lim 0.53.0 → 0.53.1

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 (135) hide show
  1. package/JSON_OUTPUT.md +17 -0
  2. package/README.md +48 -1
  3. package/dist/base-command.d.ts +2 -0
  4. package/dist/base-command.d.ts.map +1 -1
  5. package/dist/base-command.js +10 -1
  6. package/dist/base-command.js.map +1 -1
  7. package/dist/commands/android/adb-shell.d.ts +1 -0
  8. package/dist/commands/android/adb-shell.d.ts.map +1 -1
  9. package/dist/commands/android/adb-shell.js +6 -1
  10. package/dist/commands/android/adb-shell.js.map +1 -1
  11. package/dist/commands/android/create.d.ts +1 -0
  12. package/dist/commands/android/create.d.ts.map +1 -1
  13. package/dist/commands/android/create.js +7 -1
  14. package/dist/commands/android/create.js.map +1 -1
  15. package/dist/commands/android/set/env-from-secret.d.ts +3 -0
  16. package/dist/commands/android/set/env-from-secret.d.ts.map +1 -0
  17. package/dist/commands/android/set/env-from-secret.js +5 -0
  18. package/dist/commands/android/set/env-from-secret.js.map +1 -0
  19. package/dist/commands/gradle/build.d.ts +2 -0
  20. package/dist/commands/gradle/build.d.ts.map +1 -1
  21. package/dist/commands/gradle/build.js +8 -0
  22. package/dist/commands/gradle/build.js.map +1 -1
  23. package/dist/commands/gradle/create.d.ts +2 -0
  24. package/dist/commands/gradle/create.d.ts.map +1 -1
  25. package/dist/commands/gradle/create.js +6 -0
  26. package/dist/commands/gradle/create.js.map +1 -1
  27. package/dist/commands/gradle/set/env-from-secret.d.ts +3 -0
  28. package/dist/commands/gradle/set/env-from-secret.d.ts.map +1 -0
  29. package/dist/commands/gradle/set/env-from-secret.js +5 -0
  30. package/dist/commands/gradle/set/env-from-secret.js.map +1 -0
  31. package/dist/commands/gradle/set/file-from-secret.d.ts +3 -0
  32. package/dist/commands/gradle/set/file-from-secret.d.ts.map +1 -0
  33. package/dist/commands/gradle/set/file-from-secret.js +5 -0
  34. package/dist/commands/gradle/set/file-from-secret.js.map +1 -0
  35. package/dist/commands/ios/create.d.ts +1 -0
  36. package/dist/commands/ios/create.d.ts.map +1 -1
  37. package/dist/commands/ios/create.js +8 -1
  38. package/dist/commands/ios/create.js.map +1 -1
  39. package/dist/commands/ios/launch-app.d.ts +1 -0
  40. package/dist/commands/ios/launch-app.d.ts.map +1 -1
  41. package/dist/commands/ios/launch-app.js +7 -1
  42. package/dist/commands/ios/launch-app.js.map +1 -1
  43. package/dist/commands/ios/launch-app.test.js +24 -2
  44. package/dist/commands/ios/launch-app.test.js.map +1 -1
  45. package/dist/commands/ios/set/env-from-secret.d.ts +3 -0
  46. package/dist/commands/ios/set/env-from-secret.d.ts.map +1 -0
  47. package/dist/commands/ios/set/env-from-secret.js +5 -0
  48. package/dist/commands/ios/set/env-from-secret.js.map +1 -0
  49. package/dist/commands/ios/simctl.d.ts +1 -0
  50. package/dist/commands/ios/simctl.d.ts.map +1 -1
  51. package/dist/commands/ios/simctl.js +9 -1
  52. package/dist/commands/ios/simctl.js.map +1 -1
  53. package/dist/commands/secret/commands.test.d.ts +2 -0
  54. package/dist/commands/secret/commands.test.d.ts.map +1 -0
  55. package/dist/commands/secret/commands.test.js +137 -0
  56. package/dist/commands/secret/commands.test.js.map +1 -0
  57. package/dist/commands/secret/create.d.ts +19 -0
  58. package/dist/commands/secret/create.d.ts.map +1 -0
  59. package/dist/commands/secret/create.js +32 -0
  60. package/dist/commands/secret/create.js.map +1 -0
  61. package/dist/commands/secret/delete.d.ts +16 -0
  62. package/dist/commands/secret/delete.d.ts.map +1 -0
  63. package/dist/commands/secret/delete.js +22 -0
  64. package/dist/commands/secret/delete.js.map +1 -0
  65. package/dist/commands/secret/get.d.ts +20 -0
  66. package/dist/commands/secret/get.d.ts.map +1 -0
  67. package/dist/commands/secret/get.js +33 -0
  68. package/dist/commands/secret/get.js.map +1 -0
  69. package/dist/commands/secret/read.d.ts +18 -0
  70. package/dist/commands/secret/read.d.ts.map +1 -0
  71. package/dist/commands/secret/read.js +42 -0
  72. package/dist/commands/secret/read.js.map +1 -0
  73. package/dist/commands/secret/update.d.ts +17 -0
  74. package/dist/commands/secret/update.d.ts.map +1 -0
  75. package/dist/commands/secret/update.js +26 -0
  76. package/dist/commands/secret/update.js.map +1 -0
  77. package/dist/commands/secret/write.d.ts +20 -0
  78. package/dist/commands/secret/write.d.ts.map +1 -0
  79. package/dist/commands/secret/write.js +50 -0
  80. package/dist/commands/secret/write.js.map +1 -0
  81. package/dist/commands/xcode/build.d.ts +2 -0
  82. package/dist/commands/xcode/build.d.ts.map +1 -1
  83. package/dist/commands/xcode/build.js +10 -1
  84. package/dist/commands/xcode/build.js.map +1 -1
  85. package/dist/commands/xcode/create.d.ts +2 -0
  86. package/dist/commands/xcode/create.d.ts.map +1 -1
  87. package/dist/commands/xcode/create.js +6 -0
  88. package/dist/commands/xcode/create.js.map +1 -1
  89. package/dist/commands/xcode/set/env-from-secret.d.ts +3 -0
  90. package/dist/commands/xcode/set/env-from-secret.d.ts.map +1 -0
  91. package/dist/commands/xcode/set/env-from-secret.js +5 -0
  92. package/dist/commands/xcode/set/env-from-secret.js.map +1 -0
  93. package/dist/commands/xcode/set/file-from-secret.d.ts +3 -0
  94. package/dist/commands/xcode/set/file-from-secret.d.ts.map +1 -0
  95. package/dist/commands/xcode/set/file-from-secret.js +5 -0
  96. package/dist/commands/xcode/set/file-from-secret.js.map +1 -0
  97. package/dist/commands/xcode/test.d.ts +2 -0
  98. package/dist/commands/xcode/test.d.ts.map +1 -1
  99. package/dist/commands/xcode/test.js +9 -1
  100. package/dist/commands/xcode/test.js.map +1 -1
  101. package/dist/lib/build-run-command.d.ts.map +1 -1
  102. package/dist/lib/build-run-command.js +9 -0
  103. package/dist/lib/build-run-command.js.map +1 -1
  104. package/dist/lib/delegated-permissions.d.ts.map +1 -1
  105. package/dist/lib/delegated-permissions.js +7 -1
  106. package/dist/lib/delegated-permissions.js.map +1 -1
  107. package/dist/lib/launch-app-runtime.d.ts +4 -1
  108. package/dist/lib/launch-app-runtime.d.ts.map +1 -1
  109. package/dist/lib/launch-app-runtime.js +9 -2
  110. package/dist/lib/launch-app-runtime.js.map +1 -1
  111. package/dist/lib/secret-env-flags.d.ts +7 -0
  112. package/dist/lib/secret-env-flags.d.ts.map +1 -0
  113. package/dist/lib/secret-env-flags.js +19 -0
  114. package/dist/lib/secret-env-flags.js.map +1 -0
  115. package/dist/lib/secret-env.d.ts +7 -0
  116. package/dist/lib/secret-env.d.ts.map +1 -0
  117. package/dist/lib/secret-env.js +105 -0
  118. package/dist/lib/secret-env.js.map +1 -0
  119. package/dist/lib/secret-env.test.d.ts +2 -0
  120. package/dist/lib/secret-env.test.d.ts.map +1 -0
  121. package/dist/lib/secret-env.test.js +79 -0
  122. package/dist/lib/secret-env.test.js.map +1 -0
  123. package/dist/lib/secret-input.d.ts +5 -0
  124. package/dist/lib/secret-input.d.ts.map +1 -0
  125. package/dist/lib/secret-input.js +47 -0
  126. package/dist/lib/secret-input.js.map +1 -0
  127. package/dist/lib/set-secret-env-command.d.ts +3 -0
  128. package/dist/lib/set-secret-env-command.d.ts.map +1 -0
  129. package/dist/lib/set-secret-env-command.js +96 -0
  130. package/dist/lib/set-secret-env-command.js.map +1 -0
  131. package/dist/lib/set-secret-env-command.test.d.ts +2 -0
  132. package/dist/lib/set-secret-env-command.test.d.ts.map +1 -0
  133. package/dist/lib/set-secret-env-command.test.js +115 -0
  134. package/dist/lib/set-secret-env-command.test.js.map +1 -0
  135. package/package.json +2 -2
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSecretEnv = parseSecretEnv;
4
+ exports.secretReadPermissions = secretReadPermissions;
5
+ exports.permissionCovers = permissionCovers;
6
+ exports.parseSecretFiles = parseSecretFiles;
7
+ const secret_input_1 = require("./secret-input");
8
+ /** Parse names literally, including slashes and colons; never accept wildcard delegation here. */
9
+ function parseSecretEnv(entries) {
10
+ if (!entries?.length)
11
+ return undefined;
12
+ const result = Object.create(null);
13
+ for (const entry of entries) {
14
+ const index = entry.indexOf('=');
15
+ const key = entry.slice(0, index);
16
+ const name = entry.slice(index + 1);
17
+ if (index < 1 || !/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(key) || !name || /[*?\0\r\n]/.test(name)) {
18
+ throw new Error('Use --env-from-secret NAME=secret/name. Names must be literal, without * or ?.');
19
+ }
20
+ if (/^(DYLD_|LD_|LIMRUN_|SIMCTL_CHILD_|__DYLD_|__XPC_|XPC_DYLD_|SWIFT_DEBUG_)/i.test(key) ||
21
+ [
22
+ 'NODE_BINARY',
23
+ 'PATH',
24
+ 'HOME',
25
+ 'USER',
26
+ 'LOGNAME',
27
+ 'SHELL',
28
+ 'TMPDIR',
29
+ 'TMP',
30
+ 'TEMP',
31
+ 'DEVELOPER_DIR',
32
+ 'ANDROID_HOME',
33
+ 'ANDROID_SDK_ROOT',
34
+ ].includes(key)) {
35
+ throw new Error(`--env-from-secret cannot override managed variable ${key}.`);
36
+ }
37
+ if (Object.prototype.hasOwnProperty.call(result, key))
38
+ throw new Error(`Duplicate secret binding for ${key}.`);
39
+ result[key] =
40
+ /^secret_[0-7][0-9a-hjkmnp-tv-z]{25}$/.test(name) || name.startsWith('name/') ? name : `name/${name}`;
41
+ if (result[key] === 'name/' || result[key].length > 517)
42
+ throw new Error('Invalid secret name.');
43
+ }
44
+ if (Object.keys(result).length > 64)
45
+ throw new Error('At most 64 secret bindings are supported.');
46
+ return result;
47
+ }
48
+ function secretReadPermissions(bindings) {
49
+ return [...new Set(Object.values(bindings ?? {}).map((target) => `secret:${target}:read`))];
50
+ }
51
+ function permissionCovers(existing, requested) {
52
+ if (existing === requested)
53
+ return true;
54
+ const split = (value) => [
55
+ value.slice(0, value.indexOf(':')),
56
+ value.slice(value.indexOf(':') + 1, value.lastIndexOf(':')),
57
+ value.slice(value.lastIndexOf(':') + 1),
58
+ ];
59
+ const [resource, target, action] = split(existing);
60
+ const [wantedResource, wantedTarget, wantedAction] = split(requested);
61
+ if (resource !== wantedResource || (action !== 'all' && action !== wantedAction))
62
+ return false;
63
+ if (target === '*' || target === wantedTarget)
64
+ return true;
65
+ if (!target?.startsWith('name/') || !wantedTarget?.startsWith('name/'))
66
+ return false;
67
+ const pattern = target
68
+ .split('')
69
+ .map((c) => c === '*' ? '.*'
70
+ : c === '?' ? '.'
71
+ : c.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&'))
72
+ .join('');
73
+ return new RegExp(`^${pattern}$`, 's').test(wantedTarget);
74
+ }
75
+ /** Keep ~/ literal so it resolves against the remote workload home. */
76
+ function parseSecretFiles(entries) {
77
+ if (!entries?.length)
78
+ return undefined;
79
+ const result = Object.create(null);
80
+ for (const entry of entries) {
81
+ const i = entry.indexOf('=');
82
+ const rawDestination = entry.slice(0, i);
83
+ const destination = rawDestination.replace(/^\/+/, '');
84
+ const relative = rawDestination.startsWith('~/') ? destination.slice(2) : destination;
85
+ if (i < 1 ||
86
+ rawDestination.length > 1024 ||
87
+ relative.startsWith('/') ||
88
+ relative.startsWith('~') ||
89
+ /[\\\0\r\n]/.test(relative) ||
90
+ relative.split('/').some((p) => !p || p === '.' || p === '..'))
91
+ throw new Error("Use --file-from-secret '~/path=secret/name' or 'path=secret/name'; other paths are command-relative, ignoring leading /; quote ~/ to keep it remote.");
92
+ if (Object.prototype.hasOwnProperty.call(result, destination))
93
+ throw new Error('Duplicate secret file destination.');
94
+ try {
95
+ result[destination] = (0, secret_input_1.secretTarget)(entry.slice(i + 1));
96
+ }
97
+ catch {
98
+ throw new Error('--file-from-secret requires an exact secret ID or name without wildcards.');
99
+ }
100
+ }
101
+ if (Object.keys(result).length > 64)
102
+ throw new Error('At most 64 secret files are supported.');
103
+ return result;
104
+ }
105
+ //# sourceMappingURL=secret-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-env.js","sourceRoot":"","sources":["../../src/lib/secret-env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=secret-env.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-env.test.d.ts","sourceRoot":"","sources":["../../src/lib/secret-env.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const secret_env_1 = require("./secret-env");
4
+ const delegated_permissions_1 = require("./delegated-permissions");
5
+ test('literal names preserve slashes and colons, with exact read grants', () => {
6
+ const bindings = (0, secret_env_1.parseSecretEnv)([
7
+ 'NPM_TOKEN=team/npm:production',
8
+ 'PAT=name/github/private',
9
+ 'ID=secret_01m7071h5qfavacqmm4mg23x1k',
10
+ ]);
11
+ expect(bindings).toEqual({
12
+ NPM_TOKEN: 'name/team/npm:production',
13
+ PAT: 'name/github/private',
14
+ ID: 'secret_01m7071h5qfavacqmm4mg23x1k',
15
+ });
16
+ expect((0, secret_env_1.secretReadPermissions)(bindings)).toEqual([
17
+ 'secret:name/team/npm:production:read',
18
+ 'secret:name/github/private:read',
19
+ 'secret:secret_01m7071h5qfavacqmm4mg23x1k:read',
20
+ ]);
21
+ expect((0, delegated_permissions_1.delegatedPermissionsFromFlags)({
22
+ 'env-from-secret': ['NPM_TOKEN=team/npm'],
23
+ permission: ['asset:name/source:read'],
24
+ })).toEqual(['asset:name/source:read', 'secret:name/team/npm:read']);
25
+ });
26
+ test.each([
27
+ 'TOKEN=*',
28
+ 'TOKEN=team/?',
29
+ 'TOKEN=',
30
+ 'BAD-KEY=name',
31
+ 'PATH=path',
32
+ 'LIMRUN_WORKLOAD_IDENTITY_TOKEN_FILE=token',
33
+ 'TOKEN=name/',
34
+ ])('rejects invalid binding %s', (entry) => {
35
+ expect(() => (0, secret_env_1.parseSecretEnv)([entry])).toThrow();
36
+ });
37
+ test('rejects duplicate variables instead of silently granting the wrong secret', () => {
38
+ expect(() => (0, secret_env_1.parseSecretEnv)(['TOKEN=one', 'TOKEN=two'])).toThrow('Duplicate');
39
+ });
40
+ test('already-delegated wildcard permissions avoid unnecessary role updates', () => {
41
+ expect((0, secret_env_1.permissionCovers)('secret:*:read', 'secret:name/team/npm:read')).toBe(true);
42
+ expect((0, secret_env_1.permissionCovers)('secret:name/team/*:all', 'secret:name/team/npm:read')).toBe(true);
43
+ expect((0, secret_env_1.permissionCovers)('secret:name/team/*:write', 'secret:name/team/npm:read')).toBe(false);
44
+ expect((0, secret_env_1.permissionCovers)('asset:*:all', 'secret:name/team/npm:read')).toBe(false);
45
+ expect((0, secret_env_1.permissionCovers)('secret:name/team/a.b:read', 'secret:name/team/a+b:read')).toBe(false);
46
+ expect((0, secret_env_1.permissionCovers)('secret:name/team/npm:read', 'secret:name/team/npm:production:read')).toBe(false);
47
+ });
48
+ test('file bindings keep remote home paths and delegate exact secret names', () => {
49
+ expect((0, secret_env_1.parseSecretFiles)(['~/.npmrc=packages/npm:prod', 'config/token=team/service'])).toEqual({
50
+ '~/.npmrc': 'name/packages/npm:prod',
51
+ 'config/token': 'name/team/service',
52
+ });
53
+ expect((0, delegated_permissions_1.delegatedPermissionsFromFlags)({ 'file-from-secret': ['~/.npmrc=packages/npm'] })).toEqual([
54
+ 'secret:name/packages/npm:read',
55
+ ]);
56
+ });
57
+ test.each([
58
+ '/=key',
59
+ '/~/token=key',
60
+ '/../../token=key',
61
+ '../token=key',
62
+ '~/.config/../token=key',
63
+ '~/=key',
64
+ 'a//b=key',
65
+ '~/.npmrc=*',
66
+ ])('rejects unsafe secret file %s', (entry) => {
67
+ expect(() => (0, secret_env_1.parseSecretFiles)([entry])).toThrow();
68
+ });
69
+ test('secret files normalize leading slashes and reject duplicate aliases', () => {
70
+ expect((0, secret_env_1.parseSecretFiles)(['/etc/var=one', '~/.npmrc=two'])).toEqual({
71
+ 'etc/var': 'name/one',
72
+ '~/.npmrc': 'name/two',
73
+ });
74
+ expect(() => (0, secret_env_1.parseSecretFiles)(['/etc/var=one', 'etc/var=two'])).toThrow('Duplicate');
75
+ });
76
+ test.each(['*', '', 'name/'])('file binding errors name the file flag for target %s', (target) => {
77
+ expect(() => (0, secret_env_1.parseSecretFiles)([`~/.npmrc=${target}`])).toThrow('--file-from-secret');
78
+ });
79
+ //# sourceMappingURL=secret-env.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-env.test.js","sourceRoot":"","sources":["../../src/lib/secret-env.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function secretTarget(value: string): string;
2
+ /** Bound input before requesting a grant, including streams with unknown size. */
3
+ export declare function secretBytes(file?: string): Promise<Buffer>;
4
+ export declare function secretMetadata(value: string): Record<string, unknown>;
5
+ //# sourceMappingURL=secret-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-input.d.ts","sourceRoot":"","sources":["../../src/lib/secret-input.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED,kFAAkF;AAClF,wBAAsB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAchE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYrE"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.secretTarget = secretTarget;
4
+ exports.secretBytes = secretBytes;
5
+ exports.secretMetadata = secretMetadata;
6
+ const node_fs_1 = require("node:fs");
7
+ function secretTarget(value) {
8
+ if (!value || /[\0\r\n*?]/.test(value))
9
+ throw new Error('Use a secret ID or an exact name without wildcards.');
10
+ const target = /^secret_[0-7][0-9a-hjkmnp-tv-z]{25}$/.test(value) || value.startsWith('name/') ? value : `name/${value}`;
11
+ if (target === 'name/' || target.length > 517)
12
+ throw new Error('Invalid secret name.');
13
+ return target;
14
+ }
15
+ /** Bound input before requesting a grant, including streams with unknown size. */
16
+ async function secretBytes(file) {
17
+ if ((!file || file === '-') && process.stdin.isTTY)
18
+ throw new Error('Pipe the value on stdin or supply --file PATH.');
19
+ const input = file && file !== '-' ? (0, node_fs_1.createReadStream)(file) : process.stdin;
20
+ const chunks = [];
21
+ let length = 0;
22
+ for await (const chunk of input) {
23
+ const bytes = Buffer.from(chunk);
24
+ length += bytes.length;
25
+ if (length > 65536)
26
+ throw new Error('Secret values must be at most 64 KiB.');
27
+ chunks.push(bytes);
28
+ }
29
+ if (!length)
30
+ throw new Error('Secret values cannot be empty.');
31
+ return Buffer.concat(chunks);
32
+ }
33
+ function secretMetadata(value) {
34
+ let parsed;
35
+ try {
36
+ parsed = JSON.parse(value);
37
+ }
38
+ catch {
39
+ throw new Error('--metadata must be a JSON object.');
40
+ }
41
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
42
+ throw new Error('--metadata must be a JSON object.');
43
+ if (Buffer.byteLength(JSON.stringify(parsed)) > 16384)
44
+ throw new Error('Secret metadata must be at most 16 KiB.');
45
+ return parsed;
46
+ }
47
+ //# sourceMappingURL=secret-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-input.js","sourceRoot":"","sources":["../../src/lib/secret-input.ts"],"names":[],"mappings":";;AAEA,oCAOC;AAGD,kCAcC;AAED,wCAYC;AAxCD,qCAA2C;AAE3C,SAAgB,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,MAAM,MAAM,GACV,sCAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC;IAC5G,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kFAAkF;AAC3E,KAAK,UAAU,WAAW,CAAC,IAAa;IAC7C,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAChD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAA,0BAAgB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;QACvB,IAAI,MAAM,GAAG,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;QACnD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,OAAO,MAAiC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { BaseCommand } from '../base-command';
2
+ export declare function setSecretEnvCommand(platform: 'xcode' | 'gradle' | 'ios' | 'android', kind?: 'env' | 'file'): typeof BaseCommand;
3
+ //# sourceMappingURL=set-secret-env-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-secret-env-command.d.ts","sourceRoot":"","sources":["../../src/lib/set-secret-env-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,EAChD,IAAI,GAAE,KAAK,GAAG,MAAc,GAC3B,OAAO,WAAW,CAoGpB"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setSecretEnvCommand = setSecretEnvCommand;
4
+ const core_1 = require("@oclif/core");
5
+ const api_1 = require("@limrun/api");
6
+ const base_command_1 = require("../base-command");
7
+ const secret_env_1 = require("./secret-env");
8
+ function setSecretEnvCommand(platform, kind = 'env') {
9
+ var _a;
10
+ const field = kind === 'file' ? 'fileFromSecret' : 'envFromSecret';
11
+ const parse = kind === 'file' ? secret_env_1.parseSecretFiles : secret_env_1.parseSecretEnv;
12
+ return _a = class SetSecretEnv extends base_command_1.BaseCommand {
13
+ async run() {
14
+ const { argv, flags } = await this.parse(_a);
15
+ this.setParsedFlags(flags);
16
+ const additions = parse(argv) ?? {};
17
+ const remove = (flags.unset ?? []).map((key) => kind === 'file' ? Object.keys((0, secret_env_1.parseSecretFiles)([key + '=validation']))[0] : key);
18
+ if (!Object.keys(additions).length && !remove.length && !flags.clear)
19
+ this.error('Provide NAME=secret/name, --unset NAME, or --clear.');
20
+ for (const key of remove)
21
+ if (kind === 'env' && !/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(key))
22
+ this.error('Invalid --unset environment variable name.');
23
+ await this.withAuth(async () => {
24
+ const target = platform === 'xcode' ? await this.resolveXcodeTarget(flags.id)
25
+ : platform === 'gradle' ? this.resolveGradleTarget(flags.id)
26
+ : platform === 'ios' ? this.resolveIosInstance(flags.id)
27
+ : this.resolveAndroidInstance(flags.id);
28
+ const resources = {
29
+ xcode: this.client.xcodeInstances,
30
+ gradle: this.client.gradleInstances,
31
+ ios: this.client.iosInstances,
32
+ android: this.client.androidInstances,
33
+ };
34
+ const instances = resources[platform];
35
+ for (let attempt = 0; attempt < 3; attempt++) {
36
+ const { data: instance, response } = await instances.get(target.id).withResponse();
37
+ const etag = response.headers.get('etag');
38
+ const role = instance.spec.role;
39
+ if (!etag || !role || instance.status.state === 'terminated')
40
+ this.error('Select a live instance with an editable role.');
41
+ const bindings = {
42
+ ...(flags.clear ? {}
43
+ : kind === 'file' ?
44
+ (0, secret_env_1.parseSecretFiles)(Object.entries(('fileFromSecret' in instance.spec ? instance.spec.fileFromSecret : undefined) ?? {}).map(([key, target]) => `${key}=${target}`))
45
+ : instance.spec.envFromSecret),
46
+ };
47
+ for (const key of remove)
48
+ delete bindings[key];
49
+ Object.assign(bindings, additions);
50
+ if (Object.keys(bindings).length > 64)
51
+ this.error('At most 64 secret bindings are supported.');
52
+ const required = (0, secret_env_1.secretReadPermissions)(additions).filter((permission) => !role.permissions.some((granted) => (0, secret_env_1.permissionCovers)(granted, permission)));
53
+ try {
54
+ await instances.update(target.id, {
55
+ ifMatch: etag,
56
+ spec: {
57
+ [field]: bindings,
58
+ ...(required.length && {
59
+ role: { permissions: [...new Set([...role.permissions, ...required])] },
60
+ }),
61
+ },
62
+ });
63
+ this.outputResult({ instanceId: target.id, [field]: bindings }, `Updated secret ${kind} bindings on ${target.id}.`);
64
+ return;
65
+ }
66
+ catch (error) {
67
+ if (!(error instanceof api_1.APIError) || error.status !== 412 || attempt === 2)
68
+ throw error;
69
+ }
70
+ }
71
+ });
72
+ }
73
+ },
74
+ _a.summary = `Save secret-backed ${kind === 'file' ? 'files' : 'environment variables'} on the ${platform} instance`,
75
+ _a.description = (kind === 'file' ?
76
+ 'Use quoted remote paths, for example "~/.npmrc=packages/npmrc" or "~/.netrc=github/netrc", for private packages and Git repositories. Other paths, including those starting with /, resolve relative to the command working directory. Files are refreshed on the next command and kept for future commands; unset files are removed when the next command starts. '
77
+ : 'Environment bindings apply to subsequent commands. ') +
78
+ 'The workload fetches values using its delegated secret read permissions. Repeated bindings are merged; --unset removes one and --clear removes all before applying new bindings. Removing a binding preserves delegated permissions.',
79
+ _a.strict = false,
80
+ _a.examples = [
81
+ `<%= config.bin %> ${platform} set ${kind}-from-secret ${kind === 'file' ? "'~/.npmrc=packages/npmrc'" : 'NPM_TOKEN=my/secret'}`,
82
+ `<%= config.bin %> ${platform} set ${kind}-from-secret --unset ${kind === 'file' ? "'~/.npmrc'" : 'NPM_TOKEN'}`,
83
+ ],
84
+ _a.flags = {
85
+ ...base_command_1.BaseCommand.baseFlags,
86
+ id: core_1.Flags.string({ description: 'Instance ID. Defaults to the current target.' }),
87
+ unset: core_1.Flags.string({
88
+ description: 'Remove a saved binding by variable name or quoted remote file path.',
89
+ multiple: true,
90
+ multipleNonGreedy: true,
91
+ }),
92
+ clear: core_1.Flags.boolean({ description: 'Remove all saved bindings before applying new ones.' }),
93
+ },
94
+ _a;
95
+ }
96
+ //# sourceMappingURL=set-secret-env-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-secret-env-command.js","sourceRoot":"","sources":["../../src/lib/set-secret-env-command.ts"],"names":[],"mappings":";;AAKA,kDAuGC;AA5GD,sCAAoC;AACpC,qCAAuC;AACvC,kDAA8C;AAC9C,6CAAyG;AAEzG,SAAgB,mBAAmB,CACjC,QAAgD,EAChD,OAAuB,KAAK;;IAE5B,MAAM,KAAK,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,6BAAgB,CAAC,CAAC,CAAC,2BAAc,CAAC;IAClE,YAAO,MAAM,YAAa,SAAQ,0BAAW;YA4B3C,KAAK,CAAC,GAAG;gBACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAY,CAAC,CAAC;gBACvD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAgB,CAAC,IAAI,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7C,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAA,6BAAgB,EAAC,CAAC,GAAG,GAAG,aAAa,CAAC,CAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,CAClF,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK;oBAClE,IAAI,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACpE,KAAK,MAAM,GAAG,IAAI,MAAM;oBACtB,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,GAAG,CAAC;wBAC/D,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAC7D,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;oBAC7B,MAAM,MAAM,GACV,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC9D,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC5D,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gCACxD,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC1C,MAAM,SAAS,GAAG;wBAChB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;wBACjC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;wBACnC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;wBAC7B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;qBACtC,CAAC;oBACF,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;oBACtC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;wBAC7C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;wBACnF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;wBAChC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,YAAY;4BAC1D,IAAI,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;wBAC9D,MAAM,QAAQ,GAA2B;4BACvC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gCACpB,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;oCACjB,IAAA,6BAAgB,EACd,MAAM,CAAC,OAAO,CACZ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CACrF,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC,CAC7C;oCACH,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;yBAC/B,CAAC;wBACF,KAAK,MAAM,GAAG,IAAI,MAAM;4BAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAC/C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;wBACnC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,EAAE;4BAAE,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;wBAC/F,MAAM,QAAQ,GAAG,IAAA,kCAAqB,EAAC,SAAS,CAAC,CAAC,MAAM,CACtD,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,6BAAgB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAC3F,CAAC;wBACF,IAAI,CAAC;4BACH,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE;gCAChC,OAAO,EAAE,IAAI;gCACb,IAAI,EAAE;oCACJ,CAAC,KAAK,CAAC,EAAE,QAAQ;oCACjB,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI;wCACrB,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE;qCACxE,CAAC;iCACH;6BACF,CAAC,CAAC;4BACH,IAAI,CAAC,YAAY,CACf,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAC5C,kBAAkB,IAAI,gBAAgB,MAAM,CAAC,EAAE,GAAG,CACnD,CAAC;4BACF,OAAO;wBACT,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,IAAI,CAAC,CAAC,KAAK,YAAY,cAAQ,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC;gCAAE,MAAM,KAAK,CAAC;wBACzF,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QA/FQ,UAAO,GAAG,sBACf,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,uBAC9B,WAAW,QAAQ,WAAY;QACxB,cAAW,GAChB,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;YAChB,qWAAqW;YACvW,CAAC,CAAC,qDAAqD,CAAC;YACxD,sOAAuO;QAClO,SAAM,GAAG,KAAM;QACf,WAAQ,GAAG;YAChB,qBAAqB,QAAQ,QAAQ,IAAI,gBACvC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,qBAClD,EAAE;YACF,qBAAqB,QAAQ,QAAQ,IAAI,wBACvC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WACnC,EAAE;SACF;QACK,QAAK,GAAG;YACb,GAAG,0BAAW,CAAC,SAAS;YACxB,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;YACjF,KAAK,EAAE,YAAK,CAAC,MAAM,CAAC;gBAClB,WAAW,EAAE,qEAAqE;gBAClF,QAAQ,EAAE,IAAI;gBACd,iBAAiB,EAAE,IAAI;aACxB,CAAC;YACF,KAAK,EAAE,YAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;SAC5F;WAqEF;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=set-secret-env-command.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-secret-env-command.test.d.ts","sourceRoot":"","sources":["../../src/lib/set-secret-env-command.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const api_1 = require("@limrun/api");
4
+ const set_secret_env_command_1 = require("./set-secret-env-command");
5
+ test.each(['xcode', 'gradle', 'ios', 'android'])('%s saves bindings and permissions atomically, retrying ETag conflicts', async (platform) => {
6
+ const Command = (0, set_secret_env_command_1.setSecretEnvCommand)(platform);
7
+ const command = new Command([], {});
8
+ const id = 'instance';
9
+ const live = jest
10
+ .fn()
11
+ .mockResolvedValueOnce({
12
+ data: {
13
+ spec: { envFromSecret: { OLD: 'name/old' }, role: { permissions: ['asset:name/source:read'] } },
14
+ status: { state: 'ready' },
15
+ },
16
+ response: new Response(null, { headers: { etag: '"1"' } }),
17
+ })
18
+ .mockResolvedValueOnce({
19
+ data: {
20
+ spec: {
21
+ envFromSecret: { OLD: 'name/old', CONCURRENT: 'name/concurrent' },
22
+ role: { permissions: ['asset:name/source:read', 'secret:name/concurrent:read'] },
23
+ },
24
+ status: { state: 'ready' },
25
+ },
26
+ response: new Response(null, { headers: { etag: '"2"' } }),
27
+ });
28
+ const update = jest
29
+ .fn()
30
+ .mockRejectedValueOnce(api_1.APIError.generate(412, {}, 'changed', new Headers()))
31
+ .mockResolvedValue(undefined);
32
+ Object.assign(command, {
33
+ parse: async () => ({ argv: ['NPM_TOKEN=team/npm'], flags: { unset: ['OLD', 'NPM_TOKEN'] } }),
34
+ withAuth: async (fn) => fn(),
35
+ resolveXcodeTarget: async () => ({ id }),
36
+ resolveGradleTarget: () => ({ id }),
37
+ resolveIosInstance: () => ({ id }),
38
+ resolveAndroidInstance: () => ({ id }),
39
+ outputResult: jest.fn(),
40
+ });
41
+ Object.defineProperty(command, 'client', {
42
+ value: { [`${platform}Instances`]: { get: () => ({ withResponse: live }), update } },
43
+ });
44
+ await command.run();
45
+ expect(update).toHaveBeenLastCalledWith(id, {
46
+ ifMatch: '"2"',
47
+ spec: {
48
+ envFromSecret: { CONCURRENT: 'name/concurrent', NPM_TOKEN: 'name/team/npm' },
49
+ role: {
50
+ permissions: ['asset:name/source:read', 'secret:name/concurrent:read', 'secret:name/team/npm:read'],
51
+ },
52
+ },
53
+ });
54
+ });
55
+ test.each(['xcode', 'gradle'])('%s saves file bindings and permissions atomically, retrying ETag conflicts', async (platform) => {
56
+ const Command = (0, set_secret_env_command_1.setSecretEnvCommand)(platform, 'file');
57
+ const command = new Command([], {});
58
+ const id = 'instance';
59
+ const live = jest
60
+ .fn()
61
+ .mockResolvedValueOnce({
62
+ data: {
63
+ spec: {
64
+ fileFromSecret: { '/etc/old': 'name/old', 'config/token': 'name/previous' },
65
+ role: { permissions: ['asset:name/source:read'] },
66
+ },
67
+ status: { state: 'ready' },
68
+ },
69
+ response: new Response(null, { headers: { etag: '"1"' } }),
70
+ })
71
+ .mockResolvedValueOnce({
72
+ data: {
73
+ spec: {
74
+ fileFromSecret: {
75
+ '/etc/old': 'name/old',
76
+ 'config/token': 'name/previous',
77
+ '~/concurrent': 'name/concurrent',
78
+ },
79
+ role: { permissions: ['asset:name/source:read', 'secret:name/concurrent:read'] },
80
+ },
81
+ status: { state: 'ready' },
82
+ },
83
+ response: new Response(null, { headers: { etag: '"2"' } }),
84
+ });
85
+ const update = jest
86
+ .fn()
87
+ .mockRejectedValueOnce(api_1.APIError.generate(412, {}, 'changed', new Headers()))
88
+ .mockResolvedValue(undefined);
89
+ Object.assign(command, {
90
+ parse: async () => ({
91
+ argv: ['/config/token=team/npm'],
92
+ flags: { unset: ['etc/old', 'config/token'] },
93
+ }),
94
+ withAuth: async (fn) => fn(),
95
+ resolveXcodeTarget: async () => ({ id }),
96
+ resolveGradleTarget: () => ({ id }),
97
+ resolveIosInstance: () => ({ id }),
98
+ resolveAndroidInstance: () => ({ id }),
99
+ outputResult: jest.fn(),
100
+ });
101
+ Object.defineProperty(command, 'client', {
102
+ value: { [`${platform}Instances`]: { get: () => ({ withResponse: live }), update } },
103
+ });
104
+ await command.run();
105
+ expect(update).toHaveBeenLastCalledWith(id, {
106
+ ifMatch: '"2"',
107
+ spec: {
108
+ fileFromSecret: { '~/concurrent': 'name/concurrent', 'config/token': 'name/team/npm' },
109
+ role: {
110
+ permissions: ['asset:name/source:read', 'secret:name/concurrent:read', 'secret:name/team/npm:read'],
111
+ },
112
+ },
113
+ });
114
+ });
115
+ //# sourceMappingURL=set-secret-env-command.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-secret-env-command.test.js","sourceRoot":"","sources":["../../src/lib/set-secret-env-command.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lim",
3
- "version": "0.53.0",
3
+ "version": "0.53.1",
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",
@@ -26,7 +26,7 @@
26
26
  "test": "jest"
27
27
  },
28
28
  "dependencies": {
29
- "@limrun/api": "0.70.1",
29
+ "@limrun/api": "0.70.2",
30
30
  "@oclif/core": "^4",
31
31
  "cli-progress": "^3.12.0",
32
32
  "cli-table3": "^0.6.5",