@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.
Files changed (2) hide show
  1. package/dist/index.js +43 -23
  2. 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().refine((m) => m.startsWith("/"), {
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 CRON_FIELD_PATTERN = /^(\*|[0-9]+(-[0-9]+)?(,[0-9]+(-[0-9]+)?)*)(\/[0-9]+)?$/;
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: RestartPolicySchema.optional(),
37488
+ restart_policy: exports_external.string().optional(),
37504
37489
  healthcheck: HealthcheckConfigSchema.optional(),
37505
- cron_schedule: CronScheduleSchema.optional(),
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: BuilderSchema.optional(),
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: RestartPolicySchema.optional(),
37521
+ restart_policy: exports_external.string().optional(),
37537
37522
  healthcheck: HealthcheckConfigSchema.optional(),
37538
- cron_schedule: CronScheduleSchema.optional(),
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: BuilderSchema.optional(),
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tachyon-gg/railway-deploy",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",