@seamapi/cli 0.14.0 → 0.15.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/README.md CHANGED
@@ -179,6 +179,46 @@ Missing required parameter for /locks/unlock_door: --device-id
179
179
  An error exits non-zero. A request that fails reports its `error` on stdout,
180
180
  so it can be inspected from a pipe; anything else is written to stderr only.
181
181
 
182
+ ### Environment variables
183
+
184
+ Everything `seam login`, `seam select workspace`, and `seam select server`
185
+ store may be given in the environment instead:
186
+
187
+ - `SEAM_CLI_TOKEN`: a Personal Access Token or API Key,
188
+ - `SEAM_CLI_WORKSPACE_ID`: the workspace requests are made against,
189
+ - `SEAM_CLI_ENDPOINT`: the Seam API server requests are made to.
190
+
191
+ Any of them, all of them, or none of them may be set. Each one wins over the
192
+ corresponding stored value, which makes them useful for CI, for a single
193
+ command, or for working against another workspace in one shell.
194
+
195
+ ```bash
196
+ # One command against another workspace
197
+ SEAM_CLI_WORKSPACE_ID=$OTHER_WORKSPACE seam devices list
198
+
199
+ # No login needed: authenticate from the environment
200
+ export SEAM_CLI_TOKEN=$SEAM_API_KEY
201
+ seam devices list
202
+
203
+ # Work against a local Seam Connect instance
204
+ SEAM_CLI_ENDPOINT=http://localhost:3020 seam devices list
205
+ ```
206
+
207
+ An API Key is scoped to a single workspace, so it needs no workspace id. A
208
+ Personal Access Token works across workspaces, so it needs one from either
209
+ `SEAM_CLI_WORKSPACE_ID` or `seam select workspace`.
210
+
211
+ The command that would store an overridden value fails rather than storing
212
+ something the environment ignores: `seam login` and `seam logout` while
213
+ `SEAM_CLI_TOKEN` is set, `seam select workspace` while
214
+ `SEAM_CLI_WORKSPACE_ID` is set, and `seam select server` while
215
+ `SEAM_CLI_ENDPOINT` is set. Unset the variable to use those commands.
216
+
217
+ ```bash
218
+ $ SEAM_CLI_TOKEN=$SEAM_API_KEY seam login
219
+ Cannot log in while SEAM_CLI_TOKEN is set: it overrides what would be stored. Unset SEAM_CLI_TOKEN to log in.
220
+ ```
221
+
182
222
  ## Help
183
223
 
184
224
  Pass `--help` to any command to see what it accepts. Without a command, it
package/bin/cli.js CHANGED
@@ -5,8 +5,10 @@ import chalk from 'chalk';
5
5
  import { findLocalCommand, getCommandSpec } from '../lib/command-spec.js';
6
6
  import { completionShells, isCompletionShell, renderCompletion, } from '../lib/completion/index.js';
7
7
  import { getConfigStore } from '../lib/config/index.js';
8
+ import { assertEnvVarUnset, endpointEnvVar, EnvVarOverrideError, getEndpointFromEnv, getTokenFromEnv, getWorkspaceIdFromEnv, tokenEnvVar, workspaceIdEnvVar, } from '../lib/env.js';
8
9
  import { getApiBlueprint } from '../lib/get-api-blueprint.js';
9
10
  import { getCommandBlueprintDef } from '../lib/get-command-blueprint-def.js';
11
+ import { getToken } from '../lib/get-credentials.js';
10
12
  import { getResponseKey } from '../lib/get-response-key.js';
11
13
  import { getServer } from '../lib/get-server.js';
12
14
  import { interactForActionAttemptPoll } from '../lib/interact-for-action-attempt-poll.js';
@@ -96,6 +98,8 @@ async function cli(args) {
96
98
  if (args._[0] === 'config' &&
97
99
  args._[1] === 'set' &&
98
100
  args._[2] === 'fake-server') {
101
+ assertEnvVarUnset(endpointEnvVar, getEndpointFromEnv(), 'select a server');
102
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log in');
99
103
  const randomstring = randomBytes(5).toString('hex');
100
104
  const fakeApiUrl = `https://${randomstring}.fakeseamconnect.seam.vc`;
101
105
  config.set('server', fakeApiUrl);
@@ -104,10 +108,10 @@ async function cli(args) {
104
108
  output.info(`PAT set to use fakeseamconnect with "seam_apikey1_token"`);
105
109
  return;
106
110
  }
107
- if (!config.get(`${getServer()}.pat`) &&
111
+ if (getToken() == null &&
108
112
  args._[0] !== 'login' &&
109
113
  !isEqual(args._, ['select', 'server'])) {
110
- output.error(`Not logged in. Please run "seam login"`);
114
+ output.error(`Not logged in. Please run "seam login" or set ${tokenEnvVar}`);
111
115
  process.exitCode = 1;
112
116
  return;
113
117
  }
@@ -136,6 +140,15 @@ async function cli(args) {
136
140
  // is reported rather than half applied.
137
141
  assertKnownArgs(argParams, selectedCommand, ctx);
138
142
  if (isEqual(selectedCommand, ['login'])) {
143
+ // Nothing is stored while the environment overrides it, so refuse before
144
+ // storing anything rather than part way through.
145
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log in');
146
+ if (args['server']) {
147
+ assertEnvVarUnset(endpointEnvVar, getEndpointFromEnv(), 'select a server');
148
+ }
149
+ if (args['workspace_id']) {
150
+ assertEnvVarUnset(workspaceIdEnvVar, getWorkspaceIdFromEnv(), 'select a workspace');
151
+ }
139
152
  if (args['server']) {
140
153
  config.set('server', args['server']);
141
154
  config.delete('current_workspace_id');
@@ -159,6 +172,7 @@ async function cli(args) {
159
172
  return;
160
173
  }
161
174
  else if (isEqual(selectedCommand, ['logout'])) {
175
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log out');
162
176
  config.delete('pat');
163
177
  output.info('Logged out!');
164
178
  return;
@@ -175,6 +189,7 @@ async function cli(args) {
175
189
  return;
176
190
  }
177
191
  else if (isEqual(selectedCommand, ['select', 'workspace'])) {
192
+ assertEnvVarUnset(workspaceIdEnvVar, getWorkspaceIdFromEnv(), 'select a workspace');
178
193
  if (isNonInteractive) {
179
194
  throw new NonInteractiveError('Cannot select a workspace in non-interactive mode: pass --workspace-id to "seam login"');
180
195
  }
@@ -189,6 +204,7 @@ async function cli(args) {
189
204
  }
190
205
  }
191
206
  else if (isEqual(selectedCommand, ['select', 'server'])) {
207
+ assertEnvVarUnset(endpointEnvVar, getEndpointFromEnv(), 'select a server');
192
208
  if (args['server']) {
193
209
  config.set('server', args['server']);
194
210
  config.delete('current_workspace_id');
@@ -316,7 +332,7 @@ run(process.argv.slice(2)).catch((e) => {
316
332
  output.error(e.hint);
317
333
  return;
318
334
  }
319
- if (e instanceof NonInteractiveError) {
335
+ if (e instanceof NonInteractiveError || e instanceof EnvVarOverrideError) {
320
336
  output.error(chalk.red(e.message));
321
337
  return;
322
338
  }
package/bin/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/bin/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/bin/cli.ts"],"names":[],"mappings":"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"}
package/lib/env.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Credentials and the server may be given in the environment.
3
+ *
4
+ * Each variable overrides the corresponding stored value for as long as it
5
+ * is set, so any of them may be used per command or per shell. Commands that
6
+ * would store an overridden value fail instead: see {@link assertEnvVarUnset}.
7
+ */
8
+ /** Overrides the token stored by `seam login`. */
9
+ export declare const tokenEnvVar = "SEAM_CLI_TOKEN";
10
+ /** Overrides the workspace stored by `seam select workspace`. */
11
+ export declare const workspaceIdEnvVar = "SEAM_CLI_WORKSPACE_ID";
12
+ /** Overrides the server stored by `seam select server`. */
13
+ export declare const endpointEnvVar = "SEAM_CLI_ENDPOINT";
14
+ export declare const getTokenFromEnv: () => string | null;
15
+ export declare const getWorkspaceIdFromEnv: () => string | null;
16
+ export declare const getEndpointFromEnv: () => string | null;
17
+ /** Reported without a stack trace: the environment is at fault, not the CLI. */
18
+ export declare class EnvVarOverrideError extends Error {
19
+ name: string;
20
+ }
21
+ /**
22
+ * Refuse to store a value the environment overrides.
23
+ *
24
+ * Storing it would have no effect while the variable is set, so a command
25
+ * that appears to succeed would leave the CLI using something else.
26
+ *
27
+ * @param action What the command does, e.g., `log in`.
28
+ */
29
+ export declare const assertEnvVarUnset: (envVar: string, envValue: string | null, action: string) => void;
package/lib/env.js ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Credentials and the server may be given in the environment.
3
+ *
4
+ * Each variable overrides the corresponding stored value for as long as it
5
+ * is set, so any of them may be used per command or per shell. Commands that
6
+ * would store an overridden value fail instead: see {@link assertEnvVarUnset}.
7
+ */
8
+ /** Overrides the token stored by `seam login`. */
9
+ export const tokenEnvVar = 'SEAM_CLI_TOKEN';
10
+ /** Overrides the workspace stored by `seam select workspace`. */
11
+ export const workspaceIdEnvVar = 'SEAM_CLI_WORKSPACE_ID';
12
+ /** Overrides the server stored by `seam select server`. */
13
+ export const endpointEnvVar = 'SEAM_CLI_ENDPOINT';
14
+ export const getTokenFromEnv = () => readEnvVar(tokenEnvVar);
15
+ export const getWorkspaceIdFromEnv = () => readEnvVar(workspaceIdEnvVar);
16
+ export const getEndpointFromEnv = () => readEnvVar(endpointEnvVar);
17
+ /** Reported without a stack trace: the environment is at fault, not the CLI. */
18
+ export class EnvVarOverrideError extends Error {
19
+ name = 'EnvVarOverrideError';
20
+ }
21
+ /**
22
+ * Refuse to store a value the environment overrides.
23
+ *
24
+ * Storing it would have no effect while the variable is set, so a command
25
+ * that appears to succeed would leave the CLI using something else.
26
+ *
27
+ * @param action What the command does, e.g., `log in`.
28
+ */
29
+ export const assertEnvVarUnset = (envVar, envValue, action) => {
30
+ if (envValue == null)
31
+ return;
32
+ throw new EnvVarOverrideError(`Cannot ${action} while ${envVar} is set: it overrides what would be stored. Unset ${envVar} to ${action}.`);
33
+ };
34
+ const readEnvVar = (envVar) => {
35
+ const value = process.env[envVar];
36
+ if (value == null)
37
+ return null;
38
+ const trimmedValue = value.trim();
39
+ return trimmedValue === '' ? null : trimmedValue;
40
+ };
41
+ //# sourceMappingURL=env.js.map
package/lib/env.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/lib/env.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAA;AAE3C,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAA;AAExD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAA;AAMjD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAkB,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAE3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAkB,EAAE,CACvD,UAAU,CAAC,iBAAiB,CAAC,CAAA;AAE/B,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAkB,EAAE,CACpD,UAAU,CAAC,cAAc,CAAC,CAAA;AAE5B,gFAAgF;AAChF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,GAAG,qBAAqB,CAAA;CACtC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAc,EACd,QAAuB,EACvB,MAAc,EACR,EAAE;IACR,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAM;IAE5B,MAAM,IAAI,mBAAmB,CAC3B,UAAU,MAAM,UAAU,MAAM,qDAAqD,MAAM,OAAO,MAAM,GAAG,CAC5G,CAAA;AACH,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,MAAqB,EAAiB,EAAE;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAEjC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAEjC,OAAO,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAA;AAClD,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The token used to authenticate requests.
3
+ *
4
+ * `SEAM_CLI_TOKEN` wins over the token stored by `seam login`,
5
+ * so a token may be given per command or per shell without logging in.
6
+ */
7
+ export declare const getToken: () => string | null;
8
+ /**
9
+ * The workspace requests are made against.
10
+ *
11
+ * `SEAM_CLI_WORKSPACE_ID` wins over the workspace stored by
12
+ * `seam select workspace`. Returns `null` when neither is set: a token
13
+ * scoped to a single workspace does not need one.
14
+ */
15
+ export declare const getWorkspaceId: () => string | null;
@@ -0,0 +1,35 @@
1
+ import { getConfigStore } from './config/index.js';
2
+ import { getTokenFromEnv, getWorkspaceIdFromEnv } from './env.js';
3
+ import { getServer } from './get-server.js';
4
+ /**
5
+ * The token used to authenticate requests.
6
+ *
7
+ * `SEAM_CLI_TOKEN` wins over the token stored by `seam login`,
8
+ * so a token may be given per command or per shell without logging in.
9
+ */
10
+ export const getToken = () => {
11
+ const token = getTokenFromEnv();
12
+ if (token != null)
13
+ return token;
14
+ return readString(getConfigStore().get(`${getServer()}.pat`));
15
+ };
16
+ /**
17
+ * The workspace requests are made against.
18
+ *
19
+ * `SEAM_CLI_WORKSPACE_ID` wins over the workspace stored by
20
+ * `seam select workspace`. Returns `null` when neither is set: a token
21
+ * scoped to a single workspace does not need one.
22
+ */
23
+ export const getWorkspaceId = () => {
24
+ const workspaceId = getWorkspaceIdFromEnv();
25
+ if (workspaceId != null)
26
+ return workspaceId;
27
+ return readString(getConfigStore().get('current_workspace_id'));
28
+ };
29
+ const readString = (value) => {
30
+ if (typeof value !== 'string')
31
+ return null;
32
+ const trimmedValue = value.trim();
33
+ return trimmedValue === '' ? null : trimmedValue;
34
+ };
35
+ //# sourceMappingURL=get-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-credentials.js","sourceRoot":"","sources":["../src/lib/get-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAkB,EAAE;IAC1C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAA;IAC/B,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAA;IAE/B,OAAO,UAAU,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/D,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAkB,EAAE;IAChD,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAA;IAC3C,IAAI,WAAW,IAAI,IAAI;QAAE,OAAO,WAAW,CAAA;IAE3C,OAAO,UAAU,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,KAAc,EAAiB,EAAE;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE1C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAEjC,OAAO,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAA;AAClD,CAAC,CAAA"}
@@ -1,9 +1,8 @@
1
- import { getConfigStore } from './config/index.js';
1
+ import { getWorkspaceId } from './get-credentials.js';
2
2
  import { interactForWorkspaceId } from './interact-for-workspace-id.js';
3
3
  export const getCurrentWorkspaceId = async () => {
4
- const configStore = getConfigStore();
5
- const currentWorkspaceId = configStore.get('current_workspace_id');
6
- if (typeof currentWorkspaceId === 'string')
4
+ const currentWorkspaceId = getWorkspaceId();
5
+ if (currentWorkspaceId != null)
7
6
  return currentWorkspaceId;
8
7
  return await interactForWorkspaceId();
9
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"get-current-workspace-id.js","sourceRoot":"","sources":["../src/lib/get-current-workspace-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAAqB,EAAE;IAC/D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAClE,IAAI,OAAO,kBAAkB,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAA;IAErE,OAAO,MAAM,sBAAsB,EAAE,CAAA;AACvC,CAAC,CAAA"}
1
+ {"version":3,"file":"get-current-workspace-id.js","sourceRoot":"","sources":["../src/lib/get-current-workspace-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAAqB,EAAE;IAC/D,MAAM,kBAAkB,GAAG,cAAc,EAAE,CAAA;IAC3C,IAAI,kBAAkB,IAAI,IAAI;QAAE,OAAO,kBAAkB,CAAA;IAEzD,OAAO,MAAM,sBAAsB,EAAE,CAAA;AACvC,CAAC,CAAA"}
package/lib/get-seam.js CHANGED
@@ -1,26 +1,38 @@
1
1
  import { isConsoleSessionToken, isPersonalAccessToken, SeamHttp, SeamHttpWithoutWorkspace, } from '@seamapi/http/connect';
2
- import { getConfigStore } from './config/index.js';
2
+ import { tokenEnvVar, workspaceIdEnvVar } from './env.js';
3
+ import { getToken, getWorkspaceId } from './get-credentials.js';
3
4
  import { getServer } from './get-server.js';
4
5
  export const getSeam = async () => {
5
- const config = getConfigStore();
6
- const token = config.get(`${getServer()}.pat`);
7
- const workspaceId = config.get('current_workspace_id');
6
+ const token = getRequiredToken();
8
7
  const options = { endpoint: getServer() };
9
8
  if (isPersonalAccessToken(token)) {
10
- return SeamHttp.fromPersonalAccessToken(token, workspaceId, options);
9
+ return SeamHttp.fromPersonalAccessToken(token, getRequiredWorkspaceId(), options);
11
10
  }
12
11
  if (isConsoleSessionToken(token)) {
13
- return SeamHttp.fromConsoleSessionToken(token, workspaceId, options);
12
+ return SeamHttp.fromConsoleSessionToken(token, getRequiredWorkspaceId(), options);
14
13
  }
15
14
  return SeamHttp.fromApiKey(token, options);
16
15
  };
17
16
  export const getSeamMultiWorkspace = async () => {
18
- const config = getConfigStore();
19
- const token = config.get(`${getServer()}.pat`);
17
+ const token = getRequiredToken();
20
18
  const options = { endpoint: getServer() };
21
19
  if (isPersonalAccessToken(token)) {
22
20
  return SeamHttpWithoutWorkspace.fromPersonalAccessToken(token, options);
23
21
  }
24
- return getSeam();
22
+ return await getSeam();
23
+ };
24
+ const getRequiredToken = () => {
25
+ const token = getToken();
26
+ if (token == null) {
27
+ throw new Error(`Not logged in: run "seam login" or set the ${tokenEnvVar} environment variable`);
28
+ }
29
+ return token;
30
+ };
31
+ const getRequiredWorkspaceId = () => {
32
+ const workspaceId = getWorkspaceId();
33
+ if (workspaceId == null) {
34
+ throw new Error(`No workspace selected: run "seam select workspace" or set the ${workspaceIdEnvVar} environment variable`);
35
+ }
36
+ return workspaceId;
25
37
  };
26
38
  //# sourceMappingURL=get-seam.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-seam.js","sourceRoot":"","sources":["../src/lib/get-seam.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,QAAQ,EACR,wBAAwB,GACzB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAuB,EAAE;IACnD,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAE/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,CAAW,CAAA;IAExD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAW,CAAA;IAEhE,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAA;IAEzC,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAExC,EAAE;IACF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,CAAW,CAAA;IACxD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAA;IAEzC,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,wBAAwB,CAAC,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,OAAO,EAAE,CAAA;AAClB,CAAC,CAAA"}
1
+ {"version":3,"file":"get-seam.js","sourceRoot":"","sources":["../src/lib/get-seam.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,QAAQ,EACR,wBAAwB,GACzB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAuB,EAAE;IACnD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAEhC,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAA;IAEzC,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,uBAAuB,CACrC,KAAK,EACL,sBAAsB,EAAE,EACxB,OAAO,CACR,CAAA;IACH,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,uBAAuB,CACrC,KAAK,EACL,sBAAsB,EAAE,EACxB,OAAO,CACR,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAExC,EAAE;IACF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAA;IAEzC,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,wBAAwB,CAAC,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,MAAM,OAAO,EAAE,CAAA;AACxB,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,GAAW,EAAE;IACpC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IAExB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,8CAA8C,WAAW,uBAAuB,CACjF,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,GAAW,EAAE;IAC1C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,iEAAiE,iBAAiB,uBAAuB,CAC1G,CAAA;IACH,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA"}
@@ -1 +1,6 @@
1
+ /**
2
+ * The Seam API server requests are made against.
3
+ *
4
+ * `SEAM_CLI_ENDPOINT` wins over the server stored by `seam select server`.
5
+ */
1
6
  export declare const getServer: () => string;
package/lib/get-server.js CHANGED
@@ -1,7 +1,17 @@
1
1
  import { getConfigStore } from './config/index.js';
2
+ import { getEndpointFromEnv } from './env.js';
3
+ const defaultServer = 'https://connect.getseam.com';
4
+ /**
5
+ * The Seam API server requests are made against.
6
+ *
7
+ * `SEAM_CLI_ENDPOINT` wins over the server stored by `seam select server`.
8
+ */
2
9
  export const getServer = () => {
10
+ const endpoint = getEndpointFromEnv();
11
+ if (endpoint != null)
12
+ return endpoint;
3
13
  const config = getConfigStore();
4
14
  const server = config.get('server');
5
- return typeof server === 'string' ? server : 'https://connect.getseam.com';
15
+ return typeof server === 'string' ? server : defaultServer;
6
16
  };
7
17
  //# sourceMappingURL=get-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-server.js","sourceRoot":"","sources":["../src/lib/get-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAW,EAAE;IACpC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEnC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAA;AAC5E,CAAC,CAAA"}
1
+ {"version":3,"file":"get-server.js","sourceRoot":"","sources":["../src/lib/get-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAE7C,MAAM,aAAa,GAAG,6BAA6B,CAAA;AAEnD;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAW,EAAE;IACpC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAA;IACrC,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAA;IAErC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEnC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAA;AAC5D,CAAC,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { isApiKey, isPersonalAccessToken } from '@seamapi/http/connect';
2
2
  import chalk from 'chalk';
3
3
  import { getConfigStore } from './config/index.js';
4
+ import { assertEnvVarUnset, getTokenFromEnv, tokenEnvVar } from './env.js';
4
5
  import { getServer } from './get-server.js';
5
6
  import { interactForWorkspaceId } from './interact-for-workspace-id.js';
6
7
  import { getOutput } from './output/get-output.js';
@@ -10,6 +11,7 @@ import { validateToken } from './validate-token.js';
10
11
  export const interactForLogin = async () => {
11
12
  const config = await getConfigStore();
12
13
  const output = getOutput();
14
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log in');
13
15
  if (getServer().includes('localhost')) {
14
16
  output.info(`You're using a local Seam Connect instance, you can enter the API Key to your local user, you can create a new user from:\n\n${getServer()}/admin/create_user_with_api_key`);
15
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interact-for-login.js","sourceRoot":"","sources":["../src/lib/interact-for-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;IACzC,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,IAAI,SAAS,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CACT,gIAAgI,SAAS,EAAE,iCAAiC,CAC7K,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CACT,+KAA+K,CAChL,CAAA;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,IAAI,CACR,mEAAmE,CACpE,CACF,CAAA;IAED,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC;QAC3B,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,CAAA;IAEzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC;SAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,WAAW,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IACxE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACvC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;AAC1D,CAAC,CAAA"}
1
+ {"version":3,"file":"interact-for-login.js","sourceRoot":"","sources":["../src/lib/interact-for-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;IACzC,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,iBAAiB,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,CAAA;IAE3D,IAAI,SAAS,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CACT,gIAAgI,SAAS,EAAE,iCAAiC,CAC7K,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CACT,+KAA+K,CAChL,CAAA;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CACT,KAAK,CAAC,IAAI,CACR,mEAAmE,CACpE,CACF,CAAA;IAED,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC;QAC3B,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,CAAA;IAEzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC;SAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,WAAW,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IACxE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACvC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;AAC1D,CAAC,CAAA"}
@@ -1,9 +1,11 @@
1
1
  import { randomBytes } from 'node:crypto';
2
2
  import { getConfigStore } from './config/index.js';
3
+ import { assertEnvVarUnset, endpointEnvVar, getEndpointFromEnv, getTokenFromEnv, tokenEnvVar, } from './env.js';
3
4
  import { getServer } from './get-server.js';
4
5
  import { getOutput } from './output/get-output.js';
5
6
  import { prompt } from './util/prompt.js';
6
7
  export async function interactForServerSelection() {
8
+ assertEnvVarUnset(endpointEnvVar, getEndpointFromEnv(), 'select a server');
7
9
  const servers = [
8
10
  'http://localhost:3020',
9
11
  'https://connect.getseam.com',
@@ -30,6 +32,7 @@ export async function interactForServerSelection() {
30
32
  if (userUrlSeed.trim().length === 0) {
31
33
  userUrlSeed = randomBytes(5).toString('hex');
32
34
  }
35
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log in');
33
36
  config.set('server', `https://${userUrlSeed}.fakeseamconnect.seam.vc`);
34
37
  config.set(`${getServer()}.pat`, `seam_apikey1_token`);
35
38
  output.info(`PAT set to use fakeseamconnect with "seam_apikey1_token"`);
@@ -1 +1 @@
1
- {"version":3,"file":"interact-for-server-selection.js","sourceRoot":"","sources":["../src/lib/interact-for-server-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,MAAM,OAAO,GAAG;QACd,uBAAuB;QACvB,6BAA6B;QAC7B,iCAAiC;KAClC,CAAA;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC;QAC9B;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;SACrE;KACF,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,IAAI,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1B,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC;YACjC;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,aAAa;gBACnB,OAAO,EACL,sFAAsF;aACzF;SACF,CAAC,CAAA;QAEF,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC9C,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,WAAW,0BAA0B,CAAC,CAAA;QACtE,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAA;QACtD,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACzE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAA;IACrC,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAA;AACxC,CAAC"}
1
+ {"version":3,"file":"interact-for-server-selection.js","sourceRoot":"","sources":["../src/lib/interact-for-server-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,WAAW,GACZ,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,EAAE,EAAE,iBAAiB,CAAC,CAAA;IAE1E,MAAM,OAAO,GAAG;QACd,uBAAuB;QACvB,6BAA6B;QAC7B,iCAAiC;KAClC,CAAA;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC;QAC9B;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;SACrE;KACF,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,IAAI,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1B,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC;YACjC;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,aAAa;gBACnB,OAAO,EACL,sFAAsF;aACzF;SACF,CAAC,CAAA;QAEF,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC9C,CAAC;QACD,iBAAiB,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,CAAA;QAC3D,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,WAAW,0BAA0B,CAAC,CAAA;QACtE,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAA;QACtD,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACzE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAA;IACrC,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAA;AACxC,CAAC"}
@@ -1,11 +1,13 @@
1
1
  import { SeamHttpWithoutWorkspace } from '@seamapi/http/connect';
2
2
  import { getConfigStore } from './config/index.js';
3
+ import { assertEnvVarUnset, getWorkspaceIdFromEnv, workspaceIdEnvVar, } from './env.js';
3
4
  import { getSeamMultiWorkspace } from './get-seam.js';
4
5
  import { getServer } from './get-server.js';
5
6
  import { prompt } from './util/prompt.js';
6
7
  import { withLoading } from './util/with-loading.js';
7
8
  export const interactForWorkspaceId = async (personalAccessToken) => {
8
9
  const config = getConfigStore();
10
+ assertEnvVarUnset(workspaceIdEnvVar, getWorkspaceIdFromEnv(), 'select a workspace');
9
11
  const seam = personalAccessToken
10
12
  ? SeamHttpWithoutWorkspace.fromPersonalAccessToken(personalAccessToken, {
11
13
  endpoint: getServer(),
@@ -1 +1 @@
1
- {"version":3,"file":"interact-for-workspace-id.js","sourceRoot":"","sources":["../src/lib/interact-for-workspace-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,mBAA4B,EAAE,EAAE;IAC3E,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAG,mBAAmB;QAC9B,CAAC,CAAC,wBAAwB,CAAC,uBAAuB,CAAC,mBAAmB,EAAE;YACpE,QAAQ,EAAE,SAAS,EAAE;SACtB,CAAC;QACJ,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAA;IAEjC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAClE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CACvB,CAAA;IACD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC;QACnC,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,EAAE,CAAC,CAAC;YAC3C,KAAK,EAAE,SAAS,CAAC,IAAI;YACrB,KAAK,EAAE,SAAS,CAAC,YAAY;YAC7B,WAAW,EAAE,SAAS,CAAC,YAAY;SACpC,CAAC,CAAC;KACJ,CAAC,CAAA;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAA;QAC/C,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAA;AAC3B,CAAC,CAAA"}
1
+ {"version":3,"file":"interact-for-workspace-id.js","sourceRoot":"","sources":["../src/lib/interact-for-workspace-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,mBAA4B,EAAE,EAAE;IAC3E,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAE/B,iBAAiB,CACf,iBAAiB,EACjB,qBAAqB,EAAE,EACvB,oBAAoB,CACrB,CAAA;IAED,MAAM,IAAI,GAAG,mBAAmB;QAC9B,CAAC,CAAC,wBAAwB,CAAC,uBAAuB,CAAC,mBAAmB,EAAE;YACpE,QAAQ,EAAE,SAAS,EAAE;SACtB,CAAC;QACJ,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAA;IAEjC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAClE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CACvB,CAAA;IACD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC;QACnC,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,EAAE,CAAC,CAAC;YAC3C,KAAK,EAAE,SAAS,CAAC,IAAI;YACrB,KAAK,EAAE,SAAS,CAAC,YAAY;YAC7B,WAAW,EAAE,SAAS,CAAC,YAAY;SACpC,CAAC,CAAC;KACJ,CAAC,CAAA;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAA;QAC/C,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAA;AAC3B,CAAC,CAAA"}
package/lib/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- declare const seamapiCliVersion = "0.14.0";
1
+ declare const seamapiCliVersion = "0.15.0";
2
2
  declare const seamapiBlueprintVersion = "1.2.0";
3
3
  export { seamapiBlueprintVersion };
4
4
  export default seamapiCliVersion;
package/lib/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // Versions are replaced with generated values when the package is packed.
2
- const seamapiCliVersion = '0.14.0';
2
+ const seamapiCliVersion = '0.15.0';
3
3
  const seamapiBlueprintVersion = '1.2.0';
4
4
  export { seamapiBlueprintVersion };
5
5
  export default seamapiCliVersion;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamapi/cli",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "A command-line interface (CLI) for interacting with the Seam API.",
5
5
  "type": "module",
6
6
  "main": "index.js",
package/src/bin/cli.ts CHANGED
@@ -12,8 +12,19 @@ import {
12
12
  renderCompletion,
13
13
  } from 'lib/completion/index.js'
14
14
  import { getConfigStore } from 'lib/config/index.js'
15
+ import {
16
+ assertEnvVarUnset,
17
+ endpointEnvVar,
18
+ EnvVarOverrideError,
19
+ getEndpointFromEnv,
20
+ getTokenFromEnv,
21
+ getWorkspaceIdFromEnv,
22
+ tokenEnvVar,
23
+ workspaceIdEnvVar,
24
+ } from 'lib/env.js'
15
25
  import { getApiBlueprint } from 'lib/get-api-blueprint.js'
16
26
  import { getCommandBlueprintDef } from 'lib/get-command-blueprint-def.js'
27
+ import { getToken } from 'lib/get-credentials.js'
17
28
  import { getResponseKey } from 'lib/get-response-key.js'
18
29
  import { getServer } from 'lib/get-server.js'
19
30
  import { interactForActionAttemptPoll } from 'lib/interact-for-action-attempt-poll.js'
@@ -129,6 +140,9 @@ async function cli(args: ParsedArgs) {
129
140
  args._[1] === 'set' &&
130
141
  args._[2] === 'fake-server'
131
142
  ) {
143
+ assertEnvVarUnset(endpointEnvVar, getEndpointFromEnv(), 'select a server')
144
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log in')
145
+
132
146
  const randomstring = randomBytes(5).toString('hex')
133
147
  const fakeApiUrl = `https://${randomstring}.fakeseamconnect.seam.vc`
134
148
 
@@ -141,11 +155,11 @@ async function cli(args: ParsedArgs) {
141
155
  }
142
156
 
143
157
  if (
144
- !config.get(`${getServer()}.pat`) &&
158
+ getToken() == null &&
145
159
  args._[0] !== 'login' &&
146
160
  !isEqual(args._, ['select', 'server'])
147
161
  ) {
148
- output.error(`Not logged in. Please run "seam login"`)
162
+ output.error(`Not logged in. Please run "seam login" or set ${tokenEnvVar}`)
149
163
  process.exitCode = 1
150
164
  return
151
165
  }
@@ -185,6 +199,19 @@ async function cli(args: ParsedArgs) {
185
199
  assertKnownArgs(argParams, selectedCommand, ctx)
186
200
 
187
201
  if (isEqual(selectedCommand, ['login'])) {
202
+ // Nothing is stored while the environment overrides it, so refuse before
203
+ // storing anything rather than part way through.
204
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log in')
205
+ if (args['server']) {
206
+ assertEnvVarUnset(endpointEnvVar, getEndpointFromEnv(), 'select a server')
207
+ }
208
+ if (args['workspace_id']) {
209
+ assertEnvVarUnset(
210
+ workspaceIdEnvVar,
211
+ getWorkspaceIdFromEnv(),
212
+ 'select a workspace',
213
+ )
214
+ }
188
215
  if (args['server']) {
189
216
  config.set('server', args['server'])
190
217
  config.delete('current_workspace_id')
@@ -209,6 +236,7 @@ async function cli(args: ParsedArgs) {
209
236
  await interactForLogin()
210
237
  return
211
238
  } else if (isEqual(selectedCommand, ['logout'])) {
239
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log out')
212
240
  config.delete('pat')
213
241
  output.info('Logged out!')
214
242
  return
@@ -224,6 +252,11 @@ async function cli(args: ParsedArgs) {
224
252
  await interactForUseRemoteApiDefs()
225
253
  return
226
254
  } else if (isEqual(selectedCommand, ['select', 'workspace'])) {
255
+ assertEnvVarUnset(
256
+ workspaceIdEnvVar,
257
+ getWorkspaceIdFromEnv(),
258
+ 'select a workspace',
259
+ )
227
260
  if (isNonInteractive) {
228
261
  throw new NonInteractiveError(
229
262
  'Cannot select a workspace in non-interactive mode: pass --workspace-id to "seam login"',
@@ -238,6 +271,7 @@ async function cli(args: ParsedArgs) {
238
271
  commandParams['since'] = date.toISOString()
239
272
  }
240
273
  } else if (isEqual(selectedCommand, ['select', 'server'])) {
274
+ assertEnvVarUnset(endpointEnvVar, getEndpointFromEnv(), 'select a server')
241
275
  if (args['server']) {
242
276
  config.set('server', args['server'])
243
277
  config.delete('current_workspace_id')
@@ -419,7 +453,7 @@ run(process.argv.slice(2)).catch((e: unknown) => {
419
453
  return
420
454
  }
421
455
 
422
- if (e instanceof NonInteractiveError) {
456
+ if (e instanceof NonInteractiveError || e instanceof EnvVarOverrideError) {
423
457
  output.error(chalk.red(e.message))
424
458
  return
425
459
  }
@@ -0,0 +1,12 @@
1
+ declare global {
2
+ namespace NodeJS {
3
+ interface ProcessEnv {
4
+ INSIDE_WEB_BROWSER?: string
5
+ SEAM_CLI_ENDPOINT?: string
6
+ SEAM_CLI_TOKEN?: string
7
+ SEAM_CLI_WORKSPACE_ID?: string
8
+ }
9
+ }
10
+ }
11
+
12
+ export {}
package/src/lib/env.ts ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Credentials and the server may be given in the environment.
3
+ *
4
+ * Each variable overrides the corresponding stored value for as long as it
5
+ * is set, so any of them may be used per command or per shell. Commands that
6
+ * would store an overridden value fail instead: see {@link assertEnvVarUnset}.
7
+ */
8
+
9
+ /** Overrides the token stored by `seam login`. */
10
+ export const tokenEnvVar = 'SEAM_CLI_TOKEN'
11
+
12
+ /** Overrides the workspace stored by `seam select workspace`. */
13
+ export const workspaceIdEnvVar = 'SEAM_CLI_WORKSPACE_ID'
14
+
15
+ /** Overrides the server stored by `seam select server`. */
16
+ export const endpointEnvVar = 'SEAM_CLI_ENDPOINT'
17
+
18
+ /** Every variable read here is declared on `ProcessEnv` in `env.d.ts`. */
19
+ type SeamCliEnvVar =
20
+ typeof endpointEnvVar | typeof tokenEnvVar | typeof workspaceIdEnvVar
21
+
22
+ export const getTokenFromEnv = (): string | null => readEnvVar(tokenEnvVar)
23
+
24
+ export const getWorkspaceIdFromEnv = (): string | null =>
25
+ readEnvVar(workspaceIdEnvVar)
26
+
27
+ export const getEndpointFromEnv = (): string | null =>
28
+ readEnvVar(endpointEnvVar)
29
+
30
+ /** Reported without a stack trace: the environment is at fault, not the CLI. */
31
+ export class EnvVarOverrideError extends Error {
32
+ override name = 'EnvVarOverrideError'
33
+ }
34
+
35
+ /**
36
+ * Refuse to store a value the environment overrides.
37
+ *
38
+ * Storing it would have no effect while the variable is set, so a command
39
+ * that appears to succeed would leave the CLI using something else.
40
+ *
41
+ * @param action What the command does, e.g., `log in`.
42
+ */
43
+ export const assertEnvVarUnset = (
44
+ envVar: string,
45
+ envValue: string | null,
46
+ action: string,
47
+ ): void => {
48
+ if (envValue == null) return
49
+
50
+ throw new EnvVarOverrideError(
51
+ `Cannot ${action} while ${envVar} is set: it overrides what would be stored. Unset ${envVar} to ${action}.`,
52
+ )
53
+ }
54
+
55
+ const readEnvVar = (envVar: SeamCliEnvVar): string | null => {
56
+ const value = process.env[envVar]
57
+
58
+ if (value == null) return null
59
+
60
+ const trimmedValue = value.trim()
61
+
62
+ return trimmedValue === '' ? null : trimmedValue
63
+ }
@@ -0,0 +1,38 @@
1
+ import { getConfigStore } from './config/index.js'
2
+ import { getTokenFromEnv, getWorkspaceIdFromEnv } from './env.js'
3
+ import { getServer } from './get-server.js'
4
+
5
+ /**
6
+ * The token used to authenticate requests.
7
+ *
8
+ * `SEAM_CLI_TOKEN` wins over the token stored by `seam login`,
9
+ * so a token may be given per command or per shell without logging in.
10
+ */
11
+ export const getToken = (): string | null => {
12
+ const token = getTokenFromEnv()
13
+ if (token != null) return token
14
+
15
+ return readString(getConfigStore().get(`${getServer()}.pat`))
16
+ }
17
+
18
+ /**
19
+ * The workspace requests are made against.
20
+ *
21
+ * `SEAM_CLI_WORKSPACE_ID` wins over the workspace stored by
22
+ * `seam select workspace`. Returns `null` when neither is set: a token
23
+ * scoped to a single workspace does not need one.
24
+ */
25
+ export const getWorkspaceId = (): string | null => {
26
+ const workspaceId = getWorkspaceIdFromEnv()
27
+ if (workspaceId != null) return workspaceId
28
+
29
+ return readString(getConfigStore().get('current_workspace_id'))
30
+ }
31
+
32
+ const readString = (value: unknown): string | null => {
33
+ if (typeof value !== 'string') return null
34
+
35
+ const trimmedValue = value.trim()
36
+
37
+ return trimmedValue === '' ? null : trimmedValue
38
+ }
@@ -1,11 +1,9 @@
1
- import { getConfigStore } from './config/index.js'
1
+ import { getWorkspaceId } from './get-credentials.js'
2
2
  import { interactForWorkspaceId } from './interact-for-workspace-id.js'
3
3
 
4
4
  export const getCurrentWorkspaceId = async (): Promise<string> => {
5
- const configStore = getConfigStore()
6
-
7
- const currentWorkspaceId = configStore.get('current_workspace_id')
8
- if (typeof currentWorkspaceId === 'string') return currentWorkspaceId
5
+ const currentWorkspaceId = getWorkspaceId()
6
+ if (currentWorkspaceId != null) return currentWorkspaceId
9
7
 
10
8
  return await interactForWorkspaceId()
11
9
  }
@@ -5,24 +5,29 @@ import {
5
5
  SeamHttpWithoutWorkspace,
6
6
  } from '@seamapi/http/connect'
7
7
 
8
- import { getConfigStore } from './config/index.js'
8
+ import { tokenEnvVar, workspaceIdEnvVar } from './env.js'
9
+ import { getToken, getWorkspaceId } from './get-credentials.js'
9
10
  import { getServer } from './get-server.js'
10
11
 
11
12
  export const getSeam = async (): Promise<SeamHttp> => {
12
- const config = getConfigStore()
13
-
14
- const token = config.get(`${getServer()}.pat`) as string
15
-
16
- const workspaceId = config.get('current_workspace_id') as string
13
+ const token = getRequiredToken()
17
14
 
18
15
  const options = { endpoint: getServer() }
19
16
 
20
17
  if (isPersonalAccessToken(token)) {
21
- return SeamHttp.fromPersonalAccessToken(token, workspaceId, options)
18
+ return SeamHttp.fromPersonalAccessToken(
19
+ token,
20
+ getRequiredWorkspaceId(),
21
+ options,
22
+ )
22
23
  }
23
24
 
24
25
  if (isConsoleSessionToken(token)) {
25
- return SeamHttp.fromConsoleSessionToken(token, workspaceId, options)
26
+ return SeamHttp.fromConsoleSessionToken(
27
+ token,
28
+ getRequiredWorkspaceId(),
29
+ options,
30
+ )
26
31
  }
27
32
 
28
33
  return SeamHttp.fromApiKey(token, options)
@@ -31,13 +36,36 @@ export const getSeam = async (): Promise<SeamHttp> => {
31
36
  export const getSeamMultiWorkspace = async (): Promise<
32
37
  SeamHttpWithoutWorkspace | SeamHttp
33
38
  > => {
34
- const config = getConfigStore()
35
- const token = config.get(`${getServer()}.pat`) as string
39
+ const token = getRequiredToken()
36
40
  const options = { endpoint: getServer() }
37
41
 
38
42
  if (isPersonalAccessToken(token)) {
39
43
  return SeamHttpWithoutWorkspace.fromPersonalAccessToken(token, options)
40
44
  }
41
45
 
42
- return getSeam()
46
+ return await getSeam()
47
+ }
48
+
49
+ const getRequiredToken = (): string => {
50
+ const token = getToken()
51
+
52
+ if (token == null) {
53
+ throw new Error(
54
+ `Not logged in: run "seam login" or set the ${tokenEnvVar} environment variable`,
55
+ )
56
+ }
57
+
58
+ return token
59
+ }
60
+
61
+ const getRequiredWorkspaceId = (): string => {
62
+ const workspaceId = getWorkspaceId()
63
+
64
+ if (workspaceId == null) {
65
+ throw new Error(
66
+ `No workspace selected: run "seam select workspace" or set the ${workspaceIdEnvVar} environment variable`,
67
+ )
68
+ }
69
+
70
+ return workspaceId
43
71
  }
@@ -1,9 +1,20 @@
1
1
  import { getConfigStore } from './config/index.js'
2
+ import { getEndpointFromEnv } from './env.js'
2
3
 
4
+ const defaultServer = 'https://connect.getseam.com'
5
+
6
+ /**
7
+ * The Seam API server requests are made against.
8
+ *
9
+ * `SEAM_CLI_ENDPOINT` wins over the server stored by `seam select server`.
10
+ */
3
11
  export const getServer = (): string => {
12
+ const endpoint = getEndpointFromEnv()
13
+ if (endpoint != null) return endpoint
14
+
4
15
  const config = getConfigStore()
5
16
 
6
17
  const server = config.get('server')
7
18
 
8
- return typeof server === 'string' ? server : 'https://connect.getseam.com'
19
+ return typeof server === 'string' ? server : defaultServer
9
20
  }
@@ -2,6 +2,7 @@ import { isApiKey, isPersonalAccessToken } from '@seamapi/http/connect'
2
2
  import chalk from 'chalk'
3
3
 
4
4
  import { getConfigStore } from './config/index.js'
5
+ import { assertEnvVarUnset, getTokenFromEnv, tokenEnvVar } from './env.js'
5
6
  import { getServer } from './get-server.js'
6
7
  import { interactForWorkspaceId } from './interact-for-workspace-id.js'
7
8
  import { getOutput } from './output/get-output.js'
@@ -13,6 +14,8 @@ export const interactForLogin = async () => {
13
14
  const config = await getConfigStore()
14
15
  const output = getOutput()
15
16
 
17
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log in')
18
+
16
19
  if (getServer().includes('localhost')) {
17
20
  output.info(
18
21
  `You're using a local Seam Connect instance, you can enter the API Key to your local user, you can create a new user from:\n\n${getServer()}/admin/create_user_with_api_key`,
@@ -1,11 +1,20 @@
1
1
  import { randomBytes } from 'node:crypto'
2
2
 
3
3
  import { getConfigStore } from './config/index.js'
4
+ import {
5
+ assertEnvVarUnset,
6
+ endpointEnvVar,
7
+ getEndpointFromEnv,
8
+ getTokenFromEnv,
9
+ tokenEnvVar,
10
+ } from './env.js'
4
11
  import { getServer } from './get-server.js'
5
12
  import { getOutput } from './output/get-output.js'
6
13
  import { prompt } from './util/prompt.js'
7
14
 
8
15
  export async function interactForServerSelection() {
16
+ assertEnvVarUnset(endpointEnvVar, getEndpointFromEnv(), 'select a server')
17
+
9
18
  const servers = [
10
19
  'http://localhost:3020',
11
20
  'https://connect.getseam.com',
@@ -36,6 +45,7 @@ export async function interactForServerSelection() {
36
45
  if (userUrlSeed.trim().length === 0) {
37
46
  userUrlSeed = randomBytes(5).toString('hex')
38
47
  }
48
+ assertEnvVarUnset(tokenEnvVar, getTokenFromEnv(), 'log in')
39
49
  config.set('server', `https://${userUrlSeed}.fakeseamconnect.seam.vc`)
40
50
  config.set(`${getServer()}.pat`, `seam_apikey1_token`)
41
51
  output.info(`PAT set to use fakeseamconnect with "seam_apikey1_token"`)
@@ -1,6 +1,11 @@
1
1
  import { SeamHttpWithoutWorkspace } from '@seamapi/http/connect'
2
2
 
3
3
  import { getConfigStore } from './config/index.js'
4
+ import {
5
+ assertEnvVarUnset,
6
+ getWorkspaceIdFromEnv,
7
+ workspaceIdEnvVar,
8
+ } from './env.js'
4
9
  import { getSeamMultiWorkspace } from './get-seam.js'
5
10
  import { getServer } from './get-server.js'
6
11
  import { prompt } from './util/prompt.js'
@@ -8,6 +13,13 @@ import { withLoading } from './util/with-loading.js'
8
13
 
9
14
  export const interactForWorkspaceId = async (personalAccessToken?: string) => {
10
15
  const config = getConfigStore()
16
+
17
+ assertEnvVarUnset(
18
+ workspaceIdEnvVar,
19
+ getWorkspaceIdFromEnv(),
20
+ 'select a workspace',
21
+ )
22
+
11
23
  const seam = personalAccessToken
12
24
  ? SeamHttpWithoutWorkspace.fromPersonalAccessToken(personalAccessToken, {
13
25
  endpoint: getServer(),
@@ -1,5 +1,5 @@
1
1
  // Versions are replaced with generated values when the package is packed.
2
- const seamapiCliVersion = '0.14.0'
2
+ const seamapiCliVersion = '0.15.0'
3
3
  const seamapiBlueprintVersion = '1.2.0'
4
4
 
5
5
  export { seamapiBlueprintVersion }