@farm.js/create-app 0.1.0-beta.26 → 0.1.0-beta.28

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 (30) hide show
  1. package/bin/create-farm-app.js +1 -0
  2. package/dist/index.js +52 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +52 -2
  5. package/dist/index.mjs.map +1 -1
  6. package/package.json +1 -1
  7. package/templates/_renderers/solid/farm.config.ts +12 -0
  8. package/templates/_renderers/solid/package.json +26 -0
  9. package/templates/_renderers/solid/src/app/api/greeting/route.ts +15 -0
  10. package/templates/_renderers/solid/src/app/layout.tsx +15 -0
  11. package/templates/_renderers/solid/src/app/page.tsx +56 -0
  12. package/templates/_renderers/solid/src/app/solid.css +22 -0
  13. package/templates/_renderers/solid/src/components/resource-links.tsx +71 -0
  14. package/templates/_renderers/solid/src/lib/api-client.ts +4 -0
  15. package/templates/_renderers/solid/src/lib/api.generated.ts +7 -0
  16. package/templates/_renderers/solid/tsconfig.json +25 -0
  17. package/templates/_renderers/vue/farm.config.ts +12 -0
  18. package/templates/_renderers/vue/package.json +27 -0
  19. package/templates/_renderers/vue/src/app/api/greeting/route.ts +15 -0
  20. package/templates/_renderers/vue/src/app/layout.vue +21 -0
  21. package/templates/_renderers/vue/src/app/page.vue +69 -0
  22. package/templates/_renderers/vue/src/app/vue.css +26 -0
  23. package/templates/_renderers/vue/src/components/resource-links.vue +33 -0
  24. package/templates/_renderers/vue/src/env.d.ts +7 -0
  25. package/templates/_renderers/vue/src/lib/api-client.ts +4 -0
  26. package/templates/_renderers/vue/src/lib/api.generated.ts +7 -0
  27. package/templates/_renderers/vue/tsconfig.json +23 -0
  28. package/templates/auth/package.json +3 -3
  29. package/templates/basic/package.json +2 -2
  30. package/templates/better-auth/package.json +3 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farm.js/create-app",
3
- "version": "0.1.0-beta.26",
3
+ "version": "0.1.0-beta.28",
4
4
  "description": "Create a new FARMJS application",
5
5
  "keywords": [
6
6
  "@farm.js/create-app",
@@ -0,0 +1,12 @@
1
+ import { defineConfig } from "@farm.js/core/config";
2
+ import { solid } from "@farm.js/solid";
3
+
4
+ export default defineConfig({
5
+ renderer: solid(),
6
+ theme: {
7
+ default: "dark",
8
+ },
9
+ deploy: {
10
+ target: "vercel",
11
+ },
12
+ });
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "farm-app",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "farm dev",
7
+ "build": "farm build",
8
+ "deploy": "farm deploy",
9
+ "start": "farm start",
10
+ "type-check": "tsc --noEmit"
11
+ },
12
+ "dependencies": {
13
+ "@farm.js/core": "0.1.0-beta.28",
14
+ "@farm.js/solid": "0.1.0-beta.26",
15
+ "@fontsource-variable/geist": "5.3.0",
16
+ "@fontsource-variable/geist-mono": "5.3.0",
17
+ "solid-js": "1.9.14",
18
+ "zod": "4.1.12"
19
+ },
20
+ "devDependencies": {
21
+ "@farm.js/cli": "0.1.0-beta.28",
22
+ "tailwindcss": "^4.0.0",
23
+ "typescript": "^5.3.3"
24
+ },
25
+ "packageManager": "pnpm@8.12.1"
26
+ }
@@ -0,0 +1,15 @@
1
+ import { createEndpoint } from "@farm.js/core";
2
+ import { z } from "zod";
3
+
4
+ export const POST = createEndpoint(
5
+ "/api/greeting",
6
+ {
7
+ method: "POST",
8
+ body: z.object({
9
+ name: z.string().trim().min(1).max(40),
10
+ }),
11
+ },
12
+ async ({ body }) => ({
13
+ message: `Hello, ${body.name}, from the FARMJS server.`,
14
+ }),
15
+ );
@@ -0,0 +1,15 @@
1
+ import type { LayoutProps, Metadata } from "@farm.js/core";
2
+ import "./globals.css";
3
+ import "./solid.css";
4
+
5
+ export const metadata: Metadata = {
6
+ title: "FARMJS Solid App",
7
+ description: "A framework for product-integrated apps",
8
+ icons: {
9
+ icon: [{ url: "/favicon.svg", type: "image/svg+xml", sizes: "any" }],
10
+ },
11
+ };
12
+
13
+ export default function RootLayout(props: LayoutProps) {
14
+ return <>{props.children}</>;
15
+ }
@@ -0,0 +1,56 @@
1
+ "use client";
2
+
3
+ import { createSignal } from "solid-js";
4
+ import { ResourceLinks } from "../components/resource-links";
5
+ import { api } from "../lib/api-client";
6
+
7
+ export default function HomePage() {
8
+ const [message, setMessage] = createSignal("Call a typed server function");
9
+ const [pending, setPending] = createSignal(false);
10
+
11
+ const callServer = async () => {
12
+ setPending(true);
13
+ try {
14
+ const result = await api.greeting.post({
15
+ body: { name: "Solid" },
16
+ });
17
+ if (result.error) throw result.error;
18
+ if (!result.data) throw new Error("The server returned no greeting");
19
+ setMessage(result.data.message);
20
+ } finally {
21
+ setPending(false);
22
+ }
23
+ };
24
+
25
+ return (
26
+ <main class="landing-main">
27
+ <section class="hero-section">
28
+ <div class="hero-copy">
29
+ <div class="eyebrow-row">
30
+ <span>00</span>
31
+ <span>FARMJS / Solid starter</span>
32
+ </div>
33
+
34
+ <h1>
35
+ Edit <code>page.tsx</code> to begin.
36
+ </h1>
37
+
38
+ <div class="command-list" aria-label="Getting started">
39
+ <div class="command-row">
40
+ <span>01</span>
41
+ <code>pnpm dev</code>
42
+ </div>
43
+ <div class="command-row">
44
+ <span>02</span>
45
+ <button type="button" class="server-call" onClick={callServer} disabled={pending()}>
46
+ {pending() ? "Calling…" : message()}
47
+ </button>
48
+ </div>
49
+ </div>
50
+
51
+ <ResourceLinks className="resource-links" />
52
+ </div>
53
+ </section>
54
+ </main>
55
+ );
56
+ }
@@ -0,0 +1,22 @@
1
+ .server-call {
2
+ appearance: none;
3
+ width: fit-content;
4
+ border: 0;
5
+ padding: 0;
6
+ color: var(--ink);
7
+ background: transparent;
8
+ cursor: pointer;
9
+ font-family: var(--font-mono);
10
+ font-size: 0.75rem;
11
+ text-align: left;
12
+ }
13
+
14
+ .server-call:hover:not(:disabled) {
15
+ text-decoration: underline;
16
+ text-underline-offset: 0.25rem;
17
+ }
18
+
19
+ .server-call:disabled {
20
+ color: var(--ink-soft);
21
+ cursor: wait;
22
+ }
@@ -0,0 +1,71 @@
1
+ interface ResourceLinkAction {
2
+ href: string;
3
+ label: string;
4
+ }
5
+
6
+ interface ResourceLinksProps {
7
+ className: string;
8
+ primary?: ResourceLinkAction;
9
+ }
10
+
11
+ function DocsIcon() {
12
+ return (
13
+ <svg
14
+ class="resource-icon"
15
+ viewBox="0 0 24 24"
16
+ fill="none"
17
+ stroke="currentColor"
18
+ stroke-width="1.8"
19
+ stroke-linecap="round"
20
+ stroke-linejoin="round"
21
+ aria-hidden="true"
22
+ >
23
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z" />
24
+ <path d="M14 2v6h6M8 13h8M8 17h6" />
25
+ </svg>
26
+ );
27
+ }
28
+
29
+ function GitHubIcon() {
30
+ return (
31
+ <svg class="resource-icon" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
32
+ <path d="M12 .7a11.5 11.5 0 0 0-3.64 22.41c.58.1.79-.25.79-.56v-2.23c-3.22.7-3.9-1.37-3.9-1.37-.52-1.34-1.28-1.69-1.28-1.69-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.03 1.77 2.7 1.26 3.36.96.1-.75.4-1.26.73-1.55-2.57-.29-5.27-1.29-5.27-5.68 0-1.26.45-2.28 1.18-3.09-.12-.29-.51-1.47.11-3.05 0 0 .96-.31 3.16 1.18A10.95 10.95 0 0 1 12 6.1c.98 0 1.95.13 2.87.39 2.2-1.49 3.16-1.18 3.16-1.18.62 1.58.23 2.76.11 3.05.74.81 1.18 1.83 1.18 3.09 0 4.4-2.71 5.38-5.29 5.67.42.36.79 1.07.79 2.16v3.27c0 .31.21.67.8.56A11.5 11.5 0 0 0 12 .7Z" />
33
+ </svg>
34
+ );
35
+ }
36
+
37
+ function ResourceSeparator() {
38
+ return (
39
+ <span class="resource-separator" aria-hidden="true">
40
+ /
41
+ </span>
42
+ );
43
+ }
44
+
45
+ export function ResourceLinks(props: ResourceLinksProps) {
46
+ return (
47
+ <nav class={props.className} aria-label="Starter resources">
48
+ {props.primary ? (
49
+ <span class="resource-link-item">
50
+ <a class="resource-link-primary" href={props.primary.href}>
51
+ {props.primary.label}
52
+ </a>
53
+ </span>
54
+ ) : null}
55
+ <span class="resource-link-item">
56
+ {props.primary ? <ResourceSeparator /> : null}
57
+ <a href="https://farm.js.dev">
58
+ <DocsIcon />
59
+ <span>Docs</span>
60
+ </a>
61
+ </span>
62
+ <span class="resource-link-item">
63
+ <ResourceSeparator />
64
+ <a href="https://github.com/farming-labs/farm.js">
65
+ <GitHubIcon />
66
+ <span>GitHub</span>
67
+ </a>
68
+ </span>
69
+ </nav>
70
+ );
71
+ }
@@ -0,0 +1,4 @@
1
+ import { createAPIClient } from "@farm.js/core/client";
2
+ import type { APIRouter } from "./api.generated";
3
+
4
+ export const api = createAPIClient<APIRouter>();
@@ -0,0 +1,7 @@
1
+ import type { POST as POST_greeting } from "../app/api/greeting/route";
2
+
3
+ export type APIRouter = {
4
+ greeting: {
5
+ post: typeof POST_greeting;
6
+ };
7
+ };
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "moduleResolution": "bundler",
9
+ "baseUrl": ".",
10
+ "paths": {
11
+ "@/*": ["./src/*"]
12
+ },
13
+ "allowImportingTsExtensions": true,
14
+ "resolveJsonModule": true,
15
+ "isolatedModules": true,
16
+ "noEmit": true,
17
+ "jsx": "preserve",
18
+ "jsxImportSource": "solid-js",
19
+ "strict": true,
20
+ "noUnusedLocals": true,
21
+ "noUnusedParameters": true,
22
+ "noFallthroughCasesInSwitch": true
23
+ },
24
+ "include": ["src", "farm.config.ts"]
25
+ }
@@ -0,0 +1,12 @@
1
+ import { defineConfig } from "@farm.js/core/config";
2
+ import { vue } from "@farm.js/vue";
3
+
4
+ export default defineConfig({
5
+ renderer: vue(),
6
+ theme: {
7
+ default: "dark",
8
+ },
9
+ deploy: {
10
+ target: "vercel",
11
+ },
12
+ });
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "farm-app",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "farm dev",
7
+ "build": "farm build",
8
+ "deploy": "farm deploy",
9
+ "start": "farm start",
10
+ "type-check": "vue-tsc --noEmit"
11
+ },
12
+ "dependencies": {
13
+ "@farm.js/core": "0.1.0-beta.28",
14
+ "@farm.js/vue": "0.1.0-beta.26",
15
+ "@fontsource-variable/geist": "5.3.0",
16
+ "@fontsource-variable/geist-mono": "5.3.0",
17
+ "vue": "3.5.41",
18
+ "zod": "4.1.12"
19
+ },
20
+ "devDependencies": {
21
+ "@farm.js/cli": "0.1.0-beta.28",
22
+ "tailwindcss": "^4.0.0",
23
+ "typescript": "^5.3.3",
24
+ "vue-tsc": "3.3.9"
25
+ },
26
+ "packageManager": "pnpm@8.12.1"
27
+ }
@@ -0,0 +1,15 @@
1
+ import { createEndpoint } from "@farm.js/core";
2
+ import { z } from "zod";
3
+
4
+ export const POST = createEndpoint(
5
+ "/api/greeting",
6
+ {
7
+ method: "POST",
8
+ body: z.object({
9
+ name: z.string().trim().min(1).max(40),
10
+ }),
11
+ },
12
+ async ({ body }) => ({
13
+ message: `Hello, ${body.name}, from the FARMJS server.`,
14
+ }),
15
+ );
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import type { Metadata } from "@farm.js/core";
3
+ import "./globals.css";
4
+ import "./vue.css";
5
+
6
+ export const metadata: Metadata = {
7
+ title: "FARMJS Vue App",
8
+ description: "A framework for product-integrated apps",
9
+ icons: {
10
+ icon: [{ url: "/favicon.svg", type: "image/svg+xml", sizes: "any" }],
11
+ },
12
+ };
13
+ </script>
14
+
15
+ <script setup lang="ts">
16
+ defineOptions({ inheritAttrs: false });
17
+ </script>
18
+
19
+ <template>
20
+ <slot />
21
+ </template>
@@ -0,0 +1,69 @@
1
+ <script lang="ts">
2
+ export const hydrate = true;
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ import { ref } from "vue";
7
+ import ResourceLinks from "../components/resource-links.vue";
8
+ import { api } from "../lib/api-client";
9
+
10
+ defineOptions({ inheritAttrs: false });
11
+
12
+ const message = ref("Call a typed server function");
13
+ const pending = ref(false);
14
+ const failed = ref(false);
15
+
16
+ async function callServer() {
17
+ pending.value = true;
18
+ failed.value = false;
19
+ try {
20
+ const result = await api.greeting.post({
21
+ body: { name: "Vue" },
22
+ });
23
+ if (result.error) throw result.error;
24
+ if (!result.data) throw new Error("The server returned no greeting");
25
+ message.value = result.data.message;
26
+ } catch {
27
+ failed.value = true;
28
+ message.value = "Try the server call again";
29
+ } finally {
30
+ pending.value = false;
31
+ }
32
+ }
33
+ </script>
34
+
35
+ <template>
36
+ <main class="landing-main">
37
+ <section class="hero-section">
38
+ <div class="hero-copy">
39
+ <div class="eyebrow-row">
40
+ <span>00</span>
41
+ <span>FARMJS / Vue starter</span>
42
+ </div>
43
+
44
+ <h1>Edit <code>page.vue</code> to begin.</h1>
45
+
46
+ <div class="command-list" aria-label="Getting started">
47
+ <div class="command-row">
48
+ <span>01</span>
49
+ <code>pnpm dev</code>
50
+ </div>
51
+ <div class="command-row">
52
+ <span>02</span>
53
+ <button
54
+ type="button"
55
+ class="server-call"
56
+ :class="{ 'server-call-error': failed }"
57
+ :disabled="pending"
58
+ @click="callServer"
59
+ >
60
+ {{ pending ? "Calling…" : message }}
61
+ </button>
62
+ </div>
63
+ </div>
64
+
65
+ <ResourceLinks class="resource-links" />
66
+ </div>
67
+ </section>
68
+ </main>
69
+ </template>
@@ -0,0 +1,26 @@
1
+ .server-call {
2
+ appearance: none;
3
+ width: fit-content;
4
+ border: 0;
5
+ padding: 0;
6
+ color: var(--ink);
7
+ background: transparent;
8
+ cursor: pointer;
9
+ font-family: var(--font-mono);
10
+ font-size: 0.75rem;
11
+ text-align: left;
12
+ }
13
+
14
+ .server-call:hover:not(:disabled) {
15
+ text-decoration: underline;
16
+ text-underline-offset: 0.25rem;
17
+ }
18
+
19
+ .server-call:disabled {
20
+ color: var(--ink-soft);
21
+ cursor: wait;
22
+ }
23
+
24
+ .server-call-error {
25
+ color: #fca5a5;
26
+ }
@@ -0,0 +1,33 @@
1
+ <template>
2
+ <nav aria-label="Starter resources">
3
+ <span class="resource-link-item">
4
+ <a href="https://farm.js.dev">
5
+ <svg
6
+ class="resource-icon"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="currentColor"
10
+ stroke-width="1.8"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ aria-hidden="true"
14
+ >
15
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z" />
16
+ <path d="M14 2v6h6M8 13h8M8 17h6" />
17
+ </svg>
18
+ <span>Docs</span>
19
+ </a>
20
+ </span>
21
+ <span class="resource-link-item">
22
+ <span class="resource-separator" aria-hidden="true">/</span>
23
+ <a href="https://github.com/farming-labs/farm.js">
24
+ <svg class="resource-icon" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
25
+ <path
26
+ d="M12 .7a11.5 11.5 0 0 0-3.64 22.41c.58.1.79-.25.79-.56v-2.23c-3.22.7-3.9-1.37-3.9-1.37-.52-1.34-1.28-1.69-1.28-1.69-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.03 1.77 2.7 1.26 3.36.96.1-.75.4-1.26.73-1.55-2.57-.29-5.27-1.29-5.27-5.68 0-1.26.45-2.28 1.18-3.09-.12-.29-.51-1.47.11-3.05 0 0 .96-.31 3.16 1.18A10.95 10.95 0 0 1 12 6.1c.98 0 1.95.13 2.87.39 2.2-1.49 3.16-1.18 3.16-1.18.62 1.58.23 2.76.11 3.05.74.81 1.18 1.83 1.18 3.09 0 4.4-2.71 5.38-5.29 5.67.42.36.79 1.07.79 2.16v3.27c0 .31.21.67.8.56A11.5 11.5 0 0 0 12 .7Z"
27
+ />
28
+ </svg>
29
+ <span>GitHub</span>
30
+ </a>
31
+ </span>
32
+ </nav>
33
+ </template>
@@ -0,0 +1,7 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module "*.vue" {
4
+ import type { DefineComponent } from "vue";
5
+ const component: DefineComponent<Record<string, never>, Record<string, never>, unknown>;
6
+ export default component;
7
+ }
@@ -0,0 +1,4 @@
1
+ import { createAPIClient } from "@farm.js/core/client";
2
+ import type { APIRouter } from "./api.generated";
3
+
4
+ export const api = createAPIClient<APIRouter>();
@@ -0,0 +1,7 @@
1
+ import type { POST as POST_greeting } from "../app/api/greeting/route";
2
+
3
+ export type APIRouter = {
4
+ greeting: {
5
+ post: typeof POST_greeting;
6
+ };
7
+ };
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "moduleResolution": "bundler",
9
+ "baseUrl": ".",
10
+ "paths": {
11
+ "@/*": ["./src/*"]
12
+ },
13
+ "allowImportingTsExtensions": true,
14
+ "resolveJsonModule": true,
15
+ "isolatedModules": true,
16
+ "noEmit": true,
17
+ "strict": true,
18
+ "noUnusedLocals": true,
19
+ "noUnusedParameters": true,
20
+ "noFallthroughCasesInSwitch": true
21
+ },
22
+ "include": ["src/**/*.ts", "src/**/*.vue", "farm.config.ts"]
23
+ }
@@ -12,8 +12,8 @@
12
12
  "type-check": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@farm.js/auth": "0.1.0-beta.26",
16
- "@farm.js/core": "0.1.0-beta.26",
15
+ "@farm.js/auth": "0.1.0-beta.28",
16
+ "@farm.js/core": "0.1.0-beta.28",
17
17
  "@fontsource-variable/geist": "5.3.0",
18
18
  "@fontsource-variable/geist-mono": "5.3.0",
19
19
  "better-call": "1.3.2",
@@ -21,7 +21,7 @@
21
21
  "react-dom": "^19.0.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@farm.js/cli": "0.1.0-beta.26",
24
+ "@farm.js/cli": "0.1.0-beta.28",
25
25
  "@types/node": "20.19.9",
26
26
  "@types/react": "^19.0.0",
27
27
  "@types/react-dom": "^19.0.0",
@@ -10,14 +10,14 @@
10
10
  "type-check": "tsc --noEmit"
11
11
  },
12
12
  "dependencies": {
13
- "@farm.js/core": "0.1.0-beta.26",
13
+ "@farm.js/core": "0.1.0-beta.28",
14
14
  "@fontsource-variable/geist": "5.3.0",
15
15
  "@fontsource-variable/geist-mono": "5.3.0",
16
16
  "react": "^19.0.0",
17
17
  "react-dom": "^19.0.0"
18
18
  },
19
19
  "devDependencies": {
20
- "@farm.js/cli": "0.1.0-beta.26",
20
+ "@farm.js/cli": "0.1.0-beta.28",
21
21
  "@types/react": "^19.0.0",
22
22
  "@types/react-dom": "^19.0.0",
23
23
  "tailwindcss": "^4.0.0",
@@ -11,8 +11,8 @@
11
11
  "type-check": "tsc --noEmit"
12
12
  },
13
13
  "dependencies": {
14
- "@farm.js/better-auth": "0.1.0-beta.26",
15
- "@farm.js/core": "0.1.0-beta.26",
14
+ "@farm.js/better-auth": "0.1.0-beta.28",
15
+ "@farm.js/core": "0.1.0-beta.28",
16
16
  "@fontsource-variable/geist": "5.3.0",
17
17
  "@fontsource-variable/geist-mono": "5.3.0",
18
18
  "better-auth": "1.6.25",
@@ -22,7 +22,7 @@
22
22
  "react-dom": "^19.0.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@farm.js/cli": "0.1.0-beta.26",
25
+ "@farm.js/cli": "0.1.0-beta.28",
26
26
  "@types/node": "20.19.9",
27
27
  "@types/pg": "8.20.0",
28
28
  "@types/react": "^19.0.0",