@beignet/cli 0.0.38 → 0.0.39
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/CHANGELOG.md +9 -0
- package/README.md +120 -96
- package/dist/choices.d.ts +17 -21
- package/dist/choices.d.ts.map +1 -1
- package/dist/choices.js +21 -67
- package/dist/choices.js.map +1 -1
- package/dist/create-prompts.d.ts +5 -6
- package/dist/create-prompts.d.ts.map +1 -1
- package/dist/create-prompts.js +15 -15
- package/dist/create-prompts.js.map +1 -1
- package/dist/create.d.ts +11 -2
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +38 -28
- package/dist/create.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +149 -47
- package/dist/index.js.map +1 -1
- package/dist/inspect.js +54 -1
- package/dist/inspect.js.map +1 -1
- package/dist/lib.d.ts +1 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/make/inbox.js +3 -3
- package/dist/make/inbox.js.map +1 -1
- package/dist/make/payments.js +3 -3
- package/dist/make/payments.js.map +1 -1
- package/dist/make/shared.d.ts +10 -3
- package/dist/make/shared.d.ts.map +1 -1
- package/dist/make/shared.js +7 -8
- package/dist/make/shared.js.map +1 -1
- package/dist/make.d.ts +3 -2
- package/dist/make.d.ts.map +1 -1
- package/dist/make.js +455 -185
- package/dist/make.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +15 -11
- package/dist/mcp.js.map +1 -1
- package/dist/provider-add.d.ts +21 -3
- package/dist/provider-add.d.ts.map +1 -1
- package/dist/provider-add.js +101 -65
- package/dist/provider-add.js.map +1 -1
- package/dist/task.js +1 -1
- package/dist/task.js.map +1 -1
- package/dist/templates/base.d.ts +1 -1
- package/dist/templates/base.d.ts.map +1 -1
- package/dist/templates/base.js +15 -15
- package/dist/templates/base.js.map +1 -1
- package/dist/templates/index.d.ts +2 -2
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +5 -5
- package/dist/templates/index.js.map +1 -1
- package/dist/templates/server.d.ts.map +1 -1
- package/dist/templates/server.js +17 -13
- package/dist/templates/server.js.map +1 -1
- package/dist/templates/shared.d.ts +4 -4
- package/dist/templates/shared.d.ts.map +1 -1
- package/dist/templates/shared.js +6 -6
- package/dist/templates/shared.js.map +1 -1
- package/package.json +2 -2
- package/skills/app-structure/SKILL.md +13 -8
- package/src/choices.ts +38 -88
- package/src/create-prompts.ts +20 -21
- package/src/create.ts +54 -36
- package/src/index.ts +193 -65
- package/src/inspect.ts +101 -1
- package/src/lib.ts +1 -1
- package/src/make/inbox.ts +3 -3
- package/src/make/payments.ts +3 -3
- package/src/make/shared.ts +16 -10
- package/src/make.ts +578 -176
- package/src/mcp.ts +20 -13
- package/src/provider-add.ts +159 -79
- package/src/task.ts +1 -1
- package/src/templates/base.ts +16 -16
- package/src/templates/index.ts +6 -6
- package/src/templates/server.ts +17 -13
- package/src/templates/shared.ts +10 -10
- package/src/test-helpers/generated-app.ts +1 -0
package/dist/choices.js
CHANGED
|
@@ -20,12 +20,12 @@ export const packageManagerChoices = [
|
|
|
20
20
|
"yarn",
|
|
21
21
|
];
|
|
22
22
|
/**
|
|
23
|
-
* Supported
|
|
23
|
+
* Supported providers rendered directly by the starter.
|
|
24
24
|
*/
|
|
25
|
-
export const
|
|
26
|
-
"inngest",
|
|
27
|
-
"resend",
|
|
28
|
-
"
|
|
25
|
+
export const starterProviderChoices = [
|
|
26
|
+
"jobs-inngest",
|
|
27
|
+
"mail-resend",
|
|
28
|
+
"rate-limit-upstash",
|
|
29
29
|
];
|
|
30
30
|
/**
|
|
31
31
|
* Supported scaffold database choices.
|
|
@@ -46,71 +46,34 @@ export const providerPresetChoices = [
|
|
|
46
46
|
"mail-smtp",
|
|
47
47
|
"payments-stripe",
|
|
48
48
|
"search-meilisearch",
|
|
49
|
-
"sentry",
|
|
50
|
-
"
|
|
51
|
-
"redis
|
|
52
|
-
"event-bus-redis",
|
|
53
|
-
"redis-locks",
|
|
54
|
-
"s3-storage",
|
|
55
|
-
"vercel-blob-storage",
|
|
56
|
-
];
|
|
57
|
-
/**
|
|
58
|
-
* Supported `beignet create --integrations` choices. Template integrations
|
|
59
|
-
* come first; the rest of the provider preset catalog follows.
|
|
60
|
-
*/
|
|
61
|
-
export const createIntegrationChoices = [
|
|
62
|
-
"inngest",
|
|
63
|
-
"resend",
|
|
64
|
-
"upstash-rate-limit",
|
|
65
|
-
"flags-openfeature",
|
|
66
|
-
"jobs-bullmq",
|
|
67
|
-
"jobs-inngest",
|
|
68
|
-
"mail-resend",
|
|
69
|
-
"mail-smtp",
|
|
70
|
-
"payments-stripe",
|
|
71
|
-
"redis-cache",
|
|
49
|
+
"error-reporting-sentry",
|
|
50
|
+
"rate-limit-upstash",
|
|
51
|
+
"cache-redis",
|
|
72
52
|
"event-bus-redis",
|
|
73
|
-
"redis
|
|
74
|
-
"s3
|
|
75
|
-
"
|
|
76
|
-
"sentry",
|
|
77
|
-
"vercel-blob-storage",
|
|
53
|
+
"locks-redis",
|
|
54
|
+
"storage-s3",
|
|
55
|
+
"storage-vercel-blob",
|
|
78
56
|
];
|
|
79
57
|
/**
|
|
80
|
-
*
|
|
81
|
-
* template integration. Selecting the preset name at create time scaffolds
|
|
82
|
-
* the equivalent template integration, so preset and integration stay
|
|
83
|
-
* consistent and `beignet providers add` remains a no-op afterwards.
|
|
58
|
+
* Supported `beignet create --providers` choices.
|
|
84
59
|
*/
|
|
85
|
-
const
|
|
86
|
-
"jobs-inngest": "inngest",
|
|
87
|
-
"mail-resend": "resend",
|
|
88
|
-
"upstash-rate-limit": "upstash-rate-limit",
|
|
89
|
-
};
|
|
60
|
+
export const createProviderChoices = providerPresetChoices;
|
|
90
61
|
/**
|
|
91
|
-
* Split `--
|
|
92
|
-
*
|
|
93
|
-
* the scaffold is written. Preset names with a template equivalent are
|
|
94
|
-
* normalized to the template integration; duplicates collapse.
|
|
62
|
+
* Split `--providers` selections into providers rendered directly by the
|
|
63
|
+
* starter and presets applied after the scaffold is written.
|
|
95
64
|
*/
|
|
96
|
-
export function
|
|
97
|
-
const
|
|
65
|
+
export function splitCreateProviders(values) {
|
|
66
|
+
const starterProviders = new Set();
|
|
98
67
|
const presets = new Set();
|
|
99
68
|
for (const value of values) {
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
const preset = value;
|
|
105
|
-
const alias = presetTemplateIntegrationAliases[preset];
|
|
106
|
-
if (alias) {
|
|
107
|
-
integrations.add(alias);
|
|
69
|
+
if (starterProviderChoices.includes(value)) {
|
|
70
|
+
starterProviders.add(value);
|
|
108
71
|
}
|
|
109
72
|
else {
|
|
110
|
-
presets.add(
|
|
73
|
+
presets.add(value);
|
|
111
74
|
}
|
|
112
75
|
}
|
|
113
|
-
return {
|
|
76
|
+
return { starterProviders: [...starterProviders], presets: [...presets] };
|
|
114
77
|
}
|
|
115
78
|
/**
|
|
116
79
|
* Local database name derived from the app name.
|
|
@@ -167,24 +130,15 @@ export const completionShellChoices = [
|
|
|
167
130
|
export const makeFeatureAddonChoices = [
|
|
168
131
|
"policy",
|
|
169
132
|
"factory",
|
|
170
|
-
"factories",
|
|
171
133
|
"event",
|
|
172
|
-
"events",
|
|
173
134
|
"job",
|
|
174
|
-
"jobs",
|
|
175
135
|
"listener",
|
|
176
|
-
"listeners",
|
|
177
136
|
"notification",
|
|
178
|
-
"notifications",
|
|
179
137
|
"schedule",
|
|
180
|
-
"schedules",
|
|
181
138
|
"seed",
|
|
182
|
-
"seeds",
|
|
183
139
|
"task",
|
|
184
|
-
"tasks",
|
|
185
140
|
"ui",
|
|
186
141
|
"upload",
|
|
187
|
-
"uploads",
|
|
188
142
|
];
|
|
189
143
|
/**
|
|
190
144
|
* Named recipes supported by `beignet make feature --recipe`.
|
package/dist/choices.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"choices.js","sourceRoot":"","sources":["../src/choices.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"choices.js","sourceRoot":"","sources":["../src/choices.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2CH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM;CACoC,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;CACsC,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,cAAc;IACd,aAAa;IACb,oBAAoB;CAC6B,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ;IACR,UAAU;IACV,OAAO;CACmC,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,mBAAmB;IACnB,aAAa;IACb,cAAc;IACd,aAAa;IACb,WAAW;IACX,iBAAiB;IACjB,oBAAoB;IACpB,wBAAwB;IACxB,oBAAoB;IACpB,aAAa;IACb,iBAAiB;IACjB,aAAa;IACb,YAAY;IACZ,qBAAqB;CAC2B,CAAC;AAOnD;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAqC;IAIxE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAK,sBAA4C,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,gBAAgB,CAAC,GAAG,CAAC,KAA4B,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAsB,EACtB,OAAe;IAEf,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEhD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,2FAA2F,YAAY,kCAAkC,CAAC;QACnJ,KAAK,OAAO;YACV,OAAO,uEAAuE,YAAY,yBAAyB,CAAC;QACtH;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAsB,EACtB,OAAe;IAEf,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEhD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,6CAA6C,YAAY,EAAE,CAAC;QACrE,KAAK,OAAO;YACV,OAAO,uCAAuC,YAAY,EAAE,CAAC;QAC/D;YACE,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC;AAOD;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,MAAM;IACN,KAAK;CACwC,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,QAAQ;IACR,SAAS;IACT,OAAO;IACP,KAAK;IACL,UAAU;IACV,cAAc;IACd,UAAU;IACV,MAAM;IACN,MAAM;IACN,IAAI;IACJ,QAAQ;CACA,CAAC;AAOX;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,YAAY,CAAU,CAAC"}
|
package/dist/create-prompts.d.ts
CHANGED
|
@@ -5,19 +5,18 @@
|
|
|
5
5
|
* `@clack/prompts` is loaded lazily inside the prompt flow so non-interactive
|
|
6
6
|
* runs and CLI startup never pay for it.
|
|
7
7
|
*/
|
|
8
|
-
import { type
|
|
8
|
+
import { type CreateProviderName, type DatabaseName, type PackageManager } from "./choices.js";
|
|
9
9
|
/**
|
|
10
10
|
* Selections shared by create flags and interactive prompt answers.
|
|
11
11
|
*
|
|
12
|
-
* `
|
|
13
|
-
*
|
|
14
|
-
* curated template list and points at the wider catalog.
|
|
12
|
+
* `providers` accepts the full `beignet provider add` preset catalog; the
|
|
13
|
+
* interactive prompt shows the providers rendered directly by the starter.
|
|
15
14
|
*/
|
|
16
15
|
export type CreateSelections = {
|
|
17
16
|
directory?: string;
|
|
18
17
|
api?: boolean;
|
|
19
18
|
db?: DatabaseName;
|
|
20
|
-
|
|
19
|
+
providers?: readonly CreateProviderName[];
|
|
21
20
|
packageManager?: PackageManager;
|
|
22
21
|
};
|
|
23
22
|
type CreatePromptFlags = CreateSelections & {
|
|
@@ -31,7 +30,7 @@ type CreatePromptTty = {
|
|
|
31
30
|
* Decide whether `beignet create` should run the interactive prompt flow.
|
|
32
31
|
*
|
|
33
32
|
* Prompts run only on a full TTY, only when `--yes` is absent, and only when
|
|
34
|
-
* no selection flag was passed. Any explicit api, database,
|
|
33
|
+
* no selection flag was passed. Any explicit api, database, provider, or
|
|
35
34
|
* package manager selection means the invocation is scripted, so the
|
|
36
35
|
* non-interactive path stays byte-identical for agents and CI.
|
|
37
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-prompts.d.ts","sourceRoot":"","sources":["../src/create-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,
|
|
1
|
+
{"version":3,"file":"create-prompts.d.ts","sourceRoot":"","sources":["../src/create-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,YAAY,EAEjB,KAAK,cAAc,EAGpB,MAAM,cAAc,CAAC;AAEtB;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,YAAY,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC1C,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,KAAK,iBAAiB,GAAG,gBAAgB,GAAG;IAC1C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,eAAe,GACnB,OAAO,CAWT;AAcD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAyDvC"}
|
package/dist/create-prompts.js
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* `@clack/prompts` is loaded lazily inside the prompt flow so non-interactive
|
|
6
6
|
* runs and CLI startup never pay for it.
|
|
7
7
|
*/
|
|
8
|
-
import { databaseChoices,
|
|
8
|
+
import { databaseChoices, starterProviderChoices, } from "./choices.js";
|
|
9
9
|
/**
|
|
10
10
|
* Decide whether `beignet create` should run the interactive prompt flow.
|
|
11
11
|
*
|
|
12
12
|
* Prompts run only on a full TTY, only when `--yes` is absent, and only when
|
|
13
|
-
* no selection flag was passed. Any explicit api, database,
|
|
13
|
+
* no selection flag was passed. Any explicit api, database, provider, or
|
|
14
14
|
* package manager selection means the invocation is scripted, so the
|
|
15
15
|
* non-interactive path stays byte-identical for agents and CI.
|
|
16
16
|
*/
|
|
@@ -21,14 +21,14 @@ export function shouldPromptInteractively(flags, tty) {
|
|
|
21
21
|
return false;
|
|
22
22
|
const selectionFlagPassed = flags.api !== undefined ||
|
|
23
23
|
flags.db !== undefined ||
|
|
24
|
-
(flags.
|
|
24
|
+
(flags.providers?.length ?? 0) > 0 ||
|
|
25
25
|
flags.packageManager !== undefined;
|
|
26
26
|
return !selectionFlagPassed;
|
|
27
27
|
}
|
|
28
|
-
const
|
|
29
|
-
inngest: "Inngest-backed background jobs",
|
|
30
|
-
resend: "Resend-backed mail provider",
|
|
31
|
-
"
|
|
28
|
+
const providerHints = {
|
|
29
|
+
"jobs-inngest": "Inngest-backed background jobs",
|
|
30
|
+
"mail-resend": "Resend-backed mail provider",
|
|
31
|
+
"rate-limit-upstash": "Upstash-backed rate limiting",
|
|
32
32
|
};
|
|
33
33
|
const databaseHints = {
|
|
34
34
|
sqlite: "libSQL/Turso, zero setup — default",
|
|
@@ -73,23 +73,23 @@ export async function promptCreateSelections(initial) {
|
|
|
73
73
|
});
|
|
74
74
|
if (prompts.isCancel(db))
|
|
75
75
|
return undefined;
|
|
76
|
-
const
|
|
77
|
-
message: "Add
|
|
78
|
-
options:
|
|
79
|
-
value:
|
|
80
|
-
label:
|
|
81
|
-
hint:
|
|
76
|
+
const providers = await prompts.multiselect({
|
|
77
|
+
message: "Add providers? (press enter to skip; the full catalog is available via --providers or beignet provider add)",
|
|
78
|
+
options: starterProviderChoices.map((provider) => ({
|
|
79
|
+
value: provider,
|
|
80
|
+
label: provider,
|
|
81
|
+
hint: providerHints[provider],
|
|
82
82
|
})),
|
|
83
83
|
required: false,
|
|
84
84
|
});
|
|
85
|
-
if (prompts.isCancel(
|
|
85
|
+
if (prompts.isCancel(providers))
|
|
86
86
|
return undefined;
|
|
87
87
|
prompts.outro(`Creating ${directory}`);
|
|
88
88
|
return {
|
|
89
89
|
directory,
|
|
90
90
|
api,
|
|
91
91
|
db,
|
|
92
|
-
|
|
92
|
+
providers,
|
|
93
93
|
packageManager: initial.packageManager,
|
|
94
94
|
};
|
|
95
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-prompts.js","sourceRoot":"","sources":["../src/create-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,eAAe,
|
|
1
|
+
{"version":3,"file":"create-prompts.js","sourceRoot":"","sources":["../src/create-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,eAAe,EAGf,sBAAsB,GACvB,MAAM,cAAc,CAAC;AAyBtB;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAwB,EACxB,GAAoB;IAEpB,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAE5B,MAAM,mBAAmB,GACvB,KAAK,CAAC,GAAG,KAAK,SAAS;QACvB,KAAK,CAAC,EAAE,KAAK,SAAS;QACtB,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;QAClC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC;IAErC,OAAO,CAAC,mBAAmB,CAAC;AAC9B,CAAC;AAED,MAAM,aAAa,GAAwC;IACzD,cAAc,EAAE,gCAAgC;IAChD,aAAa,EAAE,6BAA6B;IAC5C,oBAAoB,EAAE,8BAA8B;CACrD,CAAC;AAEF,MAAM,aAAa,GAAiC;IAClD,MAAM,EAAE,oCAAoC;IAC5C,QAAQ,EAAE,+CAA+C;IACzD,KAAK,EAAE,6BAA6B;CACrC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAyB;IAEzB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE/C,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAEhC,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAClC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,OAAO,EAAE,kCAAkC;YAC3C,WAAW,EAAE,QAAQ;YACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;gBACxC,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,SAAS;SAChB,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAC;QAC/C,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;QAChC,OAAO,EAAE,6BAA6B;QACtC,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE5C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAe;QAC5C,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC;SAC9B,CAAC,CAAC;QACH,YAAY,EAAE,OAAO,CAAC,EAAE,IAAI,QAAQ;KACrC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,CAAsB;QAC/D,OAAO,EACL,6GAA6G;QAC/G,OAAO,EAAE,sBAAsB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACjD,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC;SAC9B,CAAC,CAAC;QACH,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAElD,OAAO,CAAC,KAAK,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;IAEvC,OAAO;QACL,SAAS;QACT,GAAG;QACH,EAAE;QACF,SAAS;QACT,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;AACJ,CAAC"}
|
package/dist/create.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DatabaseName, type
|
|
1
|
+
import { type DatabaseName, type PackageManager, type StarterProviderName, type TemplateFile, type TemplateName } from "./templates/index.js";
|
|
2
2
|
/**
|
|
3
3
|
* Options for creating a new Beignet app.
|
|
4
4
|
*/
|
|
@@ -11,7 +11,7 @@ export type CreateOptions = {
|
|
|
11
11
|
*/
|
|
12
12
|
api?: boolean;
|
|
13
13
|
packageManager?: PackageManager;
|
|
14
|
-
|
|
14
|
+
providers?: StarterProviderName[];
|
|
15
15
|
/**
|
|
16
16
|
* Database backing the starter's Drizzle persistence layer.
|
|
17
17
|
* Defaults to "sqlite".
|
|
@@ -33,8 +33,17 @@ export type CreateResult = {
|
|
|
33
33
|
packageManager: PackageManager;
|
|
34
34
|
database: DatabaseName;
|
|
35
35
|
};
|
|
36
|
+
export type CreateProjectPlan = {
|
|
37
|
+
result: CreateResult;
|
|
38
|
+
files: TemplateFile[];
|
|
39
|
+
};
|
|
36
40
|
/**
|
|
37
41
|
* Create a Beignet app from the starter template.
|
|
38
42
|
*/
|
|
39
43
|
export declare function createProject(options: CreateOptions): Promise<CreateResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Render a scaffold without writing it so create-time provider presets can
|
|
46
|
+
* compose against the exact same file contents as a real create.
|
|
47
|
+
*/
|
|
48
|
+
export declare function planCreateProject(options: CreateOptions): Promise<CreateProjectPlan>;
|
|
40
49
|
//# sourceMappingURL=create.d.ts.map
|
package/dist/create.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,YAAY,EAGjB,KAAK,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,YAAY,EAGjB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EAExB,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAG9B;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC;;;OAGG;IACH,EAAE,CAAC,EAAE,YAAY,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAcvB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,iBAAiB,CAAC,CA+C5B"}
|
package/dist/create.js
CHANGED
|
@@ -1,18 +1,34 @@
|
|
|
1
1
|
import { mkdir, readdir, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { databaseChoices, getTemplateFiles,
|
|
3
|
+
import { databaseChoices, getTemplateFiles, starterProviderChoices, } from "./templates/index.js";
|
|
4
4
|
import { getCliVersion } from "./version.js";
|
|
5
5
|
/**
|
|
6
6
|
* Create a Beignet app from the starter template.
|
|
7
7
|
*/
|
|
8
8
|
export async function createProject(options) {
|
|
9
|
+
const plan = await planCreateProject(options);
|
|
10
|
+
if (!plan.result.dryRun) {
|
|
11
|
+
await mkdir(plan.result.targetDir, { recursive: true });
|
|
12
|
+
for (const file of plan.files) {
|
|
13
|
+
const destination = path.join(plan.result.targetDir, file.path);
|
|
14
|
+
await mkdir(path.dirname(destination), { recursive: true });
|
|
15
|
+
await writeFile(destination, file.content);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return plan.result;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Render a scaffold without writing it so create-time provider presets can
|
|
22
|
+
* compose against the exact same file contents as a real create.
|
|
23
|
+
*/
|
|
24
|
+
export async function planCreateProject(options) {
|
|
9
25
|
const cwd = options.cwd ?? process.cwd();
|
|
10
26
|
const name = normalizeProjectName(options.name);
|
|
11
27
|
const targetDir = path.resolve(cwd, options.name);
|
|
12
28
|
const packageManager = options.packageManager ?? "bun";
|
|
13
29
|
const template = options.template ?? "next";
|
|
14
30
|
const api = Boolean(options.api);
|
|
15
|
-
const
|
|
31
|
+
const providers = resolveStarterProviders(options.providers ?? []);
|
|
16
32
|
const database = options.db ?? "sqlite";
|
|
17
33
|
if (template !== "next") {
|
|
18
34
|
throw new Error(`Unknown template "${template}". Available templates: next`);
|
|
@@ -27,44 +43,38 @@ export async function createProject(options) {
|
|
|
27
43
|
packageManager,
|
|
28
44
|
beignetVersion: options.beignetVersion ?? getDefaultBeignetVersion(),
|
|
29
45
|
api,
|
|
30
|
-
|
|
46
|
+
providers,
|
|
31
47
|
database,
|
|
32
48
|
});
|
|
33
|
-
if (!dryRun) {
|
|
34
|
-
await mkdir(targetDir, { recursive: true });
|
|
35
|
-
for (const file of files) {
|
|
36
|
-
const destination = path.join(targetDir, file.path);
|
|
37
|
-
await mkdir(path.dirname(destination), { recursive: true });
|
|
38
|
-
await writeFile(destination, file.content);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
49
|
return {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
50
|
+
result: {
|
|
51
|
+
schemaVersion: 1,
|
|
52
|
+
name,
|
|
53
|
+
targetDir,
|
|
54
|
+
dryRun,
|
|
55
|
+
files: files.map((file) => file.path),
|
|
56
|
+
packageManager,
|
|
57
|
+
database,
|
|
58
|
+
},
|
|
59
|
+
files,
|
|
49
60
|
};
|
|
50
61
|
}
|
|
51
62
|
/**
|
|
52
|
-
* Providers that ship in every starter
|
|
53
|
-
* choices, so passing them gets a pointed error instead of a generic one.
|
|
63
|
+
* Providers that ship in every starter are not selectable additions.
|
|
54
64
|
*/
|
|
55
65
|
const baseProviderNames = new Set(["better-auth", "drizzle-sqlite", "pino"]);
|
|
56
|
-
function
|
|
57
|
-
for (const
|
|
58
|
-
const
|
|
59
|
-
if (baseProviderNames.has(
|
|
60
|
-
const databaseHint =
|
|
66
|
+
function resolveStarterProviders(explicitProviders) {
|
|
67
|
+
for (const provider of explicitProviders) {
|
|
68
|
+
const providerName = provider;
|
|
69
|
+
if (baseProviderNames.has(providerName)) {
|
|
70
|
+
const databaseHint = providerName === "drizzle-sqlite"
|
|
61
71
|
? " Choose the starter database with --db sqlite|postgres|mysql instead."
|
|
62
72
|
: "";
|
|
63
|
-
throw new Error(`${
|
|
73
|
+
throw new Error(`${provider} is part of every Beignet starter and is not a --providers choice.${databaseHint}`);
|
|
64
74
|
}
|
|
65
75
|
}
|
|
66
|
-
const
|
|
67
|
-
return
|
|
76
|
+
const providers = new Set(explicitProviders);
|
|
77
|
+
return starterProviderChoices.filter((provider) => providers.has(provider));
|
|
68
78
|
}
|
|
69
79
|
function getDefaultBeignetVersion() {
|
|
70
80
|
const version = getCliVersion();
|
package/dist/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAEL,eAAe,EACf,gBAAgB,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAIL,KAAK,cAAc,EAInB,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAEpB,MAAM,eAAe,CAAC;AA2BvB,KAAK,UAAU,GAAG,cAAc,GAAG;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAIL,KAAK,cAAc,EAInB,KAAK,4BAA4B,EACjC,KAAK,cAAc,EAEpB,MAAM,eAAe,CAAC;AA2BvB,KAAK,UAAU,GAAG,cAAc,GAAG;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC,CAAC;AA2lFF,wBAAsB,IAAI,CACxB,MAAM,WAAwB,EAC9B,OAAO,GAAE,4BAA4B,CAAC,UAAU,CAAe,GAC9D,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|