veryfront 0.1.1159 → 0.1.1160
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/esm/cli/commands/deploy/command.d.ts +15 -0
- package/esm/cli/commands/deploy/command.d.ts.map +1 -1
- package/esm/cli/commands/deploy/command.js +183 -4
- package/esm/cli/commands/deploy/index.d.ts +2 -2
- package/esm/cli/commands/deploy/index.d.ts.map +1 -1
- package/esm/cli/commands/deploy/index.js +1 -1
- package/esm/deno.js +1 -1
- package/esm/src/release-assets/build-executor.d.ts.map +1 -1
- package/esm/src/release-assets/build-executor.js +5 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +5 -5
|
@@ -45,6 +45,8 @@ export type DeployOptions = Omit<ParsedDeployOptions, "skipSourcePush"> & {
|
|
|
45
45
|
skipSourcePush?: boolean;
|
|
46
46
|
assetManifestPollIntervalMs?: number;
|
|
47
47
|
assetManifestTimeoutMs?: number;
|
|
48
|
+
environmentPollIntervalMs?: number;
|
|
49
|
+
environmentTimeoutMs?: number;
|
|
48
50
|
};
|
|
49
51
|
/**
|
|
50
52
|
* Parse CLI arguments into validated DeployOptions
|
|
@@ -133,6 +135,18 @@ export interface ReleaseSourceVerification {
|
|
|
133
135
|
commitSha: string | null;
|
|
134
136
|
sourceDigest: string;
|
|
135
137
|
}
|
|
138
|
+
export interface EnvironmentReadinessOptions {
|
|
139
|
+
pollIntervalMs?: number;
|
|
140
|
+
timeoutMs?: number;
|
|
141
|
+
}
|
|
142
|
+
export interface EnvironmentReadinessTarget {
|
|
143
|
+
projectSlug: string;
|
|
144
|
+
environmentName: string;
|
|
145
|
+
url: string;
|
|
146
|
+
route?: string | null;
|
|
147
|
+
protected: boolean;
|
|
148
|
+
apiToken: string;
|
|
149
|
+
}
|
|
136
150
|
interface ReleaseSourceExpectation {
|
|
137
151
|
projectId: string;
|
|
138
152
|
releaseId: string;
|
|
@@ -196,6 +210,7 @@ export declare function resolvePushedSource(input: {
|
|
|
196
210
|
commitSha: string | null;
|
|
197
211
|
sourceDigest: string;
|
|
198
212
|
}>;
|
|
213
|
+
export declare function waitForEnvironmentReady(target: EnvironmentReadinessTarget, options?: EnvironmentReadinessOptions): Promise<void>;
|
|
199
214
|
export declare function waitForReleaseAssetManifest(client: ApiClient, projectSlug: string, releaseId: string, options?: {
|
|
200
215
|
expectedRoutes?: string[];
|
|
201
216
|
pollIntervalMs?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAI3E,OAAO,EACL,KAAK,SAAS,EAOf,MAAM,wBAAwB,CAAC;AAShC,OAAO,EAIL,KAAK,aAAa,EAInB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ import { isAutoConfirmEnabled } from "../../shared/interactive.js";
|
|
|
21
21
|
import { isJsonMode, streamJsonLine } from "../../shared/json-output.js";
|
|
22
22
|
import { computeSourceDigest, getProjectTarget, normalizeControlPlane, readPushReceipt, resolveGitSource, validatePushReceipt, } from "../../shared/deployment-provenance.js";
|
|
23
23
|
import { routeForPage } from "../../../src/release-assets/route-path.js";
|
|
24
|
+
import { parseProjectDomain } from "../../../src/server/utils/domain-parser.js";
|
|
24
25
|
import { isWithinDirectory, normalizePath } from "../../../src/utils/path-utils.js";
|
|
25
26
|
/**
|
|
26
27
|
* Schema factory for deploy command arguments
|
|
@@ -55,6 +56,8 @@ export function requiresExplicitDeployConfirmation(force) {
|
|
|
55
56
|
}
|
|
56
57
|
const MAX_RELEASE_SOURCE_VERIFICATION_ATTEMPTS = 20;
|
|
57
58
|
const MAX_RELEASE_SOURCE_VERIFICATION_DELAY_MS = 500;
|
|
59
|
+
const DEFAULT_ENVIRONMENT_POLL_INTERVAL_MS = 2_000;
|
|
60
|
+
const DEFAULT_ENVIRONMENT_TIMEOUT_MS = 120_000;
|
|
58
61
|
// Release creation can precede source-snapshot materialization. Only a
|
|
59
62
|
// successfully read, well-formed digest mismatch enters this convergence loop;
|
|
60
63
|
// validation and exhausted API-client transport errors still fail closed.
|
|
@@ -319,6 +322,154 @@ function buildEnvironmentUrl(projectSlug, environment) {
|
|
|
319
322
|
}
|
|
320
323
|
return `https://${projectSlug}.${environment.name}.veryfront.com`;
|
|
321
324
|
}
|
|
325
|
+
function buildCanonicalEnvironmentUrl(projectSlug, environmentName) {
|
|
326
|
+
return `https://${projectSlug}.${environmentName}.veryfront.com`;
|
|
327
|
+
}
|
|
328
|
+
function isMatchingVeryfrontHostedUrl(url, target) {
|
|
329
|
+
const hostname = url.hostname.toLowerCase();
|
|
330
|
+
if (!hostname.endsWith(".veryfront.com") && !hostname.endsWith(".veryfront.org")) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
const parsed = parseProjectDomain(hostname);
|
|
334
|
+
return parsed.isVeryfrontDomain &&
|
|
335
|
+
parsed.slug === target.projectSlug.toLowerCase() &&
|
|
336
|
+
parsed.environment === target.environmentName.toLowerCase();
|
|
337
|
+
}
|
|
338
|
+
function isVeryfrontSignInUrl(url) {
|
|
339
|
+
const hostname = url.hostname.toLowerCase();
|
|
340
|
+
return (hostname === "veryfront.com" || hostname === "veryfront.org") &&
|
|
341
|
+
(url.pathname === "/sign-in" || url.pathname.startsWith("/sign-in/"));
|
|
342
|
+
}
|
|
343
|
+
function buildEnvironmentProbeUrl(baseUrl, route) {
|
|
344
|
+
let url;
|
|
345
|
+
try {
|
|
346
|
+
url = new URL(baseUrl);
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
throw new Error(`Environment URL "${baseUrl}" is invalid. Check the environment configuration and deploy again.`);
|
|
350
|
+
}
|
|
351
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
352
|
+
throw new Error(`Environment URL "${baseUrl}" must use HTTP or HTTPS. Check the environment configuration and deploy again.`);
|
|
353
|
+
}
|
|
354
|
+
if (!route.startsWith("/")) {
|
|
355
|
+
throw new Error(`Environment readiness route "${route}" must start with "/".`);
|
|
356
|
+
}
|
|
357
|
+
const probeUrl = new URL(route, url);
|
|
358
|
+
return route === "/" ? probeUrl.origin : probeUrl.href;
|
|
359
|
+
}
|
|
360
|
+
function secureEnvironmentProbeUrl(url) {
|
|
361
|
+
const secureUrl = new URL(url);
|
|
362
|
+
secureUrl.protocol = "https:";
|
|
363
|
+
return secureUrl.href;
|
|
364
|
+
}
|
|
365
|
+
function buildEnvironmentReadinessProbes(target) {
|
|
366
|
+
const route = target.route === undefined ? "/" : target.route;
|
|
367
|
+
if (route === null)
|
|
368
|
+
return [];
|
|
369
|
+
const targetUrl = buildEnvironmentProbeUrl(target.url, route);
|
|
370
|
+
if (target.protected && !isMatchingVeryfrontHostedUrl(new URL(targetUrl), target)) {
|
|
371
|
+
return [
|
|
372
|
+
{
|
|
373
|
+
url: targetUrl,
|
|
374
|
+
authenticate: false,
|
|
375
|
+
acceptAuthenticationChallenge: true,
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
url: buildEnvironmentProbeUrl(buildCanonicalEnvironmentUrl(target.projectSlug, target.environmentName), route),
|
|
379
|
+
authenticate: true,
|
|
380
|
+
acceptAuthenticationChallenge: false,
|
|
381
|
+
},
|
|
382
|
+
];
|
|
383
|
+
}
|
|
384
|
+
return [{
|
|
385
|
+
url: target.protected ? secureEnvironmentProbeUrl(targetUrl) : targetUrl,
|
|
386
|
+
authenticate: target.protected,
|
|
387
|
+
acceptAuthenticationChallenge: false,
|
|
388
|
+
}];
|
|
389
|
+
}
|
|
390
|
+
function isSignInRedirect(response, requestUrl) {
|
|
391
|
+
if (response.status < 300 || response.status >= 400)
|
|
392
|
+
return false;
|
|
393
|
+
const location = response.headers.get("location");
|
|
394
|
+
if (!location)
|
|
395
|
+
return false;
|
|
396
|
+
try {
|
|
397
|
+
return isVeryfrontSignInUrl(new URL(location, requestUrl));
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
function isTransientEnvironmentStatus(status) {
|
|
404
|
+
return status === 404 || status === 408 || status === 425 || status === 429 ||
|
|
405
|
+
status >= 500;
|
|
406
|
+
}
|
|
407
|
+
async function cancelResponseBody(response) {
|
|
408
|
+
try {
|
|
409
|
+
await response.body?.cancel();
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
// Readiness does not depend on response payload cleanup.
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
export async function waitForEnvironmentReady(target, options = {}) {
|
|
416
|
+
const pollIntervalMs = options.pollIntervalMs === undefined ||
|
|
417
|
+
!Number.isFinite(options.pollIntervalMs)
|
|
418
|
+
? DEFAULT_ENVIRONMENT_POLL_INTERVAL_MS
|
|
419
|
+
: Math.max(1, Math.trunc(options.pollIntervalMs));
|
|
420
|
+
const timeoutMs = options.timeoutMs === undefined || !Number.isFinite(options.timeoutMs)
|
|
421
|
+
? DEFAULT_ENVIRONMENT_TIMEOUT_MS
|
|
422
|
+
: Math.max(1, Math.trunc(options.timeoutMs));
|
|
423
|
+
const deadline = Date.now() + timeoutMs;
|
|
424
|
+
for (const probe of buildEnvironmentReadinessProbes(target)) {
|
|
425
|
+
const headers = new Headers({ "Cache-Control": "no-cache" });
|
|
426
|
+
if (probe.authenticate) {
|
|
427
|
+
headers.set("Cookie", `authToken=${target.apiToken}`);
|
|
428
|
+
}
|
|
429
|
+
let lastResponse = "no response";
|
|
430
|
+
for (;;) {
|
|
431
|
+
let response;
|
|
432
|
+
try {
|
|
433
|
+
response = await fetch(probe.url, {
|
|
434
|
+
method: "GET",
|
|
435
|
+
redirect: "manual",
|
|
436
|
+
headers,
|
|
437
|
+
signal: AbortSignal.timeout(Math.max(1, deadline - Date.now())),
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
lastResponse = "network error";
|
|
442
|
+
}
|
|
443
|
+
if (response) {
|
|
444
|
+
lastResponse = `HTTP ${response.status}`;
|
|
445
|
+
const signInRedirect = isSignInRedirect(response, probe.url);
|
|
446
|
+
const authenticationChallenge = signInRedirect ||
|
|
447
|
+
response.status === 401 ||
|
|
448
|
+
response.status === 403;
|
|
449
|
+
const ready = response.status >= 200 && response.status < 300 ||
|
|
450
|
+
response.status >= 300 && response.status < 400 && !signInRedirect ||
|
|
451
|
+
probe.acceptAuthenticationChallenge && authenticationChallenge;
|
|
452
|
+
await cancelResponseBody(response);
|
|
453
|
+
if (ready)
|
|
454
|
+
break;
|
|
455
|
+
if (authenticationChallenge) {
|
|
456
|
+
const message = probe.authenticate
|
|
457
|
+
? `Could not authenticate the protected environment URL ${probe.url}. Run veryfront login and deploy again.`
|
|
458
|
+
: `Environment URL ${probe.url} redirected to sign-in. Check its protection settings and deploy again.`;
|
|
459
|
+
throw new Error(message);
|
|
460
|
+
}
|
|
461
|
+
if (!isTransientEnvironmentStatus(response.status)) {
|
|
462
|
+
throw new Error(`Environment URL ${probe.url} returned HTTP ${response.status}. Check the environment configuration and deploy again.`);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
const remainingMs = deadline - Date.now();
|
|
466
|
+
if (remainingMs <= 0) {
|
|
467
|
+
throw new Error(`Environment URL ${probe.url} did not become ready within ${Math.ceil(timeoutMs / 1000)}s (last response: ${lastResponse}). Check the deployment and run deploy again.`);
|
|
468
|
+
}
|
|
469
|
+
await wait(Math.min(pollIntervalMs, remainingMs));
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
322
473
|
async function inferDeployProjectSlug(projectDir) {
|
|
323
474
|
const fs = createFileSystem();
|
|
324
475
|
const packagePath = join(projectDir, "package.json");
|
|
@@ -507,7 +658,7 @@ export async function waitForReleaseAssetManifest(client, projectSlug, releaseId
|
|
|
507
658
|
* Create a release and deploy to an environment
|
|
508
659
|
*/
|
|
509
660
|
export async function deployCommand(options) {
|
|
510
|
-
const { projectDir = cwd(), branch, env, releaseName, dryRun, force, quiet, skipSourcePush, assetManifestPollIntervalMs, assetManifestTimeoutMs, } = options;
|
|
661
|
+
const { projectDir = cwd(), branch, env, releaseName, dryRun, force, quiet, skipSourcePush, assetManifestPollIntervalMs, assetManifestTimeoutMs, environmentPollIntervalMs, environmentTimeoutMs, } = options;
|
|
511
662
|
if (isJsonMode()) {
|
|
512
663
|
return deployCommandJson(options);
|
|
513
664
|
}
|
|
@@ -597,6 +748,7 @@ export async function deployCommand(options) {
|
|
|
597
748
|
let release;
|
|
598
749
|
let deployment;
|
|
599
750
|
let verification;
|
|
751
|
+
let environmentUrl;
|
|
600
752
|
try {
|
|
601
753
|
release = await createRelease(client, project.id, { name: releaseName, branch });
|
|
602
754
|
if (!release.version)
|
|
@@ -630,6 +782,19 @@ export async function deployCommand(options) {
|
|
|
630
782
|
commitSha: source.commitSha,
|
|
631
783
|
sourceDigest: source.sourceDigest,
|
|
632
784
|
}, { verifiedRelease });
|
|
785
|
+
environmentUrl = buildEnvironmentUrl(verification.projectSlug, environment);
|
|
786
|
+
spinner.update(`Waiting for ${env} URL...`);
|
|
787
|
+
await waitForEnvironmentReady({
|
|
788
|
+
projectSlug: verification.projectSlug,
|
|
789
|
+
environmentName: environment.name,
|
|
790
|
+
url: environmentUrl,
|
|
791
|
+
route: expectedPageRoutes.find((route) => !route.includes("[")) ?? null,
|
|
792
|
+
protected: environment.protected,
|
|
793
|
+
apiToken: config.apiToken,
|
|
794
|
+
}, {
|
|
795
|
+
pollIntervalMs: environmentPollIntervalMs,
|
|
796
|
+
timeoutMs: environmentTimeoutMs,
|
|
797
|
+
});
|
|
633
798
|
spinner.stop();
|
|
634
799
|
}
|
|
635
800
|
catch (error) {
|
|
@@ -649,7 +814,7 @@ export async function deployCommand(options) {
|
|
|
649
814
|
const routingConvergenceWarning = getDeploymentRoutingConvergenceWarning(deployment);
|
|
650
815
|
if (routingConvergenceWarning)
|
|
651
816
|
logWarning(routingConvergenceWarning);
|
|
652
|
-
logInfo(` URL: ${
|
|
817
|
+
logInfo(` URL: ${environmentUrl}`);
|
|
653
818
|
logInfo(` Protected: ${environment.protected ? "yes" : "no"}`);
|
|
654
819
|
logInfo(verification.commitSha
|
|
655
820
|
? ` Commit: ${verification.commitSha}`
|
|
@@ -660,7 +825,7 @@ export async function deployCommand(options) {
|
|
|
660
825
|
console.log(getPostDeployTips());
|
|
661
826
|
}
|
|
662
827
|
async function deployCommandJson(options) {
|
|
663
|
-
const { projectDir = cwd(), branch, env, releaseName, dryRun, force, skipSourcePush, assetManifestPollIntervalMs, assetManifestTimeoutMs, } = options;
|
|
828
|
+
const { projectDir = cwd(), branch, env, releaseName, dryRun, force, skipSourcePush, assetManifestPollIntervalMs, assetManifestTimeoutMs, environmentPollIntervalMs, environmentTimeoutMs, } = options;
|
|
664
829
|
try {
|
|
665
830
|
// JSON mode requires --force or --yes to prevent accidental deploys
|
|
666
831
|
if (requiresExplicitDeployConfirmation(force)) {
|
|
@@ -796,6 +961,20 @@ async function deployCommandJson(options) {
|
|
|
796
961
|
sourceDigest: source.sourceDigest,
|
|
797
962
|
}, { verifiedRelease });
|
|
798
963
|
streamJsonLine({ type: "step", name: "verify-deployment", status: "completed" });
|
|
964
|
+
const environmentUrl = buildEnvironmentUrl(verification.projectSlug, environment);
|
|
965
|
+
streamJsonLine({ type: "step", name: "wait-environment-url", status: "started" });
|
|
966
|
+
await waitForEnvironmentReady({
|
|
967
|
+
projectSlug: verification.projectSlug,
|
|
968
|
+
environmentName: environment.name,
|
|
969
|
+
url: environmentUrl,
|
|
970
|
+
route: expectedPageRoutes.find((route) => !route.includes("[")) ?? null,
|
|
971
|
+
protected: environment.protected,
|
|
972
|
+
apiToken: config.apiToken,
|
|
973
|
+
}, {
|
|
974
|
+
pollIntervalMs: environmentPollIntervalMs,
|
|
975
|
+
timeoutMs: environmentTimeoutMs,
|
|
976
|
+
});
|
|
977
|
+
streamJsonLine({ type: "step", name: "wait-environment-url", status: "completed" });
|
|
799
978
|
const routingConvergenceWarning = getDeploymentRoutingConvergenceWarning(deployment);
|
|
800
979
|
if (routingConvergenceWarning) {
|
|
801
980
|
streamJsonLine({
|
|
@@ -818,7 +997,7 @@ async function deployCommandJson(options) {
|
|
|
818
997
|
environment: env,
|
|
819
998
|
environmentId: verification.environmentId,
|
|
820
999
|
deploymentId: verification.deploymentId,
|
|
821
|
-
url:
|
|
1000
|
+
url: environmentUrl,
|
|
822
1001
|
protected: environment.protected,
|
|
823
1002
|
routingConvergence: deployment.routing_convergence ?? null,
|
|
824
1003
|
commitSha: verification.commitSha,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Deploy command - Create and deploy releases
|
|
3
3
|
*/
|
|
4
|
-
export { assertProjectOwnership, createDeployment, createRelease, DeployArgsSchema, deployCommand, getDeployment, getDeploymentRoutingConvergenceWarning, getEnvironmentByName, getProject, getRelease, getReleaseSourceDigest, parseDeployArgs, requiresExplicitDeployConfirmation, resolvePushedSource, verifyDeployment, verifyReleaseSource, waitForReleaseAssetManifest, } from "./command.js";
|
|
5
|
-
export type { Deployment, DeploymentRoutingConvergence, DeploymentVerification, DeployOptions, ReleaseSourceVerification, } from "./command.js";
|
|
4
|
+
export { assertProjectOwnership, createDeployment, createRelease, DeployArgsSchema, deployCommand, getDeployment, getDeploymentRoutingConvergenceWarning, getEnvironmentByName, getProject, getRelease, getReleaseSourceDigest, parseDeployArgs, requiresExplicitDeployConfirmation, resolvePushedSource, verifyDeployment, verifyReleaseSource, waitForEnvironmentReady, waitForReleaseAssetManifest, } from "./command.js";
|
|
5
|
+
export type { Deployment, DeploymentRoutingConvergence, DeploymentVerification, DeployOptions, EnvironmentReadinessOptions, EnvironmentReadinessTarget, ReleaseSourceVerification, } from "./command.js";
|
|
6
6
|
export { handleDeployCommand } from "./handler.js";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,sCAAsC,EACtC,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,sBAAsB,EACtB,eAAe,EACf,kCAAkC,EAClC,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,UAAU,EACV,4BAA4B,EAC5B,sBAAsB,EACtB,aAAa,EACb,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,sCAAsC,EACtC,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,sBAAsB,EACtB,eAAe,EACf,kCAAkC,EAClC,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,UAAU,EACV,4BAA4B,EAC5B,sBAAsB,EACtB,aAAa,EACb,2BAA2B,EAC3B,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Deploy command - Create and deploy releases
|
|
3
3
|
*/
|
|
4
|
-
export { assertProjectOwnership, createDeployment, createRelease, DeployArgsSchema, deployCommand, getDeployment, getDeploymentRoutingConvergenceWarning, getEnvironmentByName, getProject, getRelease, getReleaseSourceDigest, parseDeployArgs, requiresExplicitDeployConfirmation, resolvePushedSource, verifyDeployment, verifyReleaseSource, waitForReleaseAssetManifest, } from "./command.js";
|
|
4
|
+
export { assertProjectOwnership, createDeployment, createRelease, DeployArgsSchema, deployCommand, getDeployment, getDeploymentRoutingConvergenceWarning, getEnvironmentByName, getProject, getRelease, getReleaseSourceDigest, parseDeployArgs, requiresExplicitDeployConfirmation, resolvePushedSource, verifyDeployment, verifyReleaseSource, waitForEnvironmentReady, waitForReleaseAssetManifest, } from "./command.js";
|
|
5
5
|
export { handleDeployCommand } from "./handler.js";
|
package/esm/deno.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-executor.d.ts","sourceRoot":"","sources":["../../../src/src/release-assets/build-executor.ts"],"names":[],"mappings":"AAmBA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"build-executor.d.ts","sourceRoot":"","sources":["../../../src/src/release-assets/build-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,7 @@ import { ensureDefaultBundlerContracts } from "../extensions/bundler/defaults.js
|
|
|
34
34
|
import { register, tryResolve } from "../extensions/contracts.js";
|
|
35
35
|
import { getEsbuildLoader } from "../utils/path-utils.js";
|
|
36
36
|
import { extractCandidatesFromFiles } from "../html/styles-builder/candidate-extractor.js";
|
|
37
|
+
import { FRAMEWORK_CANDIDATES } from "../server/handlers/dev/framework-candidates.generated.js";
|
|
37
38
|
import { validatePathSync } from "../security/path-validation.js";
|
|
38
39
|
import { collectCssImportPaths, CSS_IMPORTING_SOURCE_EXTENSIONS, } from "../html/styles-builder/css-import-extraction.js";
|
|
39
40
|
import { computeHashBytes } from "../utils/index.js";
|
|
@@ -1537,7 +1538,10 @@ function mergeModuleCssImports(sourceByPath, stylesheet) {
|
|
|
1537
1538
|
}
|
|
1538
1539
|
/** Extract Tailwind class candidates from materialized source. */
|
|
1539
1540
|
function collectClassCandidates(sourceByPath) {
|
|
1540
|
-
|
|
1541
|
+
const candidates = extractCandidatesFromFiles([...sourceByPath.entries()].map(([path, content]) => ({ path, content })));
|
|
1542
|
+
for (const candidate of FRAMEWORK_CANDIDATES)
|
|
1543
|
+
candidates.add(candidate);
|
|
1544
|
+
return candidates;
|
|
1541
1545
|
}
|
|
1542
1546
|
/** Run an async task over items with a fixed concurrency limit.
|
|
1543
1547
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1160",
|
|
4
4
|
"description": "The simplest way to build AI-powered apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -332,10 +332,10 @@
|
|
|
332
332
|
"@types/react": "19.2.14",
|
|
333
333
|
"@types/react-dom": "19.2.3",
|
|
334
334
|
"ws": "8.21.0",
|
|
335
|
-
"@veryfront/ext-bundler-esbuild": "0.1.
|
|
336
|
-
"@veryfront/ext-content-mdx": "0.1.
|
|
337
|
-
"@veryfront/ext-css-tailwind": "0.1.
|
|
338
|
-
"@veryfront/ext-parser-babel": "0.1.
|
|
335
|
+
"@veryfront/ext-bundler-esbuild": "0.1.1160",
|
|
336
|
+
"@veryfront/ext-content-mdx": "0.1.1160",
|
|
337
|
+
"@veryfront/ext-css-tailwind": "0.1.1160",
|
|
338
|
+
"@veryfront/ext-parser-babel": "0.1.1160"
|
|
339
339
|
},
|
|
340
340
|
"devDependencies": {
|
|
341
341
|
"@types/node": "20.9.0"
|