lim 0.39.1 → 0.41.0

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 (58) hide show
  1. package/dist/base-command.d.ts.map +1 -1
  2. package/dist/base-command.js +5 -0
  3. package/dist/base-command.js.map +1 -1
  4. package/dist/base-command.withauth.test.js +12 -0
  5. package/dist/base-command.withauth.test.js.map +1 -1
  6. package/dist/commands/android/create.d.ts +1 -0
  7. package/dist/commands/android/create.d.ts.map +1 -1
  8. package/dist/commands/android/create.js +7 -0
  9. package/dist/commands/android/create.js.map +1 -1
  10. package/dist/commands/android/create.test.js +22 -0
  11. package/dist/commands/android/create.test.js.map +1 -1
  12. package/dist/commands/ios/create.d.ts +1 -0
  13. package/dist/commands/ios/create.d.ts.map +1 -1
  14. package/dist/commands/ios/create.js +7 -0
  15. package/dist/commands/ios/create.js.map +1 -1
  16. package/dist/commands/ios/create.test.d.ts +2 -0
  17. package/dist/commands/ios/create.test.d.ts.map +1 -0
  18. package/dist/commands/ios/create.test.js +37 -0
  19. package/dist/commands/ios/create.test.js.map +1 -0
  20. package/dist/commands/ios/launch-app.d.ts +1 -0
  21. package/dist/commands/ios/launch-app.d.ts.map +1 -1
  22. package/dist/commands/ios/launch-app.js +7 -1
  23. package/dist/commands/ios/launch-app.js.map +1 -1
  24. package/dist/commands/ios/launch-app.test.d.ts +2 -0
  25. package/dist/commands/ios/launch-app.test.d.ts.map +1 -0
  26. package/dist/commands/ios/launch-app.test.js +61 -0
  27. package/dist/commands/ios/launch-app.test.js.map +1 -0
  28. package/dist/commands/tunnel/run.d.ts +30 -0
  29. package/dist/commands/tunnel/run.d.ts.map +1 -0
  30. package/dist/commands/tunnel/run.js +150 -0
  31. package/dist/commands/tunnel/run.js.map +1 -0
  32. package/dist/commands/tunnel/run.test.d.ts +2 -0
  33. package/dist/commands/tunnel/run.test.d.ts.map +1 -0
  34. package/dist/commands/tunnel/run.test.js +205 -0
  35. package/dist/commands/tunnel/run.test.js.map +1 -0
  36. package/dist/lib/backend.d.ts +25 -0
  37. package/dist/lib/backend.d.ts.map +1 -1
  38. package/dist/lib/backend.js +68 -5
  39. package/dist/lib/backend.js.map +1 -1
  40. package/dist/lib/backend.test.js +50 -0
  41. package/dist/lib/backend.test.js.map +1 -1
  42. package/dist/lib/launch-app-runtime.d.ts +6 -0
  43. package/dist/lib/launch-app-runtime.d.ts.map +1 -1
  44. package/dist/lib/launch-app-runtime.js +6 -1
  45. package/dist/lib/launch-app-runtime.js.map +1 -1
  46. package/dist/lib/tunnel-command.d.ts +1 -1
  47. package/dist/lib/tunnel-command.d.ts.map +1 -1
  48. package/dist/lib/tunnel-command.js +3 -9
  49. package/dist/lib/tunnel-command.js.map +1 -1
  50. package/dist/lib/tunnel-inspection-flags.d.ts +3 -0
  51. package/dist/lib/tunnel-inspection-flags.d.ts.map +1 -1
  52. package/dist/lib/tunnel-inspection-flags.js +11 -0
  53. package/dist/lib/tunnel-inspection-flags.js.map +1 -1
  54. package/dist/lib/tunnel-run.d.ts +7 -0
  55. package/dist/lib/tunnel-run.d.ts.map +1 -0
  56. package/dist/lib/tunnel-run.js +38 -0
  57. package/dist/lib/tunnel-run.js.map +1 -0
  58. package/package.json +5 -2
@@ -99,6 +99,7 @@ IosLaunchApp.description = 'Launch an installed app on a running iOS instance by
99
99
  IosLaunchApp.examples = [
100
100
  '<%= config.bin %> ios launch-app com.example.app',
101
101
  '<%= config.bin %> ios launch-app com.example.app --detach',
102
+ '<%= config.bin %> ios launch-app com.example.app --env API_URL=https://example.com --env FEATURE_FLAG=1',
102
103
  '<%= config.bin %> ios launch-app com.example.app --mode RelaunchIfRunning --id <instance-ID>',
103
104
  '<%= config.bin %> ios launch-app host.exp.Exponent --runtime detox --detox-server-url ws://localhost:8099 --detox-session-id limrun-detox --detox-version 20.51.1 --id <instance-ID>',
104
105
  ];
@@ -106,6 +107,11 @@ IosLaunchApp.args = {
106
107
  bundleId: core_1.Args.string({ description: 'App bundle identifier', required: true }),
107
108
  };
108
109
  IosLaunchApp.flags = {
110
+ env: core_1.Flags.string({
111
+ description: 'App environment variable as KEY=VALUE; repeat for multiple variables. Forces relaunch. Reserved keys and existing launch variables are ignored.',
112
+ multiple: true,
113
+ multipleNonGreedy: true,
114
+ }),
109
115
  ...base_command_1.BaseCommand.baseFlags,
110
116
  id: core_1.Flags.string({
111
117
  description: 'iOS instance ID to target. Defaults to the last created iOS instance.',
@@ -116,7 +122,7 @@ IosLaunchApp.flags = {
116
122
  default: false,
117
123
  }),
118
124
  mode: core_1.Flags.string({
119
- description: 'Launch behavior to use when the app may already be running. Default: ForegroundIfRunning.',
125
+ description: 'Launch behavior to use when the app may already be running. Default: ForegroundIfRunning, or RelaunchIfRunning with --env.',
120
126
  options: ['ForegroundIfRunning', 'RelaunchIfRunning'],
121
127
  }),
122
128
  runtime: core_1.Flags.string({
@@ -1 +1 @@
1
- {"version":3,"file":"launch-app.js","sourceRoot":"","sources":["../../../src/commands/ios/launch-app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch-app.js","sourceRoot":"","sources":["../../../src/commands/ios/launch-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=launch-app.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-app.test.d.ts","sourceRoot":"","sources":["../../../src/commands/ios/launch-app.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const launch_app_1 = __importDefault(require("./launch-app"));
7
+ const instance_client_factory_1 = require("../../lib/instance-client-factory");
8
+ jest.mock('../../lib/instance-client-factory', () => ({
9
+ ensureDaemonSession: jest.fn(),
10
+ getIosInstanceClient: jest.fn(),
11
+ sendSessionCommand: jest.fn(),
12
+ }));
13
+ function setup(env = ['FEATURE=a=b', 'EMPTY=']) {
14
+ const target = { id: 'ios_test', type: 'ios' };
15
+ const client = { launchApp: jest.fn().mockResolvedValue(undefined) };
16
+ const disconnect = jest.fn();
17
+ jest.mocked(instance_client_factory_1.getIosInstanceClient).mockResolvedValue({ client, disconnect });
18
+ const command = Object.assign(Object.create(launch_app_1.default.prototype), {
19
+ parse: async () => ({ args: { bundleId: 'com.example.app' }, flags: { detach: true, env } }),
20
+ setParsedFlags: jest.fn(),
21
+ withAuth: async (run) => run(),
22
+ resolveIosInstance: () => target,
23
+ log: jest.fn(),
24
+ });
25
+ Object.defineProperty(command, 'client', { value: {} });
26
+ return { command, client, disconnect, target };
27
+ }
28
+ beforeEach(() => jest.clearAllMocks());
29
+ test('detached env launches use the normal daemon machinery', async () => {
30
+ jest.mocked(instance_client_factory_1.ensureDaemonSession).mockResolvedValue(true);
31
+ const { command, target } = setup();
32
+ await command.run();
33
+ expect(instance_client_factory_1.ensureDaemonSession).toHaveBeenCalledWith(target);
34
+ expect(instance_client_factory_1.sendSessionCommand).toHaveBeenCalledWith('ios_test', 'launch-app', [
35
+ 'com.example.app',
36
+ { mode: 'RelaunchIfRunning', env: { FEATURE: 'a=b', EMPTY: '' } },
37
+ ]);
38
+ expect(instance_client_factory_1.getIosInstanceClient).not.toHaveBeenCalled();
39
+ });
40
+ test('direct fallback carries the same env and disconnects', async () => {
41
+ jest.mocked(instance_client_factory_1.ensureDaemonSession).mockResolvedValue(false);
42
+ const { command, client, disconnect } = setup();
43
+ await command.run();
44
+ expect(client.launchApp).toHaveBeenCalledWith('com.example.app', {
45
+ mode: 'RelaunchIfRunning',
46
+ env: { FEATURE: 'a=b', EMPTY: '' },
47
+ });
48
+ expect(disconnect).toHaveBeenCalledTimes(1);
49
+ expect(instance_client_factory_1.sendSessionCommand).not.toHaveBeenCalled();
50
+ });
51
+ test('forwards reserved env through the daemon for server validation', async () => {
52
+ jest.mocked(instance_client_factory_1.ensureDaemonSession).mockResolvedValue(true);
53
+ const { command } = setup(['DYLD_LIBRARY_PATH=/tmp']);
54
+ await command.run();
55
+ expect(instance_client_factory_1.sendSessionCommand).toHaveBeenCalledWith('ios_test', 'launch-app', [
56
+ 'com.example.app',
57
+ { mode: 'RelaunchIfRunning', env: { DYLD_LIBRARY_PATH: '/tmp' } },
58
+ ]);
59
+ expect(instance_client_factory_1.getIosInstanceClient).not.toHaveBeenCalled();
60
+ });
61
+ //# sourceMappingURL=launch-app.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-app.test.js","sourceRoot":"","sources":["../../../src/commands/ios/launch-app.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class TunnelRun extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ token: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
8
+ name: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ selector: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ replace: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ verbose: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ inspect: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
13
+ persist: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ ttl: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
15
+ 'har-body-limit': import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
16
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
19
+ create: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
20
+ workspace: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
21
+ daemon: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
22
+ };
23
+ run(): Promise<void>;
24
+ /**
25
+ * The tunnel to run: the one a tunnel key names, the one --name names, or
26
+ * a throwaway tunnel that --name and --selector create.
27
+ */
28
+ private resolveTunnel;
29
+ }
30
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/tunnel/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAajD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,OAAO,SAA+D;IAC7E,MAAM,CAAC,WAAW,SAQL;IACb,MAAM,CAAC,QAAQ,WAKb;IAEF,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;MAmCV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D1B;;;OAGG;YACW,aAAa;CAwC5B"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const api_1 = require("@limrun/api");
5
+ const base_command_1 = require("../../base-command");
6
+ const backend_1 = require("../../lib/backend");
7
+ const tunnel_run_1 = require("../../lib/tunnel-run");
8
+ const tunnel_inspection_flags_1 = require("../../lib/tunnel-inspection-flags");
9
+ const tunnel_process_1 = require("../../lib/tunnel-process");
10
+ const VERSION = require('../../../package.json').version;
11
+ class TunnelRun extends base_command_1.BaseCommand {
12
+ async run() {
13
+ const { flags } = await this.parse(TunnelRun);
14
+ // The tunnel key is an API key; it wins over a key already in the shell.
15
+ this.setParsedFlags(flags.token ? { ...flags, 'api-key': flags.token } : flags);
16
+ let inspection;
17
+ try {
18
+ inspection = (0, tunnel_inspection_flags_1.tunnelInspectionContext)(flags);
19
+ }
20
+ catch (error) {
21
+ this.error(error instanceof Error ? error.message : String(error));
22
+ }
23
+ const selectors = flags.selector?.length ? (0, tunnel_process_1.parseTunnelSelectors)(flags.selector) : undefined;
24
+ await this.withAuth(async () => {
25
+ const { organizationId, tunnelId: keyTunnelId } = await (0, backend_1.whoAmITunnel)(this.client);
26
+ const tunnel = await this.resolveTunnel(organizationId, keyTunnelId, flags.name, selectors);
27
+ // A tunnel key's tunnel learns its name from the first active.
28
+ let name = flags.name;
29
+ const connector = (0, api_1.runTunnel)({
30
+ apiKey: this.client.apiKey ?? '',
31
+ baseURL: this.client.baseURL,
32
+ organizationId,
33
+ tunnelId: tunnel.id,
34
+ inspection: (0, tunnel_inspection_flags_1.tunnelInspectionConfig)(inspection),
35
+ replace: flags.replace,
36
+ clientVersion: VERSION,
37
+ logLevel: flags.verbose ? 'debug'
38
+ : this.shouldSuppressInfo() ? 'none'
39
+ : 'warn',
40
+ onEvent: (event) => {
41
+ if (event.type === 'active')
42
+ name = event.name;
43
+ this.info((0, tunnel_run_1.formatTunnelConnectorEvent)(name, event, tunnel.created));
44
+ },
45
+ });
46
+ // close() says bye, which also takes a throwaway tunnel away.
47
+ const stop = () => void connector.close();
48
+ process.once('SIGINT', stop);
49
+ process.once('SIGTERM', stop);
50
+ try {
51
+ await connector.closed;
52
+ }
53
+ catch (error) {
54
+ this.error(error instanceof Error ? error.message : String(error));
55
+ }
56
+ finally {
57
+ process.off('SIGINT', stop);
58
+ process.off('SIGTERM', stop);
59
+ // A connector stopped while connecting, refused, or out of retries
60
+ // never said bye, so its throwaway tunnel would hold the name until
61
+ // the hub sweeps it.
62
+ if (tunnel.created) {
63
+ await (0, backend_1.deleteQuickTunnel)(this.client, organizationId, tunnel.id).catch((error) => this.warn(`${error instanceof Error ? error.message : String(error)}; it goes away within ten minutes.`));
64
+ }
65
+ }
66
+ });
67
+ }
68
+ /**
69
+ * The tunnel to run: the one a tunnel key names, the one --name names, or
70
+ * a throwaway tunnel that --name and --selector create.
71
+ */
72
+ async resolveTunnel(organizationId, keyTunnelId, name, selectors) {
73
+ if (keyTunnelId) {
74
+ if (name || selectors) {
75
+ this.error("A tunnel key runs its own tunnel as created; drop --name and --selector, and edit the tunnel's " +
76
+ 'selectors in the console.');
77
+ }
78
+ return { id: keyTunnelId, created: false };
79
+ }
80
+ if (!name) {
81
+ this.error("Run with the tunnel's key (--token), or pass --name with an admin's credential.");
82
+ }
83
+ const existing = await (0, backend_1.findTunnel)(this.client, organizationId, name);
84
+ if (existing?.ephemeral) {
85
+ // A throwaway tunnel is its creator's alone and goes when it stops.
86
+ this.error(`Tunnel ${name} is another connector's throwaway tunnel; pick another name.`);
87
+ }
88
+ if (existing) {
89
+ if (selectors) {
90
+ this.error(`Tunnel ${name} has its own selectors; edit them in the console instead of passing --selector.`);
91
+ }
92
+ return { id: existing.id, created: false };
93
+ }
94
+ if (!selectors) {
95
+ this.error(`Tunnel ${name} does not exist. Create it in the console (Network > New tunnel), or pass --selector to ` +
96
+ 'run a throwaway tunnel.');
97
+ }
98
+ const created = await (0, backend_1.createQuickTunnel)(this.client, organizationId, name, selectors);
99
+ return { id: created.id, created: true };
100
+ }
101
+ }
102
+ TunnelRun.summary = 'Serve a persistent tunnel to every instance that names it';
103
+ TunnelRun.description = 'Run the connector of a tunnel created in the console (Network > New tunnel) or the API, and open ' +
104
+ 'a destination tunnel to every iOS and Android instance created with --tunnel <name>, until Ctrl+C. ' +
105
+ 'Run it with the tunnel key the console shows (--token); the key names its tunnel, and the ' +
106
+ "tunnel's selectors decide which destinations instances reach through this machine. An admin's " +
107
+ 'login runs any tunnel with --name, and --name with --selector runs a throwaway tunnel that goes ' +
108
+ 'away when this connector exits. Instance tunnels stay up while the connection to Limrun ' +
109
+ 'reconnects. One connector holds a tunnel at a time: others wait on standby, and --replace takes ' +
110
+ 'it over.';
111
+ TunnelRun.examples = [
112
+ '<%= config.bin %> tunnel run --token <tunnel key>',
113
+ '<%= config.bin %> tunnel run --name staging',
114
+ '<%= config.bin %> tunnel run --name scratch --selector localhost:3000',
115
+ '<%= config.bin %> ios create --tunnel staging',
116
+ ];
117
+ TunnelRun.flags = {
118
+ ...base_command_1.BaseCommand.baseFlags,
119
+ token: core_1.Flags.string({
120
+ description: 'Tunnel key from the console (Network > New tunnel). Takes precedence over --api-key and LIM_API_KEY.',
121
+ }),
122
+ name: core_1.Flags.string({
123
+ description: "Tunnel to run with an admin's credential. A tunnel key runs its own tunnel and needs no name.",
124
+ }),
125
+ selector: core_1.Flags.string({
126
+ description: 'Run a throwaway tunnel with this destination, as localhost:port, IPv4:port, [IPv6]:port, or a ' +
127
+ 'private exact or *. wildcard domain, when --name names no tunnel yet. A tunnel created in the ' +
128
+ 'console keeps its own selectors. Repeat for more selectors.',
129
+ multiple: true,
130
+ }),
131
+ replace: core_1.Flags.boolean({
132
+ description: 'Take the tunnel over from the connector that holds it now.',
133
+ default: false,
134
+ }),
135
+ verbose: core_1.Flags.boolean({
136
+ description: 'Log every forwarded connection and dial failure.',
137
+ default: false,
138
+ }),
139
+ inspect: core_1.Flags.boolean({
140
+ description: 'Inspect HTTP and HTTPS through each instance tunnel with a certificate the instance trusts. ' +
141
+ 'Use --no-inspect to keep TLS end to end.',
142
+ default: true,
143
+ allowNo: true,
144
+ }),
145
+ persist: tunnel_inspection_flags_1.tunnelInspectionFlags.persist,
146
+ ttl: tunnel_inspection_flags_1.tunnelInspectionFlags.ttl,
147
+ 'har-body-limit': tunnel_inspection_flags_1.tunnelInspectionFlags['har-body-limit'],
148
+ };
149
+ exports.default = TunnelRun;
150
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/tunnel/run.ts"],"names":[],"mappings":";;AAAA,sCAAoC;AACpC,qCAAwC;AACxC,qDAAiD;AACjD,+CAAmG;AACnG,qDAAkE;AAClE,+EAK2C;AAC3C,6DAAgE;AAEhE,MAAM,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC,OAAO,CAAC;AAEzD,MAAqB,SAAU,SAAQ,0BAAW;IAuDhD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,yEAAyE;QACzE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,UAAmC,CAAC;QACxC,IAAI,CAAC;YACH,UAAU,GAAG,IAAA,iDAAuB,EAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAA,qCAAoB,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5F,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,sBAAY,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC5F,+DAA+D;YAC/D,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACtB,MAAM,SAAS,GAAG,IAAA,eAAS,EAAC;gBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE;gBAChC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,cAAc;gBACd,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,UAAU,EAAE,IAAA,gDAAsB,EAAC,UAAU,CAAC;gBAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,aAAa,EAAE,OAAO;gBACtB,QAAQ,EACN,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;oBACvB,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,MAAM;wBACpC,CAAC,CAAC,MAAM;gBACV,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAAE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBAC/C,IAAI,CAAC,IAAI,CAAC,IAAA,uCAA0B,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrE,CAAC;aACF,CAAC,CAAC;YACH,8DAA8D;YAC9D,MAAM,IAAI,GAAG,GAAS,EAAE,CAAC,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,MAAM,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,CAAC;oBAAS,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC7B,mEAAmE;gBACnE,oEAAoE;gBACpE,qBAAqB;gBACrB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,IAAA,2BAAiB,EAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CACvF,IAAI,CAAC,IAAI,CACP,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAC9F,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,aAAa,CACzB,cAAsB,EACtB,WAA+B,EAC/B,IAAwB,EACxB,SAA+B;QAE/B,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;gBACtB,IAAI,CAAC,KAAK,CACR,iGAAiG;oBAC/F,2BAA2B,CAC9B,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;QAChG,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAU,EAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;QACrE,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC;YACxB,oEAAoE;YACpE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,8DAA8D,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CACR,UAAU,IAAI,iFAAiF,CAChG,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CACR,UAAU,IAAI,0FAA0F;gBACtG,yBAAyB,CAC5B,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAiB,EAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACtF,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;;AA5JM,iBAAO,GAAG,2DAA2D,CAAC;AACtE,qBAAW,GAChB,mGAAmG;IACnG,qGAAqG;IACrG,4FAA4F;IAC5F,gGAAgG;IAChG,kGAAkG;IAClG,0FAA0F;IAC1F,kGAAkG;IAClG,UAAU,CAAC;AACN,kBAAQ,GAAG;IAChB,mDAAmD;IACnD,6CAA6C;IAC7C,uEAAuE;IACvE,+CAA+C;CAChD,CAAC;AAEK,eAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,KAAK,EAAE,YAAK,CAAC,MAAM,CAAC;QAClB,WAAW,EACT,sGAAsG;KACzG,CAAC;IACF,IAAI,EAAE,YAAK,CAAC,MAAM,CAAC;QACjB,WAAW,EACT,+FAA+F;KAClG,CAAC;IACF,QAAQ,EAAE,YAAK,CAAC,MAAM,CAAC;QACrB,WAAW,EACT,gGAAgG;YAChG,gGAAgG;YAChG,6DAA6D;QAC/D,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,OAAO,EAAE,YAAK,CAAC,OAAO,CAAC;QACrB,WAAW,EAAE,4DAA4D;QACzE,OAAO,EAAE,KAAK;KACf,CAAC;IACF,OAAO,EAAE,YAAK,CAAC,OAAO,CAAC;QACrB,WAAW,EAAE,kDAAkD;QAC/D,OAAO,EAAE,KAAK;KACf,CAAC;IACF,OAAO,EAAE,YAAK,CAAC,OAAO,CAAC;QACrB,WAAW,EACT,8FAA8F;YAC9F,0CAA0C;QAC5C,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,IAAI;KACd,CAAC;IACF,OAAO,EAAE,+CAAqB,CAAC,OAAO;IACtC,GAAG,EAAE,+CAAqB,CAAC,GAAG;IAC9B,gBAAgB,EAAE,+CAAqB,CAAC,gBAAgB,CAAC;CAC1D,CAAC;kBArDiB,SAAS"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.d.ts","sourceRoot":"","sources":["../../../src/commands/tunnel/run.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const core_1 = require("@oclif/core");
7
+ const api_1 = require("@limrun/api");
8
+ const run_1 = __importDefault(require("./run"));
9
+ const backend_1 = require("../../lib/backend");
10
+ const tunnel_run_1 = require("../../lib/tunnel-run");
11
+ jest.mock('@limrun/api', () => ({ ...jest.requireActual('@limrun/api'), runTunnel: jest.fn() }));
12
+ jest.mock('../../lib/backend', () => ({
13
+ whoAmITunnel: jest.fn(),
14
+ findTunnel: jest.fn(),
15
+ createQuickTunnel: jest.fn(),
16
+ deleteQuickTunnel: jest.fn(async () => { }),
17
+ }));
18
+ beforeEach(() => jest.clearAllMocks());
19
+ describe('tunnel run flags', () => {
20
+ test('need neither a name nor selectors, with inspection on by default', async () => {
21
+ const { flags } = await core_1.Parser.parse([], { flags: run_1.default.flags });
22
+ expect(flags).toMatchObject({ replace: false, verbose: false, inspect: true, persist: false });
23
+ expect(flags.name).toBeUndefined();
24
+ expect(flags.selector).toBeUndefined();
25
+ expect(run_1.default.flags).not.toHaveProperty('har');
26
+ });
27
+ });
28
+ describe('tunnel run command', () => {
29
+ function setup(flags, { keyTunnelId, closed = Promise.resolve() } = {}) {
30
+ jest
31
+ .mocked(backend_1.whoAmITunnel)
32
+ .mockResolvedValue({ organizationId: 'org_1', ...(keyTunnelId ? { tunnelId: keyTunnelId } : {}) });
33
+ const close = jest.fn(async () => { });
34
+ jest.mocked(api_1.runTunnel).mockReturnValue({ closed, close });
35
+ const info = jest.fn();
36
+ const command = Object.assign(Object.create(run_1.default.prototype), {
37
+ parse: async () => ({
38
+ flags: {
39
+ replace: true,
40
+ verbose: false,
41
+ inspect: true,
42
+ persist: true,
43
+ ttl: 3600,
44
+ 'har-body-limit': 1024,
45
+ ...flags,
46
+ },
47
+ }),
48
+ setParsedFlags: jest.fn(),
49
+ withAuth: async (run) => run(),
50
+ shouldSuppressInfo: () => false,
51
+ info,
52
+ error: (message) => {
53
+ throw new Error(message);
54
+ },
55
+ });
56
+ Object.defineProperty(command, 'client', {
57
+ value: { apiKey: 'lim_key', baseURL: 'https://api.example.test' },
58
+ });
59
+ return { command, info };
60
+ }
61
+ function options() {
62
+ return jest.mocked(api_1.runTunnel).mock.calls[0][0];
63
+ }
64
+ test('runs the tunnel a tunnel key names, with the mapped options', async () => {
65
+ const { command, info } = setup({}, { keyTunnelId: 'tunnel_1' });
66
+ await command.run();
67
+ expect(backend_1.findTunnel).not.toHaveBeenCalled();
68
+ expect(options()).toMatchObject({
69
+ apiKey: 'lim_key',
70
+ baseURL: 'https://api.example.test',
71
+ organizationId: 'org_1',
72
+ tunnelId: 'tunnel_1',
73
+ inspection: { enabled: true, captureBodies: true, maxBodyBytes: 1024, persist: true, ttlSeconds: 3600 },
74
+ replace: true,
75
+ logLevel: 'warn',
76
+ });
77
+ // The name arrives with the first active.
78
+ options().onEvent({ type: 'active', sessionId: 's1', name: 'staging' });
79
+ options().onEvent({ type: 'standby', holder: { hostname: 'ci-1' } });
80
+ expect(info).toHaveBeenCalledWith('Tunnel staging is active. Instances created with --tunnel staging attach here; press Ctrl+C to stop.');
81
+ expect(info).toHaveBeenCalledWith('Standby: ci-1 holds tunnel staging. Waiting for it to go away; use --replace to take it over.');
82
+ });
83
+ test('runs with the key --token passes, over one in the shell', async () => {
84
+ const { command } = setup({ token: 'lim_tunnel_key' }, { keyTunnelId: 'tunnel_1' });
85
+ await command.run();
86
+ expect(command.setParsedFlags).toHaveBeenCalledWith(expect.objectContaining({ token: 'lim_tunnel_key', 'api-key': 'lim_tunnel_key' }));
87
+ });
88
+ test('runs the tunnel an admin names', async () => {
89
+ jest.mocked(backend_1.findTunnel).mockResolvedValue({ id: 'tunnel_2', name: 'staging', ephemeral: false });
90
+ const { command } = setup({ name: 'staging' });
91
+ await command.run();
92
+ expect(backend_1.findTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'staging');
93
+ expect(options()).toMatchObject({ tunnelId: 'tunnel_2' });
94
+ expect(backend_1.createQuickTunnel).not.toHaveBeenCalled();
95
+ expect(backend_1.deleteQuickTunnel).not.toHaveBeenCalled();
96
+ });
97
+ test('creates a throwaway tunnel for --name with --selector', async () => {
98
+ jest.mocked(backend_1.findTunnel).mockResolvedValue(undefined);
99
+ jest.mocked(backend_1.createQuickTunnel).mockResolvedValue({ id: 'tunnel_3', name: 'scratch', ephemeral: true });
100
+ const { command, info } = setup({ name: 'scratch', selector: ['localhost:3000'] });
101
+ await command.run();
102
+ expect(backend_1.createQuickTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'scratch', ['localhost:3000']);
103
+ expect(options()).toMatchObject({ tunnelId: 'tunnel_3' });
104
+ options().onEvent({ type: 'active', sessionId: 's1', name: 'scratch' });
105
+ expect(info).toHaveBeenCalledWith(expect.stringContaining('goes away when this connector exits'));
106
+ expect(backend_1.deleteQuickTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'tunnel_3');
107
+ });
108
+ test('deletes its throwaway tunnel when the connector fails', async () => {
109
+ jest.mocked(backend_1.findTunnel).mockResolvedValue(undefined);
110
+ jest.mocked(backend_1.createQuickTunnel).mockResolvedValue({ id: 'tunnel_3', name: 'scratch', ephemeral: true });
111
+ const { command } = setup({ name: 'scratch', selector: ['localhost:3000'] }, { closed: Promise.reject(new Error('tunnel scratch: unauthorized')) });
112
+ await expect(command.run()).rejects.toThrow('tunnel scratch: unauthorized');
113
+ expect(backend_1.deleteQuickTunnel).toHaveBeenCalledWith(expect.anything(), 'org_1', 'tunnel_3');
114
+ });
115
+ test.each([
116
+ [
117
+ 'a tunnel key with selectors',
118
+ { selector: ['localhost:3000'] },
119
+ 'tunnel_1',
120
+ 'A tunnel key runs its own tunnel as created',
121
+ ],
122
+ ['a tunnel key with a name', { name: 'b' }, 'tunnel_1', 'A tunnel key runs its own tunnel as created'],
123
+ [
124
+ 'no key and no name',
125
+ {},
126
+ undefined,
127
+ "Run with the tunnel's key (--token), or pass --name with an admin's credential.",
128
+ ],
129
+ [
130
+ 'a name that does not exist without selectors',
131
+ { name: 'missing' },
132
+ undefined,
133
+ 'Tunnel missing does not exist. Create it in the console (Network > New tunnel), or pass --selector to ' +
134
+ 'run a throwaway tunnel.',
135
+ ],
136
+ ])('refuses %s', async (_, flags, keyTunnelId, message) => {
137
+ jest.mocked(backend_1.findTunnel).mockResolvedValue(undefined);
138
+ const { command } = setup(flags, keyTunnelId ? { keyTunnelId } : {});
139
+ await expect(command.run()).rejects.toThrow(message);
140
+ expect(api_1.runTunnel).not.toHaveBeenCalled();
141
+ });
142
+ test('refuses selectors for a tunnel that has its own', async () => {
143
+ jest.mocked(backend_1.findTunnel).mockResolvedValue({ id: 'tunnel_2', name: 'staging', ephemeral: false });
144
+ const { command } = setup({ name: 'staging', selector: ['localhost:3000'] });
145
+ await expect(command.run()).rejects.toThrow('Tunnel staging has its own selectors');
146
+ });
147
+ test.each([[{ name: 'scratch' }], [{ name: 'scratch', selector: ['localhost:3000'] }]])("refuses another connector's throwaway tunnel (%j)", async (flags) => {
148
+ jest.mocked(backend_1.findTunnel).mockResolvedValue({ id: 'tunnel_3', name: 'scratch', ephemeral: true });
149
+ const { command } = setup(flags);
150
+ await expect(command.run()).rejects.toThrow("Tunnel scratch is another connector's throwaway tunnel");
151
+ expect(api_1.runTunnel).not.toHaveBeenCalled();
152
+ });
153
+ test('fails with the terminal connector error', async () => {
154
+ const { command } = setup({}, {
155
+ keyTunnelId: 'tunnel_1',
156
+ closed: Promise.reject(new Error('tunnel staging: the tunnel was deleted')),
157
+ });
158
+ await expect(command.run()).rejects.toThrow('tunnel staging: the tunnel was deleted');
159
+ });
160
+ });
161
+ describe('tunnel run event lines', () => {
162
+ test.each([
163
+ [
164
+ { type: 'active', sessionId: 'session-1', name: 'staging' },
165
+ 'Tunnel staging is active. Instances created with --tunnel staging attach here; press Ctrl+C to stop.',
166
+ ],
167
+ [
168
+ { type: 'keyExpiring', expiresAt: '2026-10-20T00:00:00Z' },
169
+ 'The key this connector runs with expires at 2026-10-20T00:00:00Z. Issue a new key for tunnel staging ' +
170
+ 'in the console (Network) and restart the connector with it.',
171
+ ],
172
+ [
173
+ { type: 'standby', holder: { hostname: 'ci-1', since: '2026-10-08T10:00:00Z' } },
174
+ 'Standby: ci-1 holds tunnel staging since 2026-10-08T10:00:00Z. ' +
175
+ 'Waiting for it to go away; use --replace to take it over.',
176
+ ],
177
+ [
178
+ { type: 'attachFailed', instanceId: 'ios_1', code: 'instance_busy', message: 'busy' },
179
+ 'Could not attach ios_1: busy (instance_busy).',
180
+ ],
181
+ [
182
+ { type: 'reconnecting', delayMs: 1500, reason: 'the server asked to reconnect (1012)' },
183
+ 'Reconnecting to Limrun in 1.5s: the server asked to reconnect (1012). Attached instances keep their tunnels.',
184
+ ],
185
+ [
186
+ {
187
+ type: 'reconnecting',
188
+ instanceId: 'ios_1',
189
+ delayMs: 1000,
190
+ reason: 'the instance tunnel disconnected',
191
+ },
192
+ 'Retrying ios_1 in 1.0s: the instance tunnel disconnected.',
193
+ ],
194
+ ])('formats %j', (event, line) => {
195
+ expect((0, tunnel_run_1.formatTunnelConnectorEvent)('staging', event)).toBe(line);
196
+ });
197
+ test('names the tunnel generically before the first active', () => {
198
+ expect((0, tunnel_run_1.formatTunnelConnectorEvent)(undefined, { type: 'standby', holder: { hostname: 'ci-1' } })).toBe('Standby: ci-1 holds the tunnel. Waiting for it to go away; use --replace to take it over.');
199
+ });
200
+ test('says a throwaway tunnel goes with its connector', () => {
201
+ expect((0, tunnel_run_1.formatTunnelConnectorEvent)('scratch', { type: 'active', sessionId: 's1', name: 'scratch' }, true)).toBe('Tunnel scratch is active. Instances created with --tunnel scratch attach here; press Ctrl+C to stop. ' +
202
+ 'It is a throwaway tunnel and goes away when this connector exits.');
203
+ });
204
+ });
205
+ //# sourceMappingURL=run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../../src/commands/tunnel/run.test.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,31 @@ export declare const androidSigningKeySecretType = "androidSigningKey";
19
19
  * /v1/whoami nests inside `user`.
20
20
  */
21
21
  export declare function whoAmI(client: Limrun): Promise<string>;
22
+ /** A persistent tunnel as the backend lists it. */
23
+ export interface PersistentTunnel {
24
+ id: string;
25
+ name: string;
26
+ ephemeral: boolean;
27
+ }
28
+ /**
29
+ * Resolves the organization and, when the credential is a tunnel key, the
30
+ * one tunnel it runs: a tunnel key's only scope is tunnel:<id>:connect. A
31
+ * connector needs an organization key, so a user token's default
32
+ * organization does not count.
33
+ */
34
+ export declare function whoAmITunnel(client: Limrun): Promise<{
35
+ organizationId: string;
36
+ tunnelId?: string;
37
+ }>;
38
+ /** Finds an organization's tunnel by the name instances use. */
39
+ export declare function findTunnel(client: Limrun, organizationId: string, name: string): Promise<PersistentTunnel | undefined>;
40
+ /** Creates a throwaway tunnel that goes away when its connector does. */
41
+ export declare function createQuickTunnel(client: Limrun, organizationId: string, name: string, selectors: string[]): Promise<PersistentTunnel>;
42
+ /**
43
+ * Deletes a throwaway tunnel this CLI created. The hub deletes it when its
44
+ * connector says bye, so a missing tunnel is the normal case.
45
+ */
46
+ export declare function deleteQuickTunnel(client: Limrun, organizationId: string, tunnelId: string): Promise<void>;
22
47
  /** Fetches a secret's data, or undefined when it does not exist. */
23
48
  export declare function getSecret(client: Limrun, organizationId: string, secretType: string, secretName: string): Promise<SecretData | undefined>;
24
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/lib/backend.ts"],"names":[],"mappings":"AAAA,OAAO,MAAwD,MAAM,aAAa,CAAC;AAEnF;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAU/D;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY5D;AAQD,oEAAoE;AACpE,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAcjC;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,eAAe,CAAC,CAgB1B"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/lib/backend.ts"],"names":[],"mappings":"AAAA,OAAO,MAAwD,MAAM,aAAa,CAAC;AAEnF;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAU/D;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5D;AAgBD,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CASzG;AAMD,gEAAgE;AAChE,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAQvC;AAED,yEAAyE;AACzE,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CASf;AAQD,oEAAoE;AACpE,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAcjC;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,eAAe,CAAC,CAgB1B"}