@farbenmeer/bunny 0.1.4 → 0.2.0

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.
Files changed (49) hide show
  1. package/cli.js +3 -0
  2. package/dist/cli/build.d.ts.map +1 -1
  3. package/dist/cli/build.js +53 -21
  4. package/dist/cli/build.js.map +1 -0
  5. package/dist/cli/dev.d.ts +0 -1
  6. package/dist/cli/dev.d.ts.map +1 -1
  7. package/dist/cli/dev.js +86 -8
  8. package/dist/cli/dev.js.map +1 -0
  9. package/dist/cli/generate-server.d.ts +2 -0
  10. package/dist/cli/generate-server.d.ts.map +1 -0
  11. package/dist/cli/generate-server.js +13 -0
  12. package/dist/cli/generate-server.js.map +1 -0
  13. package/dist/cli/init.d.ts.map +1 -1
  14. package/dist/cli/init.js +21 -16
  15. package/dist/cli/init.js.map +1 -0
  16. package/dist/cli/start.d.ts.map +1 -1
  17. package/dist/cli/start.js +11 -4
  18. package/dist/cli/start.js.map +1 -0
  19. package/dist/cli.js +6 -7
  20. package/dist/cli.js.map +1 -0
  21. package/dist/client.d.ts +2 -2
  22. package/dist/client.d.ts.map +1 -1
  23. package/dist/client.js +20 -2
  24. package/dist/client.js.map +1 -0
  25. package/dist/node-http-adapter.d.ts +4 -0
  26. package/dist/node-http-adapter.d.ts.map +1 -0
  27. package/dist/node-http-adapter.js +34 -0
  28. package/dist/node-http-adapter.js.map +1 -0
  29. package/dist/server.d.ts +7 -1
  30. package/dist/server.d.ts.map +1 -1
  31. package/dist/server.js +28 -1
  32. package/dist/server.js.map +1 -0
  33. package/package.json +36 -35
  34. package/boilerplate.tar.gz +0 -0
  35. package/dist/auth/adapter-drizzle-sqlite/index.d.ts +0 -2
  36. package/dist/auth/adapter-drizzle-sqlite/index.d.ts.map +0 -1
  37. package/dist/auth/adapter-drizzle-sqlite/index.js +0 -1
  38. package/dist/auth/adapter-drizzle-sqlite/schema.d.ts +0 -2
  39. package/dist/auth/adapter-drizzle-sqlite/schema.d.ts.map +0 -1
  40. package/dist/auth/adapter-drizzle-sqlite/schema.js +0 -1
  41. package/dist/cli/migrate.d.ts +0 -4
  42. package/dist/cli/migrate.d.ts.map +0 -1
  43. package/dist/cli/migrate.js +0 -14
  44. package/dist/cli/server.d.ts +0 -2
  45. package/dist/cli/server.d.ts.map +0 -1
  46. package/dist/cli/server.js +0 -39
  47. package/dist/cli/tailwind-plugin.d.ts +0 -4
  48. package/dist/cli/tailwind-plugin.d.ts.map +0 -1
  49. package/dist/cli/tailwind-plugin.js +0 -15
package/cli.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import "./dist/cli.js";
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,KAAK,SAwBd,CAAC"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,KAAK,SA8Dd,CAAC"}
package/dist/cli/build.js CHANGED
@@ -1,30 +1,62 @@
1
1
  import { Command } from "commander";
2
- import { mkdir, rmdir } from "node:fs/promises";
2
+ import esbuild from "esbuild";
3
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
4
  import path from "node:path";
4
- import { generateServer } from "./server";
5
- import tailwindPlugin from "./tailwind-plugin";
5
+ import { generateServer } from "./generate-server.js";
6
+ import * as vite from "vite";
7
+ import { generateOpenAPISchema } from "@farbenmeer/tapi/server";
8
+ import { existsSync } from "node:fs";
9
+ import viteTsconfigPaths from "vite-tsconfig-paths";
6
10
  export const build = new Command()
7
11
  .name("build")
8
- .option("--sourcemap", "Generate sourcemaps", false)
9
- .description("Bunny Development server")
12
+ .option("--sourcemap", "Generate sourcemaps", true)
13
+ .option("--standalone", "Generate standalone server", false)
14
+ .description("Bunny Production Build")
10
15
  .action(async (options) => {
11
- const distDir = path.join(process.cwd(), ".bunny", "dist");
12
- await rmdir(distDir, { recursive: true });
13
- await mkdir(distDir, { recursive: true });
14
- const serverFile = await generateServer();
15
- await Bun.build({
16
- entrypoints: [serverFile],
17
- outdir: distDir,
18
- target: "bun",
19
- format: "esm",
20
- minify: true,
21
- naming: {
22
- entry: "[name].[ext]",
23
- asset: "__bunny/assets/[name]-[hash].[ext]",
24
- chunk: "__bunny/chunks/[name]-[hash].[ext]",
16
+ const bunnyDir = path.join(process.cwd(), ".bunny", "prod");
17
+ const srcDir = path.join(process.cwd(), "src");
18
+ if (existsSync(bunnyDir)) {
19
+ await rm(bunnyDir, { recursive: true, force: true });
20
+ }
21
+ await mkdir(bunnyDir, { recursive: true });
22
+ await vite.build({
23
+ configFile: false,
24
+ root: srcDir,
25
+ build: {
26
+ outDir: path.join(bunnyDir, "dist"),
27
+ sourcemap: options.sourcemap,
28
+ rollupOptions: {
29
+ input: path.join(srcDir, "index.html"),
30
+ },
31
+ emptyOutDir: false,
25
32
  },
33
+ mode: "production",
34
+ plugins: [viteTsconfigPaths()],
35
+ });
36
+ await esbuild.build({
37
+ entryPoints: [path.join(srcDir, "api.ts")],
38
+ bundle: true,
39
+ outdir: bunnyDir,
26
40
  sourcemap: options.sourcemap,
27
- env: "BUNNY_PUBLIC_*",
28
- plugins: [tailwindPlugin],
41
+ platform: "node",
42
+ target: "node24",
43
+ outExtension: {
44
+ ".js": ".cjs",
45
+ },
46
+ packages: options.standalone ? "bundle" : "external",
29
47
  });
48
+ const { api } = await import(path.join(bunnyDir, "api.cjs"));
49
+ const wellKnownDir = path.join(bunnyDir, "dist", ".well-known");
50
+ const packageJson = JSON.parse(await readFile(path.join(process.cwd(), "package.json"), "utf8"));
51
+ await mkdir(wellKnownDir);
52
+ await writeFile(path.join(wellKnownDir, "openapi.json"), JSON.stringify(await generateOpenAPISchema(api, {
53
+ info: {
54
+ title: packageJson.name,
55
+ version: packageJson.version,
56
+ },
57
+ })));
58
+ if (options.standalone) {
59
+ await writeFile(path.join(bunnyDir, "server.js"), generateServer());
60
+ }
30
61
  });
62
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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"}
package/dist/cli/dev.d.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  import { Command } from "commander";
2
- import "./tailwind-plugin";
3
2
  export declare const dev: Command;
4
3
  //# sourceMappingURL=dev.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,mBAAmB,CAAC;AAE3B,eAAO,MAAM,GAAG,SASZ,CAAC"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,GAAG,SA2FZ,CAAC"}
package/dist/cli/dev.js CHANGED
@@ -1,15 +1,93 @@
1
+ import { createRequestHandler, generateOpenAPISchema, } from "@farbenmeer/tapi/server";
1
2
  import { Command } from "commander";
2
- import { mkdir } from "node:fs/promises";
3
+ import connect from "connect";
4
+ import esbuild from "esbuild";
5
+ import { mkdir, readFile, rm } from "node:fs/promises";
6
+ import http from "node:http";
3
7
  import path from "node:path";
4
- import { generateServer } from "./server";
5
- import "./tailwind-plugin";
8
+ import { createServer } from "vite";
9
+ import { fromResponse, toRequest } from "../node-http-adapter.js";
10
+ import viteTsconfigPaths from "vite-tsconfig-paths";
11
+ import { existsSync } from "node:fs";
6
12
  export const dev = new Command()
7
13
  .name("dev")
8
14
  .description("Bunny Development server")
9
- .action(async () => {
10
- const bunnyDir = path.join(process.cwd(), ".bunny");
15
+ .option("--port <port>", "Port to listen on", "3000")
16
+ .action(async ({ port }) => {
17
+ const bunnyDir = path.join(process.cwd(), ".bunny/dev");
18
+ if (existsSync(bunnyDir)) {
19
+ await rm(bunnyDir, { recursive: true });
20
+ }
11
21
  await mkdir(bunnyDir, { recursive: true });
12
- const serverFile = await generateServer();
13
- process.env.NODE_ENV = "development";
14
- await import(serverFile);
22
+ const srcDir = path.join(process.cwd(), "src");
23
+ const viteServer = await createServer({
24
+ configFile: false,
25
+ root: srcDir,
26
+ server: {
27
+ middlewareMode: true,
28
+ },
29
+ mode: "development",
30
+ plugins: [viteTsconfigPaths()],
31
+ });
32
+ const app = connect();
33
+ let apiRequestHandler;
34
+ let openAPISchema;
35
+ async function reload() {
36
+ const { api } = await import(path.resolve(bunnyDir, `api.cjs?ts=${Date.now()}`));
37
+ apiRequestHandler = createRequestHandler(api, {
38
+ basePath: "/api",
39
+ });
40
+ const packageJson = JSON.parse(await readFile(path.join(process.cwd(), "package.json"), "utf8"));
41
+ const schema = await generateOpenAPISchema(api, {
42
+ info: {
43
+ title: packageJson.name,
44
+ version: packageJson.version,
45
+ },
46
+ });
47
+ openAPISchema = JSON.stringify(schema);
48
+ }
49
+ const esbuildContext = await esbuild.context({
50
+ entryPoints: [path.resolve(srcDir, "api.ts")],
51
+ bundle: true,
52
+ packages: "external",
53
+ outdir: bunnyDir,
54
+ platform: "node",
55
+ target: "node24",
56
+ outExtension: { ".js": ".cjs" },
57
+ plugins: [
58
+ {
59
+ name: "bunny-hot-reload",
60
+ setup(build) {
61
+ build.onEnd(async () => {
62
+ await reload();
63
+ });
64
+ },
65
+ },
66
+ ],
67
+ });
68
+ await esbuildContext.watch();
69
+ app.use(async (req, res, next) => {
70
+ if (!req.url)
71
+ return next();
72
+ const forwarded = req.headers["x-forwarded-for"];
73
+ const host = forwarded ?? req.headers["host"] ?? `localhost:${port}`;
74
+ const url = new URL(req.url, `http://${host}`);
75
+ if (/^\/api(\/|$)/.test(url.pathname)) {
76
+ const request = toRequest(req, url);
77
+ const response = await apiRequestHandler(request);
78
+ fromResponse(res, response);
79
+ return;
80
+ }
81
+ if (url.pathname === "/.well-known/openapi.json") {
82
+ res.setHeader("Content-Type", "application/json");
83
+ res.write(openAPISchema);
84
+ res.end();
85
+ return;
86
+ }
87
+ next();
88
+ });
89
+ app.use(viteServer.middlewares);
90
+ http.createServer(app).listen(parseInt(port, 10));
91
+ console.log(`Dev-Server started on port ${port}`);
15
92
  });
93
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function generateServer(): string;
2
+ //# sourceMappingURL=generate-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-server.d.ts","sourceRoot":"","sources":["../../src/cli/generate-server.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,WAW7B"}
@@ -0,0 +1,13 @@
1
+ export function generateServer() {
2
+ return `
3
+ import api from "./api.cjs"
4
+ import { startBunnyServer } from "@farbenmeer/bunny/server"
5
+
6
+ startBunnyServer({
7
+ port: 3000,
8
+ api,
9
+ dist: __dirname + "/dist",
10
+ });
11
+ `;
12
+ }
13
+ //# sourceMappingURL=generate-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-server.js","sourceRoot":"","sources":["../../src/cli/generate-server.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;CASR,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,IAAI,SAyCb,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,IAAI,SA4Cb,CAAC"}
package/dist/cli/init.js CHANGED
@@ -1,20 +1,24 @@
1
- import { $ } from "bun";
2
1
  import { Command } from "commander";
3
- import { exists, mkdir, readdir } from "node:fs/promises";
2
+ import { exec } from "node:child_process";
3
+ import { access, constants, mkdir, readdir, readFile } from "node:fs/promises";
4
4
  import path from "node:path";
5
+ import { promisify } from "node:util";
6
+ import ownPackageJson from "../../package.json" with { type: "json" };
7
+ import { exit } from "node:process";
8
+ const $ = promisify(exec);
5
9
  export const init = new Command()
6
10
  .name("init")
7
11
  .description("Initialize a new project")
8
12
  .argument("[name]", "Name of the project")
9
13
  .action(async (name) => {
14
+ console.error("sorry, WIP...");
15
+ exit(1);
10
16
  console.info("Initializing project...");
11
17
  if (name) {
12
18
  const dirPath = path.join(process.cwd(), name);
13
- if (await exists(dirPath)) {
14
- if ((await readdir(dirPath, { recursive: true })).length > 0) {
15
- console.error(`Directory ${name} already exists and contains files.`);
16
- process.exit(1);
17
- }
19
+ if ((await readdir(dirPath, { recursive: true })).length > 0) {
20
+ console.error(`Directory ${name} already exists and contains files.`);
21
+ process.exit(1);
18
22
  }
19
23
  else {
20
24
  await mkdir(dirPath, { recursive: true });
@@ -23,18 +27,19 @@ export const init = new Command()
23
27
  }
24
28
  else {
25
29
  const pkgPath = path.join(process.cwd(), "package.json");
26
- if (await Bun.file(pkgPath).exists()) {
30
+ try {
31
+ await access(pkgPath, constants.F_OK);
27
32
  console.error(`Package.json already exists.`);
28
33
  process.exit(1);
29
34
  }
35
+ catch { }
30
36
  }
31
- const tarBall = path.join(path.dirname(path.dirname(__dirname)), "boilerplate.tar.gz");
32
- // Extract the tarball to the current directory
33
- await $ `tar -xzf ${tarBall} --strip-components=1`;
34
- await $ `bun pm pkg set name=${name ?? path.basename(process.cwd())}`;
35
- await $ `git init`;
36
- await $ `bun install`;
37
- await $ `bun run generate`;
38
- await $ `bun run migrate`;
37
+ const pm = process.env.npm_config_user_agent?.match(/^(pnpm|yarn|npm|bun)/)?.[1] ??
38
+ "npm";
39
+ const packageJson = JSON.parse(await readFile(path.join(process.cwd(), "boilerplate/package.json"), "utf8"));
40
+ packageJson.name = path.basename(process.cwd());
41
+ packageJson.dependencies["@farbenmeer/bunny"] = `^${ownPackageJson.version}`;
42
+ await $(`${pm} install`);
39
43
  console.log("Project initialized successfully!");
40
44
  });
45
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,QAAQ,EACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,EAAE;KAC9B,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,0BAA0B,CAAC;KACvC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IAC9B,IAAI,CAAC,CAAC,CAAC,CAAA;IACP,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,qCAAqC,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,MAAM,EAAE,GACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC;IAER,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,MAAM,QAAQ,CACZ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,EACpD,MAAM,CACP,CACF,CAAC;IACF,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,WAAW,CAAC,YAAY,CACtB,mBAAmB,CACpB,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;IAEjC,MAAM,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,KAAK,SAQd,CAAC"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,KAAK,SAcd,CAAC"}
package/dist/cli/start.js CHANGED
@@ -1,11 +1,18 @@
1
1
  import { Command } from "commander";
2
2
  import path from "node:path";
3
+ import { startBunnyServer } from "../server.js";
3
4
  export const start = new Command()
4
5
  .name("start")
5
6
  .description("Bunny Production server")
6
- .action(async () => {
7
- const distDir = path.join(process.cwd(), ".bunny", "dist");
7
+ .option("--port <number>", "Port number", "3000")
8
+ .action((options) => {
9
+ const bunnyDir = path.join(process.cwd(), ".bunny", "prod");
8
10
  process.env.NODE_ENV = "production";
9
- process.chdir(distDir);
10
- await import(path.join(distDir, "server.js"));
11
+ const { api } = require(path.join(bunnyDir, "api.js"));
12
+ startBunnyServer({
13
+ api,
14
+ port: parseInt(options.port, 10),
15
+ dist: path.join(bunnyDir, "dist"),
16
+ });
11
17
  });
18
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE;KAC/B,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,MAAM,CAAC;KAChD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;IACpC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvD,gBAAgB,CAAC;QACf,GAAG;QACH,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/cli.js CHANGED
@@ -1,10 +1,9 @@
1
1
  #!/usr/bin/env bun
2
2
  import { Command } from "commander";
3
- import { init } from "./cli/init";
4
- import { dev } from "./cli/dev";
5
- import { build } from "./cli/build";
6
- import { start } from "./cli/start";
7
- import { migrate } from "./cli/migrate";
3
+ import { init } from "./cli/init.js";
4
+ import { dev } from "./cli/dev.js";
5
+ import { build } from "./cli/build.js";
6
+ import { start } from "./cli/start.js";
8
7
  const program = new Command();
9
8
  program
10
9
  .name("bunny")
@@ -13,6 +12,6 @@ program
13
12
  .addCommand(init)
14
13
  .addCommand(dev)
15
14
  .addCommand(build)
16
- .addCommand(start)
17
- .addCommand(migrate);
15
+ .addCommand(start);
18
16
  await program.parseAsync(process.argv);
17
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,iCAAiC,CAAC;KAC9C,OAAO,CAAC,OAAO,CAAC;KAChB,UAAU,CAAC,IAAI,CAAC;KAChB,UAAU,CAAC,GAAG,CAAC;KACf,UAAU,CAAC,KAAK,CAAC;KACjB,UAAU,CAAC,KAAK,CAAC,CAAC;AAErB,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
package/dist/client.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from "@farbenmeer/tapi/client";
2
2
  export * from "@farbenmeer/react-tapi";
3
- export * from "@farbenmeer/bun-auth/client";
4
- export * from "@farbenmeer/router";
3
+ import { type ReactNode } from "react";
4
+ export declare function startBunnyClient(app: ReactNode): void;
5
5
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG7D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,QAqB9C"}
package/dist/client.js CHANGED
@@ -1,4 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  export * from "@farbenmeer/tapi/client";
2
3
  export * from "@farbenmeer/react-tapi";
3
- export * from "@farbenmeer/bun-auth/client";
4
- export * from "@farbenmeer/router";
4
+ import { StrictMode, Suspense } from "react";
5
+ import { createRoot } from "react-dom/client";
6
+ export function startBunnyClient(app) {
7
+ let elem = document.getElementById("__bunny");
8
+ if (!elem) {
9
+ elem = document.createElement("div");
10
+ elem.id = "__bunny";
11
+ document.body.insertBefore(elem, document.body.firstChild);
12
+ }
13
+ const wrapped = (_jsx(StrictMode, { children: _jsx(Suspense, { children: app }) }));
14
+ if (import.meta.hot) {
15
+ const root = (import.meta.hot.data.root ??= createRoot(elem));
16
+ root.render(wrapped);
17
+ }
18
+ else {
19
+ createRoot(elem).render(wrapped);
20
+ }
21
+ }
22
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":";AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAAC,GAAc;IAC7C,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,CACd,KAAC,UAAU,cACT,KAAC,QAAQ,cAAE,GAAG,GAAY,GACf,CACd,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ export declare function toRequest(req: IncomingMessage, url: URL): Request;
3
+ export declare function fromResponse(node: ServerResponse, web: Response): void;
4
+ //# sourceMappingURL=node-http-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-http-adapter.d.ts","sourceRoot":"","sources":["../src/node-http-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAyBjE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,QAG/D"}
@@ -0,0 +1,34 @@
1
+ import { Readable } from "node:stream";
2
+ import stream from "node:stream";
3
+ export function toRequest(req, url) {
4
+ const headers = new Headers();
5
+ for (const key in req.headers) {
6
+ const value = req.headers[key];
7
+ if (value != null) {
8
+ if (Array.isArray(value)) {
9
+ value.forEach((v) => headers.append(key, v));
10
+ }
11
+ else {
12
+ headers.append(key, value);
13
+ }
14
+ }
15
+ }
16
+ let body;
17
+ if (req.method !== "GET" && req.method !== "HEAD") {
18
+ // Convert Node.js Readable stream to Web API ReadableStream
19
+ body = Readable.toWeb(req);
20
+ }
21
+ const request_options = {
22
+ method: req.method,
23
+ headers: headers,
24
+ body: body,
25
+ duplex: "half",
26
+ };
27
+ const request = new Request(url.toString(), request_options);
28
+ return request;
29
+ }
30
+ export function fromResponse(node, web) {
31
+ node.setHeaders(web.headers);
32
+ web.body?.pipeTo(stream.Writable.toWeb(node));
33
+ }
34
+ //# sourceMappingURL=node-http-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-http-adapter.js","sourceRoot":"","sources":["../src/node-http-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,SAAS,CAAC,GAAoB,EAAE,GAAQ;IACtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,IAAgC,CAAC;IACrC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClD,4DAA4D;QAC5D,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC/C,CAAC;IACD,MAAM,eAAe,GAAG;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,MAAe;KACxB,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,eAAe,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAoB,EAAE,GAAa;IAC9D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,3 +1,9 @@
1
1
  export * from "@farbenmeer/tapi/server";
2
- export * from "@farbenmeer/bun-auth/server";
2
+ import type { ApiDefinition } from "@farbenmeer/tapi/server";
3
+ interface BunnyServerOptions {
4
+ port: number;
5
+ api: ApiDefinition<any>;
6
+ dist: string;
7
+ }
8
+ export declare function startBunnyServer({ port, api, dist }: BunnyServerOptions): import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
3
9
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AAIxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,kBAAkB,qHA2BvE"}
package/dist/server.js CHANGED
@@ -1,2 +1,29 @@
1
1
  export * from "@farbenmeer/tapi/server";
2
- export * from "@farbenmeer/bun-auth/server";
2
+ import { createRequestHandler } from "@farbenmeer/tapi/server";
3
+ import connect from "connect";
4
+ import serveStatic from "serve-static";
5
+ import { fromResponse, toRequest } from "./node-http-adapter.js";
6
+ export function startBunnyServer({ port, api, dist }) {
7
+ const app = connect();
8
+ const apiRequestHandler = createRequestHandler(api, { basePath: "/api" });
9
+ app.use(async (req, res, next) => {
10
+ if (!req.url)
11
+ return next();
12
+ const forwarded = req.headers["x-forwarded-for"];
13
+ const host = forwarded ?? req.headers["host"] ?? `localhost:${port}`;
14
+ const url = new URL(req.url, `http://${host}`);
15
+ if (/^\/api(\/|$)/.test(url.pathname)) {
16
+ const request = toRequest(req, url);
17
+ const response = await apiRequestHandler(request);
18
+ fromResponse(res, response);
19
+ return;
20
+ }
21
+ next();
22
+ });
23
+ app.use(serveStatic(dist));
24
+ const server = app.listen(port, () => {
25
+ console.log(`Server started on port ${port}`);
26
+ });
27
+ return server;
28
+ }
29
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAQjE,MAAM,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAsB;IACtE,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAE1E,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC,GAAG,CAAC,GAAG;YAAE,OAAO,IAAI,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,aAAa,IAAI,EAAE,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;QAE/C,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAClD,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACnC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farbenmeer/bunny",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
4
4
  "author": {
5
5
  "name": "Michel Smola",
6
6
  "email": "michel.smola@farbenmeer.de"
@@ -10,56 +10,57 @@
10
10
  "main": "dist/index.js",
11
11
  "private": false,
12
12
  "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/farbenmeer/tapi.git"
16
+ },
13
17
  "files": [
14
18
  "dist",
15
- "boilerplate.tar.gz"
19
+ "boilerplate"
16
20
  ],
17
21
  "bin": {
18
- "bunny": "./dist/cli.js",
19
- "@farbenmeer/bunny": "./dist/cli.js"
22
+ "bunny": "./cli.js",
23
+ "@farbenmeer/bunny": "./cli.js"
20
24
  },
21
25
  "exports": {
22
26
  "./client": {
23
- "default": "./dist/client.js",
24
- "types": "./dist/client.d.ts"
27
+ "types": "./dist/client.d.ts",
28
+ "default": "./dist/client.js"
25
29
  },
26
30
  "./server": {
27
- "default": "./dist/server.js",
28
- "types": "./dist/server.d.ts"
29
- },
30
- "./auth/adapter-drizzle-sqlite": {
31
- "default": "./dist/auth/adapter-drizzle-sqlite/index.js",
32
- "types": "./dist/auth/adapter-drizzle-sqlite/index.d.ts"
33
- },
34
- "./auth/adapter-drizzle-sqlite/schema": {
35
- "default": "./dist/auth/adapter-drizzle-sqlite/schema.js",
36
- "types": "./dist/auth/adapter-drizzle-sqlite/schema.d.ts"
37
- },
38
- "./bun-plugin-tailwind": {
39
- "default": "./dist/cli/tailwind-plugin.js",
40
- "types": "./dist/cli/tailwind-plugin.d.ts"
31
+ "types": "./dist/server.d.ts",
32
+ "default": "./dist/server.js"
41
33
  }
42
34
  },
43
- "scripts": {
44
- "build": "tsc --noEmit false",
45
- "pack:boilerplate": "bun --cwd=\"../4-bunny-boilerplate\" pm pack --filename=\"packages/3-bunny/boilerplate.tar.gz\"",
46
- "cli": "bun src/cli.ts",
47
- "release": "bun run build && bun run pack:boilerplate && bun publish"
48
- },
49
35
  "dependencies": {
50
- "@farbenmeer/react-tapi": "^0.1.5",
51
- "@farbenmeer/tapi": "^0.1.9",
52
- "@farbenmeer/bun-auth": "^0.1.4",
53
- "@farbenmeer/router": "^0.1.0",
54
- "@tailwindcss/postcss": "^4.1.12",
55
36
  "commander": "^14.0.0",
56
- "drizzle-orm": "^0.44.5",
57
- "postcss": "^8.5.6"
37
+ "connect": "^3.7.0",
38
+ "esbuild": "^0.27.2",
39
+ "serve-static": "^2.2.1",
40
+ "vite": "^7.3.0",
41
+ "vite-tsconfig-paths": "^6.0.3",
42
+ "@farbenmeer/react-tapi": "^1.0.0",
43
+ "@farbenmeer/router": "^0.2.0",
44
+ "@farbenmeer/tapi": "^0.2.0"
58
45
  },
59
46
  "devDependencies": {
60
- "@types/bun": "latest"
47
+ "@types/connect": "^3.4.38",
48
+ "@types/node": "^25.0.3",
49
+ "@types/react": "^19.2.7",
50
+ "@types/react-dom": "^19",
51
+ "@types/serve-static": "^2.2.0",
52
+ "react": "^19.2.3",
53
+ "react-dom": "^19"
61
54
  },
62
55
  "peerDependencies": {
56
+ "react": "^19.2.3",
57
+ "react-dom": "^19",
63
58
  "typescript": "^5"
59
+ },
60
+ "scripts": {
61
+ "build": "tsc --noEmit false",
62
+ "pack:boilerplate": "pnpm --dir=\"../4-bunny-boilerplate\" pack --out=\"../3-bunny/boilerplate.tar.gz\"",
63
+ "cli": "node dist/cli.js",
64
+ "release": "pnpm run build && pnpm run pack:boilerplate && pnpm publish --no-git-checks"
64
65
  }
65
- }
66
+ }
Binary file
@@ -1,2 +0,0 @@
1
- export * from "@farbenmeer/bun-auth/adapter-drizzle-sqlite";
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/adapter-drizzle-sqlite/index.ts"],"names":[],"mappings":"AAAA,cAAc,6CAA6C,CAAC"}
@@ -1 +0,0 @@
1
- export * from "@farbenmeer/bun-auth/adapter-drizzle-sqlite";
@@ -1,2 +0,0 @@
1
- export * from "@farbenmeer/bun-auth/adapter-drizzle-sqlite/schema";
2
- //# sourceMappingURL=schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/auth/adapter-drizzle-sqlite/schema.ts"],"names":[],"mappings":"AAAA,cAAc,oDAAoD,CAAC"}
@@ -1 +0,0 @@
1
- export * from "@farbenmeer/bun-auth/adapter-drizzle-sqlite/schema";
@@ -1,4 +0,0 @@
1
- import { Command } from "commander";
2
- import "./tailwind-plugin";
3
- export declare const migrate: Command;
4
- //# sourceMappingURL=migrate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,mBAAmB,CAAC;AAE3B,eAAO,MAAM,OAAO,SAShB,CAAC"}
@@ -1,14 +0,0 @@
1
- import { Command } from "commander";
2
- import * as migrator from "drizzle-orm/bun-sqlite/migrator";
3
- import path from "node:path";
4
- import "./tailwind-plugin";
5
- export const migrate = new Command()
6
- .name("migrate")
7
- .description("Apply Database Migrations")
8
- .action(async () => {
9
- const dbPath = path.join(process.cwd(), "src", "lib", "db");
10
- const { db } = await import(dbPath);
11
- migrator.migrate(db, {
12
- migrationsFolder: path.join(process.cwd(), "drizzle"),
13
- });
14
- });
@@ -1,2 +0,0 @@
1
- export declare function generateServer(): Promise<string>;
2
- //# sourceMappingURL=server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/cli/server.ts"],"names":[],"mappings":"AAEA,wBAAsB,cAAc,oBAqDnC"}
@@ -1,39 +0,0 @@
1
- import * as path from "node:path";
2
- export async function generateServer() {
3
- const serverFile = path.join(process.cwd(), ".bunny", "server.ts");
4
- const hasAuth = await Bun.file(path.join(process.cwd(), "src", "auth.ts")).exists();
5
- const hasApi = await Bun.file(path.join(process.cwd(), "src", "api.ts")).exists();
6
- await Bun.write(serverFile, `
7
- import { serve } from "bun";
8
- ${hasApi
9
- ? 'import { api } from "api"; import { createRequestHandler } from "@farbenmeer/bunny/server";'
10
- : ""}
11
- ${hasAuth
12
- ? 'import { auth } from "auth"; import { createAuthRoute } from "@farbenmeer/bunny/server";'
13
- : ""}
14
- import client from "index.html";
15
-
16
- ${hasApi
17
- ? 'const tapiHandler = createRequestHandler(api, { basePath: "/api" });'
18
- : ""}
19
-
20
- const server = serve({
21
- routes: {
22
- ${hasAuth ? '"/api/auth/*": createAuthRoute(auth),' : ""}
23
- ${hasApi ? '"/api/*": (req) => tapiHandler(new Request(req)),' : ""}
24
- "/*": client,
25
- },
26
- port: 3000,
27
- development: process.env.NODE_ENV === "development" && {
28
- // Enable browser hot reloading in development
29
- hmr: true,
30
-
31
- // Echo console logs from the browser to the server
32
- console: true,
33
- },
34
- });
35
-
36
- console.log(\`🚀 Server running at \${server.url}\`);
37
- `);
38
- return serverFile;
39
- }
@@ -1,4 +0,0 @@
1
- import type { BunPlugin } from "bun";
2
- declare const tailwindPlugin: BunPlugin;
3
- export default tailwindPlugin;
4
- //# sourceMappingURL=tailwind-plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tailwind-plugin.d.ts","sourceRoot":"","sources":["../../src/cli/tailwind-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAKrC,QAAA,MAAM,cAAc,EAAE,SAUrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -1,15 +0,0 @@
1
- import postcssTailwind from "@tailwindcss/postcss";
2
- import postcss from "postcss";
3
- const processCss = postcss([postcssTailwind({})]);
4
- const tailwindPlugin = {
5
- name: "Tailwind CSS",
6
- setup(build) {
7
- build.onLoad({ filter: /\.(css)$/ }, async ({ path }) => {
8
- console.log("process", path);
9
- const contents = await Bun.file(path).text();
10
- const result = await processCss.process(contents, { from: path });
11
- return { contents: result.css, loader: "css" };
12
- });
13
- },
14
- };
15
- export default tailwindPlugin;