@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.
@@ -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
- file?: unknown;
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, withLegacy?: boolean): string[];
160
- export declare function getFrontendProjectValidValues(withNone?: boolean, withLegacy?: boolean): string;
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.
@@ -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, withLegacy = true) {
196
- const types = withLegacy
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, withLegacy = true) {
211
- return getFrontendProjectSlugs(withNone, withLegacy).join(', ');
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 react-storefront` calls this after the local
22
- * scaffold succeeds. Retrying is safe: existing resources are reused.
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 react-storefront` calls this after the local
6
- * scaffold succeeds. Retrying is safe: existing resources are reused.
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
@@ -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,
@@ -75,6 +75,11 @@ export interface UserAuthorization {
75
75
  client_inactive?: boolean;
76
76
  }
77
77
  export interface App {
78
+ frontend?: {
79
+ framework?: string;
80
+ hosting?: 'managed' | 'self-hosted';
81
+ url?: string;
82
+ };
78
83
  id: string;
79
84
  name: string;
80
85
  type: string;
@@ -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
- "description": "Framework: nextjs | astro | nuxt | react | hono | angular | react-storefront | none",
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 astro -y",
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": "Framework: nextjs | astro | nuxt | react | hono | angular | react-storefront | none",
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
- "react-storefront",
1474
- "none"
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": "Create frontend app and accept all default values."
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": "Framework: nextjs | astro | nuxt | react | hono | angular | react-storefront | none",
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
- "react-storefront",
1751
- "none"
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, require all arguments",
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
- "description": "Framework: nextjs | astro | nuxt | react | hono | angular | react-storefront | none",
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.\nOnce the build succeeds, this command will invoke Cloudflare Wrangler to upload\nbuild assets using your own Cloudflare account. Once complete, Swell will update\nthe app's deployment URL and push the updated frontend files.",
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.17"
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.17",
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"