@farbenmeer/bunny 0.1.3 → 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 (46) 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 +5 -0
  22. package/dist/client.d.ts.map +1 -0
  23. package/dist/client.js +22 -0
  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 +9 -0
  30. package/dist/server.d.ts.map +1 -0
  31. package/dist/server.js +29 -0
  32. package/dist/server.js.map +1 -0
  33. package/package.json +41 -16
  34. package/boilerplate.tar.gz +0 -0
  35. package/dist/cli/migrate.d.ts +0 -4
  36. package/dist/cli/migrate.d.ts.map +0 -1
  37. package/dist/cli/migrate.js +0 -14
  38. package/dist/cli/server.d.ts +0 -2
  39. package/dist/cli/server.d.ts.map +0 -1
  40. package/dist/cli/server.js +0 -39
  41. package/dist/cli/tailwind-plugin.d.ts +0 -4
  42. package/dist/cli/tailwind-plugin.d.ts.map +0 -1
  43. package/dist/cli/tailwind-plugin.js +0 -15
  44. package/dist/index.d.ts +0 -3
  45. package/dist/index.d.ts.map +0 -1
  46. package/dist/index.js +0 -2
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":"AAAA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE;KAC7B,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,MAAM,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;QACpC,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE;YACN,cAAc,EAAE,IAAI;SACrB;QACD,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,IAAI,iBAAsD,CAAC;IAC3D,IAAI,aAAqB,CAAC;IAC1B,KAAK,UAAU,MAAM;QACnB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAC1B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CACnD,CAAC;QACF,iBAAiB,GAAG,oBAAoB,CAAC,GAAG,EAAE;YAC5C,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACjE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE;YAC9C,IAAI,EAAE;gBACJ,KAAK,EAAE,WAAW,CAAC,IAAI;gBACvB,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B;SACF,CAAC,CAAC;QACH,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;QAC3C,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,QAAQ;QAChB,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;QAC/B,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,kBAAkB;gBACxB,KAAK,CAAC,KAAK;oBACT,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;wBACrB,MAAM,MAAM,EAAE,CAAC;oBACjB,CAAC,CAAC,CAAC;gBACL,CAAC;aACF;SACF;KACF,CAAC,CAAC;IAEH,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;IAE7B,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;QAC/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;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,2BAA2B,EAAE,CAAC;YACjD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACzB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAEhC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC"}
@@ -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"}
@@ -0,0 +1,5 @@
1
+ export * from "@farbenmeer/tapi/client";
2
+ export * from "@farbenmeer/react-tapi";
3
+ import { type ReactNode } from "react";
4
+ export declare function startBunnyClient(app: ReactNode): void;
5
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
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 ADDED
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export * from "@farbenmeer/tapi/client";
3
+ export * from "@farbenmeer/react-tapi";
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"}
@@ -0,0 +1,9 @@
1
+ export * from "@farbenmeer/tapi/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>;
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
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 ADDED
@@ -0,0 +1,29 @@
1
+ export * from "@farbenmeer/tapi/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.3",
3
+ "version": "0.2.0",
4
4
  "author": {
5
5
  "name": "Michel Smola",
6
6
  "email": "michel.smola@farbenmeer.de"
@@ -10,32 +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
- "scripts": {
22
- "build": "tsc --noEmit false",
23
- "pack:boilerplate": "bun --cwd=\"../4-bunny-boilerplate\" pm pack --filename=\"packages/3-bunny/boilerplate.tar.gz\"",
24
- "cli": "bun src/cli.ts",
25
- "release": "bun run build && bun run pack:boilerplate && bun publish"
25
+ "exports": {
26
+ "./client": {
27
+ "types": "./dist/client.d.ts",
28
+ "default": "./dist/client.js"
29
+ },
30
+ "./server": {
31
+ "types": "./dist/server.d.ts",
32
+ "default": "./dist/server.js"
33
+ }
26
34
  },
27
35
  "dependencies": {
28
- "@farbenmeer/react-tapi": "^0.1.5",
29
- "@farbenmeer/tapi": "^0.1.8",
30
- "@tailwindcss/postcss": "^4.1.12",
31
36
  "commander": "^14.0.0",
32
- "drizzle-orm": "^0.44.5",
33
- "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"
34
45
  },
35
46
  "devDependencies": {
36
- "@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"
37
54
  },
38
55
  "peerDependencies": {
56
+ "react": "^19.2.3",
57
+ "react-dom": "^19",
39
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"
40
65
  }
41
- }
66
+ }
Binary file
@@ -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";'
10
- : ""}
11
- ${hasAuth
12
- ? 'import { auth } from "auth"; import { createAuthRoute } from "@farbenmeer/bun-auth";'
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;
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from "@farbenmeer/tapi";
2
- export * from "@farbenmeer/react-tapi";
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC"}
package/dist/index.js DELETED
@@ -1,2 +0,0 @@
1
- export * from "@farbenmeer/tapi";
2
- export * from "@farbenmeer/react-tapi";