@swell/cli 2.9.17 → 2.9.19
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 +90 -0
- package/dist/commands/app/dev.js +21 -34
- package/dist/commands/app/frontend/deploy.js +3 -3
- package/dist/commands/app/frontend/dev.js +5 -2
- package/dist/commands/app/init.js +12 -2
- package/dist/commands/create/app.d.ts +10 -1
- package/dist/commands/create/app.js +48 -25
- package/dist/commands/create/frontend.d.ts +3 -1
- package/dist/commands/create/frontend.js +21 -13
- package/dist/create-app-command.d.ts +10 -51
- package/dist/create-app-command.js +99 -526
- package/dist/help/custom-help.js +28 -7
- package/dist/help/types.d.ts +2 -0
- package/dist/lib/app-config.js +6 -0
- package/dist/lib/apps/frontend-package.d.ts +36 -0
- package/dist/lib/apps/frontend-package.js +375 -0
- package/dist/lib/apps/frontend-routes.d.ts +1 -0
- package/dist/lib/apps/frontend-routes.js +40 -0
- package/dist/lib/apps/frontend-scaffold.d.ts +35 -0
- package/dist/lib/apps/frontend-scaffold.js +502 -0
- package/dist/lib/apps/frontend-templates.d.ts +32 -0
- package/dist/lib/apps/frontend-templates.js +137 -0
- package/dist/lib/apps/index.d.ts +7 -7
- package/dist/lib/apps/index.js +10 -33
- package/dist/lib/apps/storefront-resources.d.ts +3 -2
- package/dist/lib/apps/storefront-resources.js +3 -2
- package/dist/push-app-command.js +22 -0
- package/dist/remote-app-command.js +6 -0
- package/dist/types/index.d.ts +5 -0
- package/oclif.manifest.json +63 -94
- package/package.json +5 -3
package/dist/lib/apps/index.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export interface App {
|
|
|
28
28
|
deployment_hash?: string;
|
|
29
29
|
deployment_id?: string;
|
|
30
30
|
framework?: string;
|
|
31
|
+
hosting?: 'managed' | 'self-hosted';
|
|
32
|
+
package_id?: string;
|
|
31
33
|
service?: string;
|
|
32
34
|
url?: string;
|
|
33
35
|
};
|
|
@@ -39,8 +41,10 @@ export interface App {
|
|
|
39
41
|
}>;
|
|
40
42
|
id?: string;
|
|
41
43
|
images?: Array<{
|
|
42
|
-
|
|
44
|
+
description?: string;
|
|
43
45
|
id: string;
|
|
46
|
+
image_src?: unknown;
|
|
47
|
+
title?: string;
|
|
44
48
|
}>;
|
|
45
49
|
installed?: {
|
|
46
50
|
date_created: string;
|
|
@@ -144,20 +148,16 @@ export declare enum ConfigInputFields {
|
|
|
144
148
|
VERSION = "version"
|
|
145
149
|
}
|
|
146
150
|
export interface FrontendProjectType {
|
|
147
|
-
appTypes?: string[];
|
|
148
151
|
buildCommand?: string;
|
|
149
152
|
devCommand: string;
|
|
150
|
-
displayOrder?: number;
|
|
151
|
-
installCommand?: string;
|
|
152
153
|
mainPackage: string;
|
|
153
154
|
name: string;
|
|
154
|
-
provisionsStorefront?: boolean;
|
|
155
155
|
slug: string;
|
|
156
156
|
}
|
|
157
157
|
export declare const CUSTOM_FRAMEWORK_SLUG = "custom";
|
|
158
158
|
export declare const FrontendProjectTypes: FrontendProjectType[];
|
|
159
|
-
export declare function getFrontendProjectSlugs(withNone?: boolean
|
|
160
|
-
export declare function getFrontendProjectValidValues(withNone?: boolean
|
|
159
|
+
export declare function getFrontendProjectSlugs(withNone?: boolean): string[];
|
|
160
|
+
export declare function getFrontendProjectValidValues(withNone?: boolean): string;
|
|
161
161
|
export declare function getFrontendProjectType(appPath: string): Promise<FrontendProjectType | undefined>;
|
|
162
162
|
/**
|
|
163
163
|
* Get project commands transformed for the detected package manager.
|
package/dist/lib/apps/index.js
CHANGED
|
@@ -125,23 +125,20 @@ export const CUSTOM_FRAMEWORK_SLUG = 'custom';
|
|
|
125
125
|
// Pinned by test/lib/frontend-detection.test.ts.
|
|
126
126
|
export const FrontendProjectTypes = [
|
|
127
127
|
{
|
|
128
|
-
// Template ref is `main`; pin to an immutable tag before announcement.
|
|
129
|
-
// `--no-agents` pre-answers C3's agents-helper prompt so install
|
|
130
|
-
// doesn't hang behind our spinner.
|
|
131
|
-
appTypes: ['storefront'],
|
|
132
128
|
devCommand: 'npm run dev -- --port ${PORT}',
|
|
133
|
-
displayOrder: 7,
|
|
134
|
-
installCommand: 'npm create cloudflare@latest -- frontend --template=swellstores/storefront-react-ai-template#main --deploy=false --git=false --no-agents',
|
|
135
129
|
mainPackage: '@swell/storefront-app-sdk-react',
|
|
136
130
|
name: 'Swell React Storefront',
|
|
137
|
-
provisionsStorefront: true,
|
|
138
131
|
slug: 'react-storefront',
|
|
139
132
|
},
|
|
133
|
+
{
|
|
134
|
+
devCommand: 'npm run dev -- --port ${PORT}',
|
|
135
|
+
mainPackage: 'vinext',
|
|
136
|
+
name: 'Vinext',
|
|
137
|
+
slug: 'vinext',
|
|
138
|
+
},
|
|
140
139
|
{
|
|
141
140
|
buildCommand: 'npx astro build',
|
|
142
141
|
devCommand: 'npx astro dev --port ${PORT}',
|
|
143
|
-
displayOrder: 2,
|
|
144
|
-
installCommand: 'npm create cloudflare@latest -- frontend --framework=astro --deploy=false --git=false -- --no-git --yes --skip-houston --typescript strict',
|
|
145
142
|
mainPackage: 'astro',
|
|
146
143
|
name: 'Astro',
|
|
147
144
|
slug: 'astro',
|
|
@@ -149,16 +146,12 @@ export const FrontendProjectTypes = [
|
|
|
149
146
|
{
|
|
150
147
|
buildCommand: 'npx ng build',
|
|
151
148
|
devCommand: 'npx ng serve --port ${PORT}',
|
|
152
|
-
displayOrder: 6,
|
|
153
|
-
installCommand: 'npm create cloudflare@latest -- frontend --framework=angular --deploy=false --git=false -- --style=sass --zoneless --ai-config=none',
|
|
154
149
|
mainPackage: '@angular/core',
|
|
155
150
|
name: 'Angular',
|
|
156
151
|
slug: 'angular',
|
|
157
152
|
},
|
|
158
153
|
{
|
|
159
154
|
devCommand: 'npm run dev -- --port ${PORT}',
|
|
160
|
-
displayOrder: 5,
|
|
161
|
-
installCommand: 'npm create cloudflare@latest -- frontend --framework=hono --deploy=false --git=false',
|
|
162
155
|
mainPackage: 'hono',
|
|
163
156
|
name: 'Hono',
|
|
164
157
|
slug: 'hono',
|
|
@@ -166,8 +159,6 @@ export const FrontendProjectTypes = [
|
|
|
166
159
|
{
|
|
167
160
|
buildCommand: 'npx nuxt build',
|
|
168
161
|
devCommand: 'npx nuxt dev --port ${PORT}',
|
|
169
|
-
displayOrder: 3,
|
|
170
|
-
installCommand: 'npm create cloudflare@latest -- frontend --framework=nuxt --deploy=false --git=false -- --no-modules -f',
|
|
171
162
|
mainPackage: 'nuxt',
|
|
172
163
|
name: 'Nuxt',
|
|
173
164
|
slug: 'nuxt',
|
|
@@ -175,40 +166,26 @@ export const FrontendProjectTypes = [
|
|
|
175
166
|
{
|
|
176
167
|
buildCommand: 'npx opennextjs-cloudflare build',
|
|
177
168
|
devCommand: 'npx next dev --turbopack --port ${PORT}',
|
|
178
|
-
displayOrder: 1,
|
|
179
|
-
installCommand: 'npm create cloudflare@latest -- frontend --framework=next --deploy=false --git=false -- --typescript --use-npm --src-dir --app --eslint --import-alias "@/*" --tailwind --turbopack',
|
|
180
169
|
mainPackage: 'next',
|
|
181
170
|
name: 'Next.js',
|
|
182
171
|
slug: 'nextjs',
|
|
183
172
|
},
|
|
184
173
|
{
|
|
185
|
-
// `--variant=react-ts` pre-answers C3's variant prompt (TS Vite +
|
|
186
|
-
// plugin-react, not SWC) so install doesn't hang behind our spinner.
|
|
187
174
|
devCommand: 'npm run dev -- --port ${PORT}',
|
|
188
|
-
displayOrder: 4,
|
|
189
|
-
installCommand: 'npm create cloudflare@latest -- frontend --framework=react --deploy=false --git=false --variant=react-ts',
|
|
190
175
|
mainPackage: 'react',
|
|
191
176
|
name: 'React',
|
|
192
177
|
slug: 'react',
|
|
193
178
|
},
|
|
194
179
|
];
|
|
195
|
-
export function getFrontendProjectSlugs(withNone = true
|
|
196
|
-
const
|
|
197
|
-
? FrontendProjectTypes
|
|
198
|
-
: FrontendProjectTypes.filter((projectType) => projectType.installCommand);
|
|
199
|
-
// Sort so user-facing surfaces match the prompt; detection order is
|
|
200
|
-
// independent.
|
|
201
|
-
const slugs = [...types]
|
|
202
|
-
.sort((a, b) => (a.displayOrder ?? Number.POSITIVE_INFINITY) -
|
|
203
|
-
(b.displayOrder ?? Number.POSITIVE_INFINITY))
|
|
204
|
-
.map((projectType) => projectType.slug);
|
|
180
|
+
export function getFrontendProjectSlugs(withNone = true) {
|
|
181
|
+
const slugs = FrontendProjectTypes.map((projectType) => projectType.slug);
|
|
205
182
|
if (withNone) {
|
|
206
183
|
slugs.push('none');
|
|
207
184
|
}
|
|
208
185
|
return slugs;
|
|
209
186
|
}
|
|
210
|
-
export function getFrontendProjectValidValues(withNone = true
|
|
211
|
-
return getFrontendProjectSlugs(withNone
|
|
187
|
+
export function getFrontendProjectValidValues(withNone = true) {
|
|
188
|
+
return getFrontendProjectSlugs(withNone).join(', ');
|
|
212
189
|
}
|
|
213
190
|
export async function getFrontendProjectType(appPath) {
|
|
214
191
|
// Try frontend/package.json first (workspace structure), then root package.json (legacy)
|
|
@@ -18,8 +18,9 @@ export interface StorefrontResourceResult {
|
|
|
18
18
|
/**
|
|
19
19
|
* Ensure the remote development app and its storefront exist.
|
|
20
20
|
*
|
|
21
|
-
* `swell create app --frontend
|
|
22
|
-
* scaffold succeeds. Retrying is safe: existing
|
|
21
|
+
* `swell create app --frontend swell-spa` (or its `react-storefront` alias)
|
|
22
|
+
* calls this after the local scaffold succeeds. Retrying is safe: existing
|
|
23
|
+
* resources are reused.
|
|
23
24
|
*
|
|
24
25
|
* @param api authenticated Swell API client
|
|
25
26
|
* @param input storefront app identity from the generated swell.json
|
|
@@ -2,8 +2,9 @@ import config from '../config.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Ensure the remote development app and its storefront exist.
|
|
4
4
|
*
|
|
5
|
-
* `swell create app --frontend
|
|
6
|
-
* scaffold succeeds. Retrying is safe: existing
|
|
5
|
+
* `swell create app --frontend swell-spa` (or its `react-storefront` alias)
|
|
6
|
+
* calls this after the local scaffold succeeds. Retrying is safe: existing
|
|
7
|
+
* resources are reused.
|
|
7
8
|
*
|
|
8
9
|
* @param api authenticated Swell API client
|
|
9
10
|
* @param input storefront app identity from the generated swell.json
|
package/dist/push-app-command.js
CHANGED
|
@@ -6,6 +6,8 @@ import * as path from 'node:path';
|
|
|
6
6
|
import Stream from 'node:stream';
|
|
7
7
|
import ora from 'ora';
|
|
8
8
|
import { default as swellConfig } from './lib/app-config.js';
|
|
9
|
+
import { buildFrontendPackage, getManagedFrontendFramework, } from './lib/apps/frontend-package.js';
|
|
10
|
+
import { warnFrontendRouteCollisions } from './lib/apps/frontend-routes.js';
|
|
9
11
|
import { ConfigType, getFrontendProjectValidValues, allConfigFilesInDir, CUSTOM_FRAMEWORK_SLUG, appConfigFromFile, filePathExistsAsync, findAppConfig, getConfigTypeFromPath, getConfigTypeKeyFromValue, getFrontendProjectType, getProjectCommands, globAllFilesByPath, hashString, isPathDirectory, toPosixPath, } from './lib/apps/index.js';
|
|
10
12
|
import { getGlobIgnorePathsChecker } from './lib/apps/paths.js';
|
|
11
13
|
import { slugFromApp } from './lib/apps/slug.js';
|
|
@@ -249,6 +251,24 @@ export class PushAppCommand extends RemoteAppCommand {
|
|
|
249
251
|
}
|
|
250
252
|
async deployAppFrontend(force, log) {
|
|
251
253
|
const currentStore = localConfig.getDefaultStore();
|
|
254
|
+
if (this.swellConfig.store.frontend?.hosting === 'managed') {
|
|
255
|
+
const frontend = path.join(this.appPath, 'frontend');
|
|
256
|
+
const framework = await getManagedFrontendFramework(frontend);
|
|
257
|
+
await warnFrontendRouteCollisions(this.appPath, framework, (message) => this.warn(message));
|
|
258
|
+
this.log(`Building managed ${framework} frontend...`);
|
|
259
|
+
const pkg = await buildFrontendPackage(frontend, framework);
|
|
260
|
+
const serialized = JSON.stringify(pkg);
|
|
261
|
+
if (Buffer.byteLength(serialized) > 8 * 1024 * 1024) {
|
|
262
|
+
this.error('Managed frontend package exceeds the 8 MiB upload limit.');
|
|
263
|
+
}
|
|
264
|
+
await this.handleRequestErrors(async () => this.api.post({ adminPath: `/apps/${this.app.id}/frontend-package` }, { body: { package: serialized } }));
|
|
265
|
+
this.log(`Deployed managed frontend package ${pkg.digest}.`);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (this.app.frontend?.hosting === 'managed' &&
|
|
269
|
+
!this.swellConfig.store.frontend?.hosting) {
|
|
270
|
+
this.error('Set frontend.hosting to self-hosted explicitly to change hosting.');
|
|
271
|
+
}
|
|
252
272
|
const projectType = await this.getFrontendProjectType(false);
|
|
253
273
|
if (!projectType) {
|
|
254
274
|
return;
|
|
@@ -257,6 +277,7 @@ export class PushAppCommand extends RemoteAppCommand {
|
|
|
257
277
|
// Build and deploy only if there are files to push
|
|
258
278
|
if (deploymentHash &&
|
|
259
279
|
(force || deploymentHash !== this.app.frontend?.deployment_hash)) {
|
|
280
|
+
await warnFrontendRouteCollisions(this.appPath, projectType.slug, (message) => this.warn(message));
|
|
260
281
|
await this.buildFrontend(projectType);
|
|
261
282
|
const deploymentUrl = await this.deployFrontend(projectType);
|
|
262
283
|
await this.updateFrontendDeployment(currentStore, projectType, deploymentUrl, deploymentHash);
|
|
@@ -829,6 +850,7 @@ export class PushAppCommand extends RemoteAppCommand {
|
|
|
829
850
|
$client_id: currentStore,
|
|
830
851
|
$environment_id: 'test',
|
|
831
852
|
frontend: {
|
|
853
|
+
hosting: 'self-hosted',
|
|
832
854
|
deployment_hash: deploymentHash,
|
|
833
855
|
...(projectType.slug !== CUSTOM_FRAMEWORK_SLUG && {
|
|
834
856
|
framework: projectType.slug,
|
|
@@ -188,6 +188,12 @@ export class RemoteAppCommand extends AppCommand {
|
|
|
188
188
|
}
|
|
189
189
|
const body = {
|
|
190
190
|
...this.swellConfig.store,
|
|
191
|
+
// A hosting declaration is not deployment state. Only an explicit
|
|
192
|
+
// self-hosted URL can be applied before the deployment step succeeds.
|
|
193
|
+
frontend: this.swellConfig.store.frontend?.hosting !== 'managed' &&
|
|
194
|
+
this.swellConfig.store.frontend?.url
|
|
195
|
+
? this.swellConfig.store.frontend
|
|
196
|
+
: undefined,
|
|
191
197
|
// we store locally the private id as the id, but we need to switch it
|
|
192
198
|
// when posting to the API
|
|
193
199
|
id: undefined,
|
package/dist/types/index.d.ts
CHANGED
package/oclif.manifest.json
CHANGED
|
@@ -877,27 +877,23 @@
|
|
|
877
877
|
"$ swell app init my-app",
|
|
878
878
|
"$ swell app init -t admin -y",
|
|
879
879
|
"$ swell app init my-app -t admin -y",
|
|
880
|
-
"$ swell app init my-app -t admin --frontend astro -y",
|
|
881
880
|
"$ swell app init my_theme -t theme --storefront-app proxima -y"
|
|
882
881
|
],
|
|
883
882
|
"flags": {
|
|
884
883
|
"frontend": {
|
|
885
|
-
"
|
|
884
|
+
"hidden": true,
|
|
886
885
|
"name": "frontend",
|
|
887
886
|
"hasDynamicHelp": false,
|
|
888
887
|
"multiple": false,
|
|
889
|
-
"options": [
|
|
890
|
-
"nextjs",
|
|
891
|
-
"astro",
|
|
892
|
-
"nuxt",
|
|
893
|
-
"react",
|
|
894
|
-
"hono",
|
|
895
|
-
"angular",
|
|
896
|
-
"react-storefront",
|
|
897
|
-
"none"
|
|
898
|
-
],
|
|
899
888
|
"type": "option"
|
|
900
889
|
},
|
|
890
|
+
"yes": {
|
|
891
|
+
"char": "y",
|
|
892
|
+
"description": "Skip prompts; use defaults for optional values",
|
|
893
|
+
"name": "yes",
|
|
894
|
+
"allowNo": false,
|
|
895
|
+
"type": "boolean"
|
|
896
|
+
},
|
|
901
897
|
"storefront-app": {
|
|
902
898
|
"description": "Target storefront app ID",
|
|
903
899
|
"name": "storefront-app",
|
|
@@ -925,13 +921,6 @@
|
|
|
925
921
|
"multiple": false,
|
|
926
922
|
"type": "option"
|
|
927
923
|
},
|
|
928
|
-
"yes": {
|
|
929
|
-
"char": "y",
|
|
930
|
-
"description": "Skip prompts, require all arguments",
|
|
931
|
-
"name": "yes",
|
|
932
|
-
"allowNo": false,
|
|
933
|
-
"type": "boolean"
|
|
934
|
-
},
|
|
935
924
|
"pkg": {
|
|
936
925
|
"char": "p",
|
|
937
926
|
"description": "Package manager: npm | yarn | pnpm | bun | none",
|
|
@@ -1008,27 +997,25 @@
|
|
|
1008
997
|
{
|
|
1009
998
|
"name": "admin",
|
|
1010
999
|
"description": "Dashboard extension",
|
|
1011
|
-
"optional": [
|
|
1012
|
-
"--frontend"
|
|
1013
|
-
]
|
|
1000
|
+
"optional": []
|
|
1014
1001
|
},
|
|
1015
1002
|
{
|
|
1016
1003
|
"name": "storefront",
|
|
1017
1004
|
"description": "Hosted storefront",
|
|
1018
|
-
"optional": [
|
|
1019
|
-
"--frontend"
|
|
1020
|
-
]
|
|
1005
|
+
"optional": []
|
|
1021
1006
|
},
|
|
1022
1007
|
{
|
|
1023
1008
|
"name": "theme",
|
|
1024
1009
|
"description": "Theme for existing storefront",
|
|
1025
1010
|
"requires": [
|
|
1026
1011
|
"--storefront-app"
|
|
1027
|
-
]
|
|
1012
|
+
],
|
|
1013
|
+
"optional": []
|
|
1028
1014
|
},
|
|
1029
1015
|
{
|
|
1030
1016
|
"name": "integration",
|
|
1031
1017
|
"description": "Third-party service",
|
|
1018
|
+
"optional": [],
|
|
1032
1019
|
"requires": [
|
|
1033
1020
|
"--integration-type",
|
|
1034
1021
|
"--integration-id (for payment | shipping | tax)"
|
|
@@ -1452,29 +1439,40 @@
|
|
|
1452
1439
|
"examples": [
|
|
1453
1440
|
"$ swell create app",
|
|
1454
1441
|
"$ swell create app my_app -t admin -y",
|
|
1455
|
-
"$ swell create app my_app -t admin --frontend
|
|
1442
|
+
"$ swell create app my_app -t admin --frontend swell-react -y",
|
|
1443
|
+
"$ swell create app my_shop -t storefront --frontend swell-spa -y",
|
|
1456
1444
|
"$ swell create app my_theme -t theme --storefront-app proxima -y",
|
|
1457
|
-
"$ swell create app my_payment -t integration --integration-type payment --integration-id card -y"
|
|
1458
|
-
"$ swell create app my_shipping -t integration --integration-type shipping --integration-id fedex -y"
|
|
1445
|
+
"$ swell create app my_payment -t integration --integration-type payment --integration-id card -y"
|
|
1459
1446
|
],
|
|
1460
1447
|
"flags": {
|
|
1461
1448
|
"frontend": {
|
|
1462
|
-
"description": "
|
|
1449
|
+
"description": "Frontend template; see FRONTENDS",
|
|
1463
1450
|
"name": "frontend",
|
|
1464
1451
|
"hasDynamicHelp": false,
|
|
1452
|
+
"helpValue": "template",
|
|
1465
1453
|
"multiple": false,
|
|
1466
1454
|
"options": [
|
|
1455
|
+
"swell-react",
|
|
1456
|
+
"swell-vinext",
|
|
1457
|
+
"swell-spa",
|
|
1467
1458
|
"nextjs",
|
|
1468
1459
|
"astro",
|
|
1469
1460
|
"nuxt",
|
|
1470
1461
|
"react",
|
|
1471
1462
|
"hono",
|
|
1472
1463
|
"angular",
|
|
1473
|
-
"
|
|
1474
|
-
"
|
|
1464
|
+
"none",
|
|
1465
|
+
"react-storefront"
|
|
1475
1466
|
],
|
|
1476
1467
|
"type": "option"
|
|
1477
1468
|
},
|
|
1469
|
+
"yes": {
|
|
1470
|
+
"char": "y",
|
|
1471
|
+
"description": "Skip prompts; use defaults for optional values",
|
|
1472
|
+
"name": "yes",
|
|
1473
|
+
"allowNo": false,
|
|
1474
|
+
"type": "boolean"
|
|
1475
|
+
},
|
|
1478
1476
|
"storefront-app": {
|
|
1479
1477
|
"description": "Target storefront app ID",
|
|
1480
1478
|
"name": "storefront-app",
|
|
@@ -1502,13 +1500,6 @@
|
|
|
1502
1500
|
"multiple": false,
|
|
1503
1501
|
"type": "option"
|
|
1504
1502
|
},
|
|
1505
|
-
"yes": {
|
|
1506
|
-
"char": "y",
|
|
1507
|
-
"description": "Skip prompts, require all arguments",
|
|
1508
|
-
"name": "yes",
|
|
1509
|
-
"allowNo": false,
|
|
1510
|
-
"type": "boolean"
|
|
1511
|
-
},
|
|
1512
1503
|
"pkg": {
|
|
1513
1504
|
"char": "p",
|
|
1514
1505
|
"description": "Package manager: npm | yarn | pnpm | bun | none",
|
|
@@ -1606,6 +1597,9 @@
|
|
|
1606
1597
|
{
|
|
1607
1598
|
"name": "integration",
|
|
1608
1599
|
"description": "Third-party service",
|
|
1600
|
+
"optional": [
|
|
1601
|
+
"--frontend"
|
|
1602
|
+
],
|
|
1609
1603
|
"requires": [
|
|
1610
1604
|
"--integration-type",
|
|
1611
1605
|
"--integration-id (for payment | shipping | tax)"
|
|
@@ -1619,6 +1613,7 @@
|
|
|
1619
1613
|
"integration-type",
|
|
1620
1614
|
"integration-id"
|
|
1621
1615
|
],
|
|
1616
|
+
"frontendTemplates": "optional",
|
|
1622
1617
|
"usageDirect": "<id> -t <type> [...] -y"
|
|
1623
1618
|
},
|
|
1624
1619
|
"isESM": true,
|
|
@@ -1730,67 +1725,47 @@
|
|
|
1730
1725
|
"description": "Create frontend app following command prompts."
|
|
1731
1726
|
},
|
|
1732
1727
|
{
|
|
1733
|
-
"command": "swell create frontend -y",
|
|
1734
|
-
"description": "
|
|
1728
|
+
"command": "swell create frontend --frontend swell-react -y",
|
|
1729
|
+
"description": "Add a React frontend hosted by Swell."
|
|
1730
|
+
},
|
|
1731
|
+
{
|
|
1732
|
+
"command": "swell create frontend --frontend astro -y",
|
|
1733
|
+
"description": "Add a self-hosted Astro frontend."
|
|
1735
1734
|
}
|
|
1736
1735
|
],
|
|
1737
1736
|
"flags": {
|
|
1738
1737
|
"frontend": {
|
|
1739
|
-
"description": "
|
|
1738
|
+
"description": "Frontend template; see FRONTENDS",
|
|
1740
1739
|
"name": "frontend",
|
|
1741
1740
|
"hasDynamicHelp": false,
|
|
1741
|
+
"helpValue": "template",
|
|
1742
1742
|
"multiple": false,
|
|
1743
1743
|
"options": [
|
|
1744
|
+
"swell-react",
|
|
1745
|
+
"swell-vinext",
|
|
1746
|
+
"swell-spa",
|
|
1744
1747
|
"nextjs",
|
|
1745
1748
|
"astro",
|
|
1746
1749
|
"nuxt",
|
|
1747
1750
|
"react",
|
|
1748
1751
|
"hono",
|
|
1749
1752
|
"angular",
|
|
1750
|
-
"
|
|
1751
|
-
"
|
|
1752
|
-
],
|
|
1753
|
-
"type": "option"
|
|
1754
|
-
},
|
|
1755
|
-
"storefront-app": {
|
|
1756
|
-
"description": "Target storefront app ID",
|
|
1757
|
-
"name": "storefront-app",
|
|
1758
|
-
"hasDynamicHelp": false,
|
|
1759
|
-
"multiple": false,
|
|
1760
|
-
"type": "option"
|
|
1761
|
-
},
|
|
1762
|
-
"integration-type": {
|
|
1763
|
-
"description": "Integration: generic | payment | shipping | tax",
|
|
1764
|
-
"name": "integration-type",
|
|
1765
|
-
"hasDynamicHelp": false,
|
|
1766
|
-
"multiple": false,
|
|
1767
|
-
"options": [
|
|
1768
|
-
"generic",
|
|
1769
|
-
"payment",
|
|
1770
|
-
"shipping",
|
|
1771
|
-
"tax"
|
|
1753
|
+
"none",
|
|
1754
|
+
"react-storefront"
|
|
1772
1755
|
],
|
|
1773
1756
|
"type": "option"
|
|
1774
1757
|
},
|
|
1775
|
-
"integration-id": {
|
|
1776
|
-
"description": "Service ID (e.g., card, fedex)",
|
|
1777
|
-
"name": "integration-id",
|
|
1778
|
-
"hasDynamicHelp": false,
|
|
1779
|
-
"multiple": false,
|
|
1780
|
-
"type": "option"
|
|
1781
|
-
},
|
|
1782
1758
|
"yes": {
|
|
1783
1759
|
"char": "y",
|
|
1784
|
-
"description": "Skip prompts
|
|
1760
|
+
"description": "Skip prompts; use defaults for optional values",
|
|
1785
1761
|
"name": "yes",
|
|
1786
1762
|
"allowNo": false,
|
|
1787
1763
|
"type": "boolean"
|
|
1788
1764
|
},
|
|
1789
1765
|
"pkg": {
|
|
1790
1766
|
"char": "p",
|
|
1791
|
-
"description": "Package manager: npm | yarn | pnpm | bun | none",
|
|
1767
|
+
"description": "Package manager: npm | yarn | pnpm | bun | none (default: the workspace lockfile, else npm)",
|
|
1792
1768
|
"name": "pkg",
|
|
1793
|
-
"default": "npm",
|
|
1794
1769
|
"hasDynamicHelp": false,
|
|
1795
1770
|
"multiple": false,
|
|
1796
1771
|
"options": [
|
|
@@ -1811,6 +1786,10 @@
|
|
|
1811
1786
|
"pluginType": "core",
|
|
1812
1787
|
"strict": true,
|
|
1813
1788
|
"enableJsonFlag": false,
|
|
1789
|
+
"helpMeta": {
|
|
1790
|
+
"frontendTemplates": "required",
|
|
1791
|
+
"usageDirect": "--frontend <template> [...] -y"
|
|
1792
|
+
},
|
|
1814
1793
|
"isESM": true,
|
|
1815
1794
|
"relativePath": [
|
|
1816
1795
|
"dist",
|
|
@@ -3145,22 +3124,19 @@
|
|
|
3145
3124
|
],
|
|
3146
3125
|
"flags": {
|
|
3147
3126
|
"frontend": {
|
|
3148
|
-
"
|
|
3127
|
+
"hidden": true,
|
|
3149
3128
|
"name": "frontend",
|
|
3150
3129
|
"hasDynamicHelp": false,
|
|
3151
3130
|
"multiple": false,
|
|
3152
|
-
"options": [
|
|
3153
|
-
"nextjs",
|
|
3154
|
-
"astro",
|
|
3155
|
-
"nuxt",
|
|
3156
|
-
"react",
|
|
3157
|
-
"hono",
|
|
3158
|
-
"angular",
|
|
3159
|
-
"react-storefront",
|
|
3160
|
-
"none"
|
|
3161
|
-
],
|
|
3162
3131
|
"type": "option"
|
|
3163
3132
|
},
|
|
3133
|
+
"yes": {
|
|
3134
|
+
"char": "y",
|
|
3135
|
+
"description": "Skip prompts; use defaults for optional values",
|
|
3136
|
+
"name": "yes",
|
|
3137
|
+
"allowNo": false,
|
|
3138
|
+
"type": "boolean"
|
|
3139
|
+
},
|
|
3164
3140
|
"storefront-app": {
|
|
3165
3141
|
"description": "Target storefront app ID",
|
|
3166
3142
|
"name": "storefront-app",
|
|
@@ -3188,13 +3164,6 @@
|
|
|
3188
3164
|
"multiple": false,
|
|
3189
3165
|
"type": "option"
|
|
3190
3166
|
},
|
|
3191
|
-
"yes": {
|
|
3192
|
-
"char": "y",
|
|
3193
|
-
"description": "Skip prompts, require all arguments",
|
|
3194
|
-
"name": "yes",
|
|
3195
|
-
"allowNo": false,
|
|
3196
|
-
"type": "boolean"
|
|
3197
|
-
},
|
|
3198
3167
|
"pkg": {
|
|
3199
3168
|
"char": "p",
|
|
3200
3169
|
"description": "Package manager: npm | yarn | pnpm | bun | none",
|
|
@@ -3433,7 +3402,7 @@
|
|
|
3433
3402
|
"app:frontend:deploy": {
|
|
3434
3403
|
"aliases": [],
|
|
3435
3404
|
"args": {},
|
|
3436
|
-
"description": "Creates a new build using the relevant command depending on your frontend framework.\
|
|
3405
|
+
"description": "Creates a new build using the relevant command depending on your frontend framework.\nManaged frontends are uploaded to Swell and deployed using Swell's Cloudflare account.\nSelf-hosted frontends deploy through Wrangler using your own Cloudflare account.\nIf deployment fails, correct any reported errors and run this command again.",
|
|
3437
3406
|
"examples": [
|
|
3438
3407
|
"swell app frontend deploy",
|
|
3439
3408
|
"swell app frontend deploy --force",
|
|
@@ -3603,5 +3572,5 @@
|
|
|
3603
3572
|
]
|
|
3604
3573
|
}
|
|
3605
3574
|
},
|
|
3606
|
-
"version": "2.9.
|
|
3575
|
+
"version": "2.9.19"
|
|
3607
3576
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swell/cli",
|
|
3
|
-
"version": "2.9.
|
|
3
|
+
"version": "2.9.19",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Swell's command line interface/utility",
|
|
6
6
|
"keywords": [
|
|
@@ -114,8 +114,10 @@
|
|
|
114
114
|
"postpack": "shx rm -f oclif.manifest.json",
|
|
115
115
|
"posttest": "npm run lint",
|
|
116
116
|
"prepack": "npm run build && oclif manifest && NODE_ENV=production oclif readme",
|
|
117
|
-
"test": "mocha --forbid-only \"test/**/*.test.ts\"",
|
|
118
|
-
"publish-alpha": "npm version prerelease --preid=alpha && npm publish --tag alpha"
|
|
117
|
+
"test": "mocha --forbid-only --ignore \"**/node_modules/**\" \"test/**/*.test.ts\"",
|
|
118
|
+
"publish-alpha": "npm version prerelease --preid=alpha && npm publish --tag alpha",
|
|
119
|
+
"test:frontend-packages": "npm run build && node test/fixtures/managed-frontend/verify.mjs && node test/fixtures/managed-frontend/verify-react-worker.mjs",
|
|
120
|
+
"test:frontend-scaffolds": "npm run build && node test/fixtures/managed-frontend/verify-scaffolds.mjs"
|
|
119
121
|
},
|
|
120
122
|
"engines": {
|
|
121
123
|
"node": ">= 22.0.0"
|