anhedral 0.1.3 → 0.1.5
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/README.md +136 -20
- package/dist/cli.d.ts +3 -5
- package/dist/cli.js +8 -27
- package/dist/commands.d.ts +3 -7
- package/dist/commands.js +12 -38
- package/dist/dependencies.d.ts +35 -0
- package/dist/dependencies.js +173 -0
- package/dist/scaffold.d.ts +6 -7
- package/dist/scaffold.js +409 -296
- package/dist/templates/backend.d.ts +1 -1
- package/dist/templates/backend.js +36 -45
- package/dist/templates/extension.d.ts +1 -1
- package/dist/templates/extension.js +81 -62
- package/dist/templates/frontend.d.ts +1 -1
- package/dist/templates/frontend.js +135 -179
- package/dist/toolchain.js +5 -7
- package/dist/util.d.ts +1 -0
- package/dist/util.js +25 -1
- package/package.json +5 -4
- package/dist/templates/default-web.d.ts +0 -2
- package/dist/templates/default-web.js +0 -1950
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# anhedral
|
|
2
2
|
|
|
3
|
-
Opinionated init CLI for product teams shipping
|
|
3
|
+
Opinionated init CLI for product teams shipping one stable stack: Expo + React Native Reusables, Fastify, WXT, Drizzle, Neon, Clerk, RevenueCat + Stripe, Cloudflare R2/CDN, and Vercel.
|
|
4
4
|
|
|
5
5
|
## Requirements
|
|
6
6
|
|
|
@@ -13,16 +13,17 @@ Run the latest published CLI directly without installing it globally:
|
|
|
13
13
|
|
|
14
14
|
```sh
|
|
15
15
|
pnpm dlx anhedral@latest init
|
|
16
|
-
pnpm dlx anhedral@latest init --next
|
|
17
|
-
pnpm dlx anhedral@latest init --extension
|
|
18
|
-
pnpm dlx anhedral@latest init --next --extension
|
|
19
16
|
```
|
|
20
17
|
|
|
21
18
|
```sh
|
|
22
19
|
npx anhedral@latest init
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Use `--skip-install` when you want deterministic file generation without running dependency installation during init:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
pnpm dlx anhedral@latest init --skip-install
|
|
26
|
+
pnpm install
|
|
26
27
|
```
|
|
27
28
|
|
|
28
29
|
Global install also works:
|
|
@@ -37,16 +38,123 @@ npm install -g anhedral@latest
|
|
|
37
38
|
anhedral init
|
|
38
39
|
```
|
|
39
40
|
|
|
40
|
-
##
|
|
41
|
+
## Stack
|
|
42
|
+
|
|
43
|
+
`init` generates the only supported stack:
|
|
44
|
+
|
|
45
|
+
- Expo + React Native Reusables frontend
|
|
46
|
+
- Fastify backend
|
|
47
|
+
- WXT extension
|
|
48
|
+
- Neon + Drizzle
|
|
49
|
+
- Cloudflare R2/CDN
|
|
50
|
+
- Clerk auth
|
|
51
|
+
- RevenueCat + Stripe
|
|
52
|
+
- Vercel deploy
|
|
53
|
+
|
|
54
|
+
The scaffold is a pnpm workspace with top-level `Frontend`, `Backend`, `Extension`, and `packages/*` folders. Shared code such as the Drizzle schema lives under `packages/db` so apps do not need separate database schemas.
|
|
55
|
+
|
|
56
|
+
Each scaffold writes a `stack.json` file with the selected architecture, generated outputs, and the verified dependency manifest used for that run.
|
|
57
|
+
|
|
58
|
+
## Vercel Deployment
|
|
59
|
+
|
|
60
|
+
The generated workspace is one Git repository with two Vercel projects:
|
|
61
|
+
|
|
62
|
+
- `Frontend`: Expo web build. Build command: `pnpm build:web`. Output directory: `dist`.
|
|
63
|
+
- `Backend`: Fastify API. Build command: `pnpm build`. Vercel detects `src/index.ts` as the Fastify entrypoint.
|
|
64
|
+
|
|
65
|
+
The `Frontend` source is also the EAS source for iOS and Android builds; Vercel only deploys its web export.
|
|
66
|
+
|
|
67
|
+
Import the same repository twice in Vercel and set each project Root Directory to the app path above. Enable source access outside the app root so `packages/*` workspace dependencies are available during builds.
|
|
68
|
+
|
|
69
|
+
Vercel deployments are Git-driven. After both projects are connected, pushes and pull requests deploy the Expo web app and Fastify API automatically from GitHub commits.
|
|
70
|
+
|
|
71
|
+
Generated projects also include `PRODUCTION.md` with the provider checklist and these root verification scripts:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
pnpm verify
|
|
75
|
+
pnpm verify:frontend
|
|
76
|
+
pnpm verify:backend
|
|
77
|
+
pnpm verify:extension
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Native App Deployment
|
|
81
|
+
|
|
82
|
+
Use `Frontend` as the Expo project root for iOS and Android. Vercel only deploys the web export from this app; native builds go through EAS.
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
cd Frontend
|
|
86
|
+
pnpm dlx eas-cli@latest login
|
|
87
|
+
pnpm dlx eas-cli@latest init
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The scaffold generates `Frontend/eas.json` with `development`, `preview`, and `production` profiles.
|
|
91
|
+
|
|
92
|
+
Build commands:
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
# Android
|
|
96
|
+
pnpm dlx eas-cli@latest build --platform android --profile production
|
|
97
|
+
|
|
98
|
+
# iOS
|
|
99
|
+
pnpm dlx eas-cli@latest build --platform ios --profile production
|
|
100
|
+
|
|
101
|
+
# Both platforms
|
|
102
|
+
pnpm dlx eas-cli@latest build --platform all --profile production
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Submit latest successful builds to the stores:
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
# Google Play
|
|
109
|
+
pnpm dlx eas-cli@latest submit --platform android --latest --profile production
|
|
110
|
+
|
|
111
|
+
# App Store Connect / TestFlight
|
|
112
|
+
pnpm dlx eas-cli@latest submit --platform ios --latest --profile production
|
|
113
|
+
|
|
114
|
+
# Both platforms
|
|
115
|
+
pnpm dlx eas-cli@latest submit --platform all --latest --profile production
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
One-step build and submit:
|
|
119
|
+
|
|
120
|
+
```sh
|
|
121
|
+
pnpm dlx eas-cli@latest build --platform android --profile production --auto-submit
|
|
122
|
+
pnpm dlx eas-cli@latest build --platform ios --profile production --auto-submit
|
|
123
|
+
pnpm dlx eas-cli@latest build --platform all --profile production --auto-submit
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Useful release checks:
|
|
41
127
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
-
|
|
45
|
-
|
|
128
|
+
```sh
|
|
129
|
+
pnpm dlx eas-cli@latest build:list
|
|
130
|
+
pnpm dlx eas-cli@latest build:version:get --platform all --profile production
|
|
131
|
+
pnpm dlx eas-cli@latest credentials
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Extension Release
|
|
135
|
+
|
|
136
|
+
The WXT extension is built from `Extension`. It is not deployed by Vercel.
|
|
137
|
+
|
|
138
|
+
```sh
|
|
139
|
+
cd Extension
|
|
140
|
+
pnpm build
|
|
141
|
+
pnpm zip
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
The Chrome ZIP is generated under `.output/`. Upload that ZIP in the Chrome Web Store Developer Dashboard:
|
|
46
145
|
|
|
47
|
-
|
|
146
|
+
1. Open the Chrome Web Store Developer Dashboard.
|
|
147
|
+
2. Create the item the first time, or open the existing extension item.
|
|
148
|
+
3. Upload the generated Chrome ZIP.
|
|
149
|
+
4. Complete or update the store listing, screenshots, privacy practices, permissions justification, and distribution settings.
|
|
150
|
+
5. Submit the item for review.
|
|
48
151
|
|
|
49
|
-
|
|
152
|
+
For automated store submissions later, WXT supports:
|
|
153
|
+
|
|
154
|
+
```sh
|
|
155
|
+
pnpm wxt submit init
|
|
156
|
+
pnpm wxt submit
|
|
157
|
+
```
|
|
50
158
|
|
|
51
159
|
## Local Development
|
|
52
160
|
|
|
@@ -84,20 +192,28 @@ npm publish --provenance=false --ignore-scripts
|
|
|
84
192
|
|
|
85
193
|
## Maintenance
|
|
86
194
|
|
|
87
|
-
This repo is
|
|
195
|
+
This repo is maintained in two lanes:
|
|
88
196
|
|
|
89
|
-
- `stable`: the default user-facing toolchain, pinned to known-good upstream CLI versions in `src/
|
|
197
|
+
- `stable`: the default user-facing toolchain, pinned to known-good upstream CLI and package versions in `src/dependencies.ts`.
|
|
90
198
|
- `latest`: an early-warning lane that tracks upstream scaffold tools without pinning, so breakage is detected before it reaches the default path.
|
|
91
199
|
|
|
92
|
-
The practical rule is simple:
|
|
200
|
+
The practical rule is simple: users get the latest verified Anhedral release, not uncontrolled registry drift at init time. Detect drift on `latest`, verify it, then promote the pinned dependency manifest only after the e2e matrix passes.
|
|
201
|
+
|
|
202
|
+
### Dependency policy
|
|
203
|
+
|
|
204
|
+
- Runtime dependency versions for generated projects live in `src/dependencies.ts`.
|
|
205
|
+
- Generated package manifests and install commands must read from that manifest.
|
|
206
|
+
- Avoid raw `@latest` and caret ranges in generated output unless a package manager or platform command explicitly requires it.
|
|
207
|
+
- `pnpm dlx anhedral@latest init` means the newest published Anhedral CLI. The generated project should still be reproducible for that exact Anhedral version.
|
|
208
|
+
- `stack.json` records the dependency manifest so support and debugging can identify exactly what was generated.
|
|
93
209
|
|
|
94
210
|
### Recommended automation
|
|
95
211
|
|
|
96
|
-
- Renovate is configured in `renovate.json` to keep this repo's own dependencies current.
|
|
212
|
+
- Renovate is configured in `renovate.json` to keep this repo's own dependencies and generated dependency manifest current.
|
|
97
213
|
- GitHub Actions CI runs on pushes and pull requests in `.github/workflows/ci.yml`.
|
|
98
214
|
- Weekly toolchain drift checks run in `.github/workflows/toolchain-drift.yml` for both `stable` and `latest`.
|
|
99
215
|
- Automatic releases publish through `.github/workflows/release-on-main.yml`; `.github/workflows/release.yml` is for manual retry only.
|
|
100
|
-
- Stable
|
|
216
|
+
- Stable dependency pins in `src/dependencies.ts` are annotated so Renovate can open PRs when upstream packages and scaffold CLIs publish updates.
|
|
101
217
|
- `prepublishOnly` stays strict for manual local publishing. GitHub Actions skips npm lifecycle scripts during publish after running `pnpm release:check`.
|
|
102
218
|
|
|
103
219
|
### Upgrade workflow
|
|
@@ -117,7 +233,7 @@ If you want to validate upstream scaffold drift manually, use the explicit lates
|
|
|
117
233
|
pnpm test:e2e:latest
|
|
118
234
|
```
|
|
119
235
|
|
|
120
|
-
When a
|
|
236
|
+
When a dependency pin PR passes and the generated outputs look good, update the `VERIFIED_AT` date in `src/dependencies.ts` and release normally.
|
|
121
237
|
|
|
122
238
|
### Release policy
|
|
123
239
|
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const USAGE = "\nanhedral init [--next] [--extension] [--toolchain <latest|stable>]\n\nCommands:\n anhedral init\n Expo, Fastify, Drizzle ORM, Neon Postgres, Clerk Auth, RevenueCat + Stripe, Cloudflare R2, shared packages\n\n anhedral init --next\n Next.js App Router, shadcn/ui, Tailwind CSS, TypeScript, Fastify, Drizzle ORM, Neon Postgres, Clerk Auth, Stripe, Cloudflare R2, shared packages\n\n anhedral init --extension\n Expo + Fastify plus a WXT Chrome extension\n\n anhedral init --next --extension\n Next.js + Fastify plus a WXT Chrome extension\n";
|
|
1
|
+
import type { InitOptions } from './scaffold.js';
|
|
2
|
+
export declare const USAGE = "\nanhedral init [--toolchain <latest|stable>] [--skip-install]\n\nCommands:\n anhedral init\n Expo + React Native Reusables, Fastify, WXT extension, Neon + Drizzle, Cloudflare R2/CDN, Clerk, RevenueCat + Stripe, Vercel\n";
|
|
4
3
|
export type ParsedFlags = {
|
|
5
|
-
next: boolean;
|
|
6
|
-
extension: boolean;
|
|
7
4
|
toolchain?: string;
|
|
5
|
+
skipInstall?: boolean;
|
|
8
6
|
};
|
|
9
7
|
export declare function parseCli(args: string[]): ParsedFlags;
|
|
10
8
|
export declare function deriveProjectName(cwd: string): string;
|
package/dist/cli.js
CHANGED
|
@@ -1,39 +1,22 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { env } from 'node:process';
|
|
3
3
|
import { TOOLCHAIN_CHANNELS, resolveToolchainChannel } from './toolchain.js';
|
|
4
|
-
export const DEFAULT_FRONTEND_MODE = 'expo';
|
|
5
4
|
export const USAGE = `
|
|
6
|
-
anhedral init [--
|
|
5
|
+
anhedral init [--toolchain <latest|stable>] [--skip-install]
|
|
7
6
|
|
|
8
7
|
Commands:
|
|
9
8
|
anhedral init
|
|
10
|
-
Expo, Fastify,
|
|
11
|
-
|
|
12
|
-
anhedral init --next
|
|
13
|
-
Next.js App Router, shadcn/ui, Tailwind CSS, TypeScript, Fastify, Drizzle ORM, Neon Postgres, Clerk Auth, Stripe, Cloudflare R2, shared packages
|
|
14
|
-
|
|
15
|
-
anhedral init --extension
|
|
16
|
-
Expo + Fastify plus a WXT Chrome extension
|
|
17
|
-
|
|
18
|
-
anhedral init --next --extension
|
|
19
|
-
Next.js + Fastify plus a WXT Chrome extension
|
|
9
|
+
Expo + React Native Reusables, Fastify, WXT extension, Neon + Drizzle, Cloudflare R2/CDN, Clerk, RevenueCat + Stripe, Vercel
|
|
20
10
|
`;
|
|
21
11
|
export function parseCli(args) {
|
|
22
|
-
const flags = {
|
|
23
|
-
next: false,
|
|
24
|
-
extension: false,
|
|
25
|
-
};
|
|
12
|
+
const flags = {};
|
|
26
13
|
for (let index = 0; index < args.length; index += 1) {
|
|
27
14
|
const token = args[index];
|
|
28
15
|
if (!token.startsWith('--')) {
|
|
29
|
-
throw new Error(`Unexpected argument: ${token}. Use flags: --
|
|
30
|
-
}
|
|
31
|
-
if (token === '--next') {
|
|
32
|
-
flags.next = true;
|
|
33
|
-
continue;
|
|
16
|
+
throw new Error(`Unexpected argument: ${token}. Use flags: --toolchain, --skip-install`);
|
|
34
17
|
}
|
|
35
|
-
if (token === '--
|
|
36
|
-
flags.
|
|
18
|
+
if (token === '--skip-install') {
|
|
19
|
+
flags.skipInstall = true;
|
|
37
20
|
continue;
|
|
38
21
|
}
|
|
39
22
|
if (token === '--toolchain') {
|
|
@@ -70,17 +53,15 @@ export function buildOptions(flags) {
|
|
|
70
53
|
throw new Error(`--toolchain must be one of: ${TOOLCHAIN_CHANNELS.join(', ')}`);
|
|
71
54
|
}
|
|
72
55
|
return {
|
|
73
|
-
frontend: flags.next ? 'next' : DEFAULT_FRONTEND_MODE,
|
|
74
|
-
extension: flags.extension,
|
|
75
56
|
projectName,
|
|
76
57
|
displayName,
|
|
77
58
|
auth: 'clerk',
|
|
78
|
-
payments:
|
|
59
|
+
payments: 'revenuecat_stripe',
|
|
79
60
|
db: 'neon',
|
|
80
61
|
orm: 'drizzle',
|
|
81
62
|
storage: 'r2',
|
|
82
63
|
api: 'fastify',
|
|
83
|
-
|
|
64
|
+
skipInstall: flags.skipInstall === true || env.ANHEDRAL_SKIP_INSTALL === '1',
|
|
84
65
|
toolchainChannel: resolveToolchainChannel(flags.toolchain ?? env.ANHEDRAL_TOOLCHAIN),
|
|
85
66
|
};
|
|
86
67
|
}
|
package/dist/commands.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import type { InitOptions } from './scaffold.js';
|
|
2
|
-
import { type ToolchainSpec } from './toolchain.js';
|
|
3
1
|
export type ScaffoldCommand = {
|
|
4
2
|
cmd: string;
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
command: string;
|
|
4
|
+
args: string[];
|
|
7
5
|
};
|
|
8
|
-
export declare function getDefaultWebInitCommand(toolchain: ToolchainSpec, projectName: string): ScaffoldCommand;
|
|
9
|
-
export declare function getDefaultWebDependencyCommands(): ScaffoldCommand[];
|
|
10
6
|
export declare function getBackendInstallCommands(): ScaffoldCommand[];
|
|
11
|
-
export declare function getSkillCommands(
|
|
7
|
+
export declare function getSkillCommands(): string[];
|
package/dist/commands.js
CHANGED
|
@@ -1,50 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export function getDefaultWebInitCommand(toolchain, projectName) {
|
|
3
|
-
return {
|
|
4
|
-
cmd: [
|
|
5
|
-
'pnpm',
|
|
6
|
-
'dlx',
|
|
7
|
-
toolPackageRef('shadcn', toolchain.shadcn),
|
|
8
|
-
'init',
|
|
9
|
-
'-t',
|
|
10
|
-
'next',
|
|
11
|
-
'-n',
|
|
12
|
-
projectName,
|
|
13
|
-
'-d',
|
|
14
|
-
'-y',
|
|
15
|
-
'--css-variables',
|
|
16
|
-
].join(' '),
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export function getDefaultWebDependencyCommands() {
|
|
20
|
-
return [
|
|
21
|
-
{
|
|
22
|
-
cmd: 'pnpm add @clerk/nextjs drizzle-orm @neondatabase/serverless stripe @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner',
|
|
23
|
-
skippable: true,
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
cmd: 'pnpm add -D babel-plugin-react-compiler drizzle-kit tsx dotenv',
|
|
27
|
-
skippable: true,
|
|
28
|
-
},
|
|
29
|
-
];
|
|
30
|
-
}
|
|
1
|
+
import { BACKEND_DEPENDENCIES, withVersions } from './dependencies.js';
|
|
31
2
|
export function getBackendInstallCommands() {
|
|
3
|
+
const dependencies = withVersions(BACKEND_DEPENDENCIES.dependencies ?? {});
|
|
4
|
+
const devDependencies = withVersions(BACKEND_DEPENDENCIES.devDependencies ?? {});
|
|
32
5
|
return [
|
|
33
6
|
{
|
|
34
|
-
cmd:
|
|
7
|
+
cmd: `pnpm add ${dependencies.join(' ')}`,
|
|
8
|
+
command: 'pnpm',
|
|
9
|
+
args: ['add', ...dependencies],
|
|
35
10
|
},
|
|
36
11
|
{
|
|
37
|
-
cmd:
|
|
12
|
+
cmd: `pnpm add -D ${devDependencies.join(' ')}`,
|
|
13
|
+
command: 'pnpm',
|
|
14
|
+
args: ['add', '-D', ...devDependencies],
|
|
38
15
|
},
|
|
39
16
|
];
|
|
40
17
|
}
|
|
41
|
-
export function getSkillCommands(
|
|
42
|
-
|
|
18
|
+
export function getSkillCommands() {
|
|
19
|
+
return [
|
|
43
20
|
'pnpm dlx skills add https://github.com/clerk/skills --skill clerk-custom-ui',
|
|
21
|
+
'pnpm dlx skills add https://github.com/revenuecat/revenuecat-skill --skill revenuecat',
|
|
44
22
|
'pnpm dlx skills add https://github.com/stripe/ai --skill stripe-best-practices',
|
|
45
23
|
];
|
|
46
|
-
if (options.frontend === 'expo') {
|
|
47
|
-
commands.splice(1, 0, 'pnpm dlx skills add https://github.com/revenuecat/revenuecat-skill --skill revenuecat');
|
|
48
|
-
}
|
|
49
|
-
return commands;
|
|
50
24
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const PACKAGE_MANAGER = "pnpm@10.15.1";
|
|
2
|
+
export type DependencyMap = Record<string, string>;
|
|
3
|
+
export type DependencyGroup = {
|
|
4
|
+
dependencies?: DependencyMap;
|
|
5
|
+
devDependencies?: DependencyMap;
|
|
6
|
+
};
|
|
7
|
+
export declare const VERIFIED_AT = "2026-04-26";
|
|
8
|
+
export declare const TOOLCHAIN_DEPENDENCIES: {
|
|
9
|
+
readonly shadcn: "4.5.0";
|
|
10
|
+
readonly reactNativeReusables: "0.7.1";
|
|
11
|
+
readonly wxt: "0.20.25";
|
|
12
|
+
};
|
|
13
|
+
export declare const ROOT_DEPENDENCIES: DependencyGroup;
|
|
14
|
+
export declare const SHARED_DB_DEPENDENCIES: DependencyGroup;
|
|
15
|
+
export declare const SHARED_PACKAGE_DEPENDENCIES: DependencyGroup;
|
|
16
|
+
export declare const API_CLIENT_DEPENDENCIES: DependencyGroup;
|
|
17
|
+
export declare const BACKEND_DEPENDENCIES: DependencyGroup;
|
|
18
|
+
export declare const EXTENSION_DEPENDENCIES: DependencyGroup;
|
|
19
|
+
export declare const FRONTEND_ADDON_DEPENDENCIES: DependencyMap;
|
|
20
|
+
export declare function withVersions(dependencies: DependencyMap): string[];
|
|
21
|
+
export declare function dependencyManifest(): {
|
|
22
|
+
verifiedAt: string;
|
|
23
|
+
packageManager: string;
|
|
24
|
+
toolchain: {
|
|
25
|
+
readonly shadcn: "4.5.0";
|
|
26
|
+
readonly reactNativeReusables: "0.7.1";
|
|
27
|
+
readonly wxt: "0.20.25";
|
|
28
|
+
};
|
|
29
|
+
root: DependencyGroup;
|
|
30
|
+
sharedDb: DependencyGroup;
|
|
31
|
+
sharedPackages: DependencyGroup;
|
|
32
|
+
backend: DependencyGroup;
|
|
33
|
+
extension: DependencyGroup;
|
|
34
|
+
frontendAddons: DependencyMap;
|
|
35
|
+
};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
export const PACKAGE_MANAGER = 'pnpm@10.15.1';
|
|
2
|
+
export const VERIFIED_AT = '2026-04-26';
|
|
3
|
+
export const TOOLCHAIN_DEPENDENCIES = {
|
|
4
|
+
// renovate: datasource=npm depName=shadcn
|
|
5
|
+
shadcn: '4.5.0',
|
|
6
|
+
// renovate: datasource=npm depName=@react-native-reusables/cli
|
|
7
|
+
reactNativeReusables: '0.7.1',
|
|
8
|
+
// renovate: datasource=npm depName=wxt
|
|
9
|
+
wxt: '0.20.25',
|
|
10
|
+
};
|
|
11
|
+
export const ROOT_DEPENDENCIES = {
|
|
12
|
+
devDependencies: {
|
|
13
|
+
// renovate: datasource=npm depName=turbo
|
|
14
|
+
turbo: '2.8.0',
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
export const SHARED_DB_DEPENDENCIES = {
|
|
18
|
+
dependencies: {
|
|
19
|
+
// renovate: datasource=npm depName=@neondatabase/serverless
|
|
20
|
+
'@neondatabase/serverless': '1.0.2',
|
|
21
|
+
// renovate: datasource=npm depName=drizzle-orm
|
|
22
|
+
'drizzle-orm': '0.44.7',
|
|
23
|
+
// renovate: datasource=npm depName=dotenv
|
|
24
|
+
dotenv: '17.2.3',
|
|
25
|
+
},
|
|
26
|
+
devDependencies: {
|
|
27
|
+
// renovate: datasource=npm depName=drizzle-kit
|
|
28
|
+
'drizzle-kit': '0.31.7',
|
|
29
|
+
// renovate: datasource=npm depName=tsx
|
|
30
|
+
tsx: '4.20.6',
|
|
31
|
+
// renovate: datasource=npm depName=typescript
|
|
32
|
+
typescript: '5.9.3',
|
|
33
|
+
// renovate: datasource=npm depName=@types/node
|
|
34
|
+
'@types/node': '25.6.0',
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
export const SHARED_PACKAGE_DEPENDENCIES = {
|
|
38
|
+
devDependencies: {
|
|
39
|
+
// renovate: datasource=npm depName=typescript
|
|
40
|
+
typescript: '5.9.3',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export const API_CLIENT_DEPENDENCIES = {
|
|
44
|
+
dependencies: {
|
|
45
|
+
'@anhedral/config': 'workspace:*',
|
|
46
|
+
'@anhedral/types': 'workspace:*',
|
|
47
|
+
},
|
|
48
|
+
...SHARED_PACKAGE_DEPENDENCIES,
|
|
49
|
+
};
|
|
50
|
+
export const BACKEND_DEPENDENCIES = {
|
|
51
|
+
dependencies: {
|
|
52
|
+
'@anhedral/db': 'workspace:*',
|
|
53
|
+
// renovate: datasource=npm depName=fastify
|
|
54
|
+
fastify: '5.6.2',
|
|
55
|
+
// renovate: datasource=npm depName=fastify-plugin
|
|
56
|
+
'fastify-plugin': '5.1.0',
|
|
57
|
+
// renovate: datasource=npm depName=@fastify/cors
|
|
58
|
+
'@fastify/cors': '11.1.0',
|
|
59
|
+
// renovate: datasource=npm depName=@fastify/env
|
|
60
|
+
'@fastify/env': '5.0.3',
|
|
61
|
+
// renovate: datasource=npm depName=@fastify/compress
|
|
62
|
+
'@fastify/compress': '8.3.0',
|
|
63
|
+
// renovate: datasource=npm depName=@fastify/helmet
|
|
64
|
+
'@fastify/helmet': '13.0.2',
|
|
65
|
+
// renovate: datasource=npm depName=@fastify/rate-limit
|
|
66
|
+
'@fastify/rate-limit': '10.3.0',
|
|
67
|
+
// renovate: datasource=npm depName=@fastify/swagger
|
|
68
|
+
'@fastify/swagger': '9.6.1',
|
|
69
|
+
// renovate: datasource=npm depName=@fastify/swagger-ui
|
|
70
|
+
'@fastify/swagger-ui': '5.2.3',
|
|
71
|
+
// renovate: datasource=npm depName=@fastify/multipart
|
|
72
|
+
'@fastify/multipart': '9.3.0',
|
|
73
|
+
// renovate: datasource=npm depName=@clerk/fastify
|
|
74
|
+
'@clerk/fastify': '3.1.26',
|
|
75
|
+
'@neondatabase/serverless': SHARED_DB_DEPENDENCIES.dependencies['@neondatabase/serverless'],
|
|
76
|
+
'drizzle-orm': SHARED_DB_DEPENDENCIES.dependencies['drizzle-orm'],
|
|
77
|
+
// renovate: datasource=npm depName=@aws-sdk/client-s3
|
|
78
|
+
'@aws-sdk/client-s3': '3.1047.0',
|
|
79
|
+
// renovate: datasource=npm depName=@aws-sdk/lib-storage
|
|
80
|
+
'@aws-sdk/lib-storage': '3.1047.0',
|
|
81
|
+
// renovate: datasource=npm depName=@aws-sdk/s3-request-presigner
|
|
82
|
+
'@aws-sdk/s3-request-presigner': '3.1047.0',
|
|
83
|
+
dotenv: SHARED_DB_DEPENDENCIES.dependencies.dotenv,
|
|
84
|
+
},
|
|
85
|
+
devDependencies: {
|
|
86
|
+
typescript: SHARED_DB_DEPENDENCIES.devDependencies.typescript,
|
|
87
|
+
tsx: SHARED_DB_DEPENDENCIES.devDependencies.tsx,
|
|
88
|
+
'@types/node': SHARED_DB_DEPENDENCIES.devDependencies['@types/node'],
|
|
89
|
+
'drizzle-kit': SHARED_DB_DEPENDENCIES.devDependencies['drizzle-kit'],
|
|
90
|
+
// renovate: datasource=npm depName=vitest
|
|
91
|
+
vitest: '4.0.16',
|
|
92
|
+
// renovate: datasource=npm depName=@vitest/coverage-v8
|
|
93
|
+
'@vitest/coverage-v8': '4.0.16',
|
|
94
|
+
// renovate: datasource=npm depName=eslint
|
|
95
|
+
eslint: '9.39.2',
|
|
96
|
+
// renovate: datasource=npm depName=@eslint/js
|
|
97
|
+
'@eslint/js': '9.39.2',
|
|
98
|
+
// renovate: datasource=npm depName=globals
|
|
99
|
+
globals: '16.5.0',
|
|
100
|
+
// renovate: datasource=npm depName=typescript-eslint
|
|
101
|
+
'typescript-eslint': '8.49.0',
|
|
102
|
+
// renovate: datasource=npm depName=pino-pretty
|
|
103
|
+
'pino-pretty': '13.1.3',
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
export const EXTENSION_DEPENDENCIES = {
|
|
107
|
+
dependencies: {
|
|
108
|
+
'@anhedral/api-client': 'workspace:*',
|
|
109
|
+
// renovate: datasource=npm depName=@clerk/chrome-extension
|
|
110
|
+
'@clerk/chrome-extension': '3.1.25',
|
|
111
|
+
// renovate: datasource=npm depName=react
|
|
112
|
+
react: '19.2.3',
|
|
113
|
+
// renovate: datasource=npm depName=react-dom
|
|
114
|
+
'react-dom': '19.2.3',
|
|
115
|
+
// renovate: datasource=npm depName=clsx
|
|
116
|
+
clsx: '2.1.1',
|
|
117
|
+
// renovate: datasource=npm depName=tailwind-merge
|
|
118
|
+
'tailwind-merge': '3.4.0',
|
|
119
|
+
// renovate: datasource=npm depName=class-variance-authority
|
|
120
|
+
'class-variance-authority': '0.7.1',
|
|
121
|
+
// renovate: datasource=npm depName=lucide-react
|
|
122
|
+
'lucide-react': '0.562.0',
|
|
123
|
+
},
|
|
124
|
+
devDependencies: {
|
|
125
|
+
// renovate: datasource=npm depName=@types/chrome
|
|
126
|
+
'@types/chrome': '0.1.9',
|
|
127
|
+
// renovate: datasource=npm depName=@types/react
|
|
128
|
+
'@types/react': '19.2.7',
|
|
129
|
+
// renovate: datasource=npm depName=@types/react-dom
|
|
130
|
+
'@types/react-dom': '19.2.3',
|
|
131
|
+
// renovate: datasource=npm depName=@wxt-dev/module-react
|
|
132
|
+
'@wxt-dev/module-react': '1.1.5',
|
|
133
|
+
// renovate: datasource=npm depName=autoprefixer
|
|
134
|
+
autoprefixer: '10.4.23',
|
|
135
|
+
// renovate: datasource=npm depName=postcss
|
|
136
|
+
postcss: '8.5.6',
|
|
137
|
+
// renovate: datasource=npm depName=tailwindcss
|
|
138
|
+
tailwindcss: '3.4.19',
|
|
139
|
+
typescript: SHARED_DB_DEPENDENCIES.devDependencies.typescript,
|
|
140
|
+
wxt: TOOLCHAIN_DEPENDENCIES.wxt,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
export const FRONTEND_ADDON_DEPENDENCIES = {
|
|
144
|
+
'@anhedral/api-client': 'workspace:*',
|
|
145
|
+
// renovate: datasource=npm depName=@clerk/expo
|
|
146
|
+
'@clerk/expo': '3.2.11',
|
|
147
|
+
// renovate: datasource=npm depName=react-native-purchases
|
|
148
|
+
'react-native-purchases': '10.1.1',
|
|
149
|
+
// renovate: datasource=npm depName=react-native-purchases-ui
|
|
150
|
+
'react-native-purchases-ui': '10.1.1',
|
|
151
|
+
// renovate: datasource=npm depName=@revenuecat/purchases-js
|
|
152
|
+
'@revenuecat/purchases-js': '1.11.1',
|
|
153
|
+
};
|
|
154
|
+
export function withVersions(dependencies) {
|
|
155
|
+
return Object.entries(dependencies).map(([name, version]) => {
|
|
156
|
+
if (version === 'workspace:*')
|
|
157
|
+
return `${name}@workspace:*`;
|
|
158
|
+
return `${name}@${version}`;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
export function dependencyManifest() {
|
|
162
|
+
return {
|
|
163
|
+
verifiedAt: VERIFIED_AT,
|
|
164
|
+
packageManager: PACKAGE_MANAGER,
|
|
165
|
+
toolchain: TOOLCHAIN_DEPENDENCIES,
|
|
166
|
+
root: ROOT_DEPENDENCIES,
|
|
167
|
+
sharedDb: SHARED_DB_DEPENDENCIES,
|
|
168
|
+
sharedPackages: SHARED_PACKAGE_DEPENDENCIES,
|
|
169
|
+
backend: BACKEND_DEPENDENCIES,
|
|
170
|
+
extension: EXTENSION_DEPENDENCIES,
|
|
171
|
+
frontendAddons: FRONTEND_ADDON_DEPENDENCIES,
|
|
172
|
+
};
|
|
173
|
+
}
|
package/dist/scaffold.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { type ToolchainChannel } from './toolchain.js';
|
|
2
|
-
export type FrontendMode = 'expo'
|
|
3
|
-
export type AuthMode = 'clerk'
|
|
4
|
-
export type PaymentsMode = '
|
|
2
|
+
export type FrontendMode = 'expo';
|
|
3
|
+
export type AuthMode = 'clerk';
|
|
4
|
+
export type PaymentsMode = 'revenuecat_stripe';
|
|
5
5
|
export interface InitOptions {
|
|
6
|
-
frontend: FrontendMode;
|
|
7
|
-
extension: boolean;
|
|
8
6
|
projectName: string;
|
|
9
7
|
displayName: string;
|
|
10
8
|
auth: AuthMode;
|
|
@@ -12,8 +10,8 @@ export interface InitOptions {
|
|
|
12
10
|
db: 'neon';
|
|
13
11
|
orm: 'drizzle';
|
|
14
12
|
storage: 'r2';
|
|
15
|
-
api: 'fastify'
|
|
16
|
-
|
|
13
|
+
api: 'fastify';
|
|
14
|
+
skipInstall: boolean;
|
|
17
15
|
toolchainChannel: ToolchainChannel;
|
|
18
16
|
}
|
|
19
17
|
export interface ProjectOptions {
|
|
@@ -21,5 +19,6 @@ export interface ProjectOptions {
|
|
|
21
19
|
displayName: string;
|
|
22
20
|
githubOrg: string | null;
|
|
23
21
|
frontendUrl?: string;
|
|
22
|
+
skipInstall?: boolean;
|
|
24
23
|
}
|
|
25
24
|
export declare function scaffoldProject(options: InitOptions): Promise<void>;
|