@farm.js/create-app 0.1.0-beta.31 → 0.1.0-beta.32

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 (57) hide show
  1. package/README.md +12 -2
  2. package/dist/index.js +84 -22
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +84 -22
  5. package/dist/index.mjs.map +1 -1
  6. package/package.json +1 -1
  7. package/templates/_integrations/better-auth/preact/farm.config.ts +17 -0
  8. package/templates/_integrations/better-auth/preact/src/app/dashboard/page.tsx +73 -0
  9. package/templates/_integrations/better-auth/preact/src/app/layout.tsx +14 -0
  10. package/templates/_integrations/better-auth/preact/src/app/page.tsx +36 -0
  11. package/templates/_integrations/better-auth/preact/src/app/sign-in/page.tsx +10 -0
  12. package/templates/_integrations/better-auth/preact/src/app/sign-up/page.tsx +10 -0
  13. package/templates/_integrations/better-auth/preact/src/components/auth-form.tsx +92 -0
  14. package/templates/_integrations/better-auth/preact/src/components/auth-shell.tsx +16 -0
  15. package/templates/_integrations/better-auth/preact/src/lib/auth-client.ts +5 -0
  16. package/templates/_integrations/better-auth/solid/farm.config.ts +17 -0
  17. package/templates/_integrations/better-auth/solid/src/app/dashboard/page.tsx +67 -0
  18. package/templates/_integrations/better-auth/solid/src/app/layout.tsx +14 -0
  19. package/templates/_integrations/better-auth/solid/src/app/page.tsx +36 -0
  20. package/templates/_integrations/better-auth/solid/src/app/sign-in/page.tsx +10 -0
  21. package/templates/_integrations/better-auth/solid/src/app/sign-up/page.tsx +10 -0
  22. package/templates/_integrations/better-auth/solid/src/components/auth-form.tsx +91 -0
  23. package/templates/_integrations/better-auth/solid/src/components/auth-shell.tsx +16 -0
  24. package/templates/_integrations/better-auth/solid/src/lib/auth-client.ts +5 -0
  25. package/templates/_integrations/better-auth/svelte/farm.config.ts +17 -0
  26. package/templates/_integrations/better-auth/svelte/src/app/dashboard/page.svelte +62 -0
  27. package/templates/_integrations/better-auth/svelte/src/app/layout.svelte +20 -0
  28. package/templates/_integrations/better-auth/svelte/src/app/page.svelte +32 -0
  29. package/templates/_integrations/better-auth/svelte/src/app/sign-in/page.svelte +10 -0
  30. package/templates/_integrations/better-auth/svelte/src/app/sign-up/page.svelte +10 -0
  31. package/templates/_integrations/better-auth/svelte/src/components/auth-form.svelte +83 -0
  32. package/templates/_integrations/better-auth/svelte/src/components/auth-shell.svelte +16 -0
  33. package/templates/_integrations/better-auth/svelte/src/components/resource-links.svelte +47 -0
  34. package/templates/_integrations/better-auth/svelte/src/lib/auth-client.ts +5 -0
  35. package/templates/_integrations/better-auth/vue/farm.config.ts +17 -0
  36. package/templates/_integrations/better-auth/vue/src/app/dashboard/page.vue +62 -0
  37. package/templates/_integrations/better-auth/vue/src/app/layout.vue +20 -0
  38. package/templates/_integrations/better-auth/vue/src/app/page.vue +34 -0
  39. package/templates/_integrations/better-auth/vue/src/app/sign-in/page.vue +12 -0
  40. package/templates/_integrations/better-auth/vue/src/app/sign-up/page.vue +12 -0
  41. package/templates/_integrations/better-auth/vue/src/components/auth-form.vue +86 -0
  42. package/templates/_integrations/better-auth/vue/src/components/auth-shell.vue +15 -0
  43. package/templates/_integrations/better-auth/vue/src/components/resource-links.vue +43 -0
  44. package/templates/_integrations/better-auth/vue/src/lib/auth-client.ts +5 -0
  45. package/templates/_renderers/preact/package.json +2 -2
  46. package/templates/_renderers/preact/src/app/api/greeting/route.ts +1 -1
  47. package/templates/_renderers/solid/package.json +2 -2
  48. package/templates/_renderers/solid/src/app/api/greeting/route.ts +1 -1
  49. package/templates/_renderers/svelte/farm.config.ts +1 -1
  50. package/templates/_renderers/svelte/package.json +2 -2
  51. package/templates/_renderers/svelte/src/app/api/greeting/route.ts +1 -1
  52. package/templates/_renderers/vue/package.json +2 -2
  53. package/templates/_renderers/vue/src/app/api/greeting/route.ts +1 -1
  54. package/templates/auth/package.json +3 -3
  55. package/templates/basic/package.json +2 -2
  56. package/templates/better-auth/README.md +5 -3
  57. package/templates/better-auth/package.json +3 -3
package/dist/index.mjs CHANGED
@@ -2720,7 +2720,7 @@ async function createApp(projectName, options = {}) {
2720
2720
  logger.error(`Unknown renderer "${options.renderer}". Available: "react", "preact", "solid", "vue", "svelte".`);
2721
2721
  process.exit(1);
2722
2722
  }
2723
- if (!renderer && !options.template && template === "basic") {
2723
+ if (!renderer && !options.template && (template === "basic" || template === "better-auth")) {
2724
2724
  const response = await prompts({
2725
2725
  type: "select",
2726
2726
  name: "renderer",
@@ -2761,8 +2761,8 @@ async function createApp(projectName, options = {}) {
2761
2761
  renderer = response.renderer;
2762
2762
  }
2763
2763
  renderer ||= "react";
2764
- if (renderer !== "react" && template !== "basic") {
2765
- logger.error(`The "${template}" integration starter currently targets React. Use --template basic with --renderer ${renderer}.`);
2764
+ if (renderer !== "react" && template !== "basic" && !await hasRendererIntegrationTemplate(template, renderer)) {
2765
+ logger.error(`The "${template}" integration starter currently targets React. Use --template basic or --template better-auth with --renderer ${renderer}.`);
2766
2766
  process.exit(1);
2767
2767
  }
2768
2768
  let useTypeScript = options.typescript;
@@ -2819,29 +2819,18 @@ async function createApp(projectName, options = {}) {
2819
2819
  async function copyTemplate(template, projectPath, useTypeScript, renderer) {
2820
2820
  const details = templateDetails[template];
2821
2821
  await copyDir(path.join(__dirname, "..", "templates", details?.integration ? "basic" : template), projectPath);
2822
+ const basePackageJson = await readPackageJson(projectPath);
2822
2823
  if (useTypeScript) {
2823
2824
  const tsTemplatePath = path.join(__dirname, "..", "templates", "_typescript");
2824
2825
  if (await dirExists(tsTemplatePath)) await copyDir(tsTemplatePath, projectPath);
2825
2826
  }
2826
- if (renderer === "solid") await copyDir(path.join(__dirname, "..", "templates", "_renderers", "solid"), projectPath);
2827
- if (renderer === "preact") await copyDir(path.join(__dirname, "..", "templates", "_renderers", "preact"), projectPath);
2828
- if (renderer === "vue") {
2829
- const rendererTemplatePath = path.join(__dirname, "..", "templates", "_renderers", "vue");
2830
- await Promise.all([
2831
- fs.rm(path.join(projectPath, "src", "app", "page.tsx"), { force: true }),
2832
- fs.rm(path.join(projectPath, "src", "app", "layout.tsx"), { force: true }),
2833
- fs.rm(path.join(projectPath, "src", "components", "resource-links.tsx"), { force: true })
2834
- ]);
2835
- await copyDir(rendererTemplatePath, projectPath);
2836
- }
2837
- if (renderer === "svelte") {
2838
- const rendererTemplatePath = path.join(__dirname, "..", "templates", "_renderers", "svelte");
2839
- await Promise.all([
2840
- fs.rm(path.join(projectPath, "src", "app", "page.tsx"), { force: true }),
2841
- fs.rm(path.join(projectPath, "src", "app", "layout.tsx"), { force: true }),
2842
- fs.rm(path.join(projectPath, "src", "components", "resource-links.tsx"), { force: true })
2843
- ]);
2844
- await copyDir(rendererTemplatePath, projectPath);
2827
+ if (renderer !== "react") {
2828
+ await applyRendererTemplate(projectPath, renderer, basePackageJson);
2829
+ const integrationRendererPath = getRendererIntegrationTemplatePath(template, renderer);
2830
+ if (await dirExists(integrationRendererPath)) {
2831
+ await removeRendererIntegrationConflicts(projectPath);
2832
+ await copyDir(integrationRendererPath, projectPath);
2833
+ }
2845
2834
  }
2846
2835
  if (!details?.integration) return;
2847
2836
  const result = await addFarmIntegration({
@@ -2854,6 +2843,79 @@ async function copyTemplate(template, projectPath, useTypeScript, renderer) {
2854
2843
  await writeIntegrationReadme(projectPath, details.integration, result.env);
2855
2844
  return result;
2856
2845
  }
2846
+ async function applyRendererTemplate(projectPath, renderer, basePackageJson) {
2847
+ const rendererTemplatePath = path.join(__dirname, "..", "templates", "_renderers", renderer);
2848
+ if (renderer === "vue" || renderer === "svelte") await Promise.all([
2849
+ fs.rm(path.join(projectPath, "src", "app", "page.tsx"), { force: true }),
2850
+ fs.rm(path.join(projectPath, "src", "app", "layout.tsx"), { force: true }),
2851
+ fs.rm(path.join(projectPath, "src", "components", "resource-links.tsx"), { force: true })
2852
+ ]);
2853
+ await copyDir(rendererTemplatePath, projectPath);
2854
+ await writePackageJson(projectPath, mergeRendererPackageJson(basePackageJson, await readPackageJson(projectPath)));
2855
+ }
2856
+ function mergeRendererPackageJson(base, renderer) {
2857
+ const dependencies = {
2858
+ ...base.dependencies,
2859
+ ...renderer.dependencies
2860
+ };
2861
+ const devDependencies = {
2862
+ ...base.devDependencies,
2863
+ ...renderer.devDependencies
2864
+ };
2865
+ for (const name of ["react", "react-dom"]) delete dependencies[name];
2866
+ for (const name of ["@types/react", "@types/react-dom"]) delete devDependencies[name];
2867
+ return {
2868
+ ...base,
2869
+ ...renderer.type ? { type: renderer.type } : {},
2870
+ scripts: {
2871
+ ...base.scripts,
2872
+ ...renderer.scripts
2873
+ },
2874
+ dependencies,
2875
+ devDependencies
2876
+ };
2877
+ }
2878
+ async function readPackageJson(projectPath) {
2879
+ return JSON.parse(await fs.readFile(path.join(projectPath, "package.json"), "utf8"));
2880
+ }
2881
+ async function writePackageJson(projectPath, packageJson) {
2882
+ await fs.writeFile(path.join(projectPath, "package.json"), `${JSON.stringify(packageJson, null, 2)}\n`, "utf8");
2883
+ }
2884
+ function getRendererIntegrationTemplatePath(template, renderer) {
2885
+ return path.join(__dirname, "..", "templates", "_integrations", template, renderer);
2886
+ }
2887
+ async function hasRendererIntegrationTemplate(template, renderer) {
2888
+ return dirExists(getRendererIntegrationTemplatePath(template, renderer));
2889
+ }
2890
+ async function removeRendererIntegrationConflicts(projectPath) {
2891
+ const appFiles = [
2892
+ "page.tsx",
2893
+ "layout.tsx",
2894
+ "loading.tsx",
2895
+ "error.tsx",
2896
+ "not-found.tsx",
2897
+ "sign-in/page.tsx",
2898
+ "sign-up/page.tsx",
2899
+ "dashboard/page.tsx",
2900
+ "preact.css",
2901
+ "solid.css",
2902
+ "vue.css",
2903
+ "svelte.css",
2904
+ "api/greeting/route.ts"
2905
+ ];
2906
+ const componentFiles = [
2907
+ "auth-form.tsx",
2908
+ "auth-shell.tsx",
2909
+ "sign-out-button.tsx",
2910
+ "site-header.tsx"
2911
+ ];
2912
+ await Promise.all([
2913
+ ...appFiles.map((file) => fs.rm(path.join(projectPath, "src", "app", file), { force: true })),
2914
+ ...componentFiles.map((file) => fs.rm(path.join(projectPath, "src", "components", file), { force: true })),
2915
+ fs.rm(path.join(projectPath, "src", "lib", "api-client.ts"), { force: true }),
2916
+ fs.rm(path.join(projectPath, "src", "lib", "api.generated.ts"), { force: true })
2917
+ ]);
2918
+ }
2857
2919
  async function writeEnvironmentExample(projectPath, keys) {
2858
2920
  if (keys.length === 0) return;
2859
2921
  const envPath = path.join(projectPath, ".env.example");