@cardelli/ambit 0.1.0 → 0.1.2

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.
@@ -7,7 +7,8 @@ import { bold } from "../../../lib/cli.js";
7
7
  import { createOutput } from "../../../lib/output.js";
8
8
  import { registerCommand } from "../mod.js";
9
9
  import { createFlyProvider } from "../../providers/fly.js";
10
- import { requireTailscaleProvider } from "../../credentials.js";
10
+ import { createTailscaleProvider, } from "../../providers/tailscale.js";
11
+ import { checkDependencies } from "../../credentials.js";
11
12
  import { findRouterApp, getRouterMachineInfo, getRouterTailscaleInfo, listRouterApps, } from "../../discovery.js";
12
13
  import { resolveOrg } from "../../resolve.js";
13
14
  // =============================================================================
@@ -36,106 +37,109 @@ ${bold("EXAMPLES")}
36
37
  `);
37
38
  return;
38
39
  }
40
+ // =========================================================================
41
+ // Prerequisites
42
+ // =========================================================================
43
+ const { tailscaleKey } = await checkDependencies(createOutput(args.json));
39
44
  const fly = createFlyProvider();
40
- await fly.ensureInstalled();
41
45
  await fly.ensureAuth({ interactive: !args.json });
46
+ const tailscale = createTailscaleProvider("-", tailscaleKey);
47
+ // =========================================================================
48
+ // Status
49
+ // =========================================================================
42
50
  if (args.network) {
43
- // ========================================================================
44
- // Single Router Detailed View
45
- // ========================================================================
46
- const out = createOutput(args.json);
47
- const tailscale = await requireTailscaleProvider(out);
48
- const org = await resolveOrg(fly, args, out);
49
- // 1. Find the router
50
- const app = await findRouterApp(fly, org, args.network);
51
- if (!app) {
52
- return out.die(`No Router Found for Network '${args.network}'`);
53
- }
54
- // 2. Get machine state
55
- const machine = await getRouterMachineInfo(fly, app.appName);
56
- // 3. Get tailscale state
57
- const ts = await getRouterTailscaleInfo(tailscale, app.appName);
58
- const tag = ts?.tags?.[0] ?? null;
59
- out.blank()
60
- .header("ambit Status")
61
- .blank()
62
- .text(` Network: ${bold(app.network)}`)
63
- .text(` TLD: *.${app.network}`)
64
- .text(` Tag: ${tag ?? "unknown"}`)
65
- .blank()
66
- .text(` Router App: ${app.appName}`)
67
- .text(` Region: ${machine?.region ?? "unknown"}`)
68
- .text(` Machine State: ${machine?.state ?? "unknown"}`)
69
- .text(` Private IP: ${machine?.privateIp ?? "unknown"}`)
70
- .text(` SOCKS Proxy: ${machine?.privateIp
71
- ? `socks5://[${machine.privateIp}]:1080`
72
- : "unknown"}`);
73
- if (machine?.subnet) {
74
- out.text(` Subnet: ${machine.subnet}`);
75
- }
76
- out.blank();
77
- if (ts) {
78
- out.text(` Tailscale IP: ${ts.ip}`)
79
- .text(` Online: ${ts.online ? "yes" : "no"}`);
80
- }
81
- else {
82
- out.text(" Tailscale: Not Found in Tailnet");
83
- }
84
- out.blank();
85
- out.done({
86
- network: app.network,
87
- router: app,
88
- machine,
89
- tag,
90
- tailscale: ts,
91
- });
92
- out.print();
51
+ await showNetworkStatus(fly, tailscale, args);
52
+ }
53
+ else {
54
+ await showAllStatus(fly, tailscale, args);
55
+ }
56
+ };
57
+ // =============================================================================
58
+ // Single Router Detailed View
59
+ // =============================================================================
60
+ const showNetworkStatus = async (fly, tailscale, args) => {
61
+ const out = createOutput(args.json);
62
+ const org = await resolveOrg(fly, args, out);
63
+ const app = await findRouterApp(fly, org, args.network);
64
+ if (!app) {
65
+ return out.die(`No Router Found for Network '${args.network}'`);
66
+ }
67
+ const machine = await getRouterMachineInfo(fly, app.appName);
68
+ const ts = await getRouterTailscaleInfo(tailscale, app.appName);
69
+ const tag = ts?.tags?.[0] ?? null;
70
+ out.blank()
71
+ .header("ambit Status")
72
+ .blank()
73
+ .text(` Network: ${bold(app.network)}`)
74
+ .text(` TLD: *.${app.network}`)
75
+ .text(` Tag: ${tag ?? "unknown"}`)
76
+ .blank()
77
+ .text(` Router App: ${app.appName}`)
78
+ .text(` Region: ${machine?.region ?? "unknown"}`)
79
+ .text(` Machine State: ${machine?.state ?? "unknown"}`)
80
+ .text(` Private IP: ${machine?.privateIp ?? "unknown"}`)
81
+ .text(` SOCKS Proxy: ${machine?.privateIp ? `socks5://[${machine.privateIp}]:1080` : "unknown"}`);
82
+ if (machine?.subnet) {
83
+ out.text(` Subnet: ${machine.subnet}`);
84
+ }
85
+ out.blank();
86
+ if (ts) {
87
+ out.text(` Tailscale IP: ${ts.ip}`)
88
+ .text(` Online: ${ts.online ? "yes" : "no"}`);
93
89
  }
94
90
  else {
95
- // ========================================================================
96
- // Summary Table of All Routers
97
- // ========================================================================
98
- const out = createOutput(args.json);
99
- const tailscale = await requireTailscaleProvider(out);
100
- const org = await resolveOrg(fly, args, out);
101
- // 1. Find all router apps
102
- const spinner = out.spinner("Discovering Routers");
103
- const routerApps = await listRouterApps(fly, org);
104
- spinner.success(`Found ${routerApps.length} Router${routerApps.length !== 1 ? "s" : ""}`);
105
- if (routerApps.length === 0) {
106
- out.blank()
107
- .text("No Routers Found.")
108
- .dim(" Create one with: ambit create <network>")
109
- .blank();
110
- out.done({ routers: [] });
111
- out.print();
112
- return;
113
- }
114
- // 2. Get machine + tailscale state for each
115
- const routers = [];
116
- for (const app of routerApps) {
117
- const machine = await getRouterMachineInfo(fly, app.appName);
118
- const ts = await getRouterTailscaleInfo(tailscale, app.appName);
119
- routers.push({ ...app, machine, tailscale: ts });
120
- }
121
- // 3. Render
122
- out.blank().header("Router Status").blank();
123
- const rows = routers.map((r) => {
124
- const tsStatus = r.tailscale
125
- ? r.tailscale.online ? "online" : "offline"
126
- : "not found";
127
- return [r.network, r.appName, r.machine?.state ?? "unknown", tsStatus];
128
- });
129
- const table = new Table()
130
- .header(["Network", "App", "State", "Tailscale"])
131
- .body(rows)
132
- .indent(2)
133
- .padding(2);
134
- out.text(table.toString());
135
- out.blank();
136
- out.done({ routers });
91
+ out.text(" Tailscale: Not Found in Tailnet");
92
+ }
93
+ out.blank();
94
+ out.done({
95
+ network: app.network,
96
+ router: app,
97
+ machine,
98
+ tag,
99
+ tailscale: ts,
100
+ });
101
+ out.print();
102
+ };
103
+ // =============================================================================
104
+ // Summary Table of All Routers
105
+ // =============================================================================
106
+ const showAllStatus = async (fly, tailscale, args) => {
107
+ const out = createOutput(args.json);
108
+ const org = await resolveOrg(fly, args, out);
109
+ const spinner = out.spinner("Discovering Routers");
110
+ const routerApps = await listRouterApps(fly, org);
111
+ spinner.success(`Found ${routerApps.length} Router${routerApps.length !== 1 ? "s" : ""}`);
112
+ if (routerApps.length === 0) {
113
+ out.blank()
114
+ .text("No Routers Found.")
115
+ .dim(" Create one with: ambit create <network>")
116
+ .blank();
117
+ out.done({ routers: [] });
137
118
  out.print();
119
+ return;
138
120
  }
121
+ const routers = [];
122
+ for (const app of routerApps) {
123
+ const machine = await getRouterMachineInfo(fly, app.appName);
124
+ const ts = await getRouterTailscaleInfo(tailscale, app.appName);
125
+ routers.push({ ...app, machine, tailscale: ts });
126
+ }
127
+ out.blank().header("Router Status").blank();
128
+ const rows = routers.map((r) => {
129
+ const tsStatus = r.tailscale
130
+ ? r.tailscale.online ? "online" : "offline"
131
+ : "not found";
132
+ return [r.network, r.appName, r.machine?.state ?? "unknown", tsStatus];
133
+ });
134
+ const table = new Table()
135
+ .header(["Network", "App", "State", "Tailscale"])
136
+ .body(rows)
137
+ .indent(2)
138
+ .padding(2);
139
+ out.text(table.toString());
140
+ out.blank();
141
+ out.done({ routers });
142
+ out.print();
139
143
  };
140
144
  // =============================================================================
141
145
  // Register Command
@@ -65,7 +65,7 @@ export const runCli = async (argv) => {
65
65
  showVersion();
66
66
  return;
67
67
  }
68
- const commandName = args._[0];
68
+ const commandName = typeof args._[0] === "string" ? args._[0] : undefined;
69
69
  if (!commandName || args.help) {
70
70
  if (commandName) {
71
71
  const command = getCommand(commandName);
@@ -1,13 +1,22 @@
1
1
  import "../_dnt.polyfills.js";
2
- import { type TailscaleProvider } from "./providers/tailscale.js";
3
2
  export interface CredentialStore {
4
3
  getTailscaleApiKey(): Promise<string | null>;
5
4
  setTailscaleApiKey(key: string): Promise<void>;
6
5
  }
7
6
  export declare const createConfigCredentialStore: () => CredentialStore;
8
7
  export declare const getCredentialStore: () => CredentialStore;
9
- /** Get a TailscaleProvider or die via out.die(). Respects JSON mode. */
10
- export declare const requireTailscaleProvider: (out: {
8
+ /**
9
+ * Verify that flyctl CLI and Tailscale API key are both available.
10
+ * Reports ALL missing dependencies before dying, so the user can
11
+ * fix everything in one pass instead of hitting errors one at a time.
12
+ *
13
+ * Returns the validated Tailscale API key for explicit injection into
14
+ * the provider created by the caller.
15
+ */
16
+ export declare const checkDependencies: (out: {
17
+ err(msg: string): unknown;
11
18
  die(msg: string): never;
12
- }) => Promise<TailscaleProvider>;
19
+ }) => Promise<{
20
+ tailscaleKey: string;
21
+ }>;
13
22
  //# sourceMappingURL=credentials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/src/credentials.ts"],"names":[],"mappings":"AAGA,OAAO,sBAAsB,CAAC;AAQ9B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;AAclC,MAAM,WAAW,eAAe;IAC9B,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAQD,eAAO,MAAM,2BAA2B,QAAO,eA0B9C,CAAC;AAMF,eAAO,MAAM,kBAAkB,QAAO,eAgBrC,CAAC;AAMF,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,GACnC,KAAK;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAA;CAAE,KAC/B,OAAO,CAAC,iBAAiB,CAS3B,CAAC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/src/credentials.ts"],"names":[],"mappings":"AAGA,OAAO,sBAAsB,CAAC;AAqB9B,MAAM,WAAW,eAAe;IAC9B,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAQD,eAAO,MAAM,2BAA2B,QAAO,eA0B9C,CAAC;AAMF,eAAO,MAAM,kBAAkB,QAAO,eAgBrC,CAAC;AAMF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAC5B,KAAK;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAA;CAAE,KAC1D,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAyBlC,CAAC"}
@@ -4,9 +4,8 @@
4
4
  import "../_dnt.polyfills.js";
5
5
  import * as dntShim from "../_dnt.shims.js";
6
6
  import { z } from "../deps/jsr.io/@zod/zod/4.3.6/src/index.js";
7
- import { ensureConfigDir, fileExists } from "../lib/cli.js";
7
+ import { commandExists, ensureConfigDir, fileExists } from "../lib/cli.js";
8
8
  import { getConfigDir } from "./schemas/config.js";
9
- import { createTailscaleProvider, } from "./providers/tailscale.js";
10
9
  // =============================================================================
11
10
  // Schema
12
11
  // =============================================================================
@@ -59,14 +58,32 @@ export const getCredentialStore = () => {
59
58
  };
60
59
  };
61
60
  // =============================================================================
62
- // Require Tailscale Provider (fail-fast)
61
+ // Check Dependencies (batch validation)
63
62
  // =============================================================================
64
- /** Get a TailscaleProvider or die via out.die(). Respects JSON mode. */
65
- export const requireTailscaleProvider = async (out) => {
66
- const store = getCredentialStore();
67
- const key = await store.getTailscaleApiKey();
63
+ /**
64
+ * Verify that flyctl CLI and Tailscale API key are both available.
65
+ * Reports ALL missing dependencies before dying, so the user can
66
+ * fix everything in one pass instead of hitting errors one at a time.
67
+ *
68
+ * Returns the validated Tailscale API key for explicit injection into
69
+ * the provider created by the caller.
70
+ */
71
+ export const checkDependencies = async (out) => {
72
+ const errors = [];
73
+ if (!(await commandExists("fly"))) {
74
+ errors.push("Flyctl Not Found. Install from https://fly.io/docs/flyctl/install/");
75
+ }
76
+ const key = await getCredentialStore().getTailscaleApiKey();
68
77
  if (!key) {
69
- return out.die("Tailscale API Key Required. Run 'ambit create' or set TAILSCALE_API_KEY");
78
+ errors.push("Tailscale API Key Required. Run 'ambit create' or set TAILSCALE_API_KEY");
79
+ }
80
+ if (errors.length === 1) {
81
+ return out.die(errors[0]);
82
+ }
83
+ if (errors.length > 1) {
84
+ for (const e of errors)
85
+ out.err(e);
86
+ return out.die("Missing Prerequisites");
70
87
  }
71
- return createTailscaleProvider("-", key);
88
+ return { tailscaleKey: key };
72
89
  };
@@ -1,4 +1,10 @@
1
+ import "../_dnt.polyfills.js";
1
2
  import type { FlyProvider } from "./providers/fly.js";
3
+ /**
4
+ * Returns true if the given name is a public TLD (case-insensitive).
5
+ * Used to prevent creating networks that would shadow real DNS.
6
+ */
7
+ export declare const isPublicTld: (name: string) => boolean;
2
8
  export interface PreflightResult {
3
9
  scanned: boolean;
4
10
  errors: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/src/guard.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOjD;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAwDhE;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAwF5B"}
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/src/guard.ts"],"names":[],"mappings":"AAWA,OAAO,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAqLtD;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OACN,CAAC;AAMtC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOjD;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAwDhE;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAwF5B"}
package/esm/src/guard.js CHANGED
@@ -9,8 +9,191 @@
9
9
  // - auditDeploy: post-deploy check that releases public IPs and reports
10
10
  //
11
11
  // =============================================================================
12
+ import "../_dnt.polyfills.js";
12
13
  import { parse as parseToml } from "../deps/jsr.io/@std/toml/1.0.11/mod.js";
13
14
  // =============================================================================
15
+ // Public TLD Blocklist (source: https://data.iana.org/TLD/tlds-alpha-by-domain.txt)
16
+ // =============================================================================
17
+ // deno-fmt-ignore
18
+ const PUBLIC_TLDS = new Set([
19
+ "aaa", "aarp", "abb", "abbott", "abbvie", "abc", "able", "abogado", "abudhabi", "ac",
20
+ "academy", "accenture", "accountant", "accountants", "aco", "actor", "ad", "ads",
21
+ "adult", "ae", "aeg", "aero", "aetna", "af", "afl", "africa", "ag", "agakhan", "agency",
22
+ "ai", "aig", "airbus", "airforce", "airtel", "akdn", "al", "alibaba", "alipay",
23
+ "allfinanz", "allstate", "ally", "alsace", "alstom", "am", "amazon", "americanexpress",
24
+ "americanfamily", "amex", "amfam", "amica", "amsterdam", "analytics", "android",
25
+ "anquan", "anz", "ao", "aol", "apartments", "app", "apple", "aq", "aquarelle", "ar",
26
+ "arab", "aramco", "archi", "army", "arpa", "art", "arte", "as", "asda", "asia",
27
+ "associates", "at", "athleta", "attorney", "au", "auction", "audi", "audible", "audio",
28
+ "auspost", "author", "auto", "autos", "aw", "aws", "ax", "axa", "az", "azure", "ba",
29
+ "baby", "baidu", "banamex", "band", "bank", "bar", "barcelona", "barclaycard",
30
+ "barclays", "barefoot", "bargains", "baseball", "basketball", "bauhaus", "bayern",
31
+ "bb", "bbc", "bbt", "bbva", "bcg", "bcn", "bd", "be", "beats", "beauty", "beer",
32
+ "berlin", "best", "bestbuy", "bet", "bf", "bg", "bh", "bharti", "bi", "bible", "bid",
33
+ "bike", "bing", "bingo", "bio", "biz", "bj", "black", "blackfriday", "blockbuster",
34
+ "blog", "bloomberg", "blue", "bm", "bms", "bmw", "bn", "bnpparibas", "bo", "boats",
35
+ "boehringer", "bofa", "bom", "bond", "boo", "book", "booking", "bosch", "bostik",
36
+ "boston", "bot", "boutique", "box", "br", "bradesco", "bridgestone", "broadway",
37
+ "broker", "brother", "brussels", "bs", "bt", "build", "builders", "business", "buy",
38
+ "buzz", "bv", "bw", "by", "bz", "bzh", "ca", "cab", "cafe", "cal", "call",
39
+ "calvinklein", "cam", "camera", "camp", "canon", "capetown", "capital", "capitalone",
40
+ "car", "caravan", "cards", "care", "career", "careers", "cars", "casa", "case", "cash",
41
+ "casino", "cat", "catering", "catholic", "cba", "cbn", "cbre", "cc", "cd", "center",
42
+ "ceo", "cern", "cf", "cfa", "cfd", "cg", "ch", "chanel", "channel", "charity", "chase",
43
+ "chat", "cheap", "chintai", "christmas", "chrome", "church", "ci", "cipriani",
44
+ "circle", "cisco", "citadel", "citi", "citic", "city", "ck", "cl", "claims",
45
+ "cleaning", "click", "clinic", "clinique", "clothing", "cloud", "club", "clubmed",
46
+ "cm", "cn", "co", "coach", "codes", "coffee", "college", "cologne", "com", "commbank",
47
+ "community", "company", "compare", "computer", "comsec", "condos", "construction",
48
+ "consulting", "contact", "contractors", "cooking", "cool", "coop", "corsica",
49
+ "country", "coupon", "coupons", "courses", "cpa", "cr", "credit", "creditcard",
50
+ "creditunion", "cricket", "crown", "crs", "cruise", "cruises", "cu", "cuisinella",
51
+ "cv", "cw", "cx", "cy", "cymru", "cyou", "cz", "dad", "dance", "data", "date",
52
+ "dating", "datsun", "day", "dclk", "dds", "de", "deal", "dealer", "deals", "degree",
53
+ "delivery", "dell", "deloitte", "delta", "democrat", "dental", "dentist", "desi",
54
+ "design", "dev", "dhl", "diamonds", "diet", "digital", "direct", "directory",
55
+ "discount", "discover", "dish", "diy", "dj", "dk", "dm", "dnp", "do", "docs", "doctor",
56
+ "dog", "domains", "dot", "download", "drive", "dtv", "dubai", "dupont", "durban",
57
+ "dvag", "dvr", "dz", "earth", "eat", "ec", "eco", "edeka", "edu", "education", "ee",
58
+ "eg", "email", "emerck", "energy", "engineer", "engineering", "enterprises", "epson",
59
+ "equipment", "er", "ericsson", "erni", "es", "esq", "estate", "et", "eu", "eurovision",
60
+ "eus", "events", "exchange", "expert", "exposed", "express", "extraspace", "fage",
61
+ "fail", "fairwinds", "faith", "family", "fan", "fans", "farm", "farmers", "fashion",
62
+ "fast", "fedex", "feedback", "ferrari", "ferrero", "fi", "fidelity", "fido", "film",
63
+ "final", "finance", "financial", "fire", "firestone", "firmdale", "fish", "fishing",
64
+ "fit", "fitness", "fj", "fk", "flickr", "flights", "flir", "florist", "flowers", "fly",
65
+ "fm", "fo", "foo", "food", "football", "ford", "forex", "forsale", "forum",
66
+ "foundation", "fox", "fr", "free", "fresenius", "frl", "frogans", "frontier", "ftr",
67
+ "fujitsu", "fun", "fund", "furniture", "futbol", "fyi", "ga", "gal", "gallery",
68
+ "gallo", "gallup", "game", "games", "gap", "garden", "gay", "gb", "gbiz", "gd", "gdn",
69
+ "ge", "gea", "gent", "genting", "george", "gf", "gg", "ggee", "gh", "gi", "gift",
70
+ "gifts", "gives", "giving", "gl", "glass", "gle", "global", "globo", "gm", "gmail",
71
+ "gmbh", "gmo", "gmx", "gn", "godaddy", "gold", "goldpoint", "golf", "goodyear",
72
+ "goog", "google", "gop", "got", "gov", "gp", "gq", "gr", "grainger", "graphics",
73
+ "gratis", "green", "gripe", "grocery", "group", "gs", "gt", "gu", "gucci", "guge",
74
+ "guide", "guitars", "guru", "gw", "gy", "hair", "hamburg", "hangout", "haus", "hbo",
75
+ "hdfc", "hdfcbank", "health", "healthcare", "help", "helsinki", "here", "hermes",
76
+ "hiphop", "hisamitsu", "hitachi", "hiv", "hk", "hkt", "hm", "hn", "hockey",
77
+ "holdings", "holiday", "homedepot", "homegoods", "homes", "homesense", "honda",
78
+ "horse", "hospital", "host", "hosting", "hot", "hotels", "hotmail", "house", "how",
79
+ "hr", "hsbc", "ht", "hu", "hughes", "hyatt", "hyundai", "ibm", "icbc", "ice", "icu",
80
+ "id", "ie", "ieee", "ifm", "ikano", "il", "im", "imamat", "imdb", "immo", "immobilien",
81
+ "in", "inc", "industries", "infiniti", "info", "ing", "ink", "institute", "insurance",
82
+ "insure", "int", "international", "intuit", "investments", "io", "ipiranga", "iq",
83
+ "ir", "irish", "is", "ismaili", "ist", "istanbul", "it", "itau", "itv", "jaguar",
84
+ "java", "jcb", "je", "jeep", "jetzt", "jewelry", "jio", "jll", "jm", "jmp", "jnj", "jo",
85
+ "jobs", "joburg", "jot", "joy", "jp", "jpmorgan", "jprs", "juegos", "juniper",
86
+ "kaufen", "kddi", "ke", "kerryhotels", "kerryproperties", "kfh", "kg", "kh", "ki",
87
+ "kia", "kids", "kim", "kindle", "kitchen", "kiwi", "km", "kn", "koeln", "komatsu",
88
+ "kosher", "kp", "kpmg", "kpn", "kr", "krd", "kred", "kuokgroup", "kw", "ky", "kyoto",
89
+ "kz", "la", "lacaixa", "lamborghini", "lamer", "land", "landrover", "lanxess",
90
+ "lasalle", "lat", "latino", "latrobe", "law", "lawyer", "lb", "lc", "lds", "lease",
91
+ "leclerc", "lefrak", "legal", "lego", "lexus", "lgbt", "li", "lidl", "life",
92
+ "lifeinsurance", "lifestyle", "lighting", "like", "lilly", "limited", "limo",
93
+ "lincoln", "link", "live", "living", "lk", "llc", "llp", "loan", "loans", "locker",
94
+ "locus", "lol", "london", "lotte", "lotto", "love", "lpl", "lplfinancial", "lr", "ls",
95
+ "lt", "ltd", "ltda", "lu", "lundbeck", "luxe", "luxury", "lv", "ly", "ma", "madrid",
96
+ "maif", "maison", "makeup", "man", "management", "mango", "map", "market",
97
+ "marketing", "markets", "marriott", "marshalls", "mattel", "mba", "mc", "mckinsey",
98
+ "md", "me", "med", "media", "meet", "melbourne", "meme", "memorial", "men", "menu",
99
+ "merckmsd", "mg", "mh", "miami", "microsoft", "mil", "mini", "mint", "mit",
100
+ "mitsubishi", "mk", "ml", "mlb", "mls", "mm", "mma", "mn", "mo", "mobi", "mobile",
101
+ "moda", "moe", "moi", "mom", "monash", "money", "monster", "mormon", "mortgage",
102
+ "moscow", "moto", "motorcycles", "mov", "movie", "mp", "mq", "mr", "ms", "msd", "mt",
103
+ "mtn", "mtr", "mu", "museum", "music", "mv", "mw", "mx", "my", "mz", "na", "nab",
104
+ "nagoya", "name", "navy", "nba", "nc", "ne", "nec", "net", "netbank", "netflix",
105
+ "network", "neustar", "new", "news", "next", "nextdirect", "nexus", "nf", "nfl", "ng",
106
+ "ngo", "nhk", "ni", "nico", "nike", "nikon", "ninja", "nissan", "nissay", "nl", "no",
107
+ "nokia", "norton", "now", "nowruz", "nowtv", "np", "nr", "nra", "nrw", "ntt", "nu",
108
+ "nyc", "nz", "obi", "observer", "office", "okinawa", "olayan", "olayangroup", "ollo",
109
+ "om", "omega", "one", "ong", "onl", "online", "ooo", "open", "oracle", "orange", "org",
110
+ "organic", "origins", "osaka", "otsuka", "ott", "ovh", "pa", "page", "panasonic",
111
+ "paris", "pars", "partners", "parts", "party", "pay", "pccw", "pe", "pet", "pf",
112
+ "pfizer", "pg", "ph", "pharmacy", "phd", "philips", "phone", "photo", "photography",
113
+ "photos", "physio", "pics", "pictet", "pictures", "pid", "pin", "ping", "pink",
114
+ "pioneer", "pizza", "pk", "pl", "place", "play", "playstation", "plumbing", "plus",
115
+ "pm", "pn", "pnc", "pohl", "poker", "politie", "porn", "post", "pr", "praxi", "press",
116
+ "prime", "pro", "prod", "productions", "prof", "progressive", "promo", "properties",
117
+ "property", "protection", "pru", "prudential", "ps", "pt", "pub", "pw", "pwc", "py",
118
+ "qa", "qpon", "quebec", "quest", "racing", "radio", "re", "read", "realestate",
119
+ "realtor", "realty", "recipes", "red", "redumbrella", "rehab", "reise", "reisen",
120
+ "reit", "reliance", "ren", "rent", "rentals", "repair", "report", "republican",
121
+ "rest", "restaurant", "review", "reviews", "rexroth", "rich", "richardli", "ricoh",
122
+ "ril", "rio", "rip", "ro", "rocks", "rodeo", "rogers", "room", "rs", "rsvp", "ru",
123
+ "rugby", "ruhr", "run", "rw", "rwe", "ryukyu", "sa", "saarland", "safe", "safety",
124
+ "sakura", "sale", "salon", "samsclub", "samsung", "sandvik", "sandvikcoromant",
125
+ "sanofi", "sap", "sarl", "sas", "save", "saxo", "sb", "sbi", "sbs", "sc", "scb",
126
+ "schaeffler", "schmidt", "scholarships", "school", "schule", "schwarz", "science",
127
+ "scot", "sd", "se", "search", "seat", "secure", "security", "seek", "select", "sener",
128
+ "services", "seven", "sew", "sex", "sexy", "sfr", "sg", "sh", "shangrila", "sharp",
129
+ "shell", "shia", "shiksha", "shoes", "shop", "shopping", "shouji", "show", "si",
130
+ "silk", "sina", "singles", "site", "sj", "sk", "ski", "skin", "sky", "skype", "sl",
131
+ "sling", "sm", "smart", "smile", "sn", "sncf", "so", "soccer", "social", "softbank",
132
+ "software", "sohu", "solar", "solutions", "song", "sony", "soy", "spa", "space",
133
+ "sport", "spot", "sr", "srl", "ss", "st", "stada", "staples", "star", "statebank",
134
+ "statefarm", "stc", "stcgroup", "stockholm", "storage", "store", "stream", "studio",
135
+ "study", "style", "su", "sucks", "supplies", "supply", "support", "surf", "surgery",
136
+ "suzuki", "sv", "swatch", "swiss", "sx", "sy", "sydney", "systems", "sz", "tab",
137
+ "taipei", "talk", "taobao", "target", "tatamotors", "tatar", "tattoo", "tax", "taxi",
138
+ "tc", "tci", "td", "tdk", "team", "tech", "technology", "tel", "temasek", "tennis",
139
+ "teva", "tf", "tg", "th", "thd", "theater", "theatre", "tiaa", "tickets", "tienda",
140
+ "tips", "tires", "tirol", "tj", "tjmaxx", "tjx", "tk", "tkmaxx", "tl", "tm", "tmall",
141
+ "tn", "to", "today", "tokyo", "tools", "top", "toray", "toshiba", "total", "tours",
142
+ "town", "toyota", "toys", "tr", "trade", "trading", "training", "travel", "travelers",
143
+ "travelersinsurance", "trust", "trv", "tt", "tube", "tui", "tunes", "tushu", "tv",
144
+ "tvs", "tw", "tz", "ua", "ubank", "ubs", "ug", "uk", "unicom", "university", "uno",
145
+ "uol", "ups", "us", "uy", "uz", "va", "vacations", "vana", "vanguard", "vc", "ve",
146
+ "vegas", "ventures", "verisign", "versicherung", "vet", "vg", "vi", "viajes", "video",
147
+ "vig", "viking", "villas", "vin", "vip", "virgin", "visa", "vision", "viva", "vivo",
148
+ "vlaanderen", "vn", "vodka", "volvo", "vote", "voting", "voto", "voyage", "vu",
149
+ "wales", "walmart", "walter", "wang", "wanggou", "watch", "watches", "weather",
150
+ "weatherchannel", "webcam", "weber", "website", "wed", "wedding", "weibo", "weir",
151
+ "wf", "whoswho", "wien", "wiki", "williamhill", "win", "windows", "wine", "winners",
152
+ "wme", "woodside", "work", "works", "world", "wow", "ws", "wtc", "wtf", "xbox",
153
+ "xerox", "xihuan", "xin", "xn--11b4c3d", "xn--1ck2e1b", "xn--1qqw23a",
154
+ "xn--2scrj9c", "xn--30rr7y", "xn--3bst00m", "xn--3ds443g", "xn--3e0b707e",
155
+ "xn--3hcrj9c", "xn--3pxu8k", "xn--42c2d9a", "xn--45br5cyl", "xn--45brj9c",
156
+ "xn--45q11c", "xn--4dbrk0ce", "xn--4gbrim", "xn--54b7fta0cc", "xn--55qw42g",
157
+ "xn--55qx5d", "xn--5su34j936bgsg", "xn--5tzm5g", "xn--6frz82g",
158
+ "xn--6qq986b3xl", "xn--80adxhks", "xn--80ao21a", "xn--80aqecdr1a",
159
+ "xn--80asehdb", "xn--80aswg", "xn--8y0a063a", "xn--90a3ac", "xn--90ae",
160
+ "xn--90ais", "xn--9dbq2a", "xn--9et52u", "xn--9krt00a", "xn--b4w605ferd",
161
+ "xn--bck1b9a5dre4c", "xn--c1avg", "xn--c2br7g", "xn--cck2b3b",
162
+ "xn--cckwcxetd", "xn--cg4bki", "xn--clchc0ea0b2g2a9gcd", "xn--czr694b",
163
+ "xn--czrs0t", "xn--czru2d", "xn--d1acj3b", "xn--d1alf", "xn--e1a4c",
164
+ "xn--eckvdtc9d", "xn--efvy88h", "xn--fct429k", "xn--fhbei", "xn--fiq228c5hs",
165
+ "xn--fiq64b", "xn--fiqs8s", "xn--fiqz9s", "xn--fjq720a", "xn--flw351e",
166
+ "xn--fpcrj9c3d", "xn--fzc2c9e2c", "xn--fzys8d69uvgm", "xn--g2xx48c",
167
+ "xn--gckr3f0f", "xn--gecrj9c", "xn--gk3at1e", "xn--h2breg3eve", "xn--h2brj9c",
168
+ "xn--h2brj9c8c", "xn--hxt814e", "xn--i1b6b1a6a2e", "xn--imr513n",
169
+ "xn--io0a7i", "xn--j1aef", "xn--j1amh", "xn--j6w193g", "xn--jlq480n2rg",
170
+ "xn--jvr189m", "xn--kcrx77d1x4a", "xn--kprw13d", "xn--kpry57d", "xn--kput3i",
171
+ "xn--l1acc", "xn--lgbbat1ad8j", "xn--mgb9awbf", "xn--mgba3a3ejt",
172
+ "xn--mgba3a4f16a", "xn--mgba7c0bbn0a", "xn--mgbaam7a8h", "xn--mgbab2bd",
173
+ "xn--mgbah1a3hjkrd", "xn--mgbai9azgqp6j", "xn--mgbayh7gpa", "xn--mgbbh1a",
174
+ "xn--mgbbh1a71e", "xn--mgbc0a9azcg", "xn--mgbca7dzdo", "xn--mgbcpq6gpa1a",
175
+ "xn--mgberp4a5d4ar", "xn--mgbgu82a", "xn--mgbi4ecexp", "xn--mgbpl2fh",
176
+ "xn--mgbt3dhd", "xn--mgbtx2b", "xn--mgbx4cd0ab", "xn--mix891f",
177
+ "xn--mk1bu44c", "xn--mxtq1m", "xn--ngbc5azd", "xn--ngbe9e0a", "xn--ngbrx",
178
+ "xn--node", "xn--nqv7f", "xn--nqv7fs00ema", "xn--nyqy26a", "xn--o3cw4h",
179
+ "xn--ogbpf8fl", "xn--otu796d", "xn--p1acf", "xn--p1ai", "xn--pgbs0dh",
180
+ "xn--pssy2u", "xn--q7ce6a", "xn--q9jyb4c", "xn--qcka1pmc", "xn--qxa6a",
181
+ "xn--qxam", "xn--rhqv96g", "xn--rovu88b", "xn--rvc1e0am3e", "xn--s9brj9c",
182
+ "xn--ses554g", "xn--t60b56a", "xn--tckwe", "xn--tiq49xqyj", "xn--unup4y",
183
+ "xn--vermgensberater-ctb", "xn--vermgensberatung-pwb", "xn--vhquv",
184
+ "xn--vuq861b", "xn--w4r85el8fhu5dnra", "xn--w4rs40l", "xn--wgbh1c",
185
+ "xn--wgbl6a", "xn--xhq521b", "xn--xkc2al3hye2a", "xn--xkc2dl3a5ee0h",
186
+ "xn--y9a3aq", "xn--yfro4i67o", "xn--ygbi2ammx", "xn--zfr164b", "xxx", "xyz",
187
+ "yachts", "yahoo", "yamaxun", "yandex", "ye", "yodobashi", "yoga", "yokohama", "you",
188
+ "youtube", "yt", "yun", "za", "zappos", "zara", "zero", "zip", "zm", "zone", "zuerich",
189
+ "zw",
190
+ ]);
191
+ /**
192
+ * Returns true if the given name is a public TLD (case-insensitive).
193
+ * Used to prevent creating networks that would shadow real DNS.
194
+ */
195
+ export const isPublicTld = (name) => PUBLIC_TLDS.has(name.toLowerCase());
196
+ // =============================================================================
14
197
  // assertNotRouter
15
198
  // =============================================================================
16
199
  /**
@@ -1,5 +1,15 @@
1
1
  import "../../_dnt.polyfills.js";
2
2
  import { type FlyApp, type FlyAppInfo, type FlyIp, type FlyMachine } from "../schemas/fly.js";
3
+ /**
4
+ * Thrown when a `fly deploy` command fails. Carries the raw stderr so callers
5
+ * can surface it through `out` (respecting JSON mode) instead of printing
6
+ * directly.
7
+ */
8
+ export declare class FlyDeployError extends Error {
9
+ /** Last meaningful line from flyctl stderr. */
10
+ readonly detail: string;
11
+ constructor(app: string, stderr: string);
12
+ }
3
13
  export type MachineSize = "shared-cpu-1x" | "shared-cpu-2x" | "shared-cpu-4x";
4
14
  export interface MachineConfig {
5
15
  size: MachineSize;
@@ -1 +1 @@
1
- {"version":3,"file":"fly.d.ts","sourceRoot":"","sources":["../../../src/src/providers/fly.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fly.d.ts","sourceRoot":"","sources":["../../../src/src/providers/fly.ts"],"names":[],"mappings":"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"}