@celsian/vura-cli 0.5.11 → 0.5.12
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
CHANGED
|
@@ -6,7 +6,7 @@ CLI for [Vura](https://vura.io) — develop, build, and run tasks for Vura appli
|
|
|
6
6
|
|
|
7
7
|
## What it does
|
|
8
8
|
|
|
9
|
-
`@celsian/vura-cli` provides the `vura` command for developing, building, inspecting, and deploying Vura projects. It reports effective Function/Dedicated placement
|
|
9
|
+
`@celsian/vura-cli` provides the `vura` command for developing, building, inspecting, and deploying Vura projects. It reports effective Function/Dedicated placement, including memory, CPU, timeout, provider-neutral runtime recommendations, confidence, and reasons. Dedicated endpoints can select `nano`, `small`, `medium`, `large`, `xlarge`, `2xlarge`, or `4xlarge` capacity profiles. `create-vura` installs the managed deployment adapter, so `vura deploy` works without a follow-up package install. Self-hosted builds can use the Lambda or Cloudflare adapters. The package was historically named `then`/`thenjs`; the only installed bin is `vura`.
|
|
10
10
|
|
|
11
11
|
## Install
|
|
12
12
|
|
|
@@ -44,9 +44,9 @@ vura routes inspect --json
|
|
|
44
44
|
vura runtime advise --json
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
Managed routes choose between scale-to-zero Function compute and persistent
|
|
48
|
+
Dedicated compute. Function memory defaults to 1 GiB and supports 1, 4, 6, 8,
|
|
49
|
+
and 12 GiB profiles.
|
|
50
50
|
|
|
51
51
|
(`then` is a shell reserved word — use `vura` in all scripts.)
|
|
52
52
|
|
|
@@ -12,11 +12,11 @@ export interface RuntimeRouteInspection {
|
|
|
12
12
|
hasWebsocket?: boolean;
|
|
13
13
|
effectiveComputeClass?: 'function' | 'dedicated';
|
|
14
14
|
requestedComputeClass?: ComputeClass;
|
|
15
|
-
edgeEligibility?: 'pending';
|
|
16
15
|
memory?: string | number;
|
|
17
16
|
cpu?: number;
|
|
17
|
+
size?: string;
|
|
18
18
|
timeout?: number;
|
|
19
|
-
providerRecommendation?: '
|
|
19
|
+
providerRecommendation?: 'serverless-function' | 'dedicated-machine';
|
|
20
20
|
confidence?: 'high' | 'medium';
|
|
21
21
|
reasons?: string[];
|
|
22
22
|
warnings: string[];
|
|
@@ -20,40 +20,23 @@ function computeDetails(route) {
|
|
|
20
20
|
const effectiveComputeClass = compute.effectiveClass === 'dedicated' || compute.class === 'dedicated'
|
|
21
21
|
? 'dedicated'
|
|
22
22
|
: 'function';
|
|
23
|
-
const requestedComputeClass =
|
|
24
|
-
|
|
25
|
-
: effectiveComputeClass;
|
|
26
|
-
const effectiveMemory = compute.effectiveMemory ?? compute.memory;
|
|
23
|
+
const requestedComputeClass = effectiveComputeClass;
|
|
24
|
+
const effectiveMemory = compute.memory;
|
|
27
25
|
const memory = typeof effectiveMemory === 'string' || typeof effectiveMemory === 'number'
|
|
28
26
|
? effectiveMemory
|
|
29
27
|
: undefined;
|
|
30
28
|
const cpu = typeof compute.cpu === 'number' ? compute.cpu : undefined;
|
|
29
|
+
const size = typeof compute.size === 'string' ? compute.size : undefined;
|
|
31
30
|
const timeout = configNumber(route.config, 'timeout');
|
|
32
|
-
const edgeEligibility = compute.edgeEligibility === 'pending' ? 'pending' : undefined;
|
|
33
|
-
if (requestedComputeClass === 'edge') {
|
|
34
|
-
return {
|
|
35
|
-
effectiveComputeClass,
|
|
36
|
-
requestedComputeClass,
|
|
37
|
-
edgeEligibility,
|
|
38
|
-
memory,
|
|
39
|
-
cpu,
|
|
40
|
-
timeout,
|
|
41
|
-
providerRecommendation: 'cloudflare-workers-for-platforms',
|
|
42
|
-
confidence: 'high',
|
|
43
|
-
reasons: [
|
|
44
|
-
'Edge is an optimization request and remains on Function until the platform marks this endpoint eligible from observed memory/runtime telemetry.',
|
|
45
|
-
'Edge has a fixed 128mb isolate ceiling; the safe fallback is Function at 1gb.',
|
|
46
|
-
],
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
31
|
if (effectiveComputeClass === 'dedicated') {
|
|
50
32
|
return {
|
|
51
33
|
effectiveComputeClass,
|
|
52
34
|
requestedComputeClass,
|
|
53
35
|
memory,
|
|
54
36
|
cpu,
|
|
37
|
+
size,
|
|
55
38
|
timeout,
|
|
56
|
-
providerRecommendation: 'dedicated-
|
|
39
|
+
providerRecommendation: 'dedicated-machine',
|
|
57
40
|
confidence: 'high',
|
|
58
41
|
reasons: [route.hasWebsocket
|
|
59
42
|
? 'WebSocket upgrades require persistent Dedicated compute.'
|
|
@@ -65,8 +48,9 @@ function computeDetails(route) {
|
|
|
65
48
|
requestedComputeClass,
|
|
66
49
|
memory,
|
|
67
50
|
cpu,
|
|
51
|
+
size,
|
|
68
52
|
timeout,
|
|
69
|
-
providerRecommendation: '
|
|
53
|
+
providerRecommendation: 'serverless-function',
|
|
70
54
|
confidence: 'medium',
|
|
71
55
|
reasons: ['Stateless endpoints and tasks default to scale-to-zero Function compute at 1gb.'],
|
|
72
56
|
};
|
|
@@ -120,9 +104,6 @@ function inspectApiRoute(route) {
|
|
|
120
104
|
warnings.push('WebSocket exports require kind: hot to be reachable.');
|
|
121
105
|
}
|
|
122
106
|
const details = computeDetails(route);
|
|
123
|
-
if (details.requestedComputeClass === 'edge' && details.edgeEligibility === 'pending') {
|
|
124
|
-
warnings.push('Edge request is pending platform eligibility; effective runtime remains Function at 1gb.');
|
|
125
|
-
}
|
|
126
107
|
const base = {
|
|
127
108
|
type: 'api',
|
|
128
109
|
pattern: route.urlPattern,
|
|
@@ -213,16 +194,6 @@ export function adviseRuntime(manifest) {
|
|
|
213
194
|
const schedule = configString(route.config, 'schedule');
|
|
214
195
|
const timeout = configNumber(route.config, 'timeout');
|
|
215
196
|
const details = computeDetails(route);
|
|
216
|
-
if (details.requestedComputeClass === 'edge') {
|
|
217
|
-
advice.push({
|
|
218
|
-
pattern: route.urlPattern,
|
|
219
|
-
type: 'api',
|
|
220
|
-
currentProfile,
|
|
221
|
-
recommendation: currentProfile,
|
|
222
|
-
severity: 'warn',
|
|
223
|
-
reason: 'Edge request is pending measured platform eligibility; deploys continue on Function at 1gb until approved.',
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
197
|
if (route.hasWebsocket) {
|
|
227
198
|
advice.push({
|
|
228
199
|
pattern: route.urlPattern,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@celsian/vura-cli",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.12",
|
|
4
4
|
"description": "Vura CLI — build and deploy full-stack apps",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"!dist/**/*.map"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@celsian/vura-core": "0.5.
|
|
18
|
+
"@celsian/vura-core": "0.5.12",
|
|
19
19
|
"esbuild": "^0.28.1",
|
|
20
20
|
"what-framework": "^0.11.1"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
|
-
"@celsian/vura-adapter-vura": "0.5.
|
|
23
|
+
"@celsian/vura-adapter-vura": "0.5.12",
|
|
24
24
|
"ws": "^8.0.0"
|
|
25
25
|
},
|
|
26
26
|
"peerDependenciesMeta": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@celsian/vura-adapter-vura": "0.5.
|
|
35
|
+
"@celsian/vura-adapter-vura": "0.5.12",
|
|
36
36
|
"@types/ws": "^8.18.1",
|
|
37
37
|
"ws": "^8.21.0"
|
|
38
38
|
},
|