@f5-sales-demo/pi-utils 22.13.2 → 22.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@f5-sales-demo/pi-utils",
4
- "version": "22.13.2",
4
+ "version": "22.14.2",
5
5
  "description": "Shared utilities for pi packages",
6
6
  "homepage": "https://github.com/f5-sales-demo/xcsh",
7
7
  "author": "Can Boluk",
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/bun": "1.4.2",
42
- "@f5-sales-demo/pi-natives": "22.13.2"
42
+ "@f5-sales-demo/pi-natives": "22.14.2"
43
43
  },
44
44
  "engines": {
45
45
  "bun": ">=1.4.2"
@@ -28,6 +28,7 @@ export interface KnowledgeSource {
28
28
  }
29
29
 
30
30
  export interface ContextOverrides {
31
+ unsetEnv?: string[];
31
32
  defaultNamespace?: string;
32
33
  env?: Record<string, string>;
33
34
  sensitiveKeys?: string[];
@@ -123,6 +124,10 @@ export function mergePointerOverrides(base: XCSHContextData, overrides: ContextO
123
124
  merged.env = { ...base.env, ...overrides.env };
124
125
  }
125
126
 
127
+ if (overrides.unsetEnv) {
128
+ merged.env = { ...merged.env };
129
+ for (const key of overrides.unsetEnv) if (typeof key === "string") delete merged.env[key];
130
+ }
126
131
  return merged;
127
132
  }
128
133
 
@@ -138,6 +143,8 @@ export const RESERVED_CONTEXT_NAMES = new Set([
138
143
  "create",
139
144
  "delete",
140
145
  "rename",
146
+ "edit",
147
+ "manage",
141
148
  "namespace",
142
149
  "env",
143
150
  "set",
@@ -239,6 +246,26 @@ export class ContextResolver {
239
246
  return Promise.resolve(this.#resolveGlobal());
240
247
  }
241
248
 
249
+ /** Resolve an explicit identity without changing any saved active pointer. */
250
+ resolveTarget(target: { name: string; source: "local" | "global" }, cwd: string): ResolvedContext | null {
251
+ if (!isSafeContextName(target.name)) return null;
252
+ const file =
253
+ target.source === "local"
254
+ ? this.#paths.getLocalContextPath(target.name, cwd)
255
+ : this.#paths.getContextPath(target.name);
256
+ const data = this.#readJsonFile(file);
257
+ if (!data || !validateLocalContextFile(data).valid) return null;
258
+ const result =
259
+ isPointerContext(data) && target.source === "local"
260
+ ? this.#resolvePointer(data, file)
261
+ : isInlineContext(data)
262
+ ? this.#finalize(data as unknown as XCSHContextData, target.source, file)
263
+ : null;
264
+ if (!result || typeof result.context.apiToken !== "string" || typeof result.context.defaultNamespace !== "string")
265
+ return null;
266
+ return { ...result, context: { ...result.context, name: target.name } };
267
+ }
268
+
242
269
  findLocalContextsDir(cwd: string): string | null {
243
270
  const dir = this.#paths.getLocalContextsDir(cwd);
244
271
  return fs.existsSync(dir) ? dir : null;