@salesforce/b2c-tooling-sdk 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/cjs/cli/base-command.d.ts +33 -8
  2. package/dist/cjs/cli/base-command.js +92 -35
  3. package/dist/cjs/cli/base-command.js.map +1 -1
  4. package/dist/cjs/clients/middleware.d.ts +15 -10
  5. package/dist/cjs/clients/middleware.js +22 -15
  6. package/dist/cjs/clients/middleware.js.map +1 -1
  7. package/dist/cjs/clients/webdav.d.ts +22 -0
  8. package/dist/cjs/clients/webdav.js +46 -0
  9. package/dist/cjs/clients/webdav.js.map +1 -1
  10. package/dist/cjs/config/dw-json.d.ts +32 -0
  11. package/dist/cjs/config/dw-json.js.map +1 -1
  12. package/dist/cjs/config/mapping.js +55 -0
  13. package/dist/cjs/config/mapping.js.map +1 -1
  14. package/dist/cjs/config/resolver.js +9 -1
  15. package/dist/cjs/config/resolver.js.map +1 -1
  16. package/dist/cjs/config/sources/env-source.js +3 -1
  17. package/dist/cjs/config/sources/env-source.js.map +1 -1
  18. package/dist/cjs/config/types.d.ts +15 -0
  19. package/dist/cjs/index.d.ts +3 -2
  20. package/dist/cjs/index.js +1 -1
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/operations/code/deploy.d.ts +6 -2
  23. package/dist/cjs/operations/code/deploy.js +13 -10
  24. package/dist/cjs/operations/code/deploy.js.map +1 -1
  25. package/dist/cjs/safety/index.d.ts +7 -2
  26. package/dist/cjs/safety/index.js +5 -1
  27. package/dist/cjs/safety/index.js.map +1 -1
  28. package/dist/cjs/safety/safety-guard.d.ts +92 -0
  29. package/dist/cjs/safety/safety-guard.js +270 -0
  30. package/dist/cjs/safety/safety-guard.js.map +1 -0
  31. package/dist/cjs/safety/safety-middleware.d.ts +86 -1
  32. package/dist/cjs/safety/safety-middleware.js +165 -16
  33. package/dist/cjs/safety/safety-middleware.js.map +1 -1
  34. package/dist/cjs/safety/types.d.ts +81 -0
  35. package/dist/cjs/safety/types.js +16 -0
  36. package/dist/cjs/safety/types.js.map +1 -0
  37. package/dist/cjs/safety/with-confirmation.d.ts +58 -0
  38. package/dist/cjs/safety/with-confirmation.js +67 -0
  39. package/dist/cjs/safety/with-confirmation.js.map +1 -0
  40. package/dist/cjs/ux/confirm.d.ts +14 -0
  41. package/dist/cjs/ux/confirm.js +36 -0
  42. package/dist/cjs/ux/confirm.js.map +1 -0
  43. package/dist/esm/cli/base-command.d.ts +33 -8
  44. package/dist/esm/cli/base-command.js +92 -35
  45. package/dist/esm/cli/base-command.js.map +1 -1
  46. package/dist/esm/clients/middleware.d.ts +15 -10
  47. package/dist/esm/clients/middleware.js +22 -15
  48. package/dist/esm/clients/middleware.js.map +1 -1
  49. package/dist/esm/clients/webdav.d.ts +22 -0
  50. package/dist/esm/clients/webdav.js +46 -0
  51. package/dist/esm/clients/webdav.js.map +1 -1
  52. package/dist/esm/config/dw-json.d.ts +32 -0
  53. package/dist/esm/config/dw-json.js.map +1 -1
  54. package/dist/esm/config/mapping.js +55 -0
  55. package/dist/esm/config/mapping.js.map +1 -1
  56. package/dist/esm/config/resolver.js +9 -1
  57. package/dist/esm/config/resolver.js.map +1 -1
  58. package/dist/esm/config/sources/env-source.js +3 -1
  59. package/dist/esm/config/sources/env-source.js.map +1 -1
  60. package/dist/esm/config/types.d.ts +15 -0
  61. package/dist/esm/index.d.ts +3 -2
  62. package/dist/esm/index.js +1 -1
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/operations/code/deploy.d.ts +6 -2
  65. package/dist/esm/operations/code/deploy.js +13 -10
  66. package/dist/esm/operations/code/deploy.js.map +1 -1
  67. package/dist/esm/safety/index.d.ts +7 -2
  68. package/dist/esm/safety/index.js +5 -1
  69. package/dist/esm/safety/index.js.map +1 -1
  70. package/dist/esm/safety/safety-guard.d.ts +92 -0
  71. package/dist/esm/safety/safety-guard.js +270 -0
  72. package/dist/esm/safety/safety-guard.js.map +1 -0
  73. package/dist/esm/safety/safety-middleware.d.ts +86 -1
  74. package/dist/esm/safety/safety-middleware.js +165 -16
  75. package/dist/esm/safety/safety-middleware.js.map +1 -1
  76. package/dist/esm/safety/types.d.ts +81 -0
  77. package/dist/esm/safety/types.js +16 -0
  78. package/dist/esm/safety/types.js.map +1 -0
  79. package/dist/esm/safety/with-confirmation.d.ts +58 -0
  80. package/dist/esm/safety/with-confirmation.js +67 -0
  81. package/dist/esm/safety/with-confirmation.js.map +1 -0
  82. package/dist/esm/ux/confirm.d.ts +14 -0
  83. package/dist/esm/ux/confirm.js +36 -0
  84. package/dist/esm/ux/confirm.js.map +1 -0
  85. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"env-source.js","sourceRoot":"","sources":["../../../../src/config/sources/env-source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env-source.js","sourceRoot":"","sources":["../../../../src/config/sources/env-source.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@
8
8
  */
9
9
  import type { AuthMethod, AuthStrategy } from '../auth/types.js';
10
10
  import type { B2CInstance } from '../instance/index.js';
11
+ import type { SafetyLevel } from '../safety/safety-middleware.js';
12
+ import type { SafetyRule } from '../safety/types.js';
11
13
  /**
12
14
  * A value that may be synchronous or a Promise.
13
15
  *
@@ -70,6 +72,10 @@ export interface NormalizedConfig {
70
72
  cartridges?: string[];
71
73
  /** Default content library ID for content export/list commands */
72
74
  contentLibrary?: string;
75
+ /** Catalog IDs for WebDAV browsing */
76
+ catalogs?: string[];
77
+ /** Library IDs for WebDAV browsing */
78
+ libraries?: string[];
73
79
  /** Optional CIP analytics host override */
74
80
  cipHost?: string;
75
81
  /** Instance name (from multi-config supporting sources) */
@@ -84,6 +90,15 @@ export interface NormalizedConfig {
84
90
  certificatePassphrase?: string;
85
91
  /** Whether to skip SSL/TLS certificate verification (self-signed certs) */
86
92
  selfSigned?: boolean;
93
+ /** Safety configuration for this instance */
94
+ safety?: {
95
+ /** Safety level */
96
+ level?: SafetyLevel;
97
+ /** When true, level-blocked operations require confirmation instead of hard-blocking */
98
+ confirm?: boolean;
99
+ /** Ordered safety rules. First matching rule wins. */
100
+ rules?: SafetyRule[];
101
+ };
87
102
  }
88
103
  /**
89
104
  * Warning codes for configuration resolution.
@@ -24,7 +24,8 @@ export type { CipColumnMetadata, CipDescribeTableOptions, CipDescribeTableResult
24
24
  export { getUser, getUserByLogin, listUsers, createUser, updateUser, deleteUser, purgeUser, resetUser, grantRole, revokeRole, } from './operations/users/index.js';
25
25
  export { getRole, listRoles } from './operations/roles/index.js';
26
26
  export { getOrg, getOrgByName, listOrgs } from './operations/orgs/index.js';
27
- export { getSafetyLevel, describeSafetyLevel, checkSafetyViolation, SafetyBlockedError } from './safety/index.js';
28
- export type { SafetyLevel, SafetyConfig } from './safety/index.js';
27
+ export { getSafetyLevel, describeSafetyLevel, checkSafetyViolation, checkLevelViolation, SafetyBlockedError, SafetyConfirmationRequired, SafetyGuard, extractJobIdFromPath, maxSafetyLevel, isValidSafetyLevel, parseSafetyLevelString, resolveEffectiveSafetyConfig, loadGlobalSafetyConfig, isValidSafetyAction, VALID_SAFETY_ACTIONS, withSafetyConfirmation, } from './safety/index.js';
28
+ export type { SafetyLevel, SafetyConfig, SafetyConfigFragment } from './safety/index.js';
29
+ export type { SafetyAction, SafetyRule, SafetyOperation, SafetyEvaluation, ConfirmHandler } from './safety/index.js';
29
30
  export { DEFAULT_ACCOUNT_MANAGER_HOST, DEFAULT_ODS_HOST, DEFAULT_PUBLIC_CLIENT_ID, getDefaultPublicClientId, } from './defaults.js';
30
31
  export { SDK_NAME, SDK_VERSION, SDK_USER_AGENT } from './version.js';
package/dist/esm/index.js CHANGED
@@ -31,7 +31,7 @@ export { getRole, listRoles } from './operations/roles/index.js';
31
31
  // Operations - Organizations
32
32
  export { getOrg, getOrgByName, listOrgs } from './operations/orgs/index.js';
33
33
  // Safety - Protection against destructive operations
34
- export { getSafetyLevel, describeSafetyLevel, checkSafetyViolation, SafetyBlockedError } from './safety/index.js';
34
+ export { getSafetyLevel, describeSafetyLevel, checkSafetyViolation, checkLevelViolation, SafetyBlockedError, SafetyConfirmationRequired, SafetyGuard, extractJobIdFromPath, maxSafetyLevel, isValidSafetyLevel, parseSafetyLevelString, resolveEffectiveSafetyConfig, loadGlobalSafetyConfig, isValidSafetyAction, VALID_SAFETY_ACTIONS, withSafetyConfirmation, } from './safety/index.js';
35
35
  // Defaults
36
36
  export { DEFAULT_ACCOUNT_MANAGER_HOST, DEFAULT_ODS_HOST, DEFAULT_PUBLIC_CLIENT_ID, getDefaultPublicClientId, } from './defaults.js';
37
37
  // Version info
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@ import { type CartridgeMapping, type FindCartridgesOptions } from './cartridges.
4
4
  * Options for deploying cartridges.
5
5
  */
6
6
  export interface DeployOptions extends FindCartridgesOptions {
7
- /** Reload (re-activate) the code version after deploy */
7
+ /** Activate the code version after deploy */
8
+ activate?: boolean;
9
+ /** Reload (toggle activation to force reload) the code version after deploy */
8
10
  reload?: boolean;
9
11
  /** Delete existing cartridges before uploading */
10
12
  delete?: boolean;
@@ -17,7 +19,9 @@ export interface DeployResult {
17
19
  cartridges: CartridgeMapping[];
18
20
  /** Code version deployed to */
19
21
  codeVersion: string;
20
- /** Whether the code version was reloaded */
22
+ /** Whether the code version was activated after deploy */
23
+ activated: boolean;
24
+ /** Whether the code version was reloaded after deploy */
21
25
  reloaded: boolean;
22
26
  }
23
27
  /**
@@ -8,7 +8,7 @@ import fs from 'node:fs';
8
8
  import JSZip from 'jszip';
9
9
  import { getLogger } from '../../logging/logger.js';
10
10
  import { findCartridges } from './cartridges.js';
11
- import { reloadCodeVersion } from './versions.js';
11
+ import { activateCodeVersion, reloadCodeVersion } from './versions.js';
12
12
  const UNZIP_BODY = new URLSearchParams({ method: 'UNZIP' }).toString();
13
13
  /**
14
14
  * Recursively adds a directory to a JSZip instance.
@@ -203,21 +203,24 @@ export async function findAndDeployCartridges(instance, directory, options = {})
203
203
  }
204
204
  // Upload cartridges
205
205
  await uploadCartridges(instance, cartridges);
206
- // Optionally reload
206
+ // Optionally activate or reload
207
+ let activated = false;
207
208
  let reloaded = false;
208
- if (options.reload) {
209
+ if (options.activate) {
210
+ logger.debug('Activating code version...');
211
+ await activateCodeVersion(instance, codeVersion);
212
+ activated = true;
213
+ }
214
+ else if (options.reload) {
209
215
  logger.debug('Reloading code version...');
210
- try {
211
- await reloadCodeVersion(instance, codeVersion);
212
- reloaded = true;
213
- }
214
- catch (error) {
215
- logger.debug({ error }, 'Could not reload code version');
216
- }
216
+ await reloadCodeVersion(instance, codeVersion);
217
+ activated = true;
218
+ reloaded = true;
217
219
  }
218
220
  return {
219
221
  cartridges,
220
222
  codeVersion,
223
+ activated,
221
224
  reloaded,
222
225
  };
223
226
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/operations/code/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../src/operations/code/deploy.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,10 @@
3
3
  *
4
4
  * @module safety
5
5
  */
6
- export type { SafetyLevel, SafetyConfig } from './safety-middleware.js';
7
- export { SafetyBlockedError, checkSafetyViolation, getSafetyLevel, describeSafetyLevel } from './safety-middleware.js';
6
+ export type { SafetyAction, SafetyRule, SafetyOperation, SafetyEvaluation } from './types.js';
7
+ export { isValidSafetyAction, VALID_SAFETY_ACTIONS } from './types.js';
8
+ export type { SafetyLevel, SafetyConfig, SafetyConfigFragment } from './safety-middleware.js';
9
+ export { SafetyBlockedError, SafetyConfirmationRequired, checkSafetyViolation, checkLevelViolation, getSafetyLevel, describeSafetyLevel, maxSafetyLevel, isValidSafetyLevel, parseSafetyLevelString, resolveEffectiveSafetyConfig, loadGlobalSafetyConfig, } from './safety-middleware.js';
10
+ export { SafetyGuard, extractJobIdFromPath } from './safety-guard.js';
11
+ export type { ConfirmHandler } from './with-confirmation.js';
12
+ export { withSafetyConfirmation } from './with-confirmation.js';
@@ -3,5 +3,9 @@
3
3
  * SPDX-License-Identifier: Apache-2
4
4
  * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
5
  */
6
- export { SafetyBlockedError, checkSafetyViolation, getSafetyLevel, describeSafetyLevel } from './safety-middleware.js';
6
+ export { isValidSafetyAction, VALID_SAFETY_ACTIONS } from './types.js';
7
+ export { SafetyBlockedError, SafetyConfirmationRequired, checkSafetyViolation, checkLevelViolation, getSafetyLevel, describeSafetyLevel, maxSafetyLevel, isValidSafetyLevel, parseSafetyLevelString, resolveEffectiveSafetyConfig, loadGlobalSafetyConfig, } from './safety-middleware.js';
8
+ // SafetyGuard
9
+ export { SafetyGuard, extractJobIdFromPath } from './safety-guard.js';
10
+ export { withSafetyConfirmation } from './with-confirmation.js';
7
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/safety/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAC,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAC,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/safety/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,EAAC,mBAAmB,EAAE,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAIrE,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAEhC,cAAc;AACd,OAAO,EAAC,WAAW,EAAE,oBAAoB,EAAC,MAAM,mBAAmB,CAAC;AAIpE,OAAO,EAAC,sBAAsB,EAAC,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,92 @@
1
+ import type { SafetyConfig } from './safety-middleware.js';
2
+ import type { SafetyEvaluation, SafetyOperation, SafetyRule } from './types.js';
3
+ /**
4
+ * Extract a job ID from a URL path if it's a job execution endpoint.
5
+ *
6
+ * Matches patterns like:
7
+ * - `/s/-/dw/data/v24_5/jobs/sfcc-site-archive-import/executions`
8
+ * - `/jobs/sfcc-site-archive-export/executions`
9
+ */
10
+ export declare function extractJobIdFromPath(path: string): string | undefined;
11
+ /**
12
+ * SafetyGuard evaluates operations against safety rules and levels.
13
+ *
14
+ * The guard provides three levels of API:
15
+ * - {@link evaluate} — returns a {@link SafetyEvaluation} describing what should happen
16
+ * - {@link assert} — throws {@link SafetyBlockedError} or {@link SafetyConfirmationRequired}
17
+ * - {@link temporarilyAllow} — creates a scoped exemption for confirmed operations
18
+ *
19
+ * The HTTP middleware uses the guard internally so all HTTP requests are
20
+ * evaluated automatically. CLI commands and other consumers can use the
21
+ * guard directly for richer safety interaction (command-level checks,
22
+ * confirmation flows).
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const guard = new SafetyGuard({
27
+ * level: 'NO_UPDATE',
28
+ * confirm: true,
29
+ * rules: [{ job: 'sfcc-site-archive-export', action: 'allow' }],
30
+ * });
31
+ *
32
+ * const evaluation = guard.evaluate({ type: 'job', jobId: 'sfcc-site-archive-export' });
33
+ * // evaluation.action === 'allow'
34
+ * ```
35
+ */
36
+ export declare class SafetyGuard {
37
+ readonly config: SafetyConfig;
38
+ private temporaryAllows;
39
+ private readonly logger;
40
+ constructor(config: SafetyConfig);
41
+ /**
42
+ * Evaluate an operation against safety rules and level.
43
+ *
44
+ * Evaluation order:
45
+ * 1. Temporary allows (from confirmed retries) — if matched, allow
46
+ * 2. Config rules in order — first matching rule's action wins
47
+ * 3. Level-based default — confirm if `confirm: true`, otherwise block/allow
48
+ *
49
+ * All evaluations are trace-logged for diagnostics.
50
+ */
51
+ evaluate(operation: SafetyOperation): SafetyEvaluation;
52
+ /**
53
+ * Assert that an operation is allowed.
54
+ *
55
+ * @throws {SafetyBlockedError} if the operation is blocked
56
+ * @throws {SafetyConfirmationRequired} if the operation needs confirmation
57
+ */
58
+ assert(operation: SafetyOperation): void;
59
+ /**
60
+ * Create a temporary exemption for a confirmed operation.
61
+ *
62
+ * Returns a cleanup function that removes the exemption. Use this
63
+ * to retry an operation after the user has confirmed.
64
+ */
65
+ temporarilyAllow(operation: SafetyOperation): () => void;
66
+ /**
67
+ * Add a temporary safety rule for a scoped exemption.
68
+ *
69
+ * Unlike {@link temporarilyAllow} which derives a rule from an operation,
70
+ * this accepts an arbitrary rule — useful for granting broad temporary
71
+ * access (e.g., allowing WebDAV DELETE on Impex paths during a job export).
72
+ *
73
+ * Returns a cleanup function that removes the rule.
74
+ */
75
+ temporarilyAddRule(rule: SafetyRule): () => void;
76
+ /**
77
+ * Evaluate an operation using only the safety level (no rules).
78
+ */
79
+ private evaluateByLevel;
80
+ /**
81
+ * Convert an operation to a temporary allow rule for retry.
82
+ */
83
+ private operationToRule;
84
+ /**
85
+ * Describe why a rule matched, for user-facing messages.
86
+ */
87
+ private describeRuleMatch;
88
+ /**
89
+ * Describe why the level blocked an operation, for user-facing messages.
90
+ */
91
+ private describeLevelBlock;
92
+ }
@@ -0,0 +1,270 @@
1
+ /*
2
+ * Copyright (c) 2025, Salesforce, Inc.
3
+ * SPDX-License-Identifier: Apache-2
4
+ * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ /**
7
+ * SafetyGuard: SDK-level safety evaluation engine.
8
+ *
9
+ * Evaluates operations against safety rules and levels, producing typed
10
+ * evaluations (allow/block/confirm). Used by both the HTTP middleware
11
+ * (automatic) and command-level checks (opt-in).
12
+ *
13
+ * @module safety/safety-guard
14
+ */
15
+ import { Minimatch } from 'minimatch';
16
+ import { getLogger } from '../logging/index.js';
17
+ import { SafetyBlockedError, SafetyConfirmationRequired, checkLevelViolation, describeSafetyLevel, } from './safety-middleware.js';
18
+ /** Regex to extract job ID from OCAPI job execution URLs. */
19
+ const JOB_EXECUTION_PATTERN = /\/jobs\/([^/]+)\/executions/;
20
+ /**
21
+ * Extract a job ID from a URL path if it's a job execution endpoint.
22
+ *
23
+ * Matches patterns like:
24
+ * - `/s/-/dw/data/v24_5/jobs/sfcc-site-archive-import/executions`
25
+ * - `/jobs/sfcc-site-archive-export/executions`
26
+ */
27
+ export function extractJobIdFromPath(path) {
28
+ const match = JOB_EXECUTION_PATTERN.exec(path);
29
+ return match?.[1];
30
+ }
31
+ /**
32
+ * Test whether a string matches a glob pattern.
33
+ * Uses minimatch with dot matching enabled.
34
+ */
35
+ function matchGlob(value, pattern) {
36
+ const matcher = new Minimatch(pattern, { dot: true, nocase: true });
37
+ return matcher.match(value);
38
+ }
39
+ /**
40
+ * Check if a rule matches an operation.
41
+ */
42
+ function ruleMatchesOperation(rule, operation) {
43
+ // Command matcher
44
+ if (rule.command !== undefined) {
45
+ if (!operation.commandId)
46
+ return false;
47
+ return matchGlob(operation.commandId, rule.command);
48
+ }
49
+ // Job matcher
50
+ if (rule.job !== undefined) {
51
+ const jobId = operation.jobId ?? (operation.path ? extractJobIdFromPath(operation.path) : undefined);
52
+ if (!jobId)
53
+ return false;
54
+ return matchGlob(jobId, rule.job);
55
+ }
56
+ // HTTP method + path matcher
57
+ if (rule.path !== undefined) {
58
+ if (!operation.path)
59
+ return false;
60
+ if (!matchGlob(operation.path, rule.path))
61
+ return false;
62
+ // If method is specified, it must also match
63
+ if (rule.method !== undefined) {
64
+ if (!operation.method)
65
+ return false;
66
+ return matchGlob(operation.method.toUpperCase(), rule.method.toUpperCase());
67
+ }
68
+ return true;
69
+ }
70
+ // Method-only matcher (no path)
71
+ if (rule.method !== undefined) {
72
+ if (!operation.method)
73
+ return false;
74
+ return matchGlob(operation.method.toUpperCase(), rule.method.toUpperCase());
75
+ }
76
+ // Rule has no matchers — does not match anything
77
+ return false;
78
+ }
79
+ /**
80
+ * SafetyGuard evaluates operations against safety rules and levels.
81
+ *
82
+ * The guard provides three levels of API:
83
+ * - {@link evaluate} — returns a {@link SafetyEvaluation} describing what should happen
84
+ * - {@link assert} — throws {@link SafetyBlockedError} or {@link SafetyConfirmationRequired}
85
+ * - {@link temporarilyAllow} — creates a scoped exemption for confirmed operations
86
+ *
87
+ * The HTTP middleware uses the guard internally so all HTTP requests are
88
+ * evaluated automatically. CLI commands and other consumers can use the
89
+ * guard directly for richer safety interaction (command-level checks,
90
+ * confirmation flows).
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const guard = new SafetyGuard({
95
+ * level: 'NO_UPDATE',
96
+ * confirm: true,
97
+ * rules: [{ job: 'sfcc-site-archive-export', action: 'allow' }],
98
+ * });
99
+ *
100
+ * const evaluation = guard.evaluate({ type: 'job', jobId: 'sfcc-site-archive-export' });
101
+ * // evaluation.action === 'allow'
102
+ * ```
103
+ */
104
+ export class SafetyGuard {
105
+ config;
106
+ temporaryAllows = [];
107
+ logger;
108
+ constructor(config) {
109
+ this.config = config;
110
+ this.logger = getLogger();
111
+ }
112
+ /**
113
+ * Evaluate an operation against safety rules and level.
114
+ *
115
+ * Evaluation order:
116
+ * 1. Temporary allows (from confirmed retries) — if matched, allow
117
+ * 2. Config rules in order — first matching rule's action wins
118
+ * 3. Level-based default — confirm if `confirm: true`, otherwise block/allow
119
+ *
120
+ * All evaluations are trace-logged for diagnostics.
121
+ */
122
+ evaluate(operation) {
123
+ // 1. Check temporary allows (confirmed operations)
124
+ for (const rule of this.temporaryAllows) {
125
+ if (ruleMatchesOperation(rule, operation)) {
126
+ const evaluation = {
127
+ action: 'allow',
128
+ reason: 'Temporarily allowed after confirmation',
129
+ operation,
130
+ rule,
131
+ };
132
+ this.logger.trace({ operation, evaluation }, '[SafetyGuard] Allowed by temporary exemption');
133
+ return evaluation;
134
+ }
135
+ }
136
+ // 2. Check config rules (first match wins)
137
+ if (this.config.rules) {
138
+ for (const rule of this.config.rules) {
139
+ if (ruleMatchesOperation(rule, operation)) {
140
+ const evaluation = {
141
+ action: rule.action,
142
+ reason: this.describeRuleMatch(rule, operation),
143
+ operation,
144
+ rule,
145
+ };
146
+ this.logger.trace({ operation, rule, action: rule.action }, '[SafetyGuard] Matched rule');
147
+ return evaluation;
148
+ }
149
+ }
150
+ }
151
+ // 3. Fall back to level-based evaluation
152
+ return this.evaluateByLevel(operation);
153
+ }
154
+ /**
155
+ * Assert that an operation is allowed.
156
+ *
157
+ * @throws {SafetyBlockedError} if the operation is blocked
158
+ * @throws {SafetyConfirmationRequired} if the operation needs confirmation
159
+ */
160
+ assert(operation) {
161
+ const evaluation = this.evaluate(operation);
162
+ switch (evaluation.action) {
163
+ case 'allow':
164
+ return;
165
+ case 'block':
166
+ throw new SafetyBlockedError(evaluation.reason, operation.method ?? '', operation.url ?? '', this.config.level);
167
+ case 'confirm':
168
+ throw new SafetyConfirmationRequired(evaluation);
169
+ }
170
+ }
171
+ /**
172
+ * Create a temporary exemption for a confirmed operation.
173
+ *
174
+ * Returns a cleanup function that removes the exemption. Use this
175
+ * to retry an operation after the user has confirmed.
176
+ */
177
+ temporarilyAllow(operation) {
178
+ const rule = this.operationToRule(operation);
179
+ return this.temporarilyAddRule(rule);
180
+ }
181
+ /**
182
+ * Add a temporary safety rule for a scoped exemption.
183
+ *
184
+ * Unlike {@link temporarilyAllow} which derives a rule from an operation,
185
+ * this accepts an arbitrary rule — useful for granting broad temporary
186
+ * access (e.g., allowing WebDAV DELETE on Impex paths during a job export).
187
+ *
188
+ * Returns a cleanup function that removes the rule.
189
+ */
190
+ temporarilyAddRule(rule) {
191
+ this.temporaryAllows.push(rule);
192
+ this.logger.trace({ rule }, '[SafetyGuard] Added temporary rule');
193
+ return () => {
194
+ const idx = this.temporaryAllows.indexOf(rule);
195
+ if (idx >= 0) {
196
+ this.temporaryAllows.splice(idx, 1);
197
+ this.logger.trace({ rule }, '[SafetyGuard] Removed temporary rule');
198
+ }
199
+ };
200
+ }
201
+ /**
202
+ * Evaluate an operation using only the safety level (no rules).
203
+ */
204
+ evaluateByLevel(operation) {
205
+ // For HTTP operations, check the level
206
+ if (operation.method && operation.path) {
207
+ const violation = checkLevelViolation(operation.method, operation.path, this.config.level);
208
+ if (violation) {
209
+ const action = this.config.confirm ? 'confirm' : 'block';
210
+ const evaluation = {
211
+ action,
212
+ reason: this.describeLevelBlock(operation),
213
+ operation,
214
+ };
215
+ this.logger.trace({ operation, action, level: this.config.level }, '[SafetyGuard] Level evaluation');
216
+ return evaluation;
217
+ }
218
+ }
219
+ // For command operations, no level-based blocking (levels are HTTP-level)
220
+ // Commands opt into safety via rules or assertDestructiveOperationAllowed()
221
+ const evaluation = {
222
+ action: 'allow',
223
+ reason: 'No matching rule and level allows this operation',
224
+ operation,
225
+ };
226
+ this.logger.trace({ operation, level: this.config.level }, '[SafetyGuard] Allowed by level');
227
+ return evaluation;
228
+ }
229
+ /**
230
+ * Convert an operation to a temporary allow rule for retry.
231
+ */
232
+ operationToRule(operation) {
233
+ if (operation.commandId) {
234
+ return { command: operation.commandId, action: 'allow' };
235
+ }
236
+ if (operation.jobId) {
237
+ return { job: operation.jobId, action: 'allow' };
238
+ }
239
+ // HTTP operation — match exact method + path
240
+ return {
241
+ method: operation.method,
242
+ path: operation.path,
243
+ action: 'allow',
244
+ };
245
+ }
246
+ /**
247
+ * Describe why a rule matched, for user-facing messages.
248
+ */
249
+ describeRuleMatch(rule, operation) {
250
+ if (rule.command) {
251
+ return `Command "${operation.commandId}" matched safety rule (command: "${rule.command}", action: ${rule.action})`;
252
+ }
253
+ if (rule.job) {
254
+ return `Job "${operation.jobId}" matched safety rule (job: "${rule.job}", action: ${rule.action})`;
255
+ }
256
+ const method = operation.method ?? 'unknown';
257
+ const path = operation.path ?? 'unknown';
258
+ return `${method} ${path} matched safety rule (action: ${rule.action})`;
259
+ }
260
+ /**
261
+ * Describe why the level blocked an operation, for user-facing messages.
262
+ */
263
+ describeLevelBlock(operation) {
264
+ const method = operation.method ?? 'unknown';
265
+ const path = operation.path ?? 'unknown';
266
+ const levelDesc = describeSafetyLevel(this.config.level);
267
+ return `${method} ${path} blocked by safety level ${this.config.level} — ${levelDesc}`;
268
+ }
269
+ }
270
+ //# sourceMappingURL=safety-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety-guard.js","sourceRoot":"","sources":["../../../src/safety/safety-guard.ts"],"names":[],"mappings":"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"}