@tachyon-gg/railway-deploy 0.2.7 → 0.2.8
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/index.js +43 -23
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -37447,9 +37447,7 @@ var SourceConfigSchema = exports_external.object({
|
|
|
37447
37447
|
message: "source must have either 'image' or 'repo', not both or neither"
|
|
37448
37448
|
});
|
|
37449
37449
|
var VolumeConfigSchema = exports_external.object({
|
|
37450
|
-
mount: exports_external.string()
|
|
37451
|
-
message: "volume mount must be an absolute path (start with /)"
|
|
37452
|
-
}),
|
|
37450
|
+
mount: exports_external.string(),
|
|
37453
37451
|
name: exports_external.string().min(1)
|
|
37454
37452
|
});
|
|
37455
37453
|
var HealthcheckConfigSchema = exports_external.object({
|
|
@@ -37460,24 +37458,11 @@ var RegionConfigSchema = exports_external.object({
|
|
|
37460
37458
|
region: exports_external.string().min(1),
|
|
37461
37459
|
num_replicas: exports_external.number().int().positive().optional()
|
|
37462
37460
|
});
|
|
37463
|
-
var RestartPolicySchema = exports_external.enum(["ALWAYS", "NEVER", "ON_FAILURE"]);
|
|
37464
|
-
var BuilderSchema = exports_external.enum(["RAILPACK", "DOCKERFILE", "NIXPACKS", "HEROKU", "PAKETO"]);
|
|
37465
37461
|
var RegistryCredentialsSchema = exports_external.object({
|
|
37466
37462
|
username: exports_external.string(),
|
|
37467
37463
|
password: exports_external.string()
|
|
37468
37464
|
});
|
|
37469
|
-
var
|
|
37470
|
-
var CronScheduleSchema = exports_external.string().refine((s) => {
|
|
37471
|
-
const parts = s.trim().split(/\s+/);
|
|
37472
|
-
if (parts.length !== 5)
|
|
37473
|
-
return false;
|
|
37474
|
-
return parts.every((part) => CRON_FIELD_PATTERN.test(part));
|
|
37475
|
-
}, { message: "cron_schedule must be a valid cron expression with 5 fields (e.g., '*/5 * * * *')" });
|
|
37476
|
-
var DomainSchema = exports_external.string().refine((d) => {
|
|
37477
|
-
if (d.includes("%{") || d.includes("${"))
|
|
37478
|
-
return true;
|
|
37479
|
-
return /^(\*\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(d);
|
|
37480
|
-
}, { message: "invalid domain format" });
|
|
37465
|
+
var DomainSchema = exports_external.string();
|
|
37481
37466
|
var DomainEntrySchema = exports_external.union([
|
|
37482
37467
|
DomainSchema,
|
|
37483
37468
|
exports_external.object({ domain: DomainSchema, target_port: exports_external.number().int().positive().optional() })
|
|
@@ -37500,9 +37485,9 @@ var ServiceTemplateSchema = exports_external.object({
|
|
|
37500
37485
|
variables: exports_external.record(exports_external.string(), exports_external.string().nullable()).optional(),
|
|
37501
37486
|
domains: exports_external.array(DomainEntrySchema).optional(),
|
|
37502
37487
|
region: RegionConfigSchema.optional(),
|
|
37503
|
-
restart_policy:
|
|
37488
|
+
restart_policy: exports_external.string().optional(),
|
|
37504
37489
|
healthcheck: HealthcheckConfigSchema.optional(),
|
|
37505
|
-
cron_schedule:
|
|
37490
|
+
cron_schedule: exports_external.string().optional(),
|
|
37506
37491
|
volume: VolumeConfigSchema.optional(),
|
|
37507
37492
|
start_command: exports_external.string().optional(),
|
|
37508
37493
|
build_command: exports_external.string().optional(),
|
|
@@ -37511,7 +37496,7 @@ var ServiceTemplateSchema = exports_external.object({
|
|
|
37511
37496
|
pre_deploy_command: exports_external.union([exports_external.string(), exports_external.array(exports_external.string())]).optional(),
|
|
37512
37497
|
restart_policy_max_retries: exports_external.number().int().nonnegative().optional(),
|
|
37513
37498
|
sleep_application: exports_external.boolean().optional(),
|
|
37514
|
-
builder:
|
|
37499
|
+
builder: exports_external.string().optional(),
|
|
37515
37500
|
watch_patterns: exports_external.array(exports_external.string()).optional(),
|
|
37516
37501
|
draining_seconds: exports_external.number().int().nonnegative().optional(),
|
|
37517
37502
|
overlap_seconds: exports_external.number().int().nonnegative().optional(),
|
|
@@ -37533,9 +37518,9 @@ var ServiceEntrySchema = exports_external.object({
|
|
|
37533
37518
|
domains: exports_external.array(DomainEntrySchema).optional(),
|
|
37534
37519
|
volume: VolumeConfigSchema.optional(),
|
|
37535
37520
|
region: RegionConfigSchema.optional(),
|
|
37536
|
-
restart_policy:
|
|
37521
|
+
restart_policy: exports_external.string().optional(),
|
|
37537
37522
|
healthcheck: HealthcheckConfigSchema.optional(),
|
|
37538
|
-
cron_schedule:
|
|
37523
|
+
cron_schedule: exports_external.string().optional(),
|
|
37539
37524
|
start_command: exports_external.string().optional(),
|
|
37540
37525
|
build_command: exports_external.string().optional(),
|
|
37541
37526
|
root_directory: exports_external.string().optional(),
|
|
@@ -37543,7 +37528,7 @@ var ServiceEntrySchema = exports_external.object({
|
|
|
37543
37528
|
pre_deploy_command: exports_external.union([exports_external.string(), exports_external.array(exports_external.string())]).optional(),
|
|
37544
37529
|
restart_policy_max_retries: exports_external.number().int().nonnegative().optional(),
|
|
37545
37530
|
sleep_application: exports_external.boolean().optional(),
|
|
37546
|
-
builder:
|
|
37531
|
+
builder: exports_external.string().optional(),
|
|
37547
37532
|
watch_patterns: exports_external.array(exports_external.string()).optional(),
|
|
37548
37533
|
draining_seconds: exports_external.number().int().nonnegative().optional(),
|
|
37549
37534
|
overlap_seconds: exports_external.number().int().nonnegative().optional(),
|
|
@@ -37588,6 +37573,40 @@ function validateServiceTemplate(data, templatePath) {
|
|
|
37588
37573
|
${issues}`);
|
|
37589
37574
|
}
|
|
37590
37575
|
}
|
|
37576
|
+
var VALID_RESTART_POLICIES = ["ALWAYS", "NEVER", "ON_FAILURE"];
|
|
37577
|
+
var VALID_BUILDERS = ["RAILPACK", "DOCKERFILE", "NIXPACKS", "HEROKU", "PAKETO"];
|
|
37578
|
+
var CRON_FIELD_PATTERN = /^(\*|[0-9]+(-[0-9]+)?(,[0-9]+(-[0-9]+)?)*)(\/[0-9]+)?$/;
|
|
37579
|
+
var DOMAIN_PATTERN = /^(\*\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
|
|
37580
|
+
function validateResolvedService(name, service) {
|
|
37581
|
+
const errors4 = [];
|
|
37582
|
+
if (service.restartPolicy && !VALID_RESTART_POLICIES.includes(service.restartPolicy)) {
|
|
37583
|
+
errors4.push(`restart_policy: "${service.restartPolicy}" is not valid (must be ${VALID_RESTART_POLICIES.join(", ")})`);
|
|
37584
|
+
}
|
|
37585
|
+
if (service.builder && !VALID_BUILDERS.includes(service.builder)) {
|
|
37586
|
+
errors4.push(`builder: "${service.builder}" is not valid (must be ${VALID_BUILDERS.join(", ")})`);
|
|
37587
|
+
}
|
|
37588
|
+
if (service.cronSchedule) {
|
|
37589
|
+
const parts = service.cronSchedule.trim().split(/\s+/);
|
|
37590
|
+
if (parts.length !== 5 || !parts.every((p) => CRON_FIELD_PATTERN.test(p))) {
|
|
37591
|
+
errors4.push(`cron_schedule: "${service.cronSchedule}" is not a valid cron expression (5 fields required)`);
|
|
37592
|
+
}
|
|
37593
|
+
}
|
|
37594
|
+
if (service.volume && !service.volume.mount.startsWith("/")) {
|
|
37595
|
+
errors4.push(`volume.mount: "${service.volume.mount}" must be an absolute path (start with /)`);
|
|
37596
|
+
}
|
|
37597
|
+
for (const d of service.domains) {
|
|
37598
|
+
if (d.domain.includes("${{") || d.domain.includes("${"))
|
|
37599
|
+
continue;
|
|
37600
|
+
if (!DOMAIN_PATTERN.test(d.domain)) {
|
|
37601
|
+
errors4.push(`domain: "${d.domain}" is not a valid domain format`);
|
|
37602
|
+
}
|
|
37603
|
+
}
|
|
37604
|
+
if (errors4.length > 0) {
|
|
37605
|
+
throw new Error(`Invalid resolved config for service "${name}":
|
|
37606
|
+
${errors4.join(`
|
|
37607
|
+
`)}`);
|
|
37608
|
+
}
|
|
37609
|
+
}
|
|
37591
37610
|
|
|
37592
37611
|
// src/config/variables.ts
|
|
37593
37612
|
var import_dotenv = __toESM(require_main(), 1);
|
|
@@ -37847,6 +37866,7 @@ function resolveService(name, entry, envDir, lenient = false) {
|
|
|
37847
37866
|
service.railwayConfigFile = railwayConfigFile;
|
|
37848
37867
|
if (staticOutboundIps !== undefined)
|
|
37849
37868
|
service.staticOutboundIps = staticOutboundIps;
|
|
37869
|
+
validateResolvedService(name, service);
|
|
37850
37870
|
return { service, deleted };
|
|
37851
37871
|
}
|
|
37852
37872
|
|