create-better-t-stack 3.7.3-canary.8e4d5716 → 3.7.3-canary.fe324be3

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 (104) hide show
  1. package/dist/cli.d.ts +1 -0
  2. package/dist/cli.js +8 -0
  3. package/dist/index.d.ts +347 -0
  4. package/dist/index.js +4 -0
  5. package/dist/src-yXf02Wox.js +7077 -0
  6. package/package.json +11 -7
  7. package/src/cli.ts +0 -3
  8. package/src/constants.ts +0 -188
  9. package/src/helpers/addons/addons-setup.ts +0 -226
  10. package/src/helpers/addons/examples-setup.ts +0 -104
  11. package/src/helpers/addons/fumadocs-setup.ts +0 -103
  12. package/src/helpers/addons/ruler-setup.ts +0 -139
  13. package/src/helpers/addons/starlight-setup.ts +0 -51
  14. package/src/helpers/addons/tauri-setup.ts +0 -96
  15. package/src/helpers/addons/ultracite-setup.ts +0 -232
  16. package/src/helpers/addons/vite-pwa-setup.ts +0 -59
  17. package/src/helpers/core/add-addons.ts +0 -85
  18. package/src/helpers/core/add-deployment.ts +0 -102
  19. package/src/helpers/core/api-setup.ts +0 -280
  20. package/src/helpers/core/auth-setup.ts +0 -203
  21. package/src/helpers/core/backend-setup.ts +0 -73
  22. package/src/helpers/core/command-handlers.ts +0 -354
  23. package/src/helpers/core/convex-codegen.ts +0 -14
  24. package/src/helpers/core/create-project.ts +0 -133
  25. package/src/helpers/core/create-readme.ts +0 -687
  26. package/src/helpers/core/db-setup.ts +0 -184
  27. package/src/helpers/core/detect-project-config.ts +0 -41
  28. package/src/helpers/core/env-setup.ts +0 -449
  29. package/src/helpers/core/git.ts +0 -31
  30. package/src/helpers/core/install-dependencies.ts +0 -32
  31. package/src/helpers/core/payments-setup.ts +0 -48
  32. package/src/helpers/core/post-installation.ts +0 -383
  33. package/src/helpers/core/project-config.ts +0 -246
  34. package/src/helpers/core/runtime-setup.ts +0 -76
  35. package/src/helpers/core/template-manager.ts +0 -917
  36. package/src/helpers/core/workspace-setup.ts +0 -184
  37. package/src/helpers/database-providers/d1-setup.ts +0 -28
  38. package/src/helpers/database-providers/docker-compose-setup.ts +0 -50
  39. package/src/helpers/database-providers/mongodb-atlas-setup.ts +0 -186
  40. package/src/helpers/database-providers/neon-setup.ts +0 -243
  41. package/src/helpers/database-providers/planetscale-setup.ts +0 -78
  42. package/src/helpers/database-providers/prisma-postgres-setup.ts +0 -196
  43. package/src/helpers/database-providers/supabase-setup.ts +0 -218
  44. package/src/helpers/database-providers/turso-setup.ts +0 -309
  45. package/src/helpers/deployment/alchemy/alchemy-combined-setup.ts +0 -80
  46. package/src/helpers/deployment/alchemy/alchemy-next-setup.ts +0 -51
  47. package/src/helpers/deployment/alchemy/alchemy-nuxt-setup.ts +0 -104
  48. package/src/helpers/deployment/alchemy/alchemy-react-router-setup.ts +0 -32
  49. package/src/helpers/deployment/alchemy/alchemy-solid-setup.ts +0 -32
  50. package/src/helpers/deployment/alchemy/alchemy-svelte-setup.ts +0 -98
  51. package/src/helpers/deployment/alchemy/alchemy-tanstack-router-setup.ts +0 -33
  52. package/src/helpers/deployment/alchemy/alchemy-tanstack-start-setup.ts +0 -98
  53. package/src/helpers/deployment/alchemy/env-dts-setup.ts +0 -76
  54. package/src/helpers/deployment/alchemy/index.ts +0 -7
  55. package/src/helpers/deployment/server-deploy-setup.ts +0 -55
  56. package/src/helpers/deployment/web-deploy-setup.ts +0 -58
  57. package/src/index.ts +0 -253
  58. package/src/prompts/addons.ts +0 -178
  59. package/src/prompts/api.ts +0 -49
  60. package/src/prompts/auth.ts +0 -84
  61. package/src/prompts/backend.ts +0 -83
  62. package/src/prompts/config-prompts.ts +0 -138
  63. package/src/prompts/database-setup.ts +0 -112
  64. package/src/prompts/database.ts +0 -57
  65. package/src/prompts/examples.ts +0 -64
  66. package/src/prompts/frontend.ts +0 -118
  67. package/src/prompts/git.ts +0 -16
  68. package/src/prompts/install.ts +0 -16
  69. package/src/prompts/orm.ts +0 -53
  70. package/src/prompts/package-manager.ts +0 -32
  71. package/src/prompts/payments.ts +0 -50
  72. package/src/prompts/project-name.ts +0 -86
  73. package/src/prompts/runtime.ts +0 -47
  74. package/src/prompts/server-deploy.ts +0 -91
  75. package/src/prompts/web-deploy.ts +0 -107
  76. package/src/types.ts +0 -2
  77. package/src/utils/add-package-deps.ts +0 -57
  78. package/src/utils/analytics.ts +0 -39
  79. package/src/utils/better-auth-plugin-setup.ts +0 -71
  80. package/src/utils/biome-formatter.ts +0 -82
  81. package/src/utils/bts-config.ts +0 -122
  82. package/src/utils/command-exists.ts +0 -16
  83. package/src/utils/compatibility-rules.ts +0 -319
  84. package/src/utils/compatibility.ts +0 -11
  85. package/src/utils/config-processing.ts +0 -130
  86. package/src/utils/config-validation.ts +0 -470
  87. package/src/utils/display-config.ts +0 -96
  88. package/src/utils/docker-utils.ts +0 -70
  89. package/src/utils/errors.ts +0 -32
  90. package/src/utils/generate-reproducible-command.ts +0 -53
  91. package/src/utils/get-latest-cli-version.ts +0 -11
  92. package/src/utils/get-package-manager.ts +0 -13
  93. package/src/utils/open-url.ts +0 -25
  94. package/src/utils/package-runner.ts +0 -23
  95. package/src/utils/project-directory.ts +0 -102
  96. package/src/utils/project-name-validation.ts +0 -43
  97. package/src/utils/render-title.ts +0 -48
  98. package/src/utils/setup-catalogs.ts +0 -192
  99. package/src/utils/sponsors.ts +0 -101
  100. package/src/utils/telemetry.ts +0 -19
  101. package/src/utils/template-processor.ts +0 -64
  102. package/src/utils/templates.ts +0 -94
  103. package/src/utils/ts-morph.ts +0 -26
  104. package/src/validation.ts +0 -117
@@ -1,57 +0,0 @@
1
- import path from "node:path";
2
- import fs from "fs-extra";
3
-
4
- import { type AvailableDependencies, dependencyVersionMap } from "../constants";
5
-
6
- export const addPackageDependency = async (opts: {
7
- dependencies?: AvailableDependencies[];
8
- devDependencies?: AvailableDependencies[];
9
- customDependencies?: Record<string, string>;
10
- customDevDependencies?: Record<string, string>;
11
- projectDir: string;
12
- }) => {
13
- const {
14
- dependencies = [],
15
- devDependencies = [],
16
- customDependencies = {},
17
- customDevDependencies = {},
18
- projectDir,
19
- } = opts;
20
-
21
- const pkgJsonPath = path.join(projectDir, "package.json");
22
-
23
- const pkgJson = await fs.readJson(pkgJsonPath);
24
-
25
- if (!pkgJson.dependencies) pkgJson.dependencies = {};
26
- if (!pkgJson.devDependencies) pkgJson.devDependencies = {};
27
-
28
- for (const pkgName of dependencies) {
29
- const version = dependencyVersionMap[pkgName];
30
- if (version) {
31
- pkgJson.dependencies[pkgName] = version;
32
- } else {
33
- console.warn(`Warning: Dependency ${pkgName} not found in version map.`);
34
- }
35
- }
36
-
37
- for (const pkgName of devDependencies) {
38
- const version = dependencyVersionMap[pkgName];
39
- if (version) {
40
- pkgJson.devDependencies[pkgName] = version;
41
- } else {
42
- console.warn(`Warning: Dev dependency ${pkgName} not found in version map.`);
43
- }
44
- }
45
-
46
- for (const [pkgName, version] of Object.entries(customDependencies)) {
47
- pkgJson.dependencies[pkgName] = version;
48
- }
49
-
50
- for (const [pkgName, version] of Object.entries(customDevDependencies)) {
51
- pkgJson.devDependencies[pkgName] = version;
52
- }
53
-
54
- await fs.writeJson(pkgJsonPath, pkgJson, {
55
- spaces: 2,
56
- });
57
- };
@@ -1,39 +0,0 @@
1
- import type { ProjectConfig } from "../types";
2
- import { getLatestCLIVersion } from "./get-latest-cli-version";
3
- import { isTelemetryEnabled } from "./telemetry";
4
-
5
- const CONVEX_INGEST_URL = "https://striped-seahorse-863.convex.site/api/analytics/ingest";
6
-
7
- async function sendConvexEvent(payload: Record<string, unknown>) {
8
- if (!CONVEX_INGEST_URL) return;
9
-
10
- try {
11
- await fetch(CONVEX_INGEST_URL, {
12
- method: "POST",
13
- headers: {
14
- "Content-Type": "application/json",
15
- },
16
- body: JSON.stringify(payload),
17
- });
18
- } catch {}
19
- }
20
-
21
- export async function trackProjectCreation(config: ProjectConfig, disableAnalytics = false) {
22
- if (!isTelemetryEnabled() || disableAnalytics) return;
23
-
24
- const {
25
- projectName: _projectName,
26
- projectDir: _projectDir,
27
- relativePath: _relativePath,
28
- ...safeConfig
29
- } = config;
30
-
31
- try {
32
- await sendConvexEvent({
33
- ...safeConfig,
34
- cli_version: getLatestCLIVersion(),
35
- node_version: typeof process !== "undefined" ? process.version : "",
36
- platform: typeof process !== "undefined" ? process.platform : "",
37
- });
38
- } catch {}
39
- }
@@ -1,71 +0,0 @@
1
- import { SyntaxKind } from "ts-morph";
2
- import type { ProjectConfig } from "../types";
3
- import { ensureArrayProperty, tsProject } from "./ts-morph";
4
-
5
- export async function setupBetterAuthPlugins(projectDir: string, config: ProjectConfig) {
6
- const authIndexPath = `${projectDir}/packages/auth/src/index.ts`;
7
- const authIndexFile = tsProject.addSourceFileAtPath(authIndexPath);
8
-
9
- if (!authIndexFile) {
10
- return;
11
- }
12
-
13
- const pluginsToAdd: string[] = [];
14
- const importsToAdd: string[] = [];
15
-
16
- if (config.backend === "self" && config.frontend?.includes("tanstack-start")) {
17
- pluginsToAdd.push("tanstackStartCookies()");
18
- importsToAdd.push('import { tanstackStartCookies } from "better-auth/tanstack-start";');
19
- }
20
-
21
- if (config.backend === "self" && config.frontend?.includes("next")) {
22
- pluginsToAdd.push("nextCookies()");
23
- importsToAdd.push('import { nextCookies } from "better-auth/next-js";');
24
- }
25
-
26
- if (
27
- config.frontend?.includes("native-bare") ||
28
- config.frontend?.includes("native-uniwind") ||
29
- config.frontend?.includes("native-unistyles")
30
- ) {
31
- pluginsToAdd.push("expo()");
32
- importsToAdd.push('import { expo } from "@better-auth/expo";');
33
- }
34
-
35
- if (pluginsToAdd.length === 0) {
36
- return;
37
- }
38
-
39
- importsToAdd.forEach((importStatement) => {
40
- const existingImport = authIndexFile.getImportDeclaration((declaration) =>
41
- declaration.getModuleSpecifierValue().includes(importStatement.split('"')[1]),
42
- );
43
-
44
- if (!existingImport) {
45
- authIndexFile.insertImportDeclaration(0, {
46
- moduleSpecifier: importStatement.split('"')[1],
47
- namedImports: [importStatement.split("{")[1].split("}")[0].trim()],
48
- });
49
- }
50
- });
51
-
52
- const betterAuthCall = authIndexFile
53
- .getDescendantsOfKind(SyntaxKind.CallExpression)
54
- .find((call) => call.getExpression().getText() === "betterAuth");
55
-
56
- if (betterAuthCall) {
57
- const configObject = betterAuthCall.getArguments()[0];
58
-
59
- if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {
60
- const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);
61
-
62
- const pluginsArray = ensureArrayProperty(objLiteral, "plugins");
63
-
64
- pluginsToAdd.forEach((plugin) => {
65
- pluginsArray.addElement(plugin);
66
- });
67
- }
68
- }
69
-
70
- authIndexFile.save();
71
- }
@@ -1,82 +0,0 @@
1
- import path from "node:path";
2
- import { Biome } from "@biomejs/js-api/nodejs";
3
- import consola from "consola";
4
-
5
- function initializeBiome() {
6
- try {
7
- const biome = new Biome();
8
- const result = biome.openProject("./");
9
- const projectKey = result.projectKey;
10
-
11
- biome.applyConfiguration(projectKey, {
12
- formatter: {
13
- enabled: true,
14
- indentStyle: "tab",
15
- indentWidth: 2,
16
- lineWidth: 80,
17
- },
18
- linter: {
19
- enabled: false,
20
- },
21
- javascript: {
22
- formatter: {
23
- enabled: true,
24
- },
25
- },
26
- json: {
27
- formatter: {
28
- enabled: true,
29
- },
30
- },
31
- });
32
-
33
- return { biome, projectKey };
34
- } catch {
35
- return null;
36
- }
37
- }
38
-
39
- function isSupportedFile(filePath: string) {
40
- const ext = path.extname(filePath).toLowerCase();
41
- const supportedExtensions = [".js", ".jsx", ".ts", ".tsx", ".json", ".jsonc"];
42
- return supportedExtensions.includes(ext);
43
- }
44
-
45
- function shouldSkipFile(filePath: string) {
46
- const basename = path.basename(filePath);
47
- const skipPatterns = [
48
- ".hbs",
49
- "package-lock.json",
50
- "yarn.lock",
51
- "pnpm-lock.yaml",
52
- "bun.lock",
53
- ".d.ts",
54
- ];
55
-
56
- return skipPatterns.some((pattern) => basename.includes(pattern));
57
- }
58
-
59
- export function formatFileWithBiome(filePath: string, content: string) {
60
- if (!isSupportedFile(filePath) || shouldSkipFile(filePath)) {
61
- return null;
62
- }
63
-
64
- try {
65
- const biomeResult = initializeBiome();
66
- if (!biomeResult) return null;
67
-
68
- const { biome, projectKey } = biomeResult;
69
-
70
- const result = biome.formatContent(projectKey, content, {
71
- filePath: path.basename(filePath),
72
- });
73
-
74
- if (result.diagnostics && result.diagnostics.length > 0) {
75
- consola.debug(`Biome formatting diagnostics for ${filePath}:`, result.diagnostics);
76
- }
77
-
78
- return result.content;
79
- } catch {
80
- return null;
81
- }
82
- }
@@ -1,122 +0,0 @@
1
- import path from "node:path";
2
- import fs from "fs-extra";
3
- import * as JSONC from "jsonc-parser";
4
- import type { BetterTStackConfig, ProjectConfig } from "../types";
5
- import { getLatestCLIVersion } from "./get-latest-cli-version";
6
-
7
- const BTS_CONFIG_FILE = "bts.jsonc";
8
-
9
- export async function writeBtsConfig(projectConfig: ProjectConfig) {
10
- const btsConfig: BetterTStackConfig = {
11
- version: getLatestCLIVersion(),
12
- createdAt: new Date().toISOString(),
13
- database: projectConfig.database,
14
- orm: projectConfig.orm,
15
- backend: projectConfig.backend,
16
- runtime: projectConfig.runtime,
17
- frontend: projectConfig.frontend,
18
- addons: projectConfig.addons,
19
- examples: projectConfig.examples,
20
- auth: projectConfig.auth,
21
- payments: projectConfig.payments,
22
- packageManager: projectConfig.packageManager,
23
- dbSetup: projectConfig.dbSetup,
24
- api: projectConfig.api,
25
- webDeploy: projectConfig.webDeploy,
26
- serverDeploy: projectConfig.serverDeploy,
27
- };
28
-
29
- const baseContent = {
30
- $schema: "https://r2.better-t-stack.dev/schema.json",
31
- version: btsConfig.version,
32
- createdAt: btsConfig.createdAt,
33
- database: btsConfig.database,
34
- orm: btsConfig.orm,
35
- backend: btsConfig.backend,
36
- runtime: btsConfig.runtime,
37
- frontend: btsConfig.frontend,
38
- addons: btsConfig.addons,
39
- examples: btsConfig.examples,
40
- auth: btsConfig.auth,
41
- payments: btsConfig.payments,
42
- packageManager: btsConfig.packageManager,
43
- dbSetup: btsConfig.dbSetup,
44
- api: btsConfig.api,
45
- webDeploy: btsConfig.webDeploy,
46
- serverDeploy: btsConfig.serverDeploy,
47
- };
48
-
49
- let configContent = JSON.stringify(baseContent);
50
-
51
- const formatResult = JSONC.format(configContent, undefined, {
52
- tabSize: 2,
53
- insertSpaces: true,
54
- eol: "\n",
55
- });
56
-
57
- configContent = JSONC.applyEdits(configContent, formatResult);
58
-
59
- const finalContent = `// Better-T-Stack configuration file
60
- // safe to delete
61
-
62
- ${configContent}`;
63
- const configPath = path.join(projectConfig.projectDir, BTS_CONFIG_FILE);
64
- await fs.writeFile(configPath, finalContent, "utf-8");
65
- }
66
-
67
- export async function readBtsConfig(projectDir: string) {
68
- try {
69
- const configPath = path.join(projectDir, BTS_CONFIG_FILE);
70
-
71
- if (!(await fs.pathExists(configPath))) {
72
- return null;
73
- }
74
-
75
- const configContent = await fs.readFile(configPath, "utf-8");
76
-
77
- const errors: JSONC.ParseError[] = [];
78
- const config = JSONC.parse(configContent, errors, {
79
- allowTrailingComma: true,
80
- disallowComments: false,
81
- }) as BetterTStackConfig;
82
-
83
- if (errors.length > 0) {
84
- console.warn("Warning: Found errors parsing bts.jsonc:", errors);
85
- return null;
86
- }
87
-
88
- return config;
89
- } catch {
90
- return null;
91
- }
92
- }
93
-
94
- export async function updateBtsConfig(
95
- projectDir: string,
96
- updates: Partial<Pick<BetterTStackConfig, "addons" | "webDeploy" | "serverDeploy">>,
97
- ) {
98
- try {
99
- const configPath = path.join(projectDir, BTS_CONFIG_FILE);
100
-
101
- if (!(await fs.pathExists(configPath))) {
102
- return;
103
- }
104
-
105
- const configContent = await fs.readFile(configPath, "utf-8");
106
-
107
- let modifiedContent = configContent;
108
-
109
- for (const [key, value] of Object.entries(updates)) {
110
- const editResult = JSONC.modify(modifiedContent, [key], value, {
111
- formattingOptions: {
112
- tabSize: 2,
113
- insertSpaces: true,
114
- eol: "\n",
115
- },
116
- });
117
- modifiedContent = JSONC.applyEdits(modifiedContent, editResult);
118
- }
119
-
120
- await fs.writeFile(configPath, modifiedContent, "utf-8");
121
- } catch {}
122
- }
@@ -1,16 +0,0 @@
1
- import { execa } from "execa";
2
-
3
- export async function commandExists(command: string) {
4
- try {
5
- const isWindows = process.platform === "win32";
6
- if (isWindows) {
7
- const result = await execa("where", [command]);
8
- return result.exitCode === 0;
9
- }
10
-
11
- const result = await execa("which", [command]);
12
- return result.exitCode === 0;
13
- } catch {
14
- return false;
15
- }
16
- }