@stacksjs/buddy 0.70.155 → 0.70.156

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/dist/cli.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import process from "node:process";
3
3
  import { cli, log } from "@stacksjs/cli";
4
4
  import { path as p } from "@stacksjs/path";
5
+ import { registerGlobalOptions } from "./global-options";
5
6
  try {
6
7
  const { isSupportedBunVersion, minimumBunVersion } = await import("@stacksjs/utils"), currentBunVersion = typeof Bun < "u" ? Bun.version : process.versions.bun;
7
8
  if (currentBunVersion && !isSupportedBunVersion(currentBunVersion)) {
@@ -9,7 +10,7 @@ try {
9
10
  process.exit(1);
10
11
  }
11
12
  } catch {}
12
- const args = process.argv.slice(2), requestedCommand = args[0] || "help", isHelpFlag = args.includes("--help") || args.includes("-h"), isVersionOnly = ["--version", "-v", "version"].includes(requestedCommand), isHelpMode = requestedCommand === "help" || isHelpFlag && args.length <= 2, skipAppKeyCheck = [
13
+ const args = process.argv.slice(2), requestedCommand = args[0] || "help", isHelpFlag = args.includes("--help") || args.includes("-h"), isVersionOnly = ["--version", "-V", "version"].includes(requestedCommand), isHelpMode = requestedCommand === "help" || isHelpFlag && args.length <= 2, skipAppKeyCheck = [
13
14
  "build",
14
15
  "lint",
15
16
  "lint:fix",
@@ -53,7 +54,9 @@ if (needsFullSetup) {
53
54
  process.on("unhandledRejection", (error) => reportFatal("unhandledRejection", error));
54
55
  }
55
56
  async function main() {
56
- const buddy = cli("buddy"), configPath = "./buddy.config.js";
57
+ const buddy = cli("buddy");
58
+ registerGlobalOptions(buddy);
59
+ const configPath = "./buddy.config.js";
57
60
  try {
58
61
  await Bun.file(configPath).text();
59
62
  const { applyBuddyConfig } = await import("./config.js");
@@ -27,7 +27,7 @@ export function create(buddy) {
27
27
  minimal: "Skip optional feature bundles (cms, commerce, dashboard, marketing, monitoring, realtime, queue) \u2014 bare-bones API/SPA starter that can re-add them later via `./buddy <feature>:install`.",
28
28
  verbose: "Enable verbose output"
29
29
  };
30
- buddy.command("new [name]", descriptions.command).alias("create [name]").option("-n, --name [name]", descriptions.name, { default: !1 }).option("-u, --ui", descriptions.ui, { default: !0 }).option("-c, --components", descriptions.components, { default: !0 }).option("-w, --web-components", descriptions.webComponents, { default: !0 }).option("-v, --vue", descriptions.vue, { default: !0 }).option("-p, --views", descriptions.views, { default: !0 }).option("-f, --functions", descriptions.functions, { default: !0 }).option("-a, --api", descriptions.api, { default: !0 }).option("-d, --database", descriptions.database, { default: !0 }).option("-ca, --cache", descriptions.cache, { default: !1 }).option("-e, --email", descriptions.email, { default: !1 }).option("-P, --project [project]", descriptions.project, { default: !1 }).option("-m, --minimal", descriptions.minimal, { default: !1 }).option("--verbose", descriptions.verbose, { default: !1 }).action(async (name, options) => {
30
+ buddy.command("new [name]", descriptions.command).alias("create [name]").option("-n, --name [name]", descriptions.name, { default: !1 }).option("-u, --ui", descriptions.ui, { default: !0 }).option("-c, --components", descriptions.components, { default: !0 }).option("-w, --web-components", descriptions.webComponents, { default: !0 }).option("--vue", descriptions.vue, { default: !0 }).option("-p, --views", descriptions.views, { default: !0 }).option("-f, --functions", descriptions.functions, { default: !0 }).option("-a, --api", descriptions.api, { default: !0 }).option("-d, --database", descriptions.database, { default: !0 }).option("-ca, --cache", descriptions.cache, { default: !1 }).option("-e, --email", descriptions.email, { default: !1 }).option("-P, --project [project]", descriptions.project, { default: !1 }).option("-m, --minimal", descriptions.minimal, { default: !1 }).option("--verbose", descriptions.verbose, { default: !1 }).action(async (name, options) => {
31
31
  log.debug("Running `buddy new <name>` ...", options);
32
32
  const startTime = await intro("buddy new");
33
33
  name = name ?? options.name;
@@ -1,7 +1,36 @@
1
1
  import type { CLI, DevOptions } from '@stacksjs/types';
2
+ export declare function dispatchInteractiveDevSelection(selection: string, runners: InteractiveDevRunners): Promise<boolean>;
3
+ export declare function resolvePrettyDevDomain(appUrl: string | undefined, nativeMode?: boolean): string | null;
2
4
  export declare function dev(buddy: CLI): void;
3
5
  export declare function startDevelopmentServer(_options: DevOptions, _startTime?: number): Promise<void>;
6
+ export declare const interactiveDevChoices: readonly [{
7
+ value: 'all';
8
+ title: 'All'
9
+ }, {
10
+ value: 'frontend';
11
+ title: 'Frontend'
12
+ }, {
13
+ value: 'api';
14
+ title: 'Backend'
15
+ }, {
16
+ value: 'dashboard';
17
+ title: 'Dashboard'
18
+ }, {
19
+ value: 'desktop';
20
+ title: 'Desktop'
21
+ }, {
22
+ value: 'native';
23
+ title: 'Native App'
24
+ }, {
25
+ value: 'components';
26
+ title: 'Components'
27
+ }, {
28
+ value: 'docs';
29
+ title: 'Documentation'
30
+ }];
4
31
  declare type DevelopmentRpx = typeof import('@stacksjs/rpx');
32
+ declare type InteractiveDevSelection = typeof interactiveDevChoices[number]['value'];
33
+ declare type InteractiveDevRunners = Record<InteractiveDevSelection, () => Promise<unknown>>;
5
34
  type RpxProxySpec = {
6
35
  id: string
7
36
  from: string
@@ -41,6 +41,34 @@ async function actions() {
41
41
  _actions = await import("@stacksjs/actions");
42
42
  return _actions;
43
43
  }
44
+ export const interactiveDevChoices = [
45
+ { value: "all", title: "All" },
46
+ { value: "frontend", title: "Frontend" },
47
+ { value: "api", title: "Backend" },
48
+ { value: "dashboard", title: "Dashboard" },
49
+ { value: "desktop", title: "Desktop" },
50
+ { value: "native", title: "Native App" },
51
+ { value: "components", title: "Components" },
52
+ { value: "docs", title: "Documentation" }
53
+ ];
54
+ export async function dispatchInteractiveDevSelection(selection, runners) {
55
+ if (!Object.hasOwn(runners, selection))
56
+ return !1;
57
+ await runners[selection]();
58
+ return !0;
59
+ }
60
+ export function resolvePrettyDevDomain(appUrl, nativeMode = !1) {
61
+ if (!appUrl || nativeMode)
62
+ return null;
63
+ try {
64
+ const hostname = new URL(/^https?:\/\//i.test(appUrl) ? appUrl : `https://${appUrl}`).hostname.toLowerCase();
65
+ if (hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1" || hostname === "0.0.0.0")
66
+ return null;
67
+ return hostname;
68
+ } catch {
69
+ return null;
70
+ }
71
+ }
44
72
  export function dev(buddy) {
45
73
  const descriptions = {
46
74
  dev: "Start development server",
@@ -50,7 +78,6 @@ export function dev(buddy) {
50
78
  native: "Start the app in a native Craft window",
51
79
  dashboard: "Start the Dashboard development server",
52
80
  api: "Start the local API development server",
53
- email: "Start the Email development server",
54
81
  docs: "Start the Documentation development server",
55
82
  systemTray: "Start the System Tray development server",
56
83
  interactive: "Get asked which development server to start",
@@ -59,7 +86,7 @@ export function dev(buddy) {
59
86
  project: "Target a specific project",
60
87
  verbose: "Enable verbose output"
61
88
  };
62
- buddy.command("dev [server]", descriptions.dev).option("-f, --frontend", descriptions.frontend).option("-a, --api", descriptions.api).option("-e, --email", descriptions.email).option("-c, --components", descriptions.components).option("-d, --dashboard", descriptions.dashboard).option("-k, --desktop", descriptions.desktop).option("-n, --native", descriptions.native).option("-o, --docs", descriptions.docs).option("-s, --system-tray", descriptions.systemTray).option("-i, --interactive", descriptions.interactive, { default: !1 }).option("-l, --with-localhost", descriptions.withLocalhost, { default: !1 }).option("-p, --project [project]", descriptions.project, { default: !1 }).option("--verbose", descriptions.verbose, { default: !1 }).action(async (server, options) => {
89
+ buddy.command("dev [server]", descriptions.dev).option("-f, --frontend", descriptions.frontend).option("-a, --api", descriptions.api).option("-c, --components", descriptions.components).option("-d, --dashboard", descriptions.dashboard).option("-k, --desktop", descriptions.desktop).option("-n, --native", descriptions.native).option("-o, --docs", descriptions.docs).option("-s, --system-tray", descriptions.systemTray).option("-i, --interactive", descriptions.interactive, { default: !1 }).option("-l, --with-localhost", descriptions.withLocalhost, { default: !1 }).option("-p, --project [project]", descriptions.project, { default: !1 }).option("--verbose", descriptions.verbose, { default: !1 }).action(async (server, options) => {
63
90
  const perf = Bun.nanoseconds(), target = server || (options.frontend ? "frontend" : void 0) || (options.api ? "api" : void 0) || (options.components ? "components" : void 0) || (options.dashboard ? "dashboard" : void 0) || (options.desktop ? "desktop" : void 0) || (options.native ? "native" : void 0) || (options.systemTray || options["system-tray"] ? "system-tray" : void 0) || (options.docs ? "docs" : void 0);
64
91
  if (target) {
65
92
  const serverOptions = { ...options }, a = await actions();
@@ -97,29 +124,18 @@ export function dev(buddy) {
97
124
  type: "select",
98
125
  name: "value",
99
126
  message: descriptions.select,
100
- choices: [
101
- { value: "all", title: "All" },
102
- { value: "frontend", title: "Frontend" },
103
- { value: "api", title: "Backend" },
104
- { value: "dashboard", title: "Dashboard" },
105
- { value: "desktop", title: "Desktop" },
106
- { value: "native", title: "Native App" },
107
- { value: "email", title: "Email" },
108
- { value: "components", title: "Components" },
109
- { value: "docs", title: "Documentation" }
110
- ]
111
- })).value;
112
- if (selectedValue === "components")
113
- await (await actions()).runComponentsDevServer(options);
114
- else if (selectedValue === "api")
115
- await (await actions()).runApiDevServer(options);
116
- else if (selectedValue === "dashboard")
117
- await (await actions()).runDashboardDevServer(options);
118
- else if (selectedValue === "native")
119
- await startDevelopmentServer({ ...options, native: !0 }, perf);
120
- else if (selectedValue === "docs")
121
- await (await actions()).runDocsDevServer(options);
122
- else {
127
+ choices: interactiveDevChoices
128
+ })).value, a = await actions();
129
+ if (!await dispatchInteractiveDevSelection(selectedValue, {
130
+ all: () => startDevelopmentServer(options, perf),
131
+ frontend: () => a.runFrontendDevServer(options),
132
+ api: () => a.runApiDevServer(options),
133
+ dashboard: () => a.runDashboardDevServer(options),
134
+ desktop: () => a.runDesktopDevServer(options),
135
+ native: () => startDevelopmentServer({ ...options, native: !0 }, perf),
136
+ components: () => a.runComponentsDevServer(options),
137
+ docs: () => a.runDocsDevServer(options)
138
+ })) {
123
139
  log.error("Invalid option during interactive mode");
124
140
  process.exit(ExitCode.InvalidArgument);
125
141
  }
@@ -186,7 +202,7 @@ export function dev(buddy) {
186
202
  onUnknownSubcommand(buddy, "dev");
187
203
  }
188
204
  export async function startDevelopmentServer(_options, _startTime) {
189
- const options = _options, startedAt = _startTime, appUrl = process.env.APP_URL, nativeMode = options.native === !0, proxyManagedExternally = process.env.STACKS_PROXY_MANAGED === "1", frontendPort = Number(process.env.PORT) || 3000, apiPort = Number(process.env.PORT_API) || 3008, docsPort = Number(process.env.PORT_DOCS) || 3006, dashboardPort = Number(process.env.PORT_ADMIN) || 3002, includeDashboard = process.env.STACKS_DEV_DASHBOARD === "1", appLooksCustom = !nativeMode && appUrl && appUrl !== "localhost" && !appUrl.includes("localhost:"), domain = appLooksCustom ? appUrl.replace(/^https?:\/\//, "") : null, localhostOnly = process.env.STACKS_DEV_LOCALHOST === "1", hasCustomDomain = appLooksCustom && !proxyManagedExternally && !localhostOnly, dashboardDomain = domain ? `dashboard.${domain}` : null, frontendUrl = domain ? `https://${domain}` : `http://localhost:${frontendPort}`, apiUrl = domain ? `https://${domain}/api` : `http://localhost:${apiPort}`, docsUrl = domain ? `https://${domain}/docs` : `http://localhost:${docsPort}`, dashboardUrl = dashboardDomain ? `https://${dashboardDomain}` : `http://localhost:${dashboardPort}`, managedPorts = [
205
+ const options = _options, startedAt = _startTime, appUrl = process.env.APP_URL, nativeMode = options.native === !0, proxyManagedExternally = process.env.STACKS_PROXY_MANAGED === "1", frontendPort = Number(process.env.PORT) || 3000, apiPort = Number(process.env.PORT_API) || 3008, docsPort = Number(process.env.PORT_DOCS) || 3006, dashboardPort = Number(process.env.PORT_ADMIN) || 3002, includeDashboard = process.env.STACKS_DEV_DASHBOARD === "1", domain = resolvePrettyDevDomain(appUrl, nativeMode), appLooksCustom = domain !== null, localhostOnly = process.env.STACKS_DEV_LOCALHOST === "1", usePrettyUrls = appLooksCustom && !localhostOnly, hasCustomDomain = usePrettyUrls && !proxyManagedExternally, displayedDomain = usePrettyUrls ? domain : null, dashboardDomain = displayedDomain ? `dashboard.${displayedDomain}` : null, frontendUrl = displayedDomain ? `https://${displayedDomain}` : `http://localhost:${frontendPort}`, apiUrl = displayedDomain ? `https://${displayedDomain}/api` : `http://localhost:${apiPort}`, docsUrl = displayedDomain ? `https://${displayedDomain}/docs` : `http://localhost:${docsPort}`, dashboardUrl = dashboardDomain ? `https://${dashboardDomain}` : `http://localhost:${dashboardPort}`, managedPorts = [
190
206
  frontendPort,
191
207
  apiPort,
192
208
  docsPort,
@@ -21,7 +21,7 @@ export function upgrade(buddy) {
21
21
  project: "Target a specific project",
22
22
  all: "Upgrade framework, dependencies, Bun, and binary"
23
23
  };
24
- buddy.command("upgrade", descriptions.upgrade).option("-v, --version <version>", descriptions.version).option("--canary", descriptions.canary, { default: !1 }).option("--stable", descriptions.stable, { default: !1 }).option("--dry-run", descriptions.dryRun, { default: !1 }).option("-f, --force", descriptions.force, { default: !1 }).option("--from <path>", descriptions.from).option("--no-postinstall", descriptions.noPostinstall).option("--verbose", descriptions.verbose, { default: !1 }).alias("update").example("buddy upgrade").example("buddy update").example("buddy upgrade --from ~/Code/stacks").example("buddy upgrade --version 0.70.23").example("buddy upgrade --dry-run").example("buddy upgrade --canary").example("buddy upgrade --stable").example("buddy upgrade --force").action(async (options) => {
24
+ buddy.command("upgrade", descriptions.upgrade).option("-V, --version <version>", descriptions.version).option("--canary", descriptions.canary, { default: !1 }).option("--stable", descriptions.stable, { default: !1 }).option("--dry-run", descriptions.dryRun, { default: !1 }).option("-f, --force", descriptions.force, { default: !1 }).option("--from <path>", descriptions.from).option("--no-postinstall", descriptions.noPostinstall).option("--verbose", descriptions.verbose, { default: !1 }).alias("update").example("buddy upgrade").example("buddy update").example("buddy upgrade --from ~/Code/stacks").example("buddy upgrade --version 0.70.23").example("buddy upgrade --dry-run").example("buddy upgrade --canary").example("buddy upgrade --stable").example("buddy upgrade --force").action(async (options) => {
25
25
  log.debug("Running `buddy upgrade` ...", options);
26
26
  const opts = { ...options };
27
27
  if (opts.postinstall === !1) {
@@ -1,6 +1,5 @@
1
- import process from "node:process";
2
1
  import { bold, dim, green, intro, log, onUnknownSubcommand } from "@stacksjs/cli";
3
- import { storage } from "@stacksjs/storage";
2
+ import { versionLine } from "../version-info";
4
3
  export function version(buddy) {
5
4
  const descriptions = {
6
5
  version: "Retrieving Stacks build version"
@@ -8,9 +7,8 @@ export function version(buddy) {
8
7
  buddy.command("version", descriptions.version).action(async () => {
9
8
  log.debug("Running `buddy version` ...");
10
9
  await intro("buddy version");
11
- const pkg = await storage.readPackageJson("./package.json"), bunVersion = "wip", stacksVersion = pkg.version;
12
- log.info(green(bold("@stacksjs/ ")) + dim(` ${stacksVersion}`));
13
- log.info(green(bold("Bun: ")) + dim(` ${bunVersion}`));
10
+ log.info(green(bold("Stacks: ")) + dim(` ${versionLine}`));
11
+ log.info(green(bold("Bun: ")) + dim(` ${Bun.version}`));
14
12
  });
15
13
  onUnknownSubcommand(buddy, "version");
16
14
  }
@@ -0,0 +1,3 @@
1
+ import type { CLI } from '@stacksjs/cli';
2
+ /** Register Buddy's process-wide controls before any command modules load. */
3
+ export declare function registerGlobalOptions(buddy: CLI): void;
@@ -0,0 +1,4 @@
1
+ import { versionDescriptor } from "./version-info";
2
+ export function registerGlobalOptions(buddy) {
3
+ buddy.version(versionDescriptor, "-V, --version").option("-v, --verbose", "Enable verbose output").option("-q, --quiet", "Suppress non-essential output").option("--debug", "Enable debug output and stack traces").option("--no-interaction", "Do not ask interactive questions").option("--env <environment>", "Target an environment").option("--dry-run", "Preview actions without making changes").option("--force", "Skip confirmation prompts").option("--no-emoji", "Disable emoji in output").option("--no-cache", "Disable command metadata caching");
4
+ }
@@ -0,0 +1,5 @@
1
+ import { version as buddyVersion } from '../package.json';
2
+ import { version as stacksVersion } from '../../package.json';
3
+ export declare const versionDescriptor: string;
4
+ export declare const versionLine: string;
5
+ export { buddyVersion, stacksVersion };
@@ -0,0 +1,5 @@
1
+ import { version as stacksVersion } from "../../package.json";
2
+ import { version as buddyVersion } from "../package.json";
3
+
4
+ export { buddyVersion, stacksVersion };
5
+ export const versionDescriptor = `${buddyVersion} stacks/${stacksVersion}`, versionLine = `buddy/${versionDescriptor}`;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/buddy",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.70.155",
5
+ "version": "0.70.156",
6
6
  "description": "Meet Buddy. The Stacks runtime.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -92,51 +92,51 @@
92
92
  "prepublishOnly": "bun run build"
93
93
  },
94
94
  "dependencies": {
95
- "@stacksjs/actions": "^0.70.155",
96
- "@stacksjs/ai": "^0.70.155",
97
- "@stacksjs/alias": "^0.70.155",
98
- "@stacksjs/arrays": "^0.70.155",
99
- "@stacksjs/auth": "^0.70.155",
100
- "@stacksjs/build": "^0.70.155",
101
- "@stacksjs/cache": "^0.70.155",
102
- "@stacksjs/cli": "^0.70.155",
103
- "@stacksjs/clapp": "^0.2.10",
104
- "@stacksjs/cloud": "^0.70.155",
105
- "@stacksjs/collections": "^0.70.155",
106
- "@stacksjs/config": "^0.70.155",
107
- "@stacksjs/database": "^0.70.155",
108
- "@stacksjs/desktop": "^0.70.155",
109
- "@stacksjs/dns": "^0.70.155",
110
- "@stacksjs/email": "^0.70.155",
111
- "@stacksjs/enums": "^0.70.155",
112
- "@stacksjs/error-handling": "^0.70.155",
113
- "@stacksjs/events": "^0.70.155",
114
- "@stacksjs/git": "^0.70.155",
95
+ "@stacksjs/actions": "^0.70.156",
96
+ "@stacksjs/ai": "^0.70.156",
97
+ "@stacksjs/alias": "^0.70.156",
98
+ "@stacksjs/arrays": "^0.70.156",
99
+ "@stacksjs/auth": "^0.70.156",
100
+ "@stacksjs/build": "^0.70.156",
101
+ "@stacksjs/cache": "^0.70.156",
102
+ "@stacksjs/cli": "^0.70.156",
103
+ "@stacksjs/clapp": "^0.2.12",
104
+ "@stacksjs/cloud": "^0.70.156",
105
+ "@stacksjs/collections": "^0.70.156",
106
+ "@stacksjs/config": "^0.70.156",
107
+ "@stacksjs/database": "^0.70.156",
108
+ "@stacksjs/desktop": "^0.70.156",
109
+ "@stacksjs/dns": "^0.70.156",
110
+ "@stacksjs/email": "^0.70.156",
111
+ "@stacksjs/enums": "^0.70.156",
112
+ "@stacksjs/error-handling": "^0.70.156",
113
+ "@stacksjs/events": "^0.70.156",
114
+ "@stacksjs/git": "^0.70.156",
115
115
  "@stacksjs/gitit": "^0.2.5",
116
- "@stacksjs/health": "^0.70.155",
116
+ "@stacksjs/health": "^0.70.156",
117
117
  "@stacksjs/dnsx": "^0.2.3",
118
118
  "@stacksjs/httx": "^0.1.10",
119
- "@stacksjs/lint": "^0.70.155",
120
- "@stacksjs/logging": "^0.70.155",
121
- "@stacksjs/notifications": "^0.70.155",
122
- "@stacksjs/objects": "^0.70.155",
123
- "@stacksjs/orm": "^0.70.155",
124
- "@stacksjs/path": "^0.70.155",
125
- "@stacksjs/payments": "^0.70.155",
126
- "@stacksjs/realtime": "^0.70.155",
127
- "@stacksjs/router": "^0.70.155",
119
+ "@stacksjs/lint": "^0.70.156",
120
+ "@stacksjs/logging": "^0.70.156",
121
+ "@stacksjs/notifications": "^0.70.156",
122
+ "@stacksjs/objects": "^0.70.156",
123
+ "@stacksjs/orm": "^0.70.156",
124
+ "@stacksjs/path": "^0.70.156",
125
+ "@stacksjs/payments": "^0.70.156",
126
+ "@stacksjs/realtime": "^0.70.156",
127
+ "@stacksjs/router": "^0.70.156",
128
128
  "@stacksjs/rpx": "^0.11.29",
129
- "@stacksjs/search-engine": "^0.70.155",
130
- "@stacksjs/security": "^0.70.155",
131
- "@stacksjs/server": "^0.70.155",
132
- "@stacksjs/storage": "^0.70.155",
133
- "@stacksjs/strings": "^0.70.155",
134
- "@stacksjs/testing": "^0.70.155",
135
- "@stacksjs/tunnel": "^0.70.155",
136
- "@stacksjs/types": "^0.70.155",
137
- "@stacksjs/ui": "^0.70.155",
138
- "@stacksjs/utils": "^0.70.155",
139
- "@stacksjs/validation": "^0.70.155",
129
+ "@stacksjs/search-engine": "^0.70.156",
130
+ "@stacksjs/security": "^0.70.156",
131
+ "@stacksjs/server": "^0.70.156",
132
+ "@stacksjs/storage": "^0.70.156",
133
+ "@stacksjs/strings": "^0.70.156",
134
+ "@stacksjs/testing": "^0.70.156",
135
+ "@stacksjs/tunnel": "^0.70.156",
136
+ "@stacksjs/types": "^0.70.156",
137
+ "@stacksjs/ui": "^0.70.156",
138
+ "@stacksjs/utils": "^0.70.156",
139
+ "@stacksjs/validation": "^0.70.156",
140
140
  "@stacksjs/ts-cloud": "^0.7.47"
141
141
  },
142
142
  "devDependencies": {