@tanstack/cta-engine 0.10.0-alpha.14 → 0.10.0-alpha.16
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/add-ons.js +8 -73
- package/dist/{add.js → add-to-app.js} +19 -19
- package/dist/config-file.js +6 -3
- package/dist/constants.js +0 -2
- package/dist/create-app.js +76 -460
- package/dist/environment.js +11 -26
- package/dist/file-helpers.js +59 -0
- package/dist/frameworks.js +78 -0
- package/dist/index.js +10 -1
- package/dist/integrations/git.js +4 -0
- package/dist/integrations/shadcn.js +27 -0
- package/dist/package-json.js +46 -0
- package/dist/package-manager.js +51 -6
- package/dist/template-file.js +108 -0
- package/dist/types/add-ons.d.ts +2 -6
- package/dist/types/add-to-app.d.ts +4 -0
- package/dist/types/config-file.d.ts +3 -2
- package/dist/types/constants.d.ts +0 -3
- package/dist/types/file-helpers.d.ts +5 -0
- package/dist/types/frameworks.d.ts +5 -0
- package/dist/types/index.d.ts +13 -1
- package/dist/types/integrations/git.d.ts +2 -0
- package/dist/types/integrations/shadcn.d.ts +2 -0
- package/dist/types/package-json.d.ts +2 -0
- package/dist/types/package-manager.d.ts +14 -1
- package/dist/types/template-file.d.ts +2 -0
- package/dist/types/types.d.ts +86 -64
- package/dist/types/utils.d.ts +5 -0
- package/dist/utils.js +9 -0
- package/package.json +3 -13
- package/src/add-ons.ts +11 -104
- package/src/{add.ts → add-to-app.ts} +29 -35
- package/src/config-file.ts +12 -6
- package/src/constants.ts +0 -5
- package/src/create-app.ts +126 -727
- package/src/environment.ts +12 -27
- package/src/file-helpers.ts +73 -0
- package/src/frameworks.ts +114 -0
- package/src/index.ts +42 -1
- package/src/integrations/git.ts +7 -0
- package/src/integrations/shadcn.ts +44 -0
- package/src/package-json.ts +62 -0
- package/src/package-manager.ts +80 -9
- package/src/template-file.ts +146 -0
- package/src/types.ts +101 -70
- package/src/utils.ts +17 -0
- package/tests/file-helper.test.ts +37 -0
- package/tests/package-manager.test.ts +154 -0
- package/dist/cli.js +0 -126
- package/dist/custom-add-on.js +0 -254
- package/dist/file-helper.js +0 -18
- package/dist/mcp.js +0 -229
- package/dist/options.js +0 -328
- package/dist/templates.js +0 -6
- package/dist/toolchain.js +0 -6
- package/dist/types/add.d.ts +0 -3
- package/dist/types/cli.d.ts +0 -6
- package/dist/types/custom-add-on.d.ts +0 -3
- package/dist/types/file-helper.d.ts +0 -2
- package/dist/types/mcp.d.ts +0 -7
- package/dist/types/options.d.ts +0 -6
- package/dist/types/templates.d.ts +0 -1
- package/dist/types/toolchain.d.ts +0 -3
- package/src/cli.ts +0 -189
- package/src/custom-add-on.ts +0 -325
- package/src/file-helper.ts +0 -20
- package/src/mcp.ts +0 -302
- package/src/options.ts +0 -399
- package/src/templates.ts +0 -7
- package/src/toolchain.ts +0 -7
- package/templates/react/add-on/clerk/README.md +0 -3
- package/templates/react/add-on/clerk/assets/_dot_env.local.append +0 -2
- package/templates/react/add-on/clerk/assets/src/integrations/clerk/header-user.tsx +0 -19
- package/templates/react/add-on/clerk/assets/src/integrations/clerk/provider.tsx +0 -18
- package/templates/react/add-on/clerk/assets/src/routes/demo.clerk.tsx +0 -20
- package/templates/react/add-on/clerk/info.json +0 -13
- package/templates/react/add-on/clerk/package.json +0 -5
- package/templates/react/add-on/convex/README.md +0 -4
- package/templates/react/add-on/convex/assets/_dot_cursorrules.append +0 -93
- package/templates/react/add-on/convex/assets/_dot_env.local.append +0 -3
- package/templates/react/add-on/convex/assets/convex/products.ts +0 -8
- package/templates/react/add-on/convex/assets/convex/schema.ts +0 -10
- package/templates/react/add-on/convex/assets/src/integrations/convex/provider.tsx +0 -20
- package/templates/react/add-on/convex/assets/src/routes/demo.convex.tsx +0 -33
- package/templates/react/add-on/convex/info.json +0 -13
- package/templates/react/add-on/convex/package.json +0 -6
- package/templates/react/add-on/form/assets/src/components/demo.FormComponents.tsx.ejs +0 -300
- package/templates/react/add-on/form/assets/src/hooks/demo.form-context.ts +0 -4
- package/templates/react/add-on/form/assets/src/hooks/demo.form.ts +0 -22
- package/templates/react/add-on/form/assets/src/routes/demo.form.address.tsx.ejs +0 -213
- package/templates/react/add-on/form/assets/src/routes/demo.form.simple.tsx.ejs +0 -77
- package/templates/react/add-on/form/info.json +0 -26
- package/templates/react/add-on/form/package.json +0 -6
- package/templates/react/add-on/module-federation/assets/module-federation.config.js.ejs +0 -31
- package/templates/react/add-on/module-federation/assets/src/demo-mf-component.tsx +0 -3
- package/templates/react/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +0 -11
- package/templates/react/add-on/module-federation/info.json +0 -7
- package/templates/react/add-on/module-federation/package.json +0 -5
- package/templates/react/add-on/netlify/README.md +0 -11
- package/templates/react/add-on/netlify/info.json +0 -7
- package/templates/react/add-on/sentry/assets/_dot_cursorrules.append +0 -22
- package/templates/react/add-on/sentry/assets/_dot_env.local.append +0 -2
- package/templates/react/add-on/sentry/assets/src/app/global-middleware.ts +0 -25
- package/templates/react/add-on/sentry/assets/src/routes/demo.sentry.testing.tsx +0 -480
- package/templates/react/add-on/sentry/info.json +0 -14
- package/templates/react/add-on/sentry/package.json +0 -7
- package/templates/react/add-on/shadcn/README.md +0 -7
- package/templates/react/add-on/shadcn/assets/_dot_cursorrules.append +0 -7
- package/templates/react/add-on/shadcn/assets/components.json +0 -21
- package/templates/react/add-on/shadcn/assets/src/lib/utils.ts +0 -6
- package/templates/react/add-on/shadcn/assets/src/styles.css +0 -138
- package/templates/react/add-on/shadcn/info.json +0 -7
- package/templates/react/add-on/shadcn/package.json +0 -9
- package/templates/react/add-on/start/assets/_dot_gitignore.append +0 -2
- package/templates/react/add-on/start/assets/app.config.ts.ejs +0 -19
- package/templates/react/add-on/start/assets/src/api.ts +0 -6
- package/templates/react/add-on/start/assets/src/client.tsx +0 -8
- package/templates/react/add-on/start/assets/src/router.tsx.ejs +0 -77
- package/templates/react/add-on/start/assets/src/routes/api.demo-names.ts +0 -11
- package/templates/react/add-on/start/assets/src/routes/demo.start.api-request.tsx.ejs +0 -33
- package/templates/react/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +0 -50
- package/templates/react/add-on/start/assets/src/ssr.tsx +0 -12
- package/templates/react/add-on/start/info.json +0 -18
- package/templates/react/add-on/start/package.json +0 -13
- package/templates/react/add-on/store/assets/src/lib/demo-store.ts +0 -13
- package/templates/react/add-on/store/assets/src/routes/demo.store.tsx.ejs +0 -75
- package/templates/react/add-on/store/info.json +0 -13
- package/templates/react/add-on/store/package.json +0 -6
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/init.ts +0 -9
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/react.ts +0 -4
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/router.ts +0 -18
- package/templates/react/add-on/tRPC/assets/src/routes/api.trpc.$.tsx +0 -16
- package/templates/react/add-on/tRPC/info.json +0 -9
- package/templates/react/add-on/tRPC/package.json +0 -9
- package/templates/react/add-on/table/assets/src/data/demo-table-data.ts +0 -50
- package/templates/react/add-on/table/assets/src/routes/demo.table.tsx.ejs +0 -373
- package/templates/react/add-on/table/info.json +0 -13
- package/templates/react/add-on/table/package.json +0 -7
- package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/layout.tsx +0 -5
- package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +0 -70
- package/templates/react/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx.ejs +0 -53
- package/templates/react/add-on/tanstack-query/info.json +0 -13
- package/templates/react/add-on/tanstack-query/package.json +0 -6
- package/templates/react/base/README.md.ejs +0 -558
- package/templates/react/base/_dot_gitignore +0 -5
- package/templates/react/base/_dot_vscode/settings.biome.json +0 -38
- package/templates/react/base/_dot_vscode/settings.json +0 -11
- package/templates/react/base/index.html.ejs +0 -20
- package/templates/react/base/package.biome.json +0 -10
- package/templates/react/base/package.eslintprettier.json +0 -11
- package/templates/react/base/package.json +0 -29
- package/templates/react/base/package.ts.json +0 -7
- package/templates/react/base/package.tw.json +0 -6
- package/templates/react/base/public/favicon.ico +0 -0
- package/templates/react/base/public/logo192.png +0 -0
- package/templates/react/base/public/logo512.png +0 -0
- package/templates/react/base/public/manifest.json +0 -25
- package/templates/react/base/public/robots.txt +0 -3
- package/templates/react/base/src/App.css +0 -38
- package/templates/react/base/src/App.test.tsx.ejs +0 -10
- package/templates/react/base/src/App.tsx.ejs +0 -74
- package/templates/react/base/src/components/Header.tsx.ejs +0 -27
- package/templates/react/base/src/logo.svg +0 -44
- package/templates/react/base/src/reportWebVitals.ts.ejs +0 -28
- package/templates/react/base/src/styles.css.ejs +0 -15
- package/templates/react/base/toolchain/.prettierignore +0 -3
- package/templates/react/base/toolchain/biome.json +0 -31
- package/templates/react/base/toolchain/eslint.config.js +0 -5
- package/templates/react/base/toolchain/prettier.config.js +0 -10
- package/templates/react/base/tsconfig.json.ejs +0 -29
- package/templates/react/base/vite.config.js.ejs +0 -23
- package/templates/react/code-router/src/main.tsx.ejs +0 -92
- package/templates/react/example/tanchat/README.md +0 -37
- package/templates/react/example/tanchat/assets/_dot_env.local.append +0 -2
- package/templates/react/example/tanchat/assets/public/example-guitar-flowers.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-motherboard.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-racing.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-steamer-trunk.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-superhero.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-traveling.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-video-games.jpg +0 -0
- package/templates/react/example/tanchat/assets/src/components/example-AIAssistant.tsx +0 -173
- package/templates/react/example/tanchat/assets/src/components/example-GuitarRecommendation.tsx +0 -47
- package/templates/react/example/tanchat/assets/src/data/example-guitars.ts +0 -83
- package/templates/react/example/tanchat/assets/src/demo.index.css +0 -220
- package/templates/react/example/tanchat/assets/src/integrations/tanchat/header-user.tsx +0 -5
- package/templates/react/example/tanchat/assets/src/routes/example.chat.tsx +0 -159
- package/templates/react/example/tanchat/assets/src/routes/example.guitars/$guitarId.tsx +0 -50
- package/templates/react/example/tanchat/assets/src/routes/example.guitars/index.tsx +0 -54
- package/templates/react/example/tanchat/assets/src/store/example-assistant.ts +0 -3
- package/templates/react/example/tanchat/assets/src/utils/demo.ai.ts +0 -62
- package/templates/react/example/tanchat/assets/src/utils/demo.tools.ts +0 -47
- package/templates/react/example/tanchat/info.json +0 -19
- package/templates/react/example/tanchat/package.json +0 -15
- package/templates/react/file-router/package.fr.json +0 -5
- package/templates/react/file-router/src/main.tsx.ejs +0 -55
- package/templates/react/file-router/src/routes/__root.tsx.ejs +0 -82
- package/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs +0 -352
- package/templates/solid/add-on/form/info.json +0 -13
- package/templates/solid/add-on/form/package.json +0 -5
- package/templates/solid/add-on/module-federation/assets/module-federation.config.js.ejs +0 -27
- package/templates/solid/add-on/module-federation/assets/src/demo-mf-component.tsx +0 -3
- package/templates/solid/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +0 -9
- package/templates/solid/add-on/module-federation/info.json +0 -7
- package/templates/solid/add-on/module-federation/package.json +0 -5
- package/templates/solid/add-on/sentry/assets/_dot_cursorrules.append +0 -22
- package/templates/solid/add-on/sentry/assets/_dot_env.local.append +0 -2
- package/templates/solid/add-on/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +0 -20
- package/templates/solid/add-on/sentry/info.json +0 -13
- package/templates/solid/add-on/sentry/package.json +0 -5
- package/templates/solid/add-on/solid-ui/README.md +0 -9
- package/templates/solid/add-on/solid-ui/assets/src/lib/utils.ts +0 -6
- package/templates/solid/add-on/solid-ui/assets/src/styles.css +0 -138
- package/templates/solid/add-on/solid-ui/assets/ui.config.json +0 -13
- package/templates/solid/add-on/solid-ui/info.json +0 -11
- package/templates/solid/add-on/solid-ui/package.json +0 -9
- package/templates/solid/add-on/start/assets/app.config.ts +0 -16
- package/templates/solid/add-on/start/assets/src/api.ts +0 -6
- package/templates/solid/add-on/start/assets/src/client.tsx +0 -7
- package/templates/solid/add-on/start/assets/src/router.tsx.ejs +0 -24
- package/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +0 -49
- package/templates/solid/add-on/start/assets/src/ssr.tsx +0 -12
- package/templates/solid/add-on/start/info.json +0 -14
- package/templates/solid/add-on/start/package.json +0 -12
- package/templates/solid/add-on/store/assets/src/lib/demo-store.ts +0 -13
- package/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs +0 -77
- package/templates/solid/add-on/store/info.json +0 -13
- package/templates/solid/add-on/store/package.json +0 -6
- package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/header-user.tsx +0 -5
- package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/provider.tsx +0 -15
- package/templates/solid/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx +0 -30
- package/templates/solid/add-on/tanstack-query/info.json +0 -13
- package/templates/solid/add-on/tanstack-query/package.json +0 -6
- package/templates/solid/base/README.md.ejs +0 -215
- package/templates/solid/base/_dot_cursorrules.append +0 -35
- package/templates/solid/base/_dot_gitignore +0 -5
- package/templates/solid/base/_dot_vscode/settings.biome.json +0 -38
- package/templates/solid/base/_dot_vscode/settings.json +0 -11
- package/templates/solid/base/index.html.ejs +0 -20
- package/templates/solid/base/package.biome.json +0 -10
- package/templates/solid/base/package.eslintprettier.json +0 -11
- package/templates/solid/base/package.json +0 -22
- package/templates/solid/base/package.ts.json +0 -5
- package/templates/solid/base/package.tw.json +0 -6
- package/templates/solid/base/public/favicon.ico +0 -0
- package/templates/solid/base/public/logo192.png +0 -0
- package/templates/solid/base/public/logo512.png +0 -0
- package/templates/solid/base/public/manifest.json +0 -25
- package/templates/solid/base/public/robots.txt +0 -3
- package/templates/solid/base/src/App.css +0 -0
- package/templates/solid/base/src/App.tsx.ejs +0 -47
- package/templates/solid/base/src/components/Header.tsx.ejs +0 -26
- package/templates/solid/base/src/logo.svg +0 -120
- package/templates/solid/base/src/styles.css.ejs +0 -15
- package/templates/solid/base/toolchain/.prettierignore +0 -3
- package/templates/solid/base/toolchain/biome.json +0 -31
- package/templates/solid/base/toolchain/eslint.config.js +0 -5
- package/templates/solid/base/toolchain/prettier.config.js +0 -10
- package/templates/solid/base/tsconfig.json.ejs +0 -31
- package/templates/solid/base/vite.config.js.ejs +0 -22
- package/templates/solid/code-router/src/main.tsx.ejs +0 -71
- package/templates/solid/example/tanchat/README.md +0 -52
- package/templates/solid/example/tanchat/assets/ai-streaming-server/README.md +0 -110
- package/templates/solid/example/tanchat/assets/ai-streaming-server/_dot_env.example +0 -1
- package/templates/solid/example/tanchat/assets/ai-streaming-server/package.json +0 -26
- package/templates/solid/example/tanchat/assets/ai-streaming-server/src/index.ts +0 -102
- package/templates/solid/example/tanchat/assets/ai-streaming-server/tsconfig.json +0 -15
- package/templates/solid/example/tanchat/assets/src/components/demo.SettingsDialog.tsx +0 -149
- package/templates/solid/example/tanchat/assets/src/demo.index.css +0 -227
- package/templates/solid/example/tanchat/assets/src/lib/demo-store.ts +0 -13
- package/templates/solid/example/tanchat/assets/src/routes/example.chat.tsx +0 -435
- package/templates/solid/example/tanchat/assets/src/store/demo.hooks.ts +0 -17
- package/templates/solid/example/tanchat/assets/src/store/demo.store.ts +0 -133
- package/templates/solid/example/tanchat/info.json +0 -14
- package/templates/solid/example/tanchat/package.json +0 -7
- package/templates/solid/file-router/package.fr.json +0 -5
- package/templates/solid/file-router/src/main.tsx.ejs +0 -47
- package/templates/solid/file-router/src/routes/__root.tsx.ejs +0 -41
- package/templates/solid/file-router/src/routes/index.tsx +0 -43
- package/tests/cra.test.ts +0 -293
- package/tests/snapshots/cra/cr-js-npm.json +0 -33
- package/tests/snapshots/cra/cr-ts-npm.json +0 -34
- package/tests/snapshots/cra/cr-ts-start-npm.json +0 -38
- package/tests/snapshots/cra/fr-ts-npm.json +0 -34
- package/tests/snapshots/cra/fr-ts-tw-npm.json +0 -33
- package/tests/snapshots/cra/solid-cr-js-npm.json +0 -31
- package/tests/snapshots/cra/solid-cr-ts-npm.json +0 -32
- package/tests/snapshots/cra/solid-cr-ts-start-npm.json +0 -36
- package/tests/snapshots/cra/solid-fr-ts-npm.json +0 -33
- package/tests/snapshots/cra/solid-fr-ts-tw-npm.json +0 -32
- package/tests/test-utilities.ts +0 -87
package/dist/create-app.js
CHANGED
|
@@ -1,497 +1,113 @@
|
|
|
1
|
-
import { basename,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { format } from 'prettier';
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
import { getTemplatesRoot } from './templates.js';
|
|
7
|
-
import { CODE_ROUTER, FILE_ROUTER } from './constants.js';
|
|
8
|
-
import { sortObject } from './utils.js';
|
|
1
|
+
import { basename, resolve } from 'node:path';
|
|
2
|
+
import { getBinaryFile } from './file-helpers.js';
|
|
3
|
+
import { formatCommand } from './utils.js';
|
|
9
4
|
import { writeConfigFile } from './config-file.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
import { getPackageManagerScriptCommand, packageManagerInstall, } from './package-manager.js';
|
|
6
|
+
import { createPackageJSON } from './package-json.js';
|
|
7
|
+
import { createTemplateFile } from './template-file.js';
|
|
8
|
+
import { installShadcnComponents } from './integrations/shadcn.js';
|
|
9
|
+
import { setupGit } from './integrations/git.js';
|
|
10
|
+
async function writeFiles(environment, targetDir, options) {
|
|
11
|
+
const templateFileFromContent = createTemplateFile(environment, options, targetDir);
|
|
12
|
+
async function writeFileBundle(bundle) {
|
|
13
|
+
const files = await bundle.getFiles();
|
|
16
14
|
for (const file of files) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
const contents = await bundle.getFileContents(file);
|
|
16
|
+
const binaryFile = getBinaryFile(contents);
|
|
17
|
+
if (binaryFile) {
|
|
18
|
+
await environment.writeFile(resolve(targetDir, file), binaryFile);
|
|
21
19
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
function jsSafeName(name) {
|
|
27
|
-
return name
|
|
28
|
-
.split(/[^a-zA-Z0-9]/)
|
|
29
|
-
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
30
|
-
.join('');
|
|
31
|
-
}
|
|
32
|
-
function createTemplateFile(environment, projectName, options, targetDir) {
|
|
33
|
-
return async function templateFile(file, content, targetFileName, extraTemplateValues) {
|
|
34
|
-
function getPackageManagerAddScript(packageName, isDev = false) {
|
|
35
|
-
let command;
|
|
36
|
-
switch (options.packageManager) {
|
|
37
|
-
case 'yarn':
|
|
38
|
-
case 'pnpm':
|
|
39
|
-
command = isDev
|
|
40
|
-
? `${options.packageManager} add ${packageName} --dev`
|
|
41
|
-
: `${options.packageManager} add ${packageName}`;
|
|
42
|
-
break;
|
|
43
|
-
default:
|
|
44
|
-
command = isDev
|
|
45
|
-
? `${options.packageManager} install ${packageName} -D`
|
|
46
|
-
: `${options.packageManager} install ${packageName}`;
|
|
47
|
-
break;
|
|
20
|
+
else {
|
|
21
|
+
await templateFileFromContent(file, contents);
|
|
48
22
|
}
|
|
49
|
-
return command;
|
|
50
|
-
}
|
|
51
|
-
function getPackageManagerRunScript(scriptName) {
|
|
52
|
-
let command;
|
|
53
|
-
switch (options.packageManager) {
|
|
54
|
-
case 'yarn':
|
|
55
|
-
case 'pnpm':
|
|
56
|
-
command = `${options.packageManager} ${scriptName}`;
|
|
57
|
-
break;
|
|
58
|
-
case 'deno':
|
|
59
|
-
command = `${options.packageManager} task ${scriptName}`;
|
|
60
|
-
break;
|
|
61
|
-
default:
|
|
62
|
-
command = `${options.packageManager} run ${scriptName}`;
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
return command;
|
|
66
|
-
}
|
|
67
|
-
const templateValues = {
|
|
68
|
-
packageManager: options.packageManager,
|
|
69
|
-
projectName: projectName,
|
|
70
|
-
typescript: options.typescript,
|
|
71
|
-
tailwind: options.tailwind,
|
|
72
|
-
toolchain: options.toolchain,
|
|
73
|
-
js: options.typescript ? 'ts' : 'js',
|
|
74
|
-
jsx: options.typescript ? 'tsx' : 'jsx',
|
|
75
|
-
fileRouter: options.mode === FILE_ROUTER,
|
|
76
|
-
codeRouter: options.mode === CODE_ROUTER,
|
|
77
|
-
addOnEnabled: options.chosenAddOns.reduce((acc, addOn) => {
|
|
78
|
-
acc[addOn.id] = true;
|
|
79
|
-
return acc;
|
|
80
|
-
}, {}),
|
|
81
|
-
addOns: options.chosenAddOns,
|
|
82
|
-
...extraTemplateValues,
|
|
83
|
-
getPackageManagerAddScript,
|
|
84
|
-
getPackageManagerRunScript,
|
|
85
|
-
};
|
|
86
|
-
try {
|
|
87
|
-
content = render(content, templateValues);
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
console.error(chalk.red(`EJS error in file ${file}`));
|
|
91
|
-
console.error(error);
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
const target = targetFileName ?? file.replace('.ejs', '');
|
|
95
|
-
if (target.endsWith('.ts') || target.endsWith('.tsx')) {
|
|
96
|
-
content = await format(content, {
|
|
97
|
-
semi: false,
|
|
98
|
-
singleQuote: true,
|
|
99
|
-
trailingComma: 'all',
|
|
100
|
-
parser: 'typescript',
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
await environment.writeFile(resolve(targetDir, target), content);
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
async function createPackageJSON(environment, projectName, options, templateDir, routerDir, targetDir, addOns) {
|
|
107
|
-
let packageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.json'), 'utf8'));
|
|
108
|
-
packageJSON.name = projectName;
|
|
109
|
-
if (options.typescript) {
|
|
110
|
-
const tsPackageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.ts.json'), 'utf8'));
|
|
111
|
-
packageJSON = {
|
|
112
|
-
...packageJSON,
|
|
113
|
-
devDependencies: {
|
|
114
|
-
...packageJSON.devDependencies,
|
|
115
|
-
...tsPackageJSON.devDependencies,
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
if (options.tailwind) {
|
|
120
|
-
const twPackageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.tw.json'), 'utf8'));
|
|
121
|
-
packageJSON = {
|
|
122
|
-
...packageJSON,
|
|
123
|
-
dependencies: {
|
|
124
|
-
...packageJSON.dependencies,
|
|
125
|
-
...twPackageJSON.dependencies,
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
if (options.toolchain === 'biome') {
|
|
130
|
-
const biomePackageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.biome.json'), 'utf8'));
|
|
131
|
-
packageJSON = {
|
|
132
|
-
...packageJSON,
|
|
133
|
-
scripts: {
|
|
134
|
-
...packageJSON.scripts,
|
|
135
|
-
...biomePackageJSON.scripts,
|
|
136
|
-
},
|
|
137
|
-
devDependencies: {
|
|
138
|
-
...packageJSON.devDependencies,
|
|
139
|
-
...biomePackageJSON.devDependencies,
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
if (options.toolchain === 'eslint+prettier') {
|
|
144
|
-
const eslintPrettierPackageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.eslintprettier.json'), 'utf-8'));
|
|
145
|
-
packageJSON = {
|
|
146
|
-
...packageJSON,
|
|
147
|
-
scripts: {
|
|
148
|
-
...packageJSON.scripts,
|
|
149
|
-
...eslintPrettierPackageJSON.scripts,
|
|
150
|
-
},
|
|
151
|
-
devDependencies: {
|
|
152
|
-
...packageJSON.devDependencies,
|
|
153
|
-
...eslintPrettierPackageJSON.devDependencies,
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
if (options.mode === FILE_ROUTER) {
|
|
158
|
-
const frPackageJSON = JSON.parse(await environment.readFile(resolve(routerDir, 'package.fr.json'), 'utf8'));
|
|
159
|
-
packageJSON = {
|
|
160
|
-
...packageJSON,
|
|
161
|
-
dependencies: {
|
|
162
|
-
...packageJSON.dependencies,
|
|
163
|
-
...frPackageJSON.dependencies,
|
|
164
|
-
},
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
for (const addOn of addOns) {
|
|
168
|
-
packageJSON = {
|
|
169
|
-
...packageJSON,
|
|
170
|
-
dependencies: {
|
|
171
|
-
...packageJSON.dependencies,
|
|
172
|
-
...addOn.dependencies,
|
|
173
|
-
},
|
|
174
|
-
devDependencies: {
|
|
175
|
-
...packageJSON.devDependencies,
|
|
176
|
-
...addOn.devDependencies,
|
|
177
|
-
},
|
|
178
|
-
scripts: {
|
|
179
|
-
...packageJSON.scripts,
|
|
180
|
-
...addOn.scripts,
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
packageJSON.dependencies = sortObject(packageJSON.dependencies);
|
|
185
|
-
packageJSON.devDependencies = sortObject(packageJSON.devDependencies);
|
|
186
|
-
await environment.writeFile(resolve(targetDir, 'package.json'), JSON.stringify(packageJSON, null, 2));
|
|
187
|
-
}
|
|
188
|
-
async function copyAddOnFile(environment, content, target, targetPath, templateFile) {
|
|
189
|
-
let targetFile = basename(target).replace(/^_dot_/, '.');
|
|
190
|
-
let isTemplate = false;
|
|
191
|
-
if (targetFile.endsWith('.ejs')) {
|
|
192
|
-
targetFile = targetFile.replace('.ejs', '');
|
|
193
|
-
isTemplate = true;
|
|
194
|
-
}
|
|
195
|
-
let isAppend = false;
|
|
196
|
-
if (targetFile.endsWith('.append')) {
|
|
197
|
-
targetFile = targetFile.replace('.append', '');
|
|
198
|
-
isAppend = true;
|
|
199
|
-
}
|
|
200
|
-
const finalTargetPath = resolve(dirname(targetPath), targetFile);
|
|
201
|
-
const binaryContent = getBinaryFile(content);
|
|
202
|
-
if (binaryContent) {
|
|
203
|
-
await environment.writeFile(finalTargetPath, binaryContent);
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
if (isTemplate) {
|
|
207
|
-
await templateFile(content, finalTargetPath);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
if (isAppend) {
|
|
211
|
-
await environment.appendFile(finalTargetPath, content);
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
await environment.writeFile(finalTargetPath, content);
|
|
215
23
|
}
|
|
216
24
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
environment.startRun();
|
|
220
|
-
const templateDirBase = resolve(getTemplatesRoot(), options.framework, 'base');
|
|
221
|
-
const templateDirRouter = resolve(getTemplatesRoot(), options.framework, options.mode);
|
|
222
|
-
let targetDir = cwd || '';
|
|
223
|
-
if (!targetDir.length) {
|
|
224
|
-
targetDir = resolve(process.cwd(), options.projectName);
|
|
225
|
-
if (environment.exists(targetDir)) {
|
|
226
|
-
if (!silent) {
|
|
227
|
-
log.error(`Directory "${options.projectName}" already exists`);
|
|
228
|
-
}
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
const copyFiles = createCopyFiles(environment, targetDir);
|
|
233
|
-
const templateFileFromContent = createTemplateFile(environment, options.projectName, options, targetDir);
|
|
234
|
-
async function templateFile(templateBase, file, targetFileName, extraTemplateValues) {
|
|
235
|
-
const content = await environment.readFile(resolve(templateBase, file), 'utf-8');
|
|
236
|
-
return templateFileFromContent(file, content.toString(), targetFileName, extraTemplateValues);
|
|
237
|
-
}
|
|
238
|
-
const isAddOnEnabled = (id) => options.chosenAddOns.find((a) => a.id === id);
|
|
239
|
-
async function runAddOn(addOn) {
|
|
240
|
-
if (addOn.files) {
|
|
241
|
-
for (const file of Object.keys(addOn.files)) {
|
|
242
|
-
await copyAddOnFile(environment, addOn.files[file], file, resolve(targetDir, file), (content, targetFileName) => templateFileFromContent(targetFileName, content));
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
if (addOn.deletedFiles) {
|
|
246
|
-
for (const file of addOn.deletedFiles) {
|
|
247
|
-
await environment.deleteFile(resolve(targetDir, file));
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
if (addOn.command && addOn.command.command) {
|
|
251
|
-
await environment.execute(addOn.command.command, addOn.command.args || [], resolve(targetDir));
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
// Setup the .vscode directory
|
|
255
|
-
switch (options.toolchain) {
|
|
256
|
-
case 'biome':
|
|
257
|
-
await environment.copyFile(resolve(templateDirBase, '_dot_vscode/settings.biome.json'), resolve(targetDir, '.vscode/settings.json'));
|
|
258
|
-
break;
|
|
259
|
-
case 'none':
|
|
260
|
-
default:
|
|
261
|
-
await environment.copyFile(resolve(templateDirBase, '_dot_vscode/settings.json'), resolve(targetDir, '.vscode/settings.json'));
|
|
262
|
-
}
|
|
263
|
-
// Fill the public directory
|
|
264
|
-
copyFiles(templateDirBase, [
|
|
265
|
-
'./public/robots.txt',
|
|
266
|
-
'./public/favicon.ico',
|
|
267
|
-
'./public/manifest.json',
|
|
268
|
-
'./public/logo192.png',
|
|
269
|
-
'./public/logo512.png',
|
|
270
|
-
]);
|
|
271
|
-
// Check for a .cursorrules file
|
|
272
|
-
if (environment.exists(resolve(templateDirBase, '.cursorrules'))) {
|
|
273
|
-
await environment.copyFile(resolve(templateDirBase, '.cursorrules'), resolve(targetDir, '.cursorrules'));
|
|
274
|
-
}
|
|
275
|
-
// Copy in Vite and Tailwind config and CSS
|
|
276
|
-
if (!options.tailwind) {
|
|
277
|
-
await copyFiles(templateDirBase, ['./src/App.css']);
|
|
278
|
-
}
|
|
279
|
-
// Don't create a vite.config.js file if we are building a Start app
|
|
280
|
-
if (!isAddOnEnabled('start')) {
|
|
281
|
-
await templateFile(templateDirBase, './vite.config.js.ejs');
|
|
282
|
-
}
|
|
283
|
-
await templateFile(templateDirBase, './src/styles.css.ejs');
|
|
284
|
-
copyFiles(templateDirBase, ['./src/logo.svg']);
|
|
285
|
-
if (options.toolchain === 'biome') {
|
|
286
|
-
copyFiles(templateDirBase, ['./toolchain/biome.json'], true);
|
|
287
|
-
}
|
|
288
|
-
if (options.toolchain === 'eslint+prettier') {
|
|
289
|
-
copyFiles(templateDirBase, [
|
|
290
|
-
'./toolchain/eslint.config.js',
|
|
291
|
-
'./toolchain/prettier.config.js',
|
|
292
|
-
'./toolchain/.prettierignore',
|
|
293
|
-
], true);
|
|
294
|
-
}
|
|
295
|
-
// Setup reportWebVitals
|
|
296
|
-
if (!isAddOnEnabled('start') && options.framework === 'react') {
|
|
297
|
-
if (options.typescript) {
|
|
298
|
-
await templateFile(templateDirBase, './src/reportWebVitals.ts.ejs');
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
await templateFile(templateDirBase, './src/reportWebVitals.ts.ejs', './src/reportWebVitals.js');
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
if (!isAddOnEnabled('start')) {
|
|
305
|
-
await templateFile(templateDirBase, './index.html.ejs');
|
|
306
|
-
}
|
|
307
|
-
// Add .gitignore
|
|
308
|
-
await environment.copyFile(resolve(templateDirBase, '_dot_gitignore'), resolve(targetDir, '.gitignore'));
|
|
309
|
-
// Setup tsconfig
|
|
310
|
-
if (options.typescript) {
|
|
311
|
-
await templateFile(templateDirBase, './tsconfig.json.ejs', './tsconfig.json');
|
|
312
|
-
}
|
|
313
|
-
// Setup the package.json file, optionally with typescript, tailwind and formatter/linter
|
|
314
|
-
await createPackageJSON(environment, options.projectName, options, templateDirBase, templateDirRouter, targetDir, options.chosenAddOns.map((addOn) => addOn.packageAdditions));
|
|
315
|
-
// Copy all the asset files from the addons
|
|
316
|
-
const s = silent ? null : spinner();
|
|
317
|
-
for (const type of ['add-on', 'example']) {
|
|
25
|
+
await writeFileBundle(options.framework);
|
|
26
|
+
for (const type of ['add-on', 'example', 'toolchain']) {
|
|
318
27
|
for (const phase of ['setup', 'add-on', 'example']) {
|
|
319
28
|
for (const addOn of options.chosenAddOns.filter((addOn) => addOn.phase === phase && addOn.type === type)) {
|
|
320
|
-
|
|
321
|
-
await runAddOn(addOn);
|
|
322
|
-
s?.stop(`${addOn.name} setup complete`);
|
|
29
|
+
await writeFileBundle(addOn);
|
|
323
30
|
}
|
|
324
31
|
}
|
|
325
32
|
}
|
|
326
|
-
if (
|
|
327
|
-
|
|
328
|
-
for (const addOn of options.chosenAddOns) {
|
|
329
|
-
if (addOn.shadcnComponents) {
|
|
330
|
-
for (const component of addOn.shadcnComponents) {
|
|
331
|
-
shadcnComponents.add(component);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
if (options.overlay) {
|
|
336
|
-
if (options.overlay.shadcnComponents) {
|
|
337
|
-
for (const component of options.overlay.shadcnComponents) {
|
|
338
|
-
shadcnComponents.add(component);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
if (shadcnComponents.size > 0) {
|
|
343
|
-
s?.start(`Installing shadcn components (${Array.from(shadcnComponents).join(', ')})...`);
|
|
344
|
-
await packageManagerExecute(environment, options.packageManager, 'shadcn@latest', ['add', '--silent', '--yes', ...shadcnComponents], resolve(targetDir));
|
|
345
|
-
s?.stop(`Installed additional shadcn components`);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
const integrations = [];
|
|
349
|
-
if (environment.exists(resolve(targetDir, 'src/integrations'))) {
|
|
350
|
-
for (const integration of environment.readdir(resolve(targetDir, 'src/integrations'))) {
|
|
351
|
-
const integrationName = jsSafeName(integration);
|
|
352
|
-
if (environment.exists(resolve(targetDir, 'src/integrations', integration, 'layout.tsx'))) {
|
|
353
|
-
integrations.push({
|
|
354
|
-
type: 'layout',
|
|
355
|
-
name: `${integrationName}Layout`,
|
|
356
|
-
path: `integrations/${integration}/layout`,
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
if (environment.exists(resolve(targetDir, 'src/integrations', integration, 'provider.tsx'))) {
|
|
360
|
-
integrations.push({
|
|
361
|
-
type: 'provider',
|
|
362
|
-
name: `${integrationName}Provider`,
|
|
363
|
-
path: `integrations/${integration}/provider`,
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
if (environment.exists(resolve(targetDir, 'src/integrations', integration, 'root-provider.tsx'))) {
|
|
367
|
-
integrations.push({
|
|
368
|
-
type: 'root-provider',
|
|
369
|
-
name: integrationName,
|
|
370
|
-
path: `integrations/${integration}/root-provider`,
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
if (environment.exists(resolve(targetDir, 'src/integrations', integration, 'header-user.tsx'))) {
|
|
374
|
-
integrations.push({
|
|
375
|
-
type: 'header-user',
|
|
376
|
-
name: `${integrationName}Header`,
|
|
377
|
-
path: `integrations/${integration}/header-user`,
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
const routes = [];
|
|
383
|
-
if (environment.exists(resolve(targetDir, 'src/routes'))) {
|
|
384
|
-
for (const file of environment.readdir(resolve(targetDir, 'src/routes'))) {
|
|
385
|
-
const name = file.replace(/\.tsx?|\.jsx?/, '');
|
|
386
|
-
const safeRouteName = jsSafeName(name);
|
|
387
|
-
routes.push({
|
|
388
|
-
path: `./routes/${name}`,
|
|
389
|
-
name: safeRouteName,
|
|
390
|
-
});
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
// Create the main entry point
|
|
394
|
-
if (!isAddOnEnabled('start')) {
|
|
395
|
-
if (options.typescript) {
|
|
396
|
-
await templateFile(templateDirRouter, './src/main.tsx.ejs', './src/main.tsx', {
|
|
397
|
-
routes,
|
|
398
|
-
integrations,
|
|
399
|
-
});
|
|
400
|
-
}
|
|
401
|
-
else {
|
|
402
|
-
await templateFile(templateDirRouter, './src/main.tsx.ejs', './src/main.jsx', {
|
|
403
|
-
routes,
|
|
404
|
-
integrations,
|
|
405
|
-
});
|
|
406
|
-
}
|
|
33
|
+
if (options.starter) {
|
|
34
|
+
await writeFileBundle(options.starter);
|
|
407
35
|
}
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
36
|
+
await environment.writeFile(resolve(targetDir, './package.json'), JSON.stringify(createPackageJSON(options), null, 2));
|
|
37
|
+
await writeConfigFile(environment, targetDir, options);
|
|
38
|
+
}
|
|
39
|
+
async function runCommandsAndInstallDependencies(environment, targetDir, options, silent) {
|
|
40
|
+
const s = silent ? null : environment.spinner();
|
|
41
|
+
// Setup git
|
|
42
|
+
if (options.git) {
|
|
43
|
+
s?.start(`Initializing git repository...`);
|
|
44
|
+
await setupGit(environment, targetDir);
|
|
45
|
+
s?.stop(`Initialized git repository`);
|
|
414
46
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
47
|
+
// Install dependencies
|
|
48
|
+
s?.start(`Installing dependencies via ${options.packageManager}...`);
|
|
49
|
+
await packageManagerInstall(environment, resolve(targetDir), options.packageManager);
|
|
50
|
+
s?.stop(`Installed dependencies`);
|
|
51
|
+
for (const phase of ['setup', 'add-on', 'example']) {
|
|
52
|
+
for (const addOn of options.chosenAddOns.filter((addOn) => addOn.phase === phase && addOn.command && addOn.command.command)) {
|
|
53
|
+
s?.start(`Setting up ${addOn.name}...`);
|
|
54
|
+
await environment.execute(addOn.command.command, addOn.command.args || [], resolve(targetDir));
|
|
55
|
+
s?.stop(`${addOn.name} setup complete`);
|
|
419
56
|
}
|
|
420
57
|
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
58
|
+
// Adding starter
|
|
59
|
+
if (options.starter &&
|
|
60
|
+
options.starter.command &&
|
|
61
|
+
options.starter.command.command) {
|
|
62
|
+
s?.start(`Setting up starter ${options.starter.name}...`);
|
|
63
|
+
await environment.execute(options.starter.command.command, options.starter.command.args || [], resolve(targetDir));
|
|
64
|
+
s?.stop(`Starter ${options.starter.name} setup complete`);
|
|
427
65
|
}
|
|
66
|
+
await installShadcnComponents(environment, targetDir, options, silent);
|
|
67
|
+
}
|
|
68
|
+
function report(environment, options, appName, targetDir) {
|
|
428
69
|
const warnings = [];
|
|
429
70
|
for (const addOn of options.chosenAddOns) {
|
|
430
71
|
if (addOn.warning) {
|
|
431
72
|
warnings.push(addOn.warning);
|
|
432
73
|
}
|
|
433
74
|
}
|
|
434
|
-
// Create the README.md
|
|
435
|
-
await templateFile(templateDirBase, 'README.md.ejs');
|
|
436
|
-
// Adding overlay
|
|
437
|
-
if (options.overlay) {
|
|
438
|
-
s?.start(`Setting up overlay ${options.overlay.name}...`);
|
|
439
|
-
await runAddOn(options.overlay);
|
|
440
|
-
s?.stop(`Overlay ${options.overlay.name} setup complete`);
|
|
441
|
-
}
|
|
442
|
-
// Install dependencies
|
|
443
|
-
s?.start(`Installing dependencies via ${options.packageManager}...`);
|
|
444
|
-
await environment.execute(options.packageManager, ['install'], resolve(targetDir));
|
|
445
|
-
s?.stop(`Installed dependencies`);
|
|
446
75
|
if (warnings.length > 0) {
|
|
447
|
-
|
|
448
|
-
log.warn(chalk.red(warnings.join('\n')));
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
if (options.toolchain === 'biome') {
|
|
452
|
-
s?.start(`Applying toolchain ${options.toolchain}...`);
|
|
453
|
-
switch (options.packageManager) {
|
|
454
|
-
case 'pnpm':
|
|
455
|
-
// pnpm automatically forwards extra arguments
|
|
456
|
-
await environment.execute(options.packageManager, ['run', 'check', '--fix'], resolve(targetDir));
|
|
457
|
-
break;
|
|
458
|
-
default:
|
|
459
|
-
await environment.execute(options.packageManager, ['run', 'check', '--', '--fix'], resolve(targetDir));
|
|
460
|
-
break;
|
|
461
|
-
}
|
|
462
|
-
s?.stop(`Applied toolchain ${options.toolchain}...`);
|
|
463
|
-
}
|
|
464
|
-
if (options.toolchain === 'eslint+prettier') {
|
|
465
|
-
s?.start(`Applying toolchain ${options.toolchain}...`);
|
|
466
|
-
await environment.execute(options.packageManager, ['run', 'check'], targetDir);
|
|
467
|
-
s?.stop(`Applied toolchain ${options.toolchain}...`);
|
|
468
|
-
}
|
|
469
|
-
if (options.git) {
|
|
470
|
-
s?.start(`Initializing git repository...`);
|
|
471
|
-
await environment.execute('git', ['init'], resolve(targetDir));
|
|
472
|
-
s?.stop(`Initialized git repository`);
|
|
76
|
+
environment.warn('Warnings', warnings.join('\n'));
|
|
473
77
|
}
|
|
474
|
-
|
|
475
|
-
environment.finishRun();
|
|
78
|
+
// Format errors
|
|
476
79
|
let errorStatement = '';
|
|
477
80
|
if (environment.getErrors().length) {
|
|
478
81
|
errorStatement = `
|
|
479
82
|
|
|
480
|
-
|
|
83
|
+
Errors were encountered during this process:
|
|
481
84
|
|
|
482
85
|
${environment.getErrors().join('\n')}`;
|
|
483
86
|
}
|
|
484
|
-
|
|
485
|
-
let startCommand = `${options.packageManager} ${isAddOnEnabled('start') ? 'dev' : 'start'}`;
|
|
486
|
-
if (options.packageManager === 'deno') {
|
|
487
|
-
startCommand = `deno ${isAddOnEnabled('start') ? 'task dev' : 'start'}`;
|
|
488
|
-
}
|
|
489
|
-
outro(`Your ${appName} app is ready in '${basename(targetDir)}'.
|
|
87
|
+
environment.outro(`Your ${appName} app is ready in '${basename(targetDir)}'.
|
|
490
88
|
|
|
491
89
|
Use the following commands to start your app:
|
|
492
90
|
% cd ${options.projectName}
|
|
493
|
-
% ${
|
|
91
|
+
% ${formatCommand(getPackageManagerScriptCommand(options.packageManager, ['dev']))}
|
|
494
92
|
|
|
495
|
-
Please
|
|
93
|
+
Please check the README.md for more information on testing, styling, adding routes, etc.${errorStatement}`);
|
|
94
|
+
}
|
|
95
|
+
export async function createApp(options, { silent = false, environment, cwd, appName = 'TanStack', }) {
|
|
96
|
+
environment.startRun();
|
|
97
|
+
let targetDir = cwd || '';
|
|
98
|
+
if (!targetDir.length) {
|
|
99
|
+
targetDir = resolve(process.cwd(), options.projectName);
|
|
100
|
+
if (environment.exists(targetDir)) {
|
|
101
|
+
if (!silent) {
|
|
102
|
+
environment.error(`Directory "${options.projectName}" already exists`);
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
await writeFiles(environment, targetDir, options);
|
|
108
|
+
await runCommandsAndInstallDependencies(environment, targetDir, options, silent);
|
|
109
|
+
environment.finishRun();
|
|
110
|
+
if (!silent) {
|
|
111
|
+
report(environment, options, appName, targetDir);
|
|
496
112
|
}
|
|
497
113
|
}
|
package/dist/environment.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { appendFile, copyFile, mkdir, readFile, unlink, writeFile, } from 'node:fs/promises';
|
|
2
|
-
import { existsSync
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
3
|
import { dirname } from 'node:path';
|
|
4
4
|
import { execa } from 'execa';
|
|
5
5
|
import { memfs } from 'memfs';
|
|
@@ -36,13 +36,17 @@ export function createDefaultEnvironment() {
|
|
|
36
36
|
deleteFile: async (path) => {
|
|
37
37
|
await unlink(path);
|
|
38
38
|
},
|
|
39
|
-
readFile: (path, encoding) => readFile(path, { encoding: encoding || 'utf8' }),
|
|
40
39
|
exists: (path) => existsSync(path),
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
},
|
|
40
|
+
intro: () => { },
|
|
41
|
+
outro: () => { },
|
|
42
|
+
info: () => { },
|
|
43
|
+
error: () => { },
|
|
44
|
+
warn: () => { },
|
|
45
|
+
confirm: () => Promise.resolve(true),
|
|
46
|
+
spinner: () => ({
|
|
47
|
+
start: () => { },
|
|
48
|
+
stop: () => { },
|
|
49
|
+
}),
|
|
46
50
|
};
|
|
47
51
|
}
|
|
48
52
|
export function createMemoryEnvironment() {
|
|
@@ -77,12 +81,6 @@ export function createMemoryEnvironment() {
|
|
|
77
81
|
});
|
|
78
82
|
return Promise.resolve();
|
|
79
83
|
};
|
|
80
|
-
environment.readFile = async (path, encoding) => {
|
|
81
|
-
if (isTemplatePath(path)) {
|
|
82
|
-
return (await readFile(path, encoding)).toString();
|
|
83
|
-
}
|
|
84
|
-
return fs.readFileSync(path, 'utf8').toString();
|
|
85
|
-
};
|
|
86
84
|
environment.writeFile = async (path, contents) => {
|
|
87
85
|
fs.mkdirSync(dirname(path), { recursive: true });
|
|
88
86
|
await fs.writeFileSync(path, contents);
|
|
@@ -96,19 +94,6 @@ export function createMemoryEnvironment() {
|
|
|
96
94
|
}
|
|
97
95
|
return fs.existsSync(path);
|
|
98
96
|
};
|
|
99
|
-
environment.readdir = (path) => {
|
|
100
|
-
if (isTemplatePath(path)) {
|
|
101
|
-
return readdirSync(path);
|
|
102
|
-
}
|
|
103
|
-
return fs.readdirSync(path).map((file) => file.toString());
|
|
104
|
-
};
|
|
105
|
-
environment.isDirectory = (path) => {
|
|
106
|
-
if (isTemplatePath(path)) {
|
|
107
|
-
const stat = statSync(path);
|
|
108
|
-
return stat.isDirectory();
|
|
109
|
-
}
|
|
110
|
-
return fs.statSync(path).isDirectory();
|
|
111
|
-
};
|
|
112
97
|
environment.finishRun = () => {
|
|
113
98
|
output.files = vol.toJSON();
|
|
114
99
|
};
|