lim 0.40.0 → 0.42.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.
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +5 -0
- package/dist/base-command.js.map +1 -1
- package/dist/base-command.withauth.test.js +12 -0
- package/dist/base-command.withauth.test.js.map +1 -1
- package/dist/commands/android/create.d.ts.map +1 -1
- package/dist/commands/android/create.js +2 -1
- package/dist/commands/android/create.js.map +1 -1
- package/dist/commands/ios/create.d.ts.map +1 -1
- package/dist/commands/ios/create.js +2 -1
- package/dist/commands/ios/create.js.map +1 -1
- package/dist/commands/tunnel/run.d.ts +13 -2
- package/dist/commands/tunnel/run.d.ts.map +1 -1
- package/dist/commands/tunnel/run.js +98 -30
- package/dist/commands/tunnel/run.js.map +1 -1
- package/dist/commands/tunnel/run.test.js +159 -29
- package/dist/commands/tunnel/run.test.js.map +1 -1
- package/dist/lib/backend.d.ts +38 -0
- package/dist/lib/backend.d.ts.map +1 -1
- package/dist/lib/backend.js +114 -4
- package/dist/lib/backend.js.map +1 -1
- package/dist/lib/backend.test.js +75 -0
- package/dist/lib/backend.test.js.map +1 -1
- package/dist/lib/tunnel-run.d.ts +5 -2
- package/dist/lib/tunnel-run.d.ts.map +1 -1
- package/dist/lib/tunnel-run.js +17 -5
- package/dist/lib/tunnel-run.js.map +1 -1
- package/package.json +2 -2
package/dist/lib/backend.js
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.androidSigningKeySecretType = void 0;
|
|
4
4
|
exports.whoAmI = whoAmI;
|
|
5
|
+
exports.quickTunnelOrganization = quickTunnelOrganization;
|
|
6
|
+
exports.tunnelTokenClaims = tunnelTokenClaims;
|
|
7
|
+
exports.findTunnel = findTunnel;
|
|
8
|
+
exports.createQuickTunnel = createQuickTunnel;
|
|
9
|
+
exports.deleteQuickTunnel = deleteQuickTunnel;
|
|
5
10
|
exports.getSecret = getSecret;
|
|
6
11
|
exports.putSecret = putSecret;
|
|
7
12
|
const api_1 = require("@limrun/api");
|
|
@@ -20,19 +25,124 @@ function rethrow(err, context) {
|
|
|
20
25
|
* /v1/whoami nests inside `user`.
|
|
21
26
|
*/
|
|
22
27
|
async function whoAmI(client) {
|
|
23
|
-
|
|
28
|
+
const body = await fetchWhoAmI(client);
|
|
29
|
+
const organizationId = body.organization?.id ?? body.user?.defaultOrganization?.id;
|
|
30
|
+
if (!organizationId) {
|
|
31
|
+
throw new Error('The Limrun API did not report an organization for this API key.');
|
|
32
|
+
}
|
|
33
|
+
return organizationId;
|
|
34
|
+
}
|
|
35
|
+
async function fetchWhoAmI(client) {
|
|
24
36
|
try {
|
|
25
|
-
|
|
37
|
+
return await client.get('/v1/whoami');
|
|
26
38
|
}
|
|
27
39
|
catch (err) {
|
|
28
40
|
rethrow(err, 'Failed to resolve the organization');
|
|
29
41
|
}
|
|
30
|
-
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolves the organization an admin's credential acts for, to create a quick
|
|
45
|
+
* tunnel. It must be an organization key, so a user token's default
|
|
46
|
+
* organization does not count. A tunnel token belongs in --token: the backend
|
|
47
|
+
* accepts no signed token.
|
|
48
|
+
*/
|
|
49
|
+
async function quickTunnelOrganization(client) {
|
|
50
|
+
if ((client.apiKey ?? '').startsWith(SIGNED_TOKEN_PREFIX)) {
|
|
51
|
+
throw new Error('The API key is a signed token. Pass a tunnel token with --token or LIM_TUNNEL_TOKEN; the API key ' +
|
|
52
|
+
"is an admin's, for quick tunnels.");
|
|
53
|
+
}
|
|
54
|
+
const body = await fetchWhoAmI(client);
|
|
55
|
+
const organizationId = body.organization?.id;
|
|
31
56
|
if (!organizationId) {
|
|
32
|
-
throw new Error(
|
|
57
|
+
throw new Error("A quick tunnel needs an admin's organization key or login.");
|
|
33
58
|
}
|
|
34
59
|
return organizationId;
|
|
35
60
|
}
|
|
61
|
+
/** The tunnel a credential's scopes name, when its only scope connects one. */
|
|
62
|
+
function onlyTunnelOf(scopes) {
|
|
63
|
+
const [scope, ...rest] = Array.isArray(scopes) ? scopes : [];
|
|
64
|
+
const match = rest.length === 0 && typeof scope === 'string' ? /^tunnel:(tunnel_[0-9a-z]+):connect$/.exec(scope) : null;
|
|
65
|
+
return match?.[1];
|
|
66
|
+
}
|
|
67
|
+
const SIGNED_TOKEN_PREFIX = 'lim_st_';
|
|
68
|
+
/**
|
|
69
|
+
* Reads the organization and tunnel a tunnel token names, without verifying
|
|
70
|
+
* it; undefined when the token is no tunnel token. Its only scope is
|
|
71
|
+
* tunnel:<id>:connect.
|
|
72
|
+
*/
|
|
73
|
+
function tunnelTokenClaims(token) {
|
|
74
|
+
const payload = token.slice(SIGNED_TOKEN_PREFIX.length).split('.')[1];
|
|
75
|
+
if (!token.startsWith(SIGNED_TOKEN_PREFIX) || !payload) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
let claims;
|
|
79
|
+
try {
|
|
80
|
+
claims = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
if (typeof claims !== 'object' || claims === null) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const { sub, scopes } = claims;
|
|
89
|
+
const tunnelId = onlyTunnelOf(scopes);
|
|
90
|
+
if (!tunnelId || typeof sub !== 'string' || sub === '') {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
return { organizationId: sub, tunnelId };
|
|
94
|
+
}
|
|
95
|
+
function tunnelsPath(organizationId) {
|
|
96
|
+
return `/v1/organizations/${encodeURIComponent(organizationId)}/tunnels`;
|
|
97
|
+
}
|
|
98
|
+
/** Finds an organization's tunnel by the name instances use. */
|
|
99
|
+
async function findTunnel(client, organizationId, name) {
|
|
100
|
+
let body;
|
|
101
|
+
try {
|
|
102
|
+
body = await client.get(tunnelsPath(organizationId));
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
rethrow(err, 'Failed to list tunnels');
|
|
106
|
+
}
|
|
107
|
+
return body.tunnels?.find((tunnel) => tunnel.name === name);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Creates a quick tunnel that goes away when its connector does, with the
|
|
111
|
+
* token the connector runs it with: only tunnel tokens connect. The token
|
|
112
|
+
* goes with the tunnel, so it lasts a month, the shortest the API takes.
|
|
113
|
+
*/
|
|
114
|
+
async function createQuickTunnel(client, organizationId, name, selectors) {
|
|
115
|
+
let body;
|
|
116
|
+
try {
|
|
117
|
+
body = await client.post(tunnelsPath(organizationId), {
|
|
118
|
+
body: { name, selectors, ephemeral: true, token: { expirationMonths: 1 } },
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
rethrow(err, `Failed to create tunnel ${name}`);
|
|
123
|
+
}
|
|
124
|
+
if (!body.token?.token) {
|
|
125
|
+
// Nothing can run a tunnel without its token, so it goes at once.
|
|
126
|
+
await deleteQuickTunnel(client, organizationId, body.tunnel.id).catch(() => { });
|
|
127
|
+
throw new Error(`Limrun created tunnel ${name} but returned no token to run it with.`);
|
|
128
|
+
}
|
|
129
|
+
return { tunnel: body.tunnel, token: body.token.token };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Deletes a quick tunnel this CLI created. The hub deletes it when its
|
|
133
|
+
* connector says bye, so a missing tunnel is the normal case.
|
|
134
|
+
*/
|
|
135
|
+
async function deleteQuickTunnel(client, organizationId, tunnelId) {
|
|
136
|
+
try {
|
|
137
|
+
await client.delete(`${tunnelsPath(organizationId)}/${encodeURIComponent(tunnelId)}`);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (err instanceof api_1.NotFoundError) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
rethrow(err, `Failed to delete tunnel ${tunnelId}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
36
146
|
function secretPath(organizationId, secretType, secretName) {
|
|
37
147
|
return `/v1/organizations/${encodeURIComponent(organizationId)}/secrets/${encodeURIComponent(secretType)}/${encodeURIComponent(secretName)}`;
|
|
38
148
|
}
|
package/dist/lib/backend.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/lib/backend.ts"],"names":[],"mappings":";;;AAiCA,
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/lib/backend.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/backend.test.js
CHANGED
|
@@ -56,6 +56,81 @@ describe('backend client', () => {
|
|
|
56
56
|
auth: new Headers(init?.headers).get('authorization'),
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
|
+
describe('tunnels', () => {
|
|
60
|
+
// A signed token's header and signature do not matter here; only the
|
|
61
|
+
// payload's claims are read.
|
|
62
|
+
function signedToken(claims) {
|
|
63
|
+
return `lim_st_eyJhbGciOiJFZERTQSJ9.${Buffer.from(JSON.stringify(claims)).toString('base64url')}.c2ln`;
|
|
64
|
+
}
|
|
65
|
+
it('reads the organization and tunnel a tunnel token names', () => {
|
|
66
|
+
expect((0, backend_1.tunnelTokenClaims)(signedToken({ sub: 'org_1', scopes: ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect'] }))).toEqual({ organizationId: 'org_1', tunnelId: 'tunnel_01h455vb4pex5vsknk084sn02q' });
|
|
67
|
+
});
|
|
68
|
+
it.each([
|
|
69
|
+
['a payload that is null', null],
|
|
70
|
+
['an instance token', { sub: 'org_1', scopes: ['ios:ios_euna_x:all'] }],
|
|
71
|
+
['a token for every tunnel', { sub: 'org_1', scopes: ['tunnel:*:connect'] }],
|
|
72
|
+
[
|
|
73
|
+
'a token with more than its tunnel',
|
|
74
|
+
{ sub: 'org_1', scopes: ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect', 'ios:*:read'] },
|
|
75
|
+
],
|
|
76
|
+
])('reads no tunnel from %s', (_, claims) => {
|
|
77
|
+
expect((0, backend_1.tunnelTokenClaims)(signedToken(claims))).toBeUndefined();
|
|
78
|
+
});
|
|
79
|
+
it("asks whoami for the organization of an admin's key", async () => {
|
|
80
|
+
fetchMock.mockResolvedValue(mockResponse(200, { organization: { id: 'org_1' } }));
|
|
81
|
+
await expect((0, backend_1.quickTunnelOrganization)(client)).resolves.toBe('org_1');
|
|
82
|
+
});
|
|
83
|
+
it('refuses a signed token as the API key, without a call', async () => {
|
|
84
|
+
const tokenClient = new api_1.default({
|
|
85
|
+
apiKey: signedToken({ sub: 'org_1', scopes: ['tunnel:tunnel_01h455vb4pex5vsknk084sn02q:connect'] }),
|
|
86
|
+
baseURL: apiEndpoint,
|
|
87
|
+
maxRetries: 0,
|
|
88
|
+
});
|
|
89
|
+
await expect((0, backend_1.quickTunnelOrganization)(tokenClient)).rejects.toThrow('--token or LIM_TUNNEL_TOKEN');
|
|
90
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
it('finds a tunnel by name and creates a quick one', async () => {
|
|
93
|
+
fetchMock.mockResolvedValueOnce(mockResponse(200, { tunnels: [{ id: 'tunnel_1', name: 'staging', ephemeral: false }] }));
|
|
94
|
+
await expect((0, backend_1.findTunnel)(client, 'org_1', 'staging')).resolves.toEqual({
|
|
95
|
+
id: 'tunnel_1',
|
|
96
|
+
name: 'staging',
|
|
97
|
+
ephemeral: false,
|
|
98
|
+
});
|
|
99
|
+
expect(requestOf(fetchMock.mock.calls[0]).url).toBe(`${apiEndpoint}/v1/organizations/org_1/tunnels`);
|
|
100
|
+
fetchMock.mockResolvedValueOnce(mockResponse(201, {
|
|
101
|
+
tunnel: { id: 'tunnel_2', name: 'scratch', ephemeral: true },
|
|
102
|
+
token: { token: 'lim_st_quick', expiresAt: '2026-11-09T00:00:00Z' },
|
|
103
|
+
}));
|
|
104
|
+
await expect((0, backend_1.createQuickTunnel)(client, 'org_1', 'scratch', ['localhost:3000'])).resolves.toEqual({
|
|
105
|
+
tunnel: { id: 'tunnel_2', name: 'scratch', ephemeral: true },
|
|
106
|
+
token: 'lim_st_quick',
|
|
107
|
+
});
|
|
108
|
+
const [, init] = fetchMock.mock.calls[1];
|
|
109
|
+
expect(JSON.parse(String(init.body))).toEqual({
|
|
110
|
+
name: 'scratch',
|
|
111
|
+
selectors: ['localhost:3000'],
|
|
112
|
+
ephemeral: true,
|
|
113
|
+
token: { expirationMonths: 1 },
|
|
114
|
+
});
|
|
115
|
+
// Without its token the tunnel could not run, so the create fails and
|
|
116
|
+
// the tunnel goes at once.
|
|
117
|
+
fetchMock.mockResolvedValueOnce(mockResponse(201, { tunnel: { id: 'tunnel_3', name: 'other', ephemeral: true } }));
|
|
118
|
+
fetchMock.mockResolvedValueOnce(new Response(null, { status: 204 }));
|
|
119
|
+
await expect((0, backend_1.createQuickTunnel)(client, 'org_1', 'other', ['localhost:3000'])).rejects.toThrow('returned no token');
|
|
120
|
+
const [deleteURL, deleteInit] = fetchMock.mock.calls[3];
|
|
121
|
+
expect(deleteURL).toBe(`${apiEndpoint}/v1/organizations/org_1/tunnels/tunnel_3`);
|
|
122
|
+
expect(deleteInit.method).toBe('DELETE');
|
|
123
|
+
});
|
|
124
|
+
it('deletes a quick tunnel by ID, and a tunnel the hub already removed is fine', async () => {
|
|
125
|
+
fetchMock.mockResolvedValueOnce(new Response(null, { status: 204 }));
|
|
126
|
+
await (0, backend_1.deleteQuickTunnel)(client, 'org_1', 'tunnel_2');
|
|
127
|
+
const [url, init] = fetchMock.mock.calls[0];
|
|
128
|
+
expect(url).toBe(`${apiEndpoint}/v1/organizations/org_1/tunnels/tunnel_2`);
|
|
129
|
+
expect(init.method).toBe('DELETE');
|
|
130
|
+
fetchMock.mockResolvedValueOnce(mockResponse(404, { message: 'tunnel not found' }));
|
|
131
|
+
await expect((0, backend_1.deleteQuickTunnel)(client, 'org_1', 'tunnel_2')).resolves.toBeUndefined();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
59
134
|
describe('whoAmI', () => {
|
|
60
135
|
it('resolves the organization for org tokens with the bearer key', async () => {
|
|
61
136
|
fetchMock.mockResolvedValue(mockResponse(200, { type: 'organization', organization: { id: 'org_1' } }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.test.js","sourceRoot":"","sources":["../../src/lib/backend.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAA0D;AAE1D,
|
|
1
|
+
{"version":3,"file":"backend.test.js","sourceRoot":"","sources":["../../src/lib/backend.test.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/tunnel-run.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { TunnelConnectorEvent } from '@limrun/api';
|
|
2
|
-
/**
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* One human-readable log line per connector event. name is undefined until
|
|
4
|
+
* the first active, for a connector started with a tunnel token alone.
|
|
5
|
+
*/
|
|
6
|
+
export declare function formatTunnelConnectorEvent(name: string | undefined, event: TunnelConnectorEvent, ephemeral?: boolean): string;
|
|
4
7
|
//# sourceMappingURL=tunnel-run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-run.d.ts","sourceRoot":"","sources":["../../src/lib/tunnel-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD
|
|
1
|
+
{"version":3,"file":"tunnel-run.d.ts","sourceRoot":"","sources":["../../src/lib/tunnel-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,oBAAoB,EAC3B,SAAS,UAAQ,GAChB,MAAM,CAoCR"}
|
package/dist/lib/tunnel-run.js
CHANGED
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.formatTunnelConnectorEvent = formatTunnelConnectorEvent;
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* One human-readable log line per connector event. name is undefined until
|
|
6
|
+
* the first active, for a connector started with a tunnel token alone.
|
|
7
|
+
*/
|
|
8
|
+
function formatTunnelConnectorEvent(name, event, ephemeral = false) {
|
|
9
|
+
const tunnel = name ? `tunnel ${name}` : 'the tunnel';
|
|
6
10
|
switch (event.type) {
|
|
7
11
|
case 'active':
|
|
8
|
-
return `Tunnel ${name} is active. Instances created with --tunnel ${name} attach here;
|
|
12
|
+
return (`Tunnel ${event.name} is active. Instances created with --tunnel ${event.name} attach here; ` +
|
|
13
|
+
`press Ctrl+C to stop.` +
|
|
14
|
+
(ephemeral ? ' It is a quick tunnel and goes away when this connector exits.' : ''));
|
|
15
|
+
case 'tokenExpiring':
|
|
16
|
+
// A quick tunnel's token goes with it, so a restart brings a new one.
|
|
17
|
+
return ephemeral ?
|
|
18
|
+
`The token of quick ${tunnel} expires at ${event.expiresAt}. Restart the connector to get a new one.`
|
|
19
|
+
: `The token this connector runs with expires at ${event.expiresAt}. Rotate the token of ${tunnel} ` +
|
|
20
|
+
'in the console (Network) and restart the connector with the new one.';
|
|
9
21
|
case 'standby':
|
|
10
|
-
return (`Standby: ${event.holder.hostname} holds
|
|
22
|
+
return (`Standby: ${event.holder.hostname} holds ${tunnel}` +
|
|
11
23
|
(event.holder.since ? ` since ${event.holder.since}. ` : '. ') +
|
|
12
|
-
'Waiting for it to go away; use --replace to take
|
|
24
|
+
'Waiting for it to go away; use --replace to take it over.');
|
|
13
25
|
case 'attached':
|
|
14
26
|
return `Attached ${event.instanceId} (tunnel ${event.tunnelId}).`;
|
|
15
27
|
case 'detached':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-run.js","sourceRoot":"","sources":["../../src/lib/tunnel-run.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"tunnel-run.js","sourceRoot":"","sources":["../../src/lib/tunnel-run.ts"],"names":[],"mappings":";;AAMA,gEAwCC;AA5CD;;;GAGG;AACH,SAAgB,0BAA0B,CACxC,IAAwB,EACxB,KAA2B,EAC3B,SAAS,GAAG,KAAK;IAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IACtD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,CACL,UAAU,KAAK,CAAC,IAAI,+CAA+C,KAAK,CAAC,IAAI,gBAAgB;gBAC7F,uBAAuB;gBACvB,CAAC,SAAS,CAAC,CAAC,CAAC,gEAAgE,CAAC,CAAC,CAAC,EAAE,CAAC,CACpF,CAAC;QACJ,KAAK,eAAe;YAClB,sEAAsE;YACtE,OAAO,SAAS,CAAC,CAAC;gBACd,sBAAsB,MAAM,eAAe,KAAK,CAAC,SAAS,2CAA2C;gBACvG,CAAC,CAAC,iDAAiD,KAAK,CAAC,SAAS,yBAAyB,MAAM,GAAG;oBAChG,sEAAsE,CAAC;QAC/E,KAAK,SAAS;YACZ,OAAO,CACL,YAAY,KAAK,CAAC,MAAM,CAAC,QAAQ,UAAU,MAAM,EAAE;gBACnD,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9D,2DAA2D,CAC5D,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,YAAY,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC,QAAQ,IAAI,CAAC;QACpE,KAAK,UAAU;YACb,OAAO,YAAY,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;QAC1D,KAAK,QAAQ;YACX,OAAO,SAAS,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;QAC1G,KAAK,cAAc;YACjB,OAAO,oBAAoB,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;QACnF,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YACtD,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC;gBACrB,YAAY,KAAK,CAAC,UAAU,OAAO,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG;gBAC9D,CAAC,CAAC,6BAA6B,KAAK,KAAK,KAAK,CAAC,MAAM,0CAA0C,CAAC;QACpG,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lim",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.42.0",
|
|
4
4
|
"description": "Use remote XCode, Gradle, iOS Simulator, Android Emulator and more to build and test apps from Linux, Windows or macOS.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"lim": "./bin/run.js"
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"test": "jest"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@limrun/api": "0.
|
|
28
|
+
"@limrun/api": "0.62.0",
|
|
29
29
|
"@oclif/core": "^4",
|
|
30
30
|
"cli-progress": "^3.12.0",
|
|
31
31
|
"cli-table3": "^0.6.5",
|