create-better-fullstack 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -22,10 +22,10 @@ declare const router: {
22
22
  create: _orpc_server0.Procedure<_orpc_server0.MergedInitialContext<Record<never, never>, Record<never, never>, Record<never, never>>, Record<never, never>, z.ZodTuple<[z.ZodOptional<z.ZodString>, z.ZodObject<{
23
23
  template: z.ZodOptional<z.ZodEnum<{
24
24
  none: "none";
25
+ uniwind: "uniwind";
25
26
  mern: "mern";
26
27
  pern: "pern";
27
28
  t3: "t3";
28
- uniwind: "uniwind";
29
29
  }>>;
30
30
  yes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
31
31
  yolo: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
@@ -95,8 +95,8 @@ declare const router: {
95
95
  uppy: "uppy";
96
96
  }>>;
97
97
  effect: z.ZodOptional<z.ZodEnum<{
98
- effect: "effect";
99
98
  none: "none";
99
+ effect: "effect";
100
100
  "effect-full": "effect-full";
101
101
  }>>;
102
102
  stateManagement: z.ZodOptional<z.ZodEnum<{
@@ -180,6 +180,7 @@ declare const router: {
180
180
  none: "none";
181
181
  pino: "pino";
182
182
  winston: "winston";
183
+ evlog: "evlog";
183
184
  }>>;
184
185
  observability: z.ZodOptional<z.ZodEnum<{
185
186
  none: "none";
@@ -206,6 +207,7 @@ declare const router: {
206
207
  sanity: "sanity";
207
208
  strapi: "strapi";
208
209
  tinacms: "tinacms";
210
+ directus: "directus";
209
211
  }>>;
210
212
  caching: z.ZodOptional<z.ZodEnum<{
211
213
  none: "none";
@@ -227,6 +229,7 @@ declare const router: {
227
229
  none: "none";
228
230
  s3: "s3";
229
231
  r2: "r2";
232
+ cloudinary: "cloudinary";
230
233
  }>>;
231
234
  mobileNavigation: z.ZodOptional<z.ZodEnum<{
232
235
  none: "none";
@@ -235,9 +238,9 @@ declare const router: {
235
238
  }>>;
236
239
  mobileUI: z.ZodOptional<z.ZodEnum<{
237
240
  none: "none";
238
- uniwind: "uniwind";
239
241
  tamagui: "tamagui";
240
242
  "gluestack-ui": "gluestack-ui";
243
+ uniwind: "uniwind";
241
244
  unistyles: "unistyles";
242
245
  }>>;
243
246
  mobileStorage: z.ZodOptional<z.ZodEnum<{
@@ -309,6 +312,7 @@ declare const router: {
309
312
  wxt: "wxt";
310
313
  msw: "msw";
311
314
  storybook: "storybook";
315
+ swr: "swr";
312
316
  "tanstack-query": "tanstack-query";
313
317
  "tanstack-table": "tanstack-table";
314
318
  "tanstack-virtual": "tanstack-virtual";
@@ -317,8 +321,8 @@ declare const router: {
317
321
  "docker-compose": "docker-compose";
318
322
  }>>>;
319
323
  examples: z.ZodOptional<z.ZodArray<z.ZodEnum<{
320
- ai: "ai";
321
324
  none: "none";
325
+ ai: "ai";
322
326
  "chat-sdk": "chat-sdk";
323
327
  "tanstack-showcase": "tanstack-showcase";
324
328
  }>>>;
@@ -383,9 +387,9 @@ declare const router: {
383
387
  "postcss-only": "postcss-only";
384
388
  }>>;
385
389
  uiLibrary: z.ZodOptional<z.ZodEnum<{
386
- mui: "mui";
387
390
  none: "none";
388
391
  "shadcn-ui": "shadcn-ui";
392
+ "shadcn-svelte": "shadcn-svelte";
389
393
  daisyui: "daisyui";
390
394
  "radix-ui": "radix-ui";
391
395
  "headless-ui": "headless-ui";
@@ -393,6 +397,7 @@ declare const router: {
393
397
  "chakra-ui": "chakra-ui";
394
398
  nextui: "nextui";
395
399
  mantine: "mantine";
400
+ mui: "mui";
396
401
  antd: "antd";
397
402
  "base-ui": "base-ui";
398
403
  "ark-ui": "ark-ui";
@@ -626,8 +631,8 @@ declare const router: {
626
631
  chi: "chi";
627
632
  }>>;
628
633
  goOrm: z.ZodOptional<z.ZodEnum<{
629
- gorm: "gorm";
630
634
  none: "none";
635
+ gorm: "gorm";
631
636
  sqlc: "sqlc";
632
637
  ent: "ent";
633
638
  }>>;
@@ -802,7 +807,7 @@ declare const router: {
802
807
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
803
808
  runtime: "none" | "bun" | "node" | "workers";
804
809
  frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "vinext" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
805
- addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "docker-compose")[];
810
+ addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "docker-compose")[];
806
811
  examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
807
812
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
808
813
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
@@ -821,21 +826,21 @@ declare const router: {
821
826
  testing: "none" | "vitest" | "playwright" | "vitest-playwright" | "jest" | "cypress";
822
827
  email: "none" | "react-email" | "resend" | "nodemailer" | "postmark" | "sendgrid" | "aws-ses" | "mailgun" | "plunk";
823
828
  cssFramework: "none" | "tailwind" | "scss" | "less" | "postcss-only";
824
- uiLibrary: "none" | "mui" | "shadcn-ui" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "antd" | "base-ui" | "ark-ui" | "react-aria";
829
+ uiLibrary: "none" | "shadcn-ui" | "shadcn-svelte" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "mui" | "antd" | "base-ui" | "ark-ui" | "react-aria";
825
830
  validation: "none" | "zod" | "valibot" | "arktype" | "typebox" | "typia" | "runtypes" | "effect-schema";
826
831
  realtime: "none" | "socket-io" | "partykit" | "ably" | "pusher" | "liveblocks" | "yjs";
827
832
  jobQueue: "none" | "bullmq" | "trigger-dev" | "inngest" | "temporal";
828
833
  animation: "none" | "framer-motion" | "gsap" | "react-spring" | "auto-animate" | "lottie";
829
834
  fileUpload: "none" | "uploadthing" | "filepond" | "uppy";
830
- logging: "none" | "pino" | "winston";
835
+ logging: "none" | "pino" | "winston" | "evlog";
831
836
  observability: "none" | "opentelemetry" | "sentry" | "grafana";
832
837
  featureFlags: "none" | "growthbook" | "posthog" | "launchdarkly" | "flagsmith" | "unleash";
833
838
  analytics: "none" | "plausible" | "umami";
834
- cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
839
+ cms: "none" | "payload" | "sanity" | "strapi" | "tinacms" | "directus";
835
840
  caching: "none" | "upstash-redis";
836
841
  i18n: "none" | "i18next" | "next-intl";
837
842
  search: "none" | "meilisearch" | "typesense" | "elasticsearch" | "algolia";
838
- fileStorage: "none" | "s3" | "r2";
843
+ fileStorage: "none" | "s3" | "r2" | "cloudinary";
839
844
  mobileNavigation: "none" | "expo-router" | "react-navigation";
840
845
  mobileUI: "none" | "uniwind" | "tamagui" | "gluestack-ui" | "unistyles";
841
846
  mobileStorage: "none" | "mmkv";
@@ -921,7 +926,7 @@ declare const router: {
921
926
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
922
927
  runtime: "none" | "bun" | "node" | "workers";
923
928
  frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "vinext" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
924
- addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "docker-compose")[];
929
+ addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "docker-compose")[];
925
930
  examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
926
931
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
927
932
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
@@ -940,21 +945,21 @@ declare const router: {
940
945
  testing: "none" | "vitest" | "playwright" | "vitest-playwright" | "jest" | "cypress";
941
946
  email: "none" | "react-email" | "resend" | "nodemailer" | "postmark" | "sendgrid" | "aws-ses" | "mailgun" | "plunk";
942
947
  cssFramework: "none" | "tailwind" | "scss" | "less" | "postcss-only";
943
- uiLibrary: "none" | "mui" | "shadcn-ui" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "antd" | "base-ui" | "ark-ui" | "react-aria";
948
+ uiLibrary: "none" | "shadcn-ui" | "shadcn-svelte" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "mui" | "antd" | "base-ui" | "ark-ui" | "react-aria";
944
949
  validation: "none" | "zod" | "valibot" | "arktype" | "typebox" | "typia" | "runtypes" | "effect-schema";
945
950
  realtime: "none" | "socket-io" | "partykit" | "ably" | "pusher" | "liveblocks" | "yjs";
946
951
  jobQueue: "none" | "bullmq" | "trigger-dev" | "inngest" | "temporal";
947
952
  animation: "none" | "framer-motion" | "gsap" | "react-spring" | "auto-animate" | "lottie";
948
953
  fileUpload: "none" | "uploadthing" | "filepond" | "uppy";
949
- logging: "none" | "pino" | "winston";
954
+ logging: "none" | "pino" | "winston" | "evlog";
950
955
  observability: "none" | "opentelemetry" | "sentry" | "grafana";
951
956
  featureFlags: "none" | "growthbook" | "posthog" | "launchdarkly" | "flagsmith" | "unleash";
952
957
  analytics: "none" | "plausible" | "umami";
953
- cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
958
+ cms: "none" | "payload" | "sanity" | "strapi" | "tinacms" | "directus";
954
959
  caching: "none" | "upstash-redis";
955
960
  i18n: "none" | "i18next" | "next-intl";
956
961
  search: "none" | "meilisearch" | "typesense" | "elasticsearch" | "algolia";
957
- fileStorage: "none" | "s3" | "r2";
962
+ fileStorage: "none" | "s3" | "r2" | "cloudinary";
958
963
  mobileNavigation: "none" | "expo-router" | "react-navigation";
959
964
  mobileUI: "none" | "uniwind" | "tamagui" | "gluestack-ui" | "unistyles";
960
965
  mobileStorage: "none" | "mmkv";
@@ -1053,7 +1058,7 @@ declare const router: {
1053
1058
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
1054
1059
  runtime: "none" | "bun" | "node" | "workers";
1055
1060
  frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "vinext" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
1056
- addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "docker-compose")[];
1061
+ addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "docker-compose")[];
1057
1062
  examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
1058
1063
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
1059
1064
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
@@ -1072,21 +1077,21 @@ declare const router: {
1072
1077
  testing: "none" | "vitest" | "playwright" | "vitest-playwright" | "jest" | "cypress";
1073
1078
  email: "none" | "react-email" | "resend" | "nodemailer" | "postmark" | "sendgrid" | "aws-ses" | "mailgun" | "plunk";
1074
1079
  cssFramework: "none" | "tailwind" | "scss" | "less" | "postcss-only";
1075
- uiLibrary: "none" | "mui" | "shadcn-ui" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "antd" | "base-ui" | "ark-ui" | "react-aria";
1080
+ uiLibrary: "none" | "shadcn-ui" | "shadcn-svelte" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "mui" | "antd" | "base-ui" | "ark-ui" | "react-aria";
1076
1081
  validation: "none" | "zod" | "valibot" | "arktype" | "typebox" | "typia" | "runtypes" | "effect-schema";
1077
1082
  realtime: "none" | "socket-io" | "partykit" | "ably" | "pusher" | "liveblocks" | "yjs";
1078
1083
  jobQueue: "none" | "bullmq" | "trigger-dev" | "inngest" | "temporal";
1079
1084
  animation: "none" | "framer-motion" | "gsap" | "react-spring" | "auto-animate" | "lottie";
1080
1085
  fileUpload: "none" | "uploadthing" | "filepond" | "uppy";
1081
- logging: "none" | "pino" | "winston";
1086
+ logging: "none" | "pino" | "winston" | "evlog";
1082
1087
  observability: "none" | "opentelemetry" | "sentry" | "grafana";
1083
1088
  featureFlags: "none" | "growthbook" | "posthog" | "launchdarkly" | "flagsmith" | "unleash";
1084
1089
  analytics: "none" | "plausible" | "umami";
1085
- cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
1090
+ cms: "none" | "payload" | "sanity" | "strapi" | "tinacms" | "directus";
1086
1091
  caching: "none" | "upstash-redis";
1087
1092
  i18n: "none" | "i18next" | "next-intl";
1088
1093
  search: "none" | "meilisearch" | "typesense" | "elasticsearch" | "algolia";
1089
- fileStorage: "none" | "s3" | "r2";
1094
+ fileStorage: "none" | "s3" | "r2" | "cloudinary";
1090
1095
  mobileNavigation: "none" | "expo-router" | "react-navigation";
1091
1096
  mobileUI: "none" | "uniwind" | "tamagui" | "gluestack-ui" | "unistyles";
1092
1097
  mobileStorage: "none" | "mmkv";
@@ -1172,7 +1177,7 @@ declare const router: {
1172
1177
  backend: "none" | "hono" | "express" | "fastify" | "elysia" | "fets" | "nestjs" | "adonisjs" | "nitro" | "encore" | "convex" | "self";
1173
1178
  runtime: "none" | "bun" | "node" | "workers";
1174
1179
  frontend: ("none" | "tanstack-router" | "react-router" | "react-vite" | "tanstack-start" | "next" | "vinext" | "nuxt" | "native-bare" | "native-uniwind" | "native-unistyles" | "svelte" | "solid" | "solid-start" | "astro" | "qwik" | "angular" | "redwood" | "fresh")[];
1175
- addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "docker-compose")[];
1180
+ addons: ("none" | "pwa" | "tauri" | "starlight" | "biome" | "lefthook" | "husky" | "ruler" | "mcp" | "skills" | "turborepo" | "fumadocs" | "ultracite" | "oxlint" | "opentui" | "wxt" | "msw" | "storybook" | "swr" | "tanstack-query" | "tanstack-table" | "tanstack-virtual" | "tanstack-db" | "tanstack-pacer" | "docker-compose")[];
1176
1181
  examples: ("ai" | "none" | "chat-sdk" | "tanstack-showcase")[];
1177
1182
  auth: "none" | "better-auth" | "go-better-auth" | "clerk" | "nextauth" | "stack-auth" | "supabase-auth" | "auth0";
1178
1183
  payments: "none" | "polar" | "stripe" | "lemon-squeezy" | "paddle" | "dodo";
@@ -1191,21 +1196,21 @@ declare const router: {
1191
1196
  testing: "none" | "vitest" | "playwright" | "vitest-playwright" | "jest" | "cypress";
1192
1197
  email: "none" | "react-email" | "resend" | "nodemailer" | "postmark" | "sendgrid" | "aws-ses" | "mailgun" | "plunk";
1193
1198
  cssFramework: "none" | "tailwind" | "scss" | "less" | "postcss-only";
1194
- uiLibrary: "none" | "mui" | "shadcn-ui" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "antd" | "base-ui" | "ark-ui" | "react-aria";
1199
+ uiLibrary: "none" | "shadcn-ui" | "shadcn-svelte" | "daisyui" | "radix-ui" | "headless-ui" | "park-ui" | "chakra-ui" | "nextui" | "mantine" | "mui" | "antd" | "base-ui" | "ark-ui" | "react-aria";
1195
1200
  validation: "none" | "zod" | "valibot" | "arktype" | "typebox" | "typia" | "runtypes" | "effect-schema";
1196
1201
  realtime: "none" | "socket-io" | "partykit" | "ably" | "pusher" | "liveblocks" | "yjs";
1197
1202
  jobQueue: "none" | "bullmq" | "trigger-dev" | "inngest" | "temporal";
1198
1203
  animation: "none" | "framer-motion" | "gsap" | "react-spring" | "auto-animate" | "lottie";
1199
1204
  fileUpload: "none" | "uploadthing" | "filepond" | "uppy";
1200
- logging: "none" | "pino" | "winston";
1205
+ logging: "none" | "pino" | "winston" | "evlog";
1201
1206
  observability: "none" | "opentelemetry" | "sentry" | "grafana";
1202
1207
  featureFlags: "none" | "growthbook" | "posthog" | "launchdarkly" | "flagsmith" | "unleash";
1203
1208
  analytics: "none" | "plausible" | "umami";
1204
- cms: "none" | "payload" | "sanity" | "strapi" | "tinacms";
1209
+ cms: "none" | "payload" | "sanity" | "strapi" | "tinacms" | "directus";
1205
1210
  caching: "none" | "upstash-redis";
1206
1211
  i18n: "none" | "i18next" | "next-intl";
1207
1212
  search: "none" | "meilisearch" | "typesense" | "elasticsearch" | "algolia";
1208
- fileStorage: "none" | "s3" | "r2";
1213
+ fileStorage: "none" | "s3" | "r2" | "cloudinary";
1209
1214
  mobileNavigation: "none" | "expo-router" | "react-navigation";
1210
1215
  mobileUI: "none" | "uniwind" | "tamagui" | "gluestack-ui" | "unistyles";
1211
1216
  mobileStorage: "none" | "mmkv";
@@ -1316,6 +1321,7 @@ declare const router: {
1316
1321
  wxt: "wxt";
1317
1322
  msw: "msw";
1318
1323
  storybook: "storybook";
1324
+ swr: "swr";
1319
1325
  "tanstack-query": "tanstack-query";
1320
1326
  "tanstack-table": "tanstack-table";
1321
1327
  "tanstack-virtual": "tanstack-virtual";
package/dist/index.mjs CHANGED
@@ -1116,6 +1116,10 @@ function getAddonDisplay(addon) {
1116
1116
  label = "Storybook";
1117
1117
  hint = "Component development and testing workshop";
1118
1118
  break;
1119
+ case "swr":
1120
+ label = "SWR";
1121
+ hint = "React Hooks for data fetching and caching";
1122
+ break;
1119
1123
  case "tanstack-query":
1120
1124
  label = "TanStack Query";
1121
1125
  hint = "Powerful async state management & data fetching";
@@ -1169,6 +1173,7 @@ const ADDON_GROUPS = {
1169
1173
  ],
1170
1174
  Integrations: ["msw", "storybook"],
1171
1175
  "AI Agents": ["mcp", "skills"],
1176
+ "Data Fetching": ["swr"],
1172
1177
  TanStack: [
1173
1178
  "tanstack-query",
1174
1179
  "tanstack-table",
@@ -1177,6 +1182,12 @@ const ADDON_GROUPS = {
1177
1182
  "tanstack-pacer"
1178
1183
  ]
1179
1184
  };
1185
+ function createGroupedAddonOptions() {
1186
+ return Object.fromEntries(Object.keys(ADDON_GROUPS).map((group$1) => [group$1, []]));
1187
+ }
1188
+ function getAddonGroup(addon) {
1189
+ return Object.entries(ADDON_GROUPS).find(([, addons]) => addons.includes(addon))?.[0];
1190
+ }
1180
1191
  function validateAddonCompatibilityForPrompt(addon, frontends, auth, backend, runtime) {
1181
1192
  return validateAddonCompatibility$1(addon, frontends, auth, backend, runtime);
1182
1193
  }
@@ -1186,14 +1197,7 @@ function getCompatibleAddonsForPrompt(allAddons, frontends, existingAddons = [],
1186
1197
  async function getAddonsChoice(addons, frontends, auth, backend, runtime) {
1187
1198
  if (addons !== void 0) return addons;
1188
1199
  const allAddons = types_exports.AddonsSchema.options.filter((addon) => addon !== "none");
1189
- const groupedOptions = {
1190
- Tooling: [],
1191
- Documentation: [],
1192
- Extensions: [],
1193
- Integrations: [],
1194
- "AI Agents": [],
1195
- TanStack: []
1196
- };
1200
+ const groupedOptions = createGroupedAddonOptions();
1197
1201
  const frontendsArray = frontends || [];
1198
1202
  for (const addon of allAddons) {
1199
1203
  const { isCompatible } = validateAddonCompatibilityForPrompt(addon, frontendsArray, auth, backend, runtime);
@@ -1204,12 +1208,8 @@ async function getAddonsChoice(addons, frontends, auth, backend, runtime) {
1204
1208
  label,
1205
1209
  hint
1206
1210
  };
1207
- if (ADDON_GROUPS.Tooling.includes(addon)) groupedOptions.Tooling.push(option);
1208
- else if (ADDON_GROUPS.Documentation.includes(addon)) groupedOptions.Documentation.push(option);
1209
- else if (ADDON_GROUPS.Extensions.includes(addon)) groupedOptions.Extensions.push(option);
1210
- else if (ADDON_GROUPS.Integrations.includes(addon)) groupedOptions.Integrations.push(option);
1211
- else if (ADDON_GROUPS["AI Agents"].includes(addon)) groupedOptions["AI Agents"].push(option);
1212
- else if (ADDON_GROUPS.TanStack.includes(addon)) groupedOptions.TanStack.push(option);
1211
+ const group$1 = getAddonGroup(addon);
1212
+ if (group$1) groupedOptions[group$1].push(option);
1213
1213
  }
1214
1214
  Object.keys(groupedOptions).forEach((group$1) => {
1215
1215
  if (groupedOptions[group$1].length === 0) delete groupedOptions[group$1];
@@ -1230,14 +1230,7 @@ async function getAddonsChoice(addons, frontends, auth, backend, runtime) {
1230
1230
  return response;
1231
1231
  }
1232
1232
  async function getAddonsToAdd(frontend, existingAddons = [], auth, backend, runtime) {
1233
- const groupedOptions = {
1234
- Tooling: [],
1235
- Documentation: [],
1236
- Extensions: [],
1237
- Integrations: [],
1238
- "AI Agents": [],
1239
- TanStack: []
1240
- };
1233
+ const groupedOptions = createGroupedAddonOptions();
1241
1234
  const frontendArray = frontend || [];
1242
1235
  const compatibleAddons = getCompatibleAddonsForPrompt(types_exports.AddonsSchema.options.filter((addon) => addon !== "none"), frontendArray, existingAddons, auth, backend, runtime);
1243
1236
  for (const addon of compatibleAddons) {
@@ -1247,12 +1240,8 @@ async function getAddonsToAdd(frontend, existingAddons = [], auth, backend, runt
1247
1240
  label,
1248
1241
  hint
1249
1242
  };
1250
- if (ADDON_GROUPS.Tooling.includes(addon)) groupedOptions.Tooling.push(option);
1251
- else if (ADDON_GROUPS.Documentation.includes(addon)) groupedOptions.Documentation.push(option);
1252
- else if (ADDON_GROUPS.Extensions.includes(addon)) groupedOptions.Extensions.push(option);
1253
- else if (ADDON_GROUPS.Integrations.includes(addon)) groupedOptions.Integrations.push(option);
1254
- else if (ADDON_GROUPS["AI Agents"].includes(addon)) groupedOptions["AI Agents"].push(option);
1255
- else if (ADDON_GROUPS.TanStack.includes(addon)) groupedOptions.TanStack.push(option);
1243
+ const group$1 = getAddonGroup(addon);
1244
+ if (group$1) groupedOptions[group$1].push(option);
1256
1245
  }
1257
1246
  Object.keys(groupedOptions).forEach((group$1) => {
1258
1247
  if (groupedOptions[group$1].length === 0) delete groupedOptions[group$1];
@@ -2296,6 +2285,11 @@ const CMS_PROMPT_OPTIONS = [
2296
2285
  label: "TinaCMS",
2297
2286
  hint: "Git-backed headless CMS with visual editing"
2298
2287
  },
2288
+ {
2289
+ value: "directus",
2290
+ label: "Directus",
2291
+ hint: "Open data platform and headless CMS for SQL databases"
2292
+ },
2299
2293
  {
2300
2294
  value: "none",
2301
2295
  label: "None",
@@ -3150,6 +3144,11 @@ async function getFileStorageChoice(fileStorage, backend) {
3150
3144
  label: "Cloudflare R2",
3151
3145
  hint: "S3-compatible storage with zero egress fees"
3152
3146
  },
3147
+ {
3148
+ value: "cloudinary",
3149
+ label: "Cloudinary",
3150
+ hint: "Image and media storage with transformations"
3151
+ },
3153
3152
  {
3154
3153
  value: "none",
3155
3154
  label: "None",
@@ -3385,8 +3384,8 @@ const WEB_FRONTEND_PROMPT_OPTIONS = [
3385
3384
  const NATIVE_FRONTEND_PROMPT_OPTIONS = [
3386
3385
  {
3387
3386
  value: "native-bare",
3388
- label: "Bare",
3389
- hint: "Bare Expo without styling library"
3387
+ label: "StyleSheet",
3388
+ hint: "Expo with StyleSheet (no styling library)"
3390
3389
  },
3391
3390
  {
3392
3391
  value: "native-uniwind",
@@ -4192,6 +4191,11 @@ const LOGGING_PROMPT_OPTIONS = [
4192
4191
  label: "Winston",
4193
4192
  hint: "Flexible logging library with multiple transports"
4194
4193
  },
4194
+ {
4195
+ value: "evlog",
4196
+ label: "evlog",
4197
+ hint: "Typed event-based logging for TypeScript"
4198
+ },
4195
4199
  {
4196
4200
  value: "none",
4197
4201
  label: "None",
@@ -6159,6 +6163,10 @@ const UI_LIBRARY_OPTIONS = {
6159
6163
  label: "shadcn/ui",
6160
6164
  hint: "Beautifully designed components built with Radix UI and Tailwind CSS"
6161
6165
  },
6166
+ "shadcn-svelte": {
6167
+ label: "shadcn-svelte",
6168
+ hint: "Svelte component collection styled with Tailwind CSS"
6169
+ },
6162
6170
  daisyui: {
6163
6171
  label: "daisyUI",
6164
6172
  hint: "Tailwind CSS component library with semantic class names"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-better-fullstack",
3
- "version": "1.8.0",
3
+ "version": "1.8.1",
4
4
  "description": "Scaffold production-ready fullstack apps in seconds. Pick your stack from 425 options — the CLI wires everything together.",
5
5
  "keywords": [
6
6
  "algolia",
@@ -127,8 +127,8 @@
127
127
  "prepublishOnly": "npm run build"
128
128
  },
129
129
  "dependencies": {
130
- "@better-fullstack/template-generator": "^1.8.0",
131
- "@better-fullstack/types": "^1.8.0",
130
+ "@better-fullstack/template-generator": "^1.8.1",
131
+ "@better-fullstack/types": "^1.8.1",
132
132
  "@clack/core": "^0.5.0",
133
133
  "@clack/prompts": "^1.4.0",
134
134
  "@orpc/server": "^1.14.3",
@@ -151,7 +151,7 @@
151
151
  "devDependencies": {
152
152
  "@types/bun": "^1.3.14",
153
153
  "@types/fs-extra": "^11.0.4",
154
- "@types/node": "^25.8.0",
154
+ "@types/node": "^25.9.1",
155
155
  "publint": "^0.3.21",
156
156
  "tsdown": "^0.18.2",
157
157
  "typescript": "^5.9.3"