create-convex-monorepo 0.2.1 → 0.3.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/CONTRIBUTING.md +18 -0
- package/README.md +74 -3
- package/assets/setup/convex-setup.d.mts +16 -0
- package/dist/cli/index.js +3 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/workspace.d.ts +2 -0
- package/dist/cli/workspace.js +19 -0
- package/dist/cli/workspace.js.map +1 -0
- package/dist/commands/create.d.ts +1 -1
- package/dist/commands/create.js +5 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/entry.d.ts +1 -0
- package/dist/commands/entry.js +93 -0
- package/dist/commands/entry.js.map +1 -0
- package/dist/commands/workspace.d.ts +20 -0
- package/dist/commands/workspace.js +272 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/generator/context.js +5 -2
- package/dist/generator/context.js.map +1 -1
- package/dist/generator/format.d.ts +9 -0
- package/dist/generator/format.js +47 -0
- package/dist/generator/format.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/templates/root/index.js +7 -1
- package/dist/templates/root/index.js.map +1 -1
- package/dist/templates/versions.d.ts +1 -0
- package/dist/templates/versions.js +1 -0
- package/dist/templates/versions.js.map +1 -1
- package/dist/workspace/add.d.ts +9 -0
- package/dist/workspace/add.js +326 -0
- package/dist/workspace/add.js.map +1 -0
- package/dist/workspace/changes.d.ts +23 -0
- package/dist/workspace/changes.js +157 -0
- package/dist/workspace/changes.js.map +1 -0
- package/dist/workspace/doctor.d.ts +16 -0
- package/dist/workspace/doctor.js +483 -0
- package/dist/workspace/doctor.js.map +1 -0
- package/dist/workspace/env.d.ts +12 -0
- package/dist/workspace/env.js +50 -0
- package/dist/workspace/env.js.map +1 -0
- package/dist/workspace/project.d.ts +28 -0
- package/dist/workspace/project.js +147 -0
- package/dist/workspace/project.js.map +1 -0
- package/dist/workspace/upgrade.d.ts +17 -0
- package/dist/workspace/upgrade.js +86 -0
- package/dist/workspace/upgrade.js.map +1 -0
- package/docs/adding-a-framework.md +6 -0
- package/docs/adding-an-auth-provider.md +8 -0
- package/docs/architecture.md +15 -1
- package/docs/releases.md +2 -1
- package/docs/verification.md +24 -0
- package/package.json +8 -5
package/CONTRIBUTING.md
CHANGED
|
@@ -34,6 +34,24 @@ Describe the failing behavior, the generated combination involved, and the expec
|
|
|
34
34
|
|
|
35
35
|
Check current upstream documentation before changing Convex generation, exports, bundler resolution, or SDK versions. Record compatibility findings in `docs/research.md`. Do not edit Convex-generated internals, cast away shared API types, or suppress errors to pass a build. Refresh official generated assets through supported Convex tooling when the example backend changes.
|
|
36
36
|
|
|
37
|
+
## Workspace command development
|
|
38
|
+
|
|
39
|
+
`pnpm dev:workspace --help` runs the management CLI from source. Run it inside a generated fixture by invoking the built `convex-monorepo` binary or using the exported planning APIs in tests. `pnpm test:workspace:e2e` generates one app, adds the remaining frameworks, adds Clerk, syncs URLs, installs dependencies, and runs doctor, typechecks, lint, and builds. Set `CCM_EXAMPLE=none` to test adding apps after Clerk configuration on a blank project.
|
|
40
|
+
|
|
41
|
+
Changes to mutation commands need tests for customized files, preflight conflicts, dry runs, cancellation, and preservation of unrelated content. Diagnostic tests should include both missing dependencies and real installed type resolution. Mock registry responses in unit tests for upgrade checks.
|
|
42
|
+
|
|
43
|
+
## Contribution and review process
|
|
44
|
+
|
|
45
|
+
Fork the repository, make changes on a branch in your fork, and open a pull request against `main`. A fork is your own copy; creating one or pushing to it does not change this repository or grant access to it.
|
|
46
|
+
|
|
47
|
+
Outside-contributor workflows require maintainer approval before they run. Approval to run CI only permits the tests to execute; it does not approve or merge the change. Fork PR workflows run with read-only repository permissions and do not receive repository secrets.
|
|
48
|
+
|
|
49
|
+
The normal merge requirements are a passing `CI passed` check, a passing `Conventional PR title` check, an approving review, and resolved review conversations. New commits dismiss previous approvals. `.github/CODEOWNERS` names `@adamtrip` for all files, including itself and the release workflows. GitHub reads code ownership from the PR's target branch, so this requirement starts applying once the file is on `main`.
|
|
50
|
+
|
|
51
|
+
Auto-merge is disabled. The `main` push allowlist contains only `@adamtrip`; passing CI does not give contributors permission to merge. Release-please creates release PRs, but does not merge them. The maintainer decides when a release PR is ready, and merging it starts automated npm publication.
|
|
52
|
+
|
|
53
|
+
Repository administrators retain GitHub's branch-protection override. This permits the sole maintainer to merge their own PRs, which GitHub does not let them approve. The override also applies to tools authenticated as that administrator; it is not a separate human-approval mechanism. Adding another administrator or granting access to an admin credential grants that power too. Routine contributions should use PRs, and automation should not use the override to merge contributions without the maintainer's explicit instruction.
|
|
54
|
+
|
|
37
55
|
## Tests and pull requests
|
|
38
56
|
|
|
39
57
|
Add focused regression tests for the behavior being fixed. Run generated-app typechecks and builds for affected frameworks and auth choices. For Expo, include Metro export evidence. Report exact checks run, failures, skipped checks, and whether real backend/auth interaction was exercised. Never include deployment keys or personal environment files in fixtures or logs.
|
package/README.md
CHANGED
|
@@ -26,6 +26,66 @@ Both commands run the same CLI. You can also install it globally with `npm insta
|
|
|
26
26
|
|
|
27
27
|
Contributors can run the checkout with `pnpm dev`; see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
28
28
|
|
|
29
|
+
## Manage an existing workspace
|
|
30
|
+
|
|
31
|
+
Run the same CLI from the workspace root or any subdirectory. No global or project installation is needed:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npx create-convex-monorepo@latest
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
With a terminal attached, it detects `convex-monorepo.json` and offers a menu to add an app, add Clerk, check the workspace, sync frontend URLs, or check for updates. Without a terminal, it prints management help without changing files.
|
|
38
|
+
|
|
39
|
+
You can also run each command directly:
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
npx create-convex-monorepo@latest add app admin --framework vite --example none --dry-run
|
|
43
|
+
npx create-convex-monorepo@latest add app admin --framework vite --example none --install
|
|
44
|
+
npx create-convex-monorepo@latest add app mobile --framework expo --no-install
|
|
45
|
+
npx create-convex-monorepo@latest add auth clerk --dry-run
|
|
46
|
+
npx create-convex-monorepo@latest add auth clerk --install
|
|
47
|
+
npx create-convex-monorepo@latest env sync --app mobile
|
|
48
|
+
npx create-convex-monorepo@latest doctor
|
|
49
|
+
npx create-convex-monorepo@latest upgrade --check
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The same commands work through pnpm:
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
pnpm create convex-monorepo@latest add app admin --framework vite --no-install
|
|
56
|
+
pnpm create convex-monorepo@latest doctor
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The separate `convex-monorepo` binary remains available for users who install the package locally or globally. For example, after `pnpm add -Dw create-convex-monorepo@latest`, run `pnpm exec convex-monorepo doctor`.
|
|
60
|
+
|
|
61
|
+
To explicitly generate a new project, use `create <project-name>`. This also lets you use a command name such as `doctor` as the project name:
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
npx create-convex-monorepo@latest create doctor --apps vite --no-install --no-git
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
| Command | Behavior |
|
|
68
|
+
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
69
|
+
| `add app` | Creates an app using the existing backend and auth, updates root scripts and metadata, and links the public backend URL when configured. |
|
|
70
|
+
| `add auth clerk` | Adds Clerk to generated app providers and the backend auth configuration. Customized files that need replacement cause a conflict. |
|
|
71
|
+
| `env sync` | Links only the public backend URL, using each framework's variable prefix. Supports `--app` and `--dry-run`. |
|
|
72
|
+
| `doctor` | Checks workspace configuration, installed dependencies, environment settings, and shared API types. Supports `--json`; errors exit with status 1. |
|
|
73
|
+
| `upgrade --check` | Compares generator versions with npm's latest stable release and reports the running CLI's tested dependency baseline through `--json`. Makes no changes. |
|
|
74
|
+
|
|
75
|
+
The add commands support `--dry-run`, `--install`, `--no-install`, and `--yes`. Without prompts, provide the app name and framework; dependency installation defaults to off. `--yes` enables installation unless `--no-install` is set, and never overrides conflicts. A dry run shows file paths without printing environment values or installing dependencies.
|
|
76
|
+
|
|
77
|
+
Existing workspaces with metadata version 1, including projects created with 0.2.1, are supported. Preserve `convex-monorepo.json`; the CLI reads it rather than guessing which directories belong to your project. Per-app starter choices are recorded there when they differ from the original selection.
|
|
78
|
+
|
|
79
|
+
### Changes and conflicts
|
|
80
|
+
|
|
81
|
+
Commands plan every file before applying changes. They reject unsafe paths, symlinks, existing app directories, conflicting scripts or dependencies, and customized auth files that would need replacement. App addition requires the generated `apps/*` and `packages/*` workspace layout and Turbo dev script. Adding a messages UI also requires the generated messages backend contract; use `--example none` with a customized backend.
|
|
82
|
+
|
|
83
|
+
Auth addition supports `none` to Clerk. It preserves backend schemas, functions, generated internals, unrelated package fields, and existing README content. Follow the new `CLERK_SETUP.md` for account configuration. Existing public messages do not acquire an owner automatically and will not appear in authenticated accounts. Review stored-data migration separately. Already configured Clerk is a no-op; replacing an auth provider is not supported.
|
|
84
|
+
|
|
85
|
+
A workspace lock prevents two CLI edits from running together. Each planned file is checked again before writing. Failed edits roll back files that still contain this command's output; observed concurrent edits are preserved and reported. Filesystem checks are optimistic, so avoid editing affected files while a command is applying. A failed dependency installation leaves the applied files available for retry with `pnpm install`.
|
|
86
|
+
|
|
87
|
+
Doctor is read-only and uses an in-memory TypeScript probe. It does not run application scripts, start services, configure a deployment, validate a real Clerk session, or prove a native Expo build works. Missing installation or environment configuration is reported with suggested steps. The upgrade command does not rewrite files, migrate templates, or update dependency versions.
|
|
88
|
+
|
|
29
89
|
## Interactive usage
|
|
30
90
|
|
|
31
91
|
With a terminal attached, the CLI asks for missing choices:
|
|
@@ -118,7 +178,7 @@ my-app/
|
|
|
118
178
|
└── package.json
|
|
119
179
|
```
|
|
120
180
|
|
|
121
|
-
`convex-monorepo.json` records the selected applications and auth provider.
|
|
181
|
+
`convex-monorepo.json` records the selected applications and auth provider. The workspace commands use this metadata to locate apps and plan changes. `upgrade --check` reports versions without applying migrations.
|
|
122
182
|
|
|
123
183
|
## Multiple frontends
|
|
124
184
|
|
|
@@ -128,7 +188,7 @@ Use explicit names to choose folders and repeat a framework:
|
|
|
128
188
|
pnpm create convex-monorepo@latest acme --apps web:next,admin:next,mobile:expo --yes
|
|
129
189
|
```
|
|
130
190
|
|
|
131
|
-
Apps become `@acme/web`, `@acme/admin`, and `@acme/mobile`. All depend on `@acme/backend` through `workspace:*`. The generator assigns distinct web development ports.
|
|
191
|
+
Apps become `@acme/web`, `@acme/admin`, and `@acme/mobile`. All depend on `@acme/backend` through `workspace:*`. The generator assigns distinct web development ports. Use `npx create-convex-monorepo@latest add app` to add another frontend later.
|
|
132
192
|
|
|
133
193
|
## First run and development
|
|
134
194
|
|
|
@@ -154,6 +214,17 @@ pnpm build
|
|
|
154
214
|
|
|
155
215
|
Complete setup in a normal terminal before starting Turbo. Stop a separately running backend watcher before `pnpm dev`, which starts its own. Public environment values are embedded at build time; rebuild frontends when they change. Backend build checks types and does not deploy.
|
|
156
216
|
|
|
217
|
+
## Code formatting
|
|
218
|
+
|
|
219
|
+
Generated source and configuration files are formatted with Prettier before they are written, including when using `--no-install`. New workspaces include a pinned Prettier dependency and matching configuration:
|
|
220
|
+
|
|
221
|
+
```sh
|
|
222
|
+
pnpm format
|
|
223
|
+
pnpm format:check
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Convex `_generated` files, TanStack's generated route tree, build output, lockfiles, and environment files are excluded. Adding an app formats its new files; it does not reformat existing application code. Auth migration accepts formatting differences in older starters while still rejecting customized code that would be replaced.
|
|
227
|
+
|
|
157
228
|
## Convex backend sharing
|
|
158
229
|
|
|
159
230
|
```ts
|
|
@@ -204,7 +275,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md), [adding a framework](docs/adding-a-frame
|
|
|
204
275
|
|
|
205
276
|
## Roadmap
|
|
206
277
|
|
|
207
|
-
|
|
278
|
+
Next candidates are reviewed upgrade migrations, additional auth providers, and more package-manager adapters. `upgrade --check` currently reports versions without changing dependencies.
|
|
208
279
|
|
|
209
280
|
MIT licensed. See [LICENSE](LICENSE).
|
|
210
281
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Shared runtime helpers, also copied into generated projects as plain JavaScript. */
|
|
2
|
+
export function publicVariable(framework: string): string;
|
|
3
|
+
export function deploymentUrl(value: string | undefined): string;
|
|
4
|
+
export function linkEnvironment(
|
|
5
|
+
contents: string,
|
|
6
|
+
variable: string,
|
|
7
|
+
url: string,
|
|
8
|
+
): string;
|
|
9
|
+
export function linkFrontends(
|
|
10
|
+
root: string,
|
|
11
|
+
signal?: AbortSignal,
|
|
12
|
+
): Promise<void>;
|
|
13
|
+
export function initializeConvex(
|
|
14
|
+
root: string,
|
|
15
|
+
signal?: AbortSignal,
|
|
16
|
+
): Promise<void>;
|
package/dist/cli/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { getPackageVersion } from '../version.js';
|
|
3
|
-
import {
|
|
3
|
+
import { runEntry } from '../commands/entry.js';
|
|
4
4
|
const controller = new AbortController();
|
|
5
|
-
const interrupt = () => controller.abort(new Error('
|
|
5
|
+
const interrupt = () => controller.abort(new Error('Command interrupted.'));
|
|
6
6
|
process.once('SIGINT', interrupt);
|
|
7
7
|
process.once('SIGTERM', interrupt);
|
|
8
8
|
try {
|
|
9
|
-
await
|
|
9
|
+
await runEntry(process.argv.slice(2), await getPackageVersion(), controller.signal);
|
|
10
10
|
}
|
|
11
11
|
catch (error) {
|
|
12
12
|
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;AACzC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAC5E,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAClC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACnC,IAAI,CAAC;IACH,MAAM,QAAQ,CACZ,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EACrB,MAAM,iBAAiB,EAAE,EACzB,UAAU,CAAC,MAAM,CAClB,CAAC;AACJ,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CACX,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;QAAS,CAAC;IACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { getPackageVersion } from '../version.js';
|
|
3
|
+
import { runWorkspace } from '../commands/workspace.js';
|
|
4
|
+
const controller = new AbortController();
|
|
5
|
+
const interrupt = () => controller.abort(new Error('Workspace command interrupted.'));
|
|
6
|
+
process.once('SIGINT', interrupt);
|
|
7
|
+
process.once('SIGTERM', interrupt);
|
|
8
|
+
try {
|
|
9
|
+
await runWorkspace(process.argv.slice(2), await getPackageVersion(), controller.signal);
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
13
|
+
process.exitCode = controller.signal.aborted ? 130 : 1;
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
process.removeListener('SIGINT', interrupt);
|
|
17
|
+
process.removeListener('SIGTERM', interrupt);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/cli/workspace.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;AACzC,MAAM,SAAS,GAAG,GAAG,EAAE,CACrB,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;AAChE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAClC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACnC,IAAI,CAAC;IACH,MAAM,YAAY,CAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EACrB,MAAM,iBAAiB,EAAE,EACzB,UAAU,CAAC,MAAM,CAClB,CAAC;AACJ,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CACX,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;QAAS,CAAC;IACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type RawOptions } from '../generator/options.js';
|
|
2
|
-
export declare const help = "create-convex-monorepo [project-name] [options]\n\nGenerate a pnpm + Turborepo workspace sharing one Convex backend.\n\n --apps <list> next,vite,tanstack-start,expo or web:next,admin:vite\n --example <name> messages (default) or none for blank apps\n --auth <provider> none (default) or clerk\n --package-manager <name> pnpm (v0.1)\n --install / --no-install Install generated dependencies\n --init-convex / --no-init-convex Set up Convex and link URLs (requires install)\n --git / --no-git Initialize a git repository\n --yes, -y Accept defaults, including installation and git\n --help, -h Show usage\n --version, -v Show version\n\nWithout a terminal, prompts are disabled. Installation and git default to off\nunless explicitly enabled or --yes is passed. Convex setup requires --init-convex\nwhen prompts are skipped; --yes does not opt into Convex account setup.\nNamed apps may repeat a framework.\n";
|
|
2
|
+
export declare const help = "create-convex-monorepo [project-name] [options]\n\nGenerate a pnpm + Turborepo workspace sharing one Convex backend.\n\nUse create <project-name> to explicitly create a project, including names such\nas add or doctor. Inside an existing workspace, running without arguments opens\nthe management menu. Commands: add app, add auth clerk, doctor, env sync,\nupgrade --check. No global or project installation is required.\n\n --apps <list> next,vite,tanstack-start,expo or web:next,admin:vite\n --example <name> messages (default) or none for blank apps\n --auth <provider> none (default) or clerk\n --package-manager <name> pnpm (v0.1)\n --install / --no-install Install generated dependencies\n --init-convex / --no-init-convex Set up Convex and link URLs (requires install)\n --git / --no-git Initialize a git repository\n --yes, -y Accept defaults, including installation and git\n --help, -h Show usage\n --version, -v Show version\n\nWithout a terminal, prompts are disabled. Installation and git default to off\nunless explicitly enabled or --yes is passed. Convex setup requires --init-convex\nwhen prompts are skipped; --yes does not opt into Convex account setup.\nNamed apps may repeat a framework.\n";
|
|
3
3
|
export declare function parseCommand(args: string[]): {
|
|
4
4
|
raw: RawOptions;
|
|
5
5
|
help: boolean;
|
package/dist/commands/create.js
CHANGED
|
@@ -6,6 +6,11 @@ export const help = `create-convex-monorepo [project-name] [options]
|
|
|
6
6
|
|
|
7
7
|
Generate a pnpm + Turborepo workspace sharing one Convex backend.
|
|
8
8
|
|
|
9
|
+
Use create <project-name> to explicitly create a project, including names such
|
|
10
|
+
as add or doctor. Inside an existing workspace, running without arguments opens
|
|
11
|
+
the management menu. Commands: add app, add auth clerk, doctor, env sync,
|
|
12
|
+
upgrade --check. No global or project installation is required.
|
|
13
|
+
|
|
9
14
|
--apps <list> next,vite,tanstack-start,expo or web:next,admin:vite
|
|
10
15
|
--example <name> messages (default) or none for blank apps
|
|
11
16
|
--auth <provider> none (default) or clerk
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,CAAC,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runEntry(args: string[], version: string, signal?: AbortSignal): Promise<void>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import * as prompts from '@clack/prompts';
|
|
2
|
+
import { lstat } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { isMissing, loadWorkspace } from '../workspace/project.js';
|
|
5
|
+
import { help, parseCommand, runCreate } from './create.js';
|
|
6
|
+
import { runWorkspace, workspaceHelp } from './workspace.js';
|
|
7
|
+
const managementCommands = new Set(['add', 'doctor', 'env', 'upgrade']);
|
|
8
|
+
const actions = [
|
|
9
|
+
{ value: 'app', label: 'Add an application', args: ['add', 'app'] },
|
|
10
|
+
{
|
|
11
|
+
value: 'auth',
|
|
12
|
+
label: 'Add Clerk authentication',
|
|
13
|
+
args: ['add', 'auth', 'clerk'],
|
|
14
|
+
},
|
|
15
|
+
{ value: 'doctor', label: 'Check workspace setup', args: ['doctor'] },
|
|
16
|
+
{ value: 'env', label: 'Sync frontend Convex URLs', args: ['env', 'sync'] },
|
|
17
|
+
{
|
|
18
|
+
value: 'upgrade',
|
|
19
|
+
label: 'Check for CLI updates',
|
|
20
|
+
args: ['upgrade', '--check'],
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
const managementHelp = workspaceHelp.replace('convex-monorepo <command>', 'npx create-convex-monorepo@latest <command>');
|
|
24
|
+
/** Absence is optional; malformed or unsafe metadata must still fail. */
|
|
25
|
+
async function existingWorkspace() {
|
|
26
|
+
let directory = resolve(process.cwd());
|
|
27
|
+
while (true) {
|
|
28
|
+
try {
|
|
29
|
+
await lstat(join(directory, 'convex-monorepo.json'));
|
|
30
|
+
return loadWorkspace(directory);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (!isMissing(error))
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
const parent = dirname(directory);
|
|
37
|
+
if (parent === directory)
|
|
38
|
+
return null;
|
|
39
|
+
directory = parent;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function runEntry(args, version, signal) {
|
|
43
|
+
if (args[0] === 'create') {
|
|
44
|
+
await runCreate(args.slice(1), version, signal);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (args[0] && managementCommands.has(args[0])) {
|
|
48
|
+
await runWorkspace(args, version, signal);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (args[0] === 'help') {
|
|
52
|
+
// Let the existing parser reject extra arguments and unknown flags.
|
|
53
|
+
await runWorkspace(args, version, signal);
|
|
54
|
+
console.log(help);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const parsed = parseCommand(args);
|
|
58
|
+
if (parsed.help) {
|
|
59
|
+
console.log(`${help}\n${managementHelp}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (parsed.version) {
|
|
63
|
+
console.log(version);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
signal?.throwIfAborted();
|
|
67
|
+
if (parsed.raw.name === undefined) {
|
|
68
|
+
const workspace = await existingWorkspace();
|
|
69
|
+
if (workspace) {
|
|
70
|
+
if (args.length)
|
|
71
|
+
throw new Error('An existing Convex monorepo was found. Choose a workspace command, or use create <project-name> to generate another project. Run npx create-convex-monorepo@latest --help.');
|
|
72
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
73
|
+
console.log(`Existing workspace: ${workspace.config.name}\n\n${managementHelp}`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
signal?.throwIfAborted();
|
|
77
|
+
const action = await prompts.select({
|
|
78
|
+
message: `Manage ${workspace.config.name}: what would you like to do?`,
|
|
79
|
+
options: actions.map(({ value, label }) => ({ value, label })),
|
|
80
|
+
});
|
|
81
|
+
if (prompts.isCancel(action))
|
|
82
|
+
throw new Error('Workspace command cancelled.');
|
|
83
|
+
signal?.throwIfAborted();
|
|
84
|
+
const selected = actions.find(({ value }) => value === action);
|
|
85
|
+
if (!selected)
|
|
86
|
+
throw new Error('Unknown workspace action.');
|
|
87
|
+
await runWorkspace([...selected.args], version, signal);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
await runCreate(args, version, signal);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/commands/entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AACxE,MAAM,OAAO,GAAG;IACd,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;IACnE;QACE,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,0BAA0B;QACjC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;KAC/B;IACD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE;IACrE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;IAC3E;QACE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,uBAAuB;QAC9B,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;KAC7B;CACO,CAAC;AAEX,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAC1C,2BAA2B,EAC3B,6CAA6C,CAC9C,CAAC;AAEF,yEAAyE;AACzE,KAAK,UAAU,iBAAiB;IAC9B,IAAI,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC,CAAC;YACrD,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;QACrC,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACtC,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAc,EACd,OAAe,EACf,MAAoB;IAEpB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACvB,oEAAoE;QACpE,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,cAAc,EAAE,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,MAAM;gBACb,MAAM,IAAI,KAAK,CACb,4KAA4K,CAC7K,CAAC;YACJ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClD,OAAO,CAAC,GAAG,CACT,uBAAuB,SAAS,CAAC,MAAM,CAAC,IAAI,OAAO,cAAc,EAAE,CACpE,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;gBAClC,OAAO,EAAE,UAAU,SAAS,CAAC,MAAM,CAAC,IAAI,8BAA8B;gBACtE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;aAC/D,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;YAC/D,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC5D,MAAM,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Example, Framework } from '../generator/types.js';
|
|
2
|
+
export declare const workspaceHelp = "convex-monorepo <command> [options]\n\nManage an existing Convex monorepo from its root or any subdirectory.\n\n add Choose an app or authentication interactively\n add app [name] Add an application\n --framework <name> next, vite, tanstack-start, or expo\n --example <name> none or messages (defaults to workspace example)\n add auth [clerk] Add Clerk authentication\n doctor [--json] Check workspace configuration and setup\n env sync [--app name] Copy public Convex URLs to frontend env files\n upgrade --check [--json] Check the latest stable generator version\n\nAdd options:\n --install / --no-install Install dependencies after applying changes\n --yes, -y Skip prompts and install unless --no-install\n\nAdd and env sync options:\n --dry-run Show planned paths without writing or installing\n\n --help, -h Show usage\n --version, -v Show CLI version\n\nWithout a terminal, add app requires a name and --framework. Installation\nis off unless --install or --yes is passed. Existing files are never forced.\n";
|
|
3
|
+
type CommandKind = 'help' | 'add' | 'add-app' | 'add-auth' | 'doctor' | 'env-sync' | 'upgrade';
|
|
4
|
+
export interface WorkspaceCommand {
|
|
5
|
+
command: CommandKind;
|
|
6
|
+
help: boolean;
|
|
7
|
+
version: boolean;
|
|
8
|
+
name?: string;
|
|
9
|
+
framework?: Framework;
|
|
10
|
+
example?: Example;
|
|
11
|
+
provider?: 'clerk';
|
|
12
|
+
app?: string;
|
|
13
|
+
install?: boolean;
|
|
14
|
+
yes: boolean;
|
|
15
|
+
dryRun: boolean;
|
|
16
|
+
json: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function parseWorkspaceCommand(args: string[]): WorkspaceCommand;
|
|
19
|
+
export declare function runWorkspace(args: string[], version: string, signal?: AbortSignal): Promise<void>;
|
|
20
|
+
export {};
|