@salesforce/b2c-tooling-sdk 1.10.0 → 1.11.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 (638) hide show
  1. package/data/content-schemas/componenttype.json +37 -0
  2. package/dist/esm/operations/content/validate.js +46 -4
  3. package/dist/esm/operations/content/validate.js.map +1 -1
  4. package/dist/esm/operations/jobs/site-archive.d.ts +12 -0
  5. package/dist/esm/operations/jobs/site-archive.js +107 -3
  6. package/dist/esm/operations/jobs/site-archive.js.map +1 -1
  7. package/package.json +73 -285
  8. package/dist/cjs/auth/api-key.d.ts +0 -28
  9. package/dist/cjs/auth/api-key.js +0 -45
  10. package/dist/cjs/auth/api-key.js.map +0 -1
  11. package/dist/cjs/auth/basic.d.ts +0 -7
  12. package/dist/cjs/auth/basic.js +0 -20
  13. package/dist/cjs/auth/basic.js.map +0 -1
  14. package/dist/cjs/auth/index.d.ts +0 -74
  15. package/dist/cjs/auth/index.js +0 -76
  16. package/dist/cjs/auth/index.js.map +0 -1
  17. package/dist/cjs/auth/jwt-utils.d.ts +0 -25
  18. package/dist/cjs/auth/jwt-utils.js +0 -66
  19. package/dist/cjs/auth/jwt-utils.js.map +0 -1
  20. package/dist/cjs/auth/middleware.d.ts +0 -196
  21. package/dist/cjs/auth/middleware.js +0 -190
  22. package/dist/cjs/auth/middleware.js.map +0 -1
  23. package/dist/cjs/auth/oauth-implicit.d.ts +0 -89
  24. package/dist/cjs/auth/oauth-implicit.js +0 -350
  25. package/dist/cjs/auth/oauth-implicit.js.map +0 -1
  26. package/dist/cjs/auth/oauth-jwt.d.ts +0 -99
  27. package/dist/cjs/auth/oauth-jwt.js +0 -343
  28. package/dist/cjs/auth/oauth-jwt.js.map +0 -1
  29. package/dist/cjs/auth/oauth.d.ts +0 -88
  30. package/dist/cjs/auth/oauth.js +0 -252
  31. package/dist/cjs/auth/oauth.js.map +0 -1
  32. package/dist/cjs/auth/resolve.d.ts +0 -100
  33. package/dist/cjs/auth/resolve.js +0 -175
  34. package/dist/cjs/auth/resolve.js.map +0 -1
  35. package/dist/cjs/auth/stateful-oauth-strategy.d.ts +0 -39
  36. package/dist/cjs/auth/stateful-oauth-strategy.js +0 -130
  37. package/dist/cjs/auth/stateful-oauth-strategy.js.map +0 -1
  38. package/dist/cjs/auth/stateful-store.d.ts +0 -49
  39. package/dist/cjs/auth/stateful-store.js +0 -166
  40. package/dist/cjs/auth/stateful-store.js.map +0 -1
  41. package/dist/cjs/auth/types.d.ts +0 -124
  42. package/dist/cjs/auth/types.js +0 -8
  43. package/dist/cjs/auth/types.js.map +0 -1
  44. package/dist/cjs/cli/am-command.d.ts +0 -74
  45. package/dist/cjs/cli/am-command.js +0 -199
  46. package/dist/cjs/cli/am-command.js.map +0 -1
  47. package/dist/cjs/cli/base-command.d.ts +0 -232
  48. package/dist/cjs/cli/base-command.js +0 -695
  49. package/dist/cjs/cli/base-command.js.map +0 -1
  50. package/dist/cjs/cli/cartridge-command.d.ts +0 -67
  51. package/dist/cjs/cli/cartridge-command.js +0 -146
  52. package/dist/cjs/cli/cartridge-command.js.map +0 -1
  53. package/dist/cjs/cli/cartridge-providers.d.ts +0 -149
  54. package/dist/cjs/cli/cartridge-providers.js +0 -103
  55. package/dist/cjs/cli/cartridge-providers.js.map +0 -1
  56. package/dist/cjs/cli/columns.d.ts +0 -128
  57. package/dist/cjs/cli/columns.js +0 -128
  58. package/dist/cjs/cli/columns.js.map +0 -1
  59. package/dist/cjs/cli/config.d.ts +0 -159
  60. package/dist/cjs/cli/config.js +0 -185
  61. package/dist/cjs/cli/config.js.map +0 -1
  62. package/dist/cjs/cli/details.d.ts +0 -69
  63. package/dist/cjs/cli/details.js +0 -72
  64. package/dist/cjs/cli/details.js.map +0 -1
  65. package/dist/cjs/cli/hooks.d.ts +0 -324
  66. package/dist/cjs/cli/hooks.js +0 -3
  67. package/dist/cjs/cli/hooks.js.map +0 -1
  68. package/dist/cjs/cli/index.d.ts +0 -108
  69. package/dist/cjs/cli/index.js +0 -111
  70. package/dist/cjs/cli/index.js.map +0 -1
  71. package/dist/cjs/cli/instance-command.d.ts +0 -131
  72. package/dist/cjs/cli/instance-command.js +0 -214
  73. package/dist/cjs/cli/instance-command.js.map +0 -1
  74. package/dist/cjs/cli/job-command.d.ts +0 -32
  75. package/dist/cjs/cli/job-command.js +0 -60
  76. package/dist/cjs/cli/job-command.js.map +0 -1
  77. package/dist/cjs/cli/lifecycle.d.ts +0 -189
  78. package/dist/cjs/cli/lifecycle.js +0 -130
  79. package/dist/cjs/cli/lifecycle.js.map +0 -1
  80. package/dist/cjs/cli/mrt-command.d.ts +0 -57
  81. package/dist/cjs/cli/mrt-command.js +0 -95
  82. package/dist/cjs/cli/mrt-command.js.map +0 -1
  83. package/dist/cjs/cli/oauth-command.d.ts +0 -122
  84. package/dist/cjs/cli/oauth-command.js +0 -311
  85. package/dist/cjs/cli/oauth-command.js.map +0 -1
  86. package/dist/cjs/cli/ods-command.d.ts +0 -97
  87. package/dist/cjs/cli/ods-command.js +0 -136
  88. package/dist/cjs/cli/ods-command.js.map +0 -1
  89. package/dist/cjs/cli/table.d.ts +0 -113
  90. package/dist/cjs/cli/table.js +0 -175
  91. package/dist/cjs/cli/table.js.map +0 -1
  92. package/dist/cjs/cli/webdav-command.d.ts +0 -110
  93. package/dist/cjs/cli/webdav-command.js +0 -106
  94. package/dist/cjs/cli/webdav-command.js.map +0 -1
  95. package/dist/cjs/clients/am-api.d.ts +0 -521
  96. package/dist/cjs/clients/am-api.js +0 -992
  97. package/dist/cjs/clients/am-api.js.map +0 -1
  98. package/dist/cjs/clients/am-apiclients-api.generated.d.ts +0 -803
  99. package/dist/cjs/clients/am-apiclients-api.generated.js +0 -6
  100. package/dist/cjs/clients/am-apiclients-api.generated.js.map +0 -1
  101. package/dist/cjs/clients/am-roles-api.generated.d.ts +0 -298
  102. package/dist/cjs/clients/am-roles-api.generated.js +0 -6
  103. package/dist/cjs/clients/am-roles-api.generated.js.map +0 -1
  104. package/dist/cjs/clients/am-users-api.generated.d.ts +0 -954
  105. package/dist/cjs/clients/am-users-api.generated.js +0 -6
  106. package/dist/cjs/clients/am-users-api.generated.js.map +0 -1
  107. package/dist/cjs/clients/cdn-zones.d.ts +0 -186
  108. package/dist/cjs/clients/cdn-zones.generated.d.ts +0 -8330
  109. package/dist/cjs/clients/cdn-zones.generated.js +0 -6
  110. package/dist/cjs/clients/cdn-zones.generated.js.map +0 -1
  111. package/dist/cjs/clients/cdn-zones.js +0 -103
  112. package/dist/cjs/clients/cdn-zones.js.map +0 -1
  113. package/dist/cjs/clients/cip.d.ts +0 -162
  114. package/dist/cjs/clients/cip.js +0 -572
  115. package/dist/cjs/clients/cip.js.map +0 -1
  116. package/dist/cjs/clients/custom-apis.d.ts +0 -174
  117. package/dist/cjs/clients/custom-apis.generated.d.ts +0 -202
  118. package/dist/cjs/clients/custom-apis.generated.js +0 -6
  119. package/dist/cjs/clients/custom-apis.generated.js.map +0 -1
  120. package/dist/cjs/clients/custom-apis.js +0 -140
  121. package/dist/cjs/clients/custom-apis.js.map +0 -1
  122. package/dist/cjs/clients/error-utils.d.ts +0 -35
  123. package/dist/cjs/clients/error-utils.js +0 -69
  124. package/dist/cjs/clients/error-utils.js.map +0 -1
  125. package/dist/cjs/clients/granular-replications.d.ts +0 -70
  126. package/dist/cjs/clients/granular-replications.generated.d.ts +0 -416
  127. package/dist/cjs/clients/granular-replications.generated.js +0 -6
  128. package/dist/cjs/clients/granular-replications.generated.js.map +0 -1
  129. package/dist/cjs/clients/granular-replications.js +0 -73
  130. package/dist/cjs/clients/granular-replications.js.map +0 -1
  131. package/dist/cjs/clients/index.d.ts +0 -145
  132. package/dist/cjs/clients/index.js +0 -137
  133. package/dist/cjs/clients/index.js.map +0 -1
  134. package/dist/cjs/clients/middleware-registry.d.ts +0 -184
  135. package/dist/cjs/clients/middleware-registry.js +0 -104
  136. package/dist/cjs/clients/middleware-registry.js.map +0 -1
  137. package/dist/cjs/clients/middleware.d.ts +0 -183
  138. package/dist/cjs/clients/middleware.js +0 -465
  139. package/dist/cjs/clients/middleware.js.map +0 -1
  140. package/dist/cjs/clients/mrt-b2c.d.ts +0 -138
  141. package/dist/cjs/clients/mrt-b2c.generated.d.ts +0 -176
  142. package/dist/cjs/clients/mrt-b2c.generated.js +0 -6
  143. package/dist/cjs/clients/mrt-b2c.generated.js.map +0 -1
  144. package/dist/cjs/clients/mrt-b2c.js +0 -86
  145. package/dist/cjs/clients/mrt-b2c.js.map +0 -1
  146. package/dist/cjs/clients/mrt.d.ts +0 -143
  147. package/dist/cjs/clients/mrt.generated.d.ts +0 -3806
  148. package/dist/cjs/clients/mrt.generated.js +0 -6
  149. package/dist/cjs/clients/mrt.generated.js.map +0 -1
  150. package/dist/cjs/clients/mrt.js +0 -93
  151. package/dist/cjs/clients/mrt.js.map +0 -1
  152. package/dist/cjs/clients/ocapi.d.ts +0 -128
  153. package/dist/cjs/clients/ocapi.generated.d.ts +0 -26052
  154. package/dist/cjs/clients/ocapi.generated.js +0 -6
  155. package/dist/cjs/clients/ocapi.generated.js.map +0 -1
  156. package/dist/cjs/clients/ocapi.js +0 -78
  157. package/dist/cjs/clients/ocapi.js.map +0 -1
  158. package/dist/cjs/clients/ods.d.ts +0 -160
  159. package/dist/cjs/clients/ods.generated.d.ts +0 -2860
  160. package/dist/cjs/clients/ods.generated.js +0 -6
  161. package/dist/cjs/clients/ods.generated.js.map +0 -1
  162. package/dist/cjs/clients/ods.js +0 -103
  163. package/dist/cjs/clients/ods.js.map +0 -1
  164. package/dist/cjs/clients/scapi-schemas.d.ts +0 -161
  165. package/dist/cjs/clients/scapi-schemas.generated.d.ts +0 -328
  166. package/dist/cjs/clients/scapi-schemas.generated.js +0 -6
  167. package/dist/cjs/clients/scapi-schemas.generated.js.map +0 -1
  168. package/dist/cjs/clients/scapi-schemas.js +0 -98
  169. package/dist/cjs/clients/scapi-schemas.js.map +0 -1
  170. package/dist/cjs/clients/slas-admin.d.ts +0 -132
  171. package/dist/cjs/clients/slas-admin.generated.d.ts +0 -1434
  172. package/dist/cjs/clients/slas-admin.generated.js +0 -6
  173. package/dist/cjs/clients/slas-admin.generated.js.map +0 -1
  174. package/dist/cjs/clients/slas-admin.js +0 -79
  175. package/dist/cjs/clients/slas-admin.js.map +0 -1
  176. package/dist/cjs/clients/tls-dispatcher.d.ts +0 -42
  177. package/dist/cjs/clients/tls-dispatcher.js +0 -107
  178. package/dist/cjs/clients/tls-dispatcher.js.map +0 -1
  179. package/dist/cjs/clients/user-agent.d.ts +0 -43
  180. package/dist/cjs/clients/user-agent.js +0 -87
  181. package/dist/cjs/clients/user-agent.js.map +0 -1
  182. package/dist/cjs/clients/webdav.d.ts +0 -186
  183. package/dist/cjs/clients/webdav.js +0 -395
  184. package/dist/cjs/clients/webdav.js.map +0 -1
  185. package/dist/cjs/config/config-source-registry.d.ts +0 -115
  186. package/dist/cjs/config/config-source-registry.js +0 -103
  187. package/dist/cjs/config/config-source-registry.js.map +0 -1
  188. package/dist/cjs/config/dw-json.d.ts +0 -274
  189. package/dist/cjs/config/dw-json.js +0 -333
  190. package/dist/cjs/config/dw-json.js.map +0 -1
  191. package/dist/cjs/config/index.d.ts +0 -100
  192. package/dist/cjs/config/index.js +0 -110
  193. package/dist/cjs/config/index.js.map +0 -1
  194. package/dist/cjs/config/instance-manager.d.ts +0 -97
  195. package/dist/cjs/config/instance-manager.js +0 -166
  196. package/dist/cjs/config/instance-manager.js.map +0 -1
  197. package/dist/cjs/config/mapping.d.ts +0 -199
  198. package/dist/cjs/config/mapping.js +0 -540
  199. package/dist/cjs/config/mapping.js.map +0 -1
  200. package/dist/cjs/config/resolved-config.d.ts +0 -29
  201. package/dist/cjs/config/resolved-config.js +0 -81
  202. package/dist/cjs/config/resolved-config.js.map +0 -1
  203. package/dist/cjs/config/resolver.d.ts +0 -191
  204. package/dist/cjs/config/resolver.js +0 -406
  205. package/dist/cjs/config/resolver.js.map +0 -1
  206. package/dist/cjs/config/sources/dw-json-source.d.ts +0 -27
  207. package/dist/cjs/config/sources/dw-json-source.js +0 -106
  208. package/dist/cjs/config/sources/dw-json-source.js.map +0 -1
  209. package/dist/cjs/config/sources/env-source.d.ts +0 -32
  210. package/dist/cjs/config/sources/env-source.js +0 -116
  211. package/dist/cjs/config/sources/env-source.js.map +0 -1
  212. package/dist/cjs/config/sources/index.d.ts +0 -9
  213. package/dist/cjs/config/sources/index.js +0 -15
  214. package/dist/cjs/config/sources/index.js.map +0 -1
  215. package/dist/cjs/config/sources/mobify-source.d.ts +0 -25
  216. package/dist/cjs/config/sources/mobify-source.js +0 -84
  217. package/dist/cjs/config/sources/mobify-source.js.map +0 -1
  218. package/dist/cjs/config/sources/package-json-source.d.ts +0 -14
  219. package/dist/cjs/config/sources/package-json-source.js +0 -97
  220. package/dist/cjs/config/sources/package-json-source.js.map +0 -1
  221. package/dist/cjs/config/types.d.ts +0 -428
  222. package/dist/cjs/config/types.js +0 -2
  223. package/dist/cjs/config/types.js.map +0 -1
  224. package/dist/cjs/defaults.d.ts +0 -36
  225. package/dist/cjs/defaults.js +0 -54
  226. package/dist/cjs/defaults.js.map +0 -1
  227. package/dist/cjs/discovery/detector.d.ts +0 -75
  228. package/dist/cjs/discovery/detector.js +0 -108
  229. package/dist/cjs/discovery/detector.js.map +0 -1
  230. package/dist/cjs/discovery/index.d.ts +0 -63
  231. package/dist/cjs/discovery/index.js +0 -70
  232. package/dist/cjs/discovery/index.js.map +0 -1
  233. package/dist/cjs/discovery/patterns/cartridges.d.ts +0 -16
  234. package/dist/cjs/discovery/patterns/cartridges.js +0 -16
  235. package/dist/cjs/discovery/patterns/cartridges.js.map +0 -1
  236. package/dist/cjs/discovery/patterns/index.d.ts +0 -21
  237. package/dist/cjs/discovery/patterns/index.js +0 -16
  238. package/dist/cjs/discovery/patterns/index.js.map +0 -1
  239. package/dist/cjs/discovery/patterns/pwa-kit.d.ts +0 -15
  240. package/dist/cjs/discovery/patterns/pwa-kit.js +0 -26
  241. package/dist/cjs/discovery/patterns/pwa-kit.js.map +0 -1
  242. package/dist/cjs/discovery/patterns/sfra.d.ts +0 -34
  243. package/dist/cjs/discovery/patterns/sfra.js +0 -50
  244. package/dist/cjs/discovery/patterns/sfra.js.map +0 -1
  245. package/dist/cjs/discovery/patterns/storefront-next.d.ts +0 -10
  246. package/dist/cjs/discovery/patterns/storefront-next.js +0 -65
  247. package/dist/cjs/discovery/patterns/storefront-next.js.map +0 -1
  248. package/dist/cjs/discovery/types.d.ts +0 -47
  249. package/dist/cjs/discovery/types.js +0 -12
  250. package/dist/cjs/discovery/types.js.map +0 -1
  251. package/dist/cjs/discovery/utils.d.ts +0 -44
  252. package/dist/cjs/discovery/utils.js +0 -82
  253. package/dist/cjs/discovery/utils.js.map +0 -1
  254. package/dist/cjs/docs/download.d.ts +0 -45
  255. package/dist/cjs/docs/download.js +0 -96
  256. package/dist/cjs/docs/download.js.map +0 -1
  257. package/dist/cjs/docs/index.d.ts +0 -44
  258. package/dist/cjs/docs/index.js +0 -12
  259. package/dist/cjs/docs/index.js.map +0 -1
  260. package/dist/cjs/docs/schema.d.ts +0 -26
  261. package/dist/cjs/docs/schema.js +0 -92
  262. package/dist/cjs/docs/schema.js.map +0 -1
  263. package/dist/cjs/docs/search.d.ts +0 -67
  264. package/dist/cjs/docs/search.js +0 -128
  265. package/dist/cjs/docs/search.js.map +0 -1
  266. package/dist/cjs/docs/types.d.ts +0 -64
  267. package/dist/cjs/docs/types.js +0 -15
  268. package/dist/cjs/docs/types.js.map +0 -1
  269. package/dist/cjs/errors/http-error.d.ts +0 -34
  270. package/dist/cjs/errors/http-error.js +0 -45
  271. package/dist/cjs/errors/http-error.js.map +0 -1
  272. package/dist/cjs/errors/index.d.ts +0 -12
  273. package/dist/cjs/errors/index.js +0 -18
  274. package/dist/cjs/errors/index.js.map +0 -1
  275. package/dist/cjs/i18n/index.d.ts +0 -144
  276. package/dist/cjs/i18n/index.js +0 -245
  277. package/dist/cjs/i18n/index.js.map +0 -1
  278. package/dist/cjs/i18n/locales/de.d.ts +0 -13
  279. package/dist/cjs/i18n/locales/de.js +0 -19
  280. package/dist/cjs/i18n/locales/de.js.map +0 -1
  281. package/dist/cjs/i18n/locales/index.d.ts +0 -28
  282. package/dist/cjs/i18n/locales/index.js +0 -25
  283. package/dist/cjs/i18n/locales/index.js.map +0 -1
  284. package/dist/cjs/index.d.ts +0 -33
  285. package/dist/cjs/index.js +0 -41
  286. package/dist/cjs/index.js.map +0 -1
  287. package/dist/cjs/instance/index.d.ts +0 -136
  288. package/dist/cjs/instance/index.js +0 -131
  289. package/dist/cjs/instance/index.js.map +0 -1
  290. package/dist/cjs/logging/index.d.ts +0 -116
  291. package/dist/cjs/logging/index.js +0 -121
  292. package/dist/cjs/logging/index.js.map +0 -1
  293. package/dist/cjs/logging/logger.d.ts +0 -9
  294. package/dist/cjs/logging/logger.js +0 -138
  295. package/dist/cjs/logging/logger.js.map +0 -1
  296. package/dist/cjs/logging/types.d.ts +0 -45
  297. package/dist/cjs/logging/types.js +0 -10
  298. package/dist/cjs/logging/types.js.map +0 -1
  299. package/dist/cjs/operations/bm-roles/index.d.ts +0 -52
  300. package/dist/cjs/operations/bm-roles/index.js +0 -57
  301. package/dist/cjs/operations/bm-roles/index.js.map +0 -1
  302. package/dist/cjs/operations/bm-roles/roles.d.ts +0 -155
  303. package/dist/cjs/operations/bm-roles/roles.js +0 -194
  304. package/dist/cjs/operations/bm-roles/roles.js.map +0 -1
  305. package/dist/cjs/operations/bm-users/index.d.ts +0 -50
  306. package/dist/cjs/operations/bm-users/index.js +0 -55
  307. package/dist/cjs/operations/bm-users/index.js.map +0 -1
  308. package/dist/cjs/operations/bm-users/users.d.ts +0 -189
  309. package/dist/cjs/operations/bm-users/users.js +0 -229
  310. package/dist/cjs/operations/bm-users/users.js.map +0 -1
  311. package/dist/cjs/operations/cap/index.d.ts +0 -56
  312. package/dist/cjs/operations/cap/index.js +0 -57
  313. package/dist/cjs/operations/cap/index.js.map +0 -1
  314. package/dist/cjs/operations/cap/install.d.ts +0 -53
  315. package/dist/cjs/operations/cap/install.js +0 -181
  316. package/dist/cjs/operations/cap/install.js.map +0 -1
  317. package/dist/cjs/operations/cap/list.d.ts +0 -92
  318. package/dist/cjs/operations/cap/list.js +0 -230
  319. package/dist/cjs/operations/cap/list.js.map +0 -1
  320. package/dist/cjs/operations/cap/package.d.ts +0 -39
  321. package/dist/cjs/operations/cap/package.js +0 -77
  322. package/dist/cjs/operations/cap/package.js.map +0 -1
  323. package/dist/cjs/operations/cap/pull.d.ts +0 -21
  324. package/dist/cjs/operations/cap/pull.js +0 -77
  325. package/dist/cjs/operations/cap/pull.js.map +0 -1
  326. package/dist/cjs/operations/cap/uninstall.d.ts +0 -46
  327. package/dist/cjs/operations/cap/uninstall.js +0 -87
  328. package/dist/cjs/operations/cap/uninstall.js.map +0 -1
  329. package/dist/cjs/operations/cap/validate.d.ts +0 -47
  330. package/dist/cjs/operations/cap/validate.js +0 -235
  331. package/dist/cjs/operations/cap/validate.js.map +0 -1
  332. package/dist/cjs/operations/cip/index.d.ts +0 -35
  333. package/dist/cjs/operations/cip/index.js +0 -128
  334. package/dist/cjs/operations/cip/index.js.map +0 -1
  335. package/dist/cjs/operations/cip/reports.d.ts +0 -2
  336. package/dist/cjs/operations/cip/reports.js +0 -210
  337. package/dist/cjs/operations/cip/reports.js.map +0 -1
  338. package/dist/cjs/operations/cip/types.d.ts +0 -97
  339. package/dist/cjs/operations/cip/types.js +0 -7
  340. package/dist/cjs/operations/cip/types.js.map +0 -1
  341. package/dist/cjs/operations/code/cartridges.d.ts +0 -46
  342. package/dist/cjs/operations/code/cartridges.js +0 -69
  343. package/dist/cjs/operations/code/cartridges.js.map +0 -1
  344. package/dist/cjs/operations/code/deploy.d.ts +0 -121
  345. package/dist/cjs/operations/code/deploy.js +0 -255
  346. package/dist/cjs/operations/code/deploy.js.map +0 -1
  347. package/dist/cjs/operations/code/download.d.ts +0 -77
  348. package/dist/cjs/operations/code/download.js +0 -300
  349. package/dist/cjs/operations/code/download.js.map +0 -1
  350. package/dist/cjs/operations/code/index.d.ts +0 -74
  351. package/dist/cjs/operations/code/index.js +0 -80
  352. package/dist/cjs/operations/code/index.js.map +0 -1
  353. package/dist/cjs/operations/code/upload-files.d.ts +0 -47
  354. package/dist/cjs/operations/code/upload-files.js +0 -116
  355. package/dist/cjs/operations/code/upload-files.js.map +0 -1
  356. package/dist/cjs/operations/code/versions.d.ts +0 -99
  357. package/dist/cjs/operations/code/versions.js +0 -156
  358. package/dist/cjs/operations/code/versions.js.map +0 -1
  359. package/dist/cjs/operations/code/watch.d.ts +0 -58
  360. package/dist/cjs/operations/code/watch.js +0 -175
  361. package/dist/cjs/operations/code/watch.js.map +0 -1
  362. package/dist/cjs/operations/content/asset-query.d.ts +0 -22
  363. package/dist/cjs/operations/content/asset-query.js +0 -77
  364. package/dist/cjs/operations/content/asset-query.js.map +0 -1
  365. package/dist/cjs/operations/content/export.d.ts +0 -57
  366. package/dist/cjs/operations/content/export.js +0 -221
  367. package/dist/cjs/operations/content/export.js.map +0 -1
  368. package/dist/cjs/operations/content/index.d.ts +0 -56
  369. package/dist/cjs/operations/content/index.js +0 -60
  370. package/dist/cjs/operations/content/index.js.map +0 -1
  371. package/dist/cjs/operations/content/library.d.ts +0 -137
  372. package/dist/cjs/operations/content/library.js +0 -396
  373. package/dist/cjs/operations/content/library.js.map +0 -1
  374. package/dist/cjs/operations/content/types.d.ts +0 -144
  375. package/dist/cjs/operations/content/types.js +0 -7
  376. package/dist/cjs/operations/content/types.js.map +0 -1
  377. package/dist/cjs/operations/content/validate.d.ts +0 -64
  378. package/dist/cjs/operations/content/validate.js +0 -170
  379. package/dist/cjs/operations/content/validate.js.map +0 -1
  380. package/dist/cjs/operations/debug/dap-adapter.d.ts +0 -72
  381. package/dist/cjs/operations/debug/dap-adapter.js +0 -505
  382. package/dist/cjs/operations/debug/dap-adapter.js.map +0 -1
  383. package/dist/cjs/operations/debug/debug-session.d.ts +0 -51
  384. package/dist/cjs/operations/debug/debug-session.js +0 -234
  385. package/dist/cjs/operations/debug/debug-session.js.map +0 -1
  386. package/dist/cjs/operations/debug/index.d.ts +0 -20
  387. package/dist/cjs/operations/debug/index.js +0 -21
  388. package/dist/cjs/operations/debug/index.js.map +0 -1
  389. package/dist/cjs/operations/debug/projections.d.ts +0 -72
  390. package/dist/cjs/operations/debug/projections.js +0 -84
  391. package/dist/cjs/operations/debug/projections.js.map +0 -1
  392. package/dist/cjs/operations/debug/resolve-path.d.ts +0 -15
  393. package/dist/cjs/operations/debug/resolve-path.js +0 -52
  394. package/dist/cjs/operations/debug/resolve-path.js.map +0 -1
  395. package/dist/cjs/operations/debug/sdapi-client.d.ts +0 -44
  396. package/dist/cjs/operations/debug/sdapi-client.js +0 -169
  397. package/dist/cjs/operations/debug/sdapi-client.js.map +0 -1
  398. package/dist/cjs/operations/debug/source-mapping.d.ts +0 -13
  399. package/dist/cjs/operations/debug/source-mapping.js +0 -57
  400. package/dist/cjs/operations/debug/source-mapping.js.map +0 -1
  401. package/dist/cjs/operations/debug/types.d.ts +0 -95
  402. package/dist/cjs/operations/debug/types.js +0 -2
  403. package/dist/cjs/operations/debug/types.js.map +0 -1
  404. package/dist/cjs/operations/debug/variable-store.d.ts +0 -35
  405. package/dist/cjs/operations/debug/variable-store.js +0 -52
  406. package/dist/cjs/operations/debug/variable-store.js.map +0 -1
  407. package/dist/cjs/operations/jobs/index.d.ts +0 -66
  408. package/dist/cjs/operations/jobs/index.js +0 -72
  409. package/dist/cjs/operations/jobs/index.js.map +0 -1
  410. package/dist/cjs/operations/jobs/run.d.ts +0 -239
  411. package/dist/cjs/operations/jobs/run.js +0 -324
  412. package/dist/cjs/operations/jobs/run.js.map +0 -1
  413. package/dist/cjs/operations/jobs/site-archive.d.ts +0 -267
  414. package/dist/cjs/operations/jobs/site-archive.js +0 -423
  415. package/dist/cjs/operations/jobs/site-archive.js.map +0 -1
  416. package/dist/cjs/operations/logs/index.d.ts +0 -65
  417. package/dist/cjs/operations/logs/index.js +0 -73
  418. package/dist/cjs/operations/logs/index.js.map +0 -1
  419. package/dist/cjs/operations/logs/list.d.ts +0 -35
  420. package/dist/cjs/operations/logs/list.js +0 -144
  421. package/dist/cjs/operations/logs/list.js.map +0 -1
  422. package/dist/cjs/operations/logs/path-normalizer.d.ts +0 -82
  423. package/dist/cjs/operations/logs/path-normalizer.js +0 -190
  424. package/dist/cjs/operations/logs/path-normalizer.js.map +0 -1
  425. package/dist/cjs/operations/logs/tail.d.ts +0 -92
  426. package/dist/cjs/operations/logs/tail.js +0 -525
  427. package/dist/cjs/operations/logs/tail.js.map +0 -1
  428. package/dist/cjs/operations/logs/types.d.ts +0 -132
  429. package/dist/cjs/operations/logs/types.js +0 -7
  430. package/dist/cjs/operations/logs/types.js.map +0 -1
  431. package/dist/cjs/operations/mrt/access-control.d.ts +0 -192
  432. package/dist/cjs/operations/mrt/access-control.js +0 -152
  433. package/dist/cjs/operations/mrt/access-control.js.map +0 -1
  434. package/dist/cjs/operations/mrt/b2c-config.d.ts +0 -201
  435. package/dist/cjs/operations/mrt/b2c-config.js +0 -210
  436. package/dist/cjs/operations/mrt/b2c-config.js.map +0 -1
  437. package/dist/cjs/operations/mrt/bundle.d.ts +0 -114
  438. package/dist/cjs/operations/mrt/bundle.js +0 -166
  439. package/dist/cjs/operations/mrt/bundle.js.map +0 -1
  440. package/dist/cjs/operations/mrt/cache.d.ts +0 -80
  441. package/dist/cjs/operations/mrt/cache.js +0 -65
  442. package/dist/cjs/operations/mrt/cache.js.map +0 -1
  443. package/dist/cjs/operations/mrt/certificate.d.ts +0 -60
  444. package/dist/cjs/operations/mrt/certificate.js +0 -76
  445. package/dist/cjs/operations/mrt/certificate.js.map +0 -1
  446. package/dist/cjs/operations/mrt/deployment.d.ts +0 -157
  447. package/dist/cjs/operations/mrt/deployment.js +0 -109
  448. package/dist/cjs/operations/mrt/deployment.js.map +0 -1
  449. package/dist/cjs/operations/mrt/env-var.d.ts +0 -176
  450. package/dist/cjs/operations/mrt/env-var.js +0 -231
  451. package/dist/cjs/operations/mrt/env-var.js.map +0 -1
  452. package/dist/cjs/operations/mrt/env.d.ts +0 -491
  453. package/dist/cjs/operations/mrt/env.js +0 -425
  454. package/dist/cjs/operations/mrt/env.js.map +0 -1
  455. package/dist/cjs/operations/mrt/index.d.ts +0 -75
  456. package/dist/cjs/operations/mrt/index.js +0 -81
  457. package/dist/cjs/operations/mrt/index.js.map +0 -1
  458. package/dist/cjs/operations/mrt/member.d.ts +0 -281
  459. package/dist/cjs/operations/mrt/member.js +0 -244
  460. package/dist/cjs/operations/mrt/member.js.map +0 -1
  461. package/dist/cjs/operations/mrt/notification.d.ts +0 -252
  462. package/dist/cjs/operations/mrt/notification.js +0 -206
  463. package/dist/cjs/operations/mrt/notification.js.map +0 -1
  464. package/dist/cjs/operations/mrt/organization-member.d.ts +0 -68
  465. package/dist/cjs/operations/mrt/organization-member.js +0 -88
  466. package/dist/cjs/operations/mrt/organization-member.js.map +0 -1
  467. package/dist/cjs/operations/mrt/organization.d.ts +0 -80
  468. package/dist/cjs/operations/mrt/organization.js +0 -53
  469. package/dist/cjs/operations/mrt/organization.js.map +0 -1
  470. package/dist/cjs/operations/mrt/project.d.ts +0 -261
  471. package/dist/cjs/operations/mrt/project.js +0 -232
  472. package/dist/cjs/operations/mrt/project.js.map +0 -1
  473. package/dist/cjs/operations/mrt/push.d.ts +0 -290
  474. package/dist/cjs/operations/mrt/push.js +0 -288
  475. package/dist/cjs/operations/mrt/push.js.map +0 -1
  476. package/dist/cjs/operations/mrt/redirect.d.ts +0 -337
  477. package/dist/cjs/operations/mrt/redirect.js +0 -256
  478. package/dist/cjs/operations/mrt/redirect.js.map +0 -1
  479. package/dist/cjs/operations/mrt/tail-logs.d.ts +0 -130
  480. package/dist/cjs/operations/mrt/tail-logs.js +0 -224
  481. package/dist/cjs/operations/mrt/tail-logs.js.map +0 -1
  482. package/dist/cjs/operations/mrt/user.d.ts +0 -135
  483. package/dist/cjs/operations/mrt/user.js +0 -153
  484. package/dist/cjs/operations/mrt/user.js.map +0 -1
  485. package/dist/cjs/operations/ods/index.d.ts +0 -10
  486. package/dist/cjs/operations/ods/index.js +0 -14
  487. package/dist/cjs/operations/ods/index.js.map +0 -1
  488. package/dist/cjs/operations/ods/sandbox-lookup.d.ts +0 -63
  489. package/dist/cjs/operations/ods/sandbox-lookup.js +0 -130
  490. package/dist/cjs/operations/ods/sandbox-lookup.js.map +0 -1
  491. package/dist/cjs/operations/ods/wait-for-clone.d.ts +0 -46
  492. package/dist/cjs/operations/ods/wait-for-clone.js +0 -100
  493. package/dist/cjs/operations/ods/wait-for-clone.js.map +0 -1
  494. package/dist/cjs/operations/ods/wait-for-sandbox.d.ts +0 -64
  495. package/dist/cjs/operations/ods/wait-for-sandbox.js +0 -114
  496. package/dist/cjs/operations/ods/wait-for-sandbox.js.map +0 -1
  497. package/dist/cjs/operations/orgs/index.d.ts +0 -74
  498. package/dist/cjs/operations/orgs/index.js +0 -33
  499. package/dist/cjs/operations/orgs/index.js.map +0 -1
  500. package/dist/cjs/operations/roles/index.d.ts +0 -43
  501. package/dist/cjs/operations/roles/index.js +0 -48
  502. package/dist/cjs/operations/roles/index.js.map +0 -1
  503. package/dist/cjs/operations/sites/cartridges.d.ts +0 -114
  504. package/dist/cjs/operations/sites/cartridges.js +0 -378
  505. package/dist/cjs/operations/sites/cartridges.js.map +0 -1
  506. package/dist/cjs/operations/sites/index.d.ts +0 -46
  507. package/dist/cjs/operations/sites/index.js +0 -51
  508. package/dist/cjs/operations/sites/index.js.map +0 -1
  509. package/dist/cjs/operations/users/index.d.ts +0 -153
  510. package/dist/cjs/operations/users/index.js +0 -139
  511. package/dist/cjs/operations/users/index.js.map +0 -1
  512. package/dist/cjs/operations/util/zip.d.ts +0 -5
  513. package/dist/cjs/operations/util/zip.js +0 -25
  514. package/dist/cjs/operations/util/zip.js.map +0 -1
  515. package/dist/cjs/package.json +0 -1
  516. package/dist/cjs/plugins/discovery.d.ts +0 -46
  517. package/dist/cjs/plugins/discovery.js +0 -122
  518. package/dist/cjs/plugins/discovery.js.map +0 -1
  519. package/dist/cjs/plugins/index.d.ts +0 -26
  520. package/dist/cjs/plugins/index.js +0 -32
  521. package/dist/cjs/plugins/index.js.map +0 -1
  522. package/dist/cjs/plugins/loader.d.ts +0 -34
  523. package/dist/cjs/plugins/loader.js +0 -59
  524. package/dist/cjs/plugins/loader.js.map +0 -1
  525. package/dist/cjs/plugins/manager.d.ts +0 -70
  526. package/dist/cjs/plugins/manager.js +0 -173
  527. package/dist/cjs/plugins/manager.js.map +0 -1
  528. package/dist/cjs/safety/index.d.ts +0 -12
  529. package/dist/cjs/safety/index.js +0 -11
  530. package/dist/cjs/safety/index.js.map +0 -1
  531. package/dist/cjs/safety/safety-guard.d.ts +0 -92
  532. package/dist/cjs/safety/safety-guard.js +0 -270
  533. package/dist/cjs/safety/safety-guard.js.map +0 -1
  534. package/dist/cjs/safety/safety-middleware.d.ts +0 -130
  535. package/dist/cjs/safety/safety-middleware.js +0 -248
  536. package/dist/cjs/safety/safety-middleware.js.map +0 -1
  537. package/dist/cjs/safety/types.d.ts +0 -81
  538. package/dist/cjs/safety/types.js +0 -16
  539. package/dist/cjs/safety/types.js.map +0 -1
  540. package/dist/cjs/safety/with-confirmation.d.ts +0 -58
  541. package/dist/cjs/safety/with-confirmation.js +0 -67
  542. package/dist/cjs/safety/with-confirmation.js.map +0 -1
  543. package/dist/cjs/scaffold/engine.d.ts +0 -68
  544. package/dist/cjs/scaffold/engine.js +0 -149
  545. package/dist/cjs/scaffold/engine.js.map +0 -1
  546. package/dist/cjs/scaffold/executor.d.ts +0 -36
  547. package/dist/cjs/scaffold/executor.js +0 -293
  548. package/dist/cjs/scaffold/executor.js.map +0 -1
  549. package/dist/cjs/scaffold/index.d.ts +0 -76
  550. package/dist/cjs/scaffold/index.js +0 -23
  551. package/dist/cjs/scaffold/index.js.map +0 -1
  552. package/dist/cjs/scaffold/merge.d.ts +0 -63
  553. package/dist/cjs/scaffold/merge.js +0 -192
  554. package/dist/cjs/scaffold/merge.js.map +0 -1
  555. package/dist/cjs/scaffold/parameter-resolver.d.ts +0 -86
  556. package/dist/cjs/scaffold/parameter-resolver.js +0 -191
  557. package/dist/cjs/scaffold/parameter-resolver.js.map +0 -1
  558. package/dist/cjs/scaffold/registry.d.ts +0 -60
  559. package/dist/cjs/scaffold/registry.js +0 -225
  560. package/dist/cjs/scaffold/registry.js.map +0 -1
  561. package/dist/cjs/scaffold/sources.d.ts +0 -83
  562. package/dist/cjs/scaffold/sources.js +0 -236
  563. package/dist/cjs/scaffold/sources.js.map +0 -1
  564. package/dist/cjs/scaffold/types.d.ts +0 -282
  565. package/dist/cjs/scaffold/types.js +0 -14
  566. package/dist/cjs/scaffold/types.js.map +0 -1
  567. package/dist/cjs/scaffold/validation.d.ts +0 -81
  568. package/dist/cjs/scaffold/validation.js +0 -250
  569. package/dist/cjs/scaffold/validation.js.map +0 -1
  570. package/dist/cjs/scaffold/validators.d.ts +0 -33
  571. package/dist/cjs/scaffold/validators.js +0 -340
  572. package/dist/cjs/scaffold/validators.js.map +0 -1
  573. package/dist/cjs/schemas/collapse.d.ts +0 -150
  574. package/dist/cjs/schemas/collapse.js +0 -180
  575. package/dist/cjs/schemas/collapse.js.map +0 -1
  576. package/dist/cjs/schemas/index.d.ts +0 -58
  577. package/dist/cjs/schemas/index.js +0 -65
  578. package/dist/cjs/schemas/index.js.map +0 -1
  579. package/dist/cjs/schemas/security-schemes.d.ts +0 -26
  580. package/dist/cjs/schemas/security-schemes.js +0 -44
  581. package/dist/cjs/schemas/security-schemes.js.map +0 -1
  582. package/dist/cjs/skills/agents.d.ts +0 -42
  583. package/dist/cjs/skills/agents.js +0 -200
  584. package/dist/cjs/skills/agents.js.map +0 -1
  585. package/dist/cjs/skills/github.d.ts +0 -31
  586. package/dist/cjs/skills/github.js +0 -450
  587. package/dist/cjs/skills/github.js.map +0 -1
  588. package/dist/cjs/skills/index.d.ts +0 -43
  589. package/dist/cjs/skills/index.js +0 -16
  590. package/dist/cjs/skills/index.js.map +0 -1
  591. package/dist/cjs/skills/installer.d.ts +0 -35
  592. package/dist/cjs/skills/installer.js +0 -182
  593. package/dist/cjs/skills/installer.js.map +0 -1
  594. package/dist/cjs/skills/parser.d.ts +0 -39
  595. package/dist/cjs/skills/parser.js +0 -126
  596. package/dist/cjs/skills/parser.js.map +0 -1
  597. package/dist/cjs/skills/sources.d.ts +0 -4
  598. package/dist/cjs/skills/sources.js +0 -52
  599. package/dist/cjs/skills/sources.js.map +0 -1
  600. package/dist/cjs/skills/types.d.ts +0 -153
  601. package/dist/cjs/skills/types.js +0 -7
  602. package/dist/cjs/skills/types.js.map +0 -1
  603. package/dist/cjs/slas/index.d.ts +0 -12
  604. package/dist/cjs/slas/index.js +0 -8
  605. package/dist/cjs/slas/index.js.map +0 -1
  606. package/dist/cjs/slas/pkce.d.ts +0 -13
  607. package/dist/cjs/slas/pkce.js +0 -35
  608. package/dist/cjs/slas/pkce.js.map +0 -1
  609. package/dist/cjs/slas/token.d.ts +0 -24
  610. package/dist/cjs/slas/token.js +0 -261
  611. package/dist/cjs/slas/token.js.map +0 -1
  612. package/dist/cjs/slas/types.d.ts +0 -43
  613. package/dist/cjs/slas/types.js +0 -7
  614. package/dist/cjs/slas/types.js.map +0 -1
  615. package/dist/cjs/telemetry/index.d.ts +0 -34
  616. package/dist/cjs/telemetry/index.js +0 -32
  617. package/dist/cjs/telemetry/index.js.map +0 -1
  618. package/dist/cjs/telemetry/telemetry.d.ts +0 -88
  619. package/dist/cjs/telemetry/telemetry.js +0 -298
  620. package/dist/cjs/telemetry/telemetry.js.map +0 -1
  621. package/dist/cjs/telemetry/types.d.ts +0 -62
  622. package/dist/cjs/telemetry/types.js +0 -7
  623. package/dist/cjs/telemetry/types.js.map +0 -1
  624. package/dist/cjs/test-utils/config-isolation.d.ts +0 -2
  625. package/dist/cjs/test-utils/config-isolation.js +0 -48
  626. package/dist/cjs/test-utils/config-isolation.js.map +0 -1
  627. package/dist/cjs/test-utils/index.d.ts +0 -1
  628. package/dist/cjs/test-utils/index.js +0 -7
  629. package/dist/cjs/test-utils/index.js.map +0 -1
  630. package/dist/cjs/ux/confirm.d.ts +0 -14
  631. package/dist/cjs/ux/confirm.js +0 -36
  632. package/dist/cjs/ux/confirm.js.map +0 -1
  633. package/dist/cjs/ux/index.d.ts +0 -1
  634. package/dist/cjs/ux/index.js +0 -7
  635. package/dist/cjs/ux/index.js.map +0 -1
  636. package/dist/cjs/version.d.ts +0 -14
  637. package/dist/cjs/version.js +0 -29
  638. package/dist/cjs/version.js.map +0 -1
@@ -1,270 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"safety-guard.js","sourceRoot":"","sources":["../../../src/safety/safety-guard.ts"],"names":[],"mappings":"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"}
@@ -1,130 +0,0 @@
1
- import type { SafetyRule } from './types.js';
2
- import type { SafetyEvaluation } from './types.js';
3
- /**
4
- * Safety levels for preventing destructive operations.
5
- *
6
- * - NONE: No safety restrictions (default)
7
- * - NO_DELETE: Block DELETE operations only
8
- * - NO_UPDATE: Block DELETE and destructive operations (reset, stop, restart)
9
- * - READ_ONLY: Block all write operations (only GET allowed)
10
- */
11
- export type SafetyLevel = 'NONE' | 'NO_DELETE' | 'NO_UPDATE' | 'READ_ONLY';
12
- /**
13
- * Safety configuration.
14
- *
15
- * Supports both simple level-based blocking and granular per-rule actions.
16
- */
17
- export interface SafetyConfig {
18
- /** The base safety level. */
19
- level: SafetyLevel;
20
- /** When true, operations that the level would block require confirmation instead of hard-blocking. */
21
- confirm?: boolean;
22
- /** Ordered list of rules. First matching rule wins. */
23
- rules?: SafetyRule[];
24
- }
25
- /**
26
- * Returns the more restrictive of two safety levels.
27
- */
28
- export declare function maxSafetyLevel(a: SafetyLevel, b: SafetyLevel): SafetyLevel;
29
- /**
30
- * Check if a string is a valid SafetyLevel.
31
- */
32
- export declare function isValidSafetyLevel(value: string): value is SafetyLevel;
33
- /**
34
- * Parse a string to a SafetyLevel, returning undefined for invalid values.
35
- * Accepts case-insensitive input and converts dashes to underscores.
36
- */
37
- export declare function parseSafetyLevelString(value: string | undefined): SafetyLevel | undefined;
38
- /**
39
- * Safety error thrown when an operation is blocked by safety configuration.
40
- */
41
- export declare class SafetyBlockedError extends Error {
42
- readonly method: string;
43
- readonly url: string;
44
- readonly safetyLevel: SafetyLevel;
45
- constructor(message: string, method: string, url: string, safetyLevel: SafetyLevel);
46
- }
47
- /**
48
- * Error thrown when an operation requires interactive confirmation.
49
- *
50
- * Callers can catch this error, prompt the user, and retry the operation
51
- * using {@link withSafetyConfirmation}.
52
- */
53
- export declare class SafetyConfirmationRequired extends Error {
54
- readonly evaluation: SafetyEvaluation;
55
- constructor(evaluation: SafetyEvaluation);
56
- }
57
- /**
58
- * Checks if an HTTP operation should be blocked based on a safety level.
59
- *
60
- * This is the low-level level check. For full rule-based evaluation,
61
- * use {@link SafetyGuard.evaluate}.
62
- *
63
- * @param method - HTTP method (GET, POST, PUT, PATCH, DELETE)
64
- * @param path - URL pathname
65
- * @param level - Safety level to check against
66
- * @returns Error message if blocked, undefined if allowed
67
- */
68
- export declare function checkLevelViolation(method: string, path: string, level: SafetyLevel): string | undefined;
69
- /**
70
- * Checks if an HTTP operation should be blocked based on safety configuration.
71
- *
72
- * @param method - HTTP method (GET, POST, PUT, PATCH, DELETE)
73
- * @param url - Request URL
74
- * @param config - Safety configuration
75
- * @returns Error message if blocked, undefined if allowed
76
- * @deprecated Use {@link SafetyGuard.evaluate} for full rule-based evaluation.
77
- */
78
- export declare function checkSafetyViolation(method: string, url: string, config: SafetyConfig): string | undefined;
79
- /**
80
- * Parse safety level from environment variable.
81
- *
82
- * Reads from SFCC_SAFETY_LEVEL. Valid values: NONE, NO_DELETE, NO_UPDATE, READ_ONLY
83
- * (case-insensitive; dashes converted to underscores). Invalid values are logged
84
- * as a warning and the default level is returned.
85
- *
86
- * @param defaultLevel - Default level if no environment variable is set or value is invalid
87
- * @returns Parsed safety level
88
- */
89
- export declare function getSafetyLevel(defaultLevel?: SafetyLevel): SafetyLevel;
90
- /**
91
- * Get a user-friendly description of the safety level.
92
- */
93
- export declare function describeSafetyLevel(level: SafetyLevel): string;
94
- /** Validated safety config fragment (shared by global and per-instance). */
95
- export interface SafetyConfigFragment {
96
- level?: SafetyLevel;
97
- confirm?: boolean;
98
- rules?: SafetyRule[];
99
- }
100
- /**
101
- * Load global safety configuration from a JSON file.
102
- *
103
- * Resolution order:
104
- * 1. `SFCC_SAFETY_CONFIG` env var — explicit path to a safety config file
105
- * 2. `{configDir}/safety.json` — oclif config directory (e.g., `~/.config/b2c/safety.json`)
106
- *
107
- * The file has the same shape as the `safety` object in dw.json:
108
- * ```json
109
- * { "level": "NO_DELETE", "confirm": true, "rules": [...] }
110
- * ```
111
- *
112
- * @param configDir - oclif config directory path (e.g., `this.config.configDir`)
113
- * @returns Validated safety config fragment, or undefined if no file found
114
- */
115
- export declare function loadGlobalSafetyConfig(configDir?: string): SafetyConfigFragment | undefined;
116
- /**
117
- * Compute effective safety config by merging environment variables, global
118
- * safety config, and per-instance config.
119
- *
120
- * Merge strategy:
121
- * - **Level**: `max(env, global, instance)` — most restrictive wins
122
- * - **Confirm**: OR across all sources
123
- * - **Rules**: instance rules first, then global rules (first-match-wins,
124
- * so instance rules can override global policy)
125
- *
126
- * @param instanceSafety - Per-instance safety config from dw.json
127
- * @param globalSafety - Global safety config from safety.json
128
- * @returns Merged SafetyConfig
129
- */
130
- export declare function resolveEffectiveSafetyConfig(instanceSafety?: SafetyConfigFragment, globalSafety?: SafetyConfigFragment): SafetyConfig;
@@ -1,248 +0,0 @@
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
- import { existsSync, readFileSync } from 'node:fs';
7
- import { join } from 'node:path';
8
- import { getLogger } from '../logging/logger.js';
9
- import { isValidSafetyAction } from './types.js';
10
- /**
11
- * Ordering of safety levels from least to most restrictive.
12
- */
13
- const LEVEL_ORDER = {
14
- NONE: 0,
15
- NO_DELETE: 1,
16
- NO_UPDATE: 2,
17
- READ_ONLY: 3,
18
- };
19
- /**
20
- * Valid safety level strings.
21
- */
22
- const VALID_LEVELS = ['NONE', 'NO_DELETE', 'NO_UPDATE', 'READ_ONLY'];
23
- /**
24
- * Returns the more restrictive of two safety levels.
25
- */
26
- export function maxSafetyLevel(a, b) {
27
- return LEVEL_ORDER[a] >= LEVEL_ORDER[b] ? a : b;
28
- }
29
- /**
30
- * Check if a string is a valid SafetyLevel.
31
- */
32
- export function isValidSafetyLevel(value) {
33
- return VALID_LEVELS.includes(value);
34
- }
35
- /**
36
- * Parse a string to a SafetyLevel, returning undefined for invalid values.
37
- * Accepts case-insensitive input and converts dashes to underscores.
38
- */
39
- export function parseSafetyLevelString(value) {
40
- if (!value)
41
- return undefined;
42
- const normalized = value.toUpperCase().replace(/-/g, '_');
43
- return isValidSafetyLevel(normalized) ? normalized : undefined;
44
- }
45
- /**
46
- * Safety error thrown when an operation is blocked by safety configuration.
47
- */
48
- export class SafetyBlockedError extends Error {
49
- method;
50
- url;
51
- safetyLevel;
52
- constructor(message, method, url, safetyLevel) {
53
- super(message);
54
- this.method = method;
55
- this.url = url;
56
- this.safetyLevel = safetyLevel;
57
- this.name = 'SafetyBlockedError';
58
- }
59
- }
60
- /**
61
- * Error thrown when an operation requires interactive confirmation.
62
- *
63
- * Callers can catch this error, prompt the user, and retry the operation
64
- * using {@link withSafetyConfirmation}.
65
- */
66
- export class SafetyConfirmationRequired extends Error {
67
- evaluation;
68
- constructor(evaluation) {
69
- super(`Confirmation required: ${evaluation.reason}`);
70
- this.evaluation = evaluation;
71
- this.name = 'SafetyConfirmationRequired';
72
- }
73
- }
74
- /**
75
- * Checks if an HTTP operation should be blocked based on a safety level.
76
- *
77
- * This is the low-level level check. For full rule-based evaluation,
78
- * use {@link SafetyGuard.evaluate}.
79
- *
80
- * @param method - HTTP method (GET, POST, PUT, PATCH, DELETE)
81
- * @param path - URL pathname
82
- * @param level - Safety level to check against
83
- * @returns Error message if blocked, undefined if allowed
84
- */
85
- export function checkLevelViolation(method, path, level) {
86
- const upperMethod = method.toUpperCase();
87
- switch (level) {
88
- case 'NONE':
89
- return undefined;
90
- case 'NO_DELETE':
91
- if (upperMethod === 'DELETE') {
92
- return `Delete operation blocked: DELETE ${path} (NO_DELETE mode prevents deletions)`;
93
- }
94
- return undefined;
95
- case 'NO_UPDATE': {
96
- if (upperMethod === 'DELETE') {
97
- return `Delete operation blocked: DELETE ${path} (NO_UPDATE mode prevents deletions)`;
98
- }
99
- const destructivePatterns = ['/reset', '/stop', '/restart', '/operations'];
100
- if (destructivePatterns.some((pattern) => path.includes(pattern)) && upperMethod === 'POST') {
101
- return `Destructive operation blocked: POST ${path} (NO_UPDATE mode prevents reset/stop/restart)`;
102
- }
103
- return undefined;
104
- }
105
- case 'READ_ONLY':
106
- if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(upperMethod)) {
107
- return `Write operation blocked: ${upperMethod} ${path} (READ_ONLY mode prevents all modifications)`;
108
- }
109
- return undefined;
110
- default:
111
- return undefined;
112
- }
113
- }
114
- /**
115
- * Checks if an HTTP operation should be blocked based on safety configuration.
116
- *
117
- * @param method - HTTP method (GET, POST, PUT, PATCH, DELETE)
118
- * @param url - Request URL
119
- * @param config - Safety configuration
120
- * @returns Error message if blocked, undefined if allowed
121
- * @deprecated Use {@link SafetyGuard.evaluate} for full rule-based evaluation.
122
- */
123
- export function checkSafetyViolation(method, url, config) {
124
- const path = new URL(url, 'http://dummy').pathname;
125
- return checkLevelViolation(method, path, config.level);
126
- }
127
- /**
128
- * Parse safety level from environment variable.
129
- *
130
- * Reads from SFCC_SAFETY_LEVEL. Valid values: NONE, NO_DELETE, NO_UPDATE, READ_ONLY
131
- * (case-insensitive; dashes converted to underscores). Invalid values are logged
132
- * as a warning and the default level is returned.
133
- *
134
- * @param defaultLevel - Default level if no environment variable is set or value is invalid
135
- * @returns Parsed safety level
136
- */
137
- export function getSafetyLevel(defaultLevel = 'NONE') {
138
- const safetyLevelEnv = process.env['SFCC_SAFETY_LEVEL'];
139
- if (safetyLevelEnv) {
140
- const parsed = parseSafetyLevelString(safetyLevelEnv);
141
- if (parsed)
142
- return parsed;
143
- getLogger().warn({ envValue: safetyLevelEnv, validValues: VALID_LEVELS }, 'SFCC_SAFETY_LEVEL has an invalid value; using default safety level');
144
- }
145
- return defaultLevel;
146
- }
147
- /**
148
- * Get a user-friendly description of the safety level.
149
- */
150
- export function describeSafetyLevel(level) {
151
- switch (level) {
152
- case 'NONE':
153
- return 'No safety restrictions';
154
- case 'NO_DELETE':
155
- return 'Delete operations blocked';
156
- case 'NO_UPDATE':
157
- return 'Destructive operations blocked (delete, reset, stop, restart)';
158
- case 'READ_ONLY':
159
- return 'Read-only mode - all write operations blocked';
160
- default:
161
- return 'Unknown safety level';
162
- }
163
- }
164
- /**
165
- * Load global safety configuration from a JSON file.
166
- *
167
- * Resolution order:
168
- * 1. `SFCC_SAFETY_CONFIG` env var — explicit path to a safety config file
169
- * 2. `{configDir}/safety.json` — oclif config directory (e.g., `~/.config/b2c/safety.json`)
170
- *
171
- * The file has the same shape as the `safety` object in dw.json:
172
- * ```json
173
- * { "level": "NO_DELETE", "confirm": true, "rules": [...] }
174
- * ```
175
- *
176
- * @param configDir - oclif config directory path (e.g., `this.config.configDir`)
177
- * @returns Validated safety config fragment, or undefined if no file found
178
- */
179
- export function loadGlobalSafetyConfig(configDir) {
180
- const logger = getLogger();
181
- // 1. Check SFCC_SAFETY_CONFIG env var
182
- const envPath = process.env['SFCC_SAFETY_CONFIG'];
183
- const filePath = envPath || (configDir ? join(configDir, 'safety.json') : undefined);
184
- if (!filePath || !existsSync(filePath)) {
185
- return undefined;
186
- }
187
- try {
188
- const raw = JSON.parse(readFileSync(filePath, 'utf-8'));
189
- const result = {};
190
- if (raw.level) {
191
- const parsed = parseSafetyLevelString(raw.level);
192
- if (parsed) {
193
- result.level = parsed;
194
- }
195
- else {
196
- logger.warn({ level: raw.level, file: filePath }, 'Invalid safety level in global safety config; ignoring');
197
- }
198
- }
199
- if (raw.confirm !== undefined) {
200
- result.confirm = raw.confirm === true;
201
- }
202
- if (raw.rules && Array.isArray(raw.rules)) {
203
- result.rules = raw.rules.filter((r) => {
204
- if (!isValidSafetyAction(r.action)) {
205
- logger.warn({ rule: r, file: filePath }, 'Invalid safety rule action in global safety config; skipping rule');
206
- return false;
207
- }
208
- return true;
209
- });
210
- }
211
- logger.trace({ filePath, level: result.level, ruleCount: result.rules?.length }, 'Loaded global safety config');
212
- return result;
213
- }
214
- catch (error) {
215
- logger.warn({ error, file: filePath }, 'Failed to load global safety config; ignoring');
216
- return undefined;
217
- }
218
- }
219
- /**
220
- * Compute effective safety config by merging environment variables, global
221
- * safety config, and per-instance config.
222
- *
223
- * Merge strategy:
224
- * - **Level**: `max(env, global, instance)` — most restrictive wins
225
- * - **Confirm**: OR across all sources
226
- * - **Rules**: instance rules first, then global rules (first-match-wins,
227
- * so instance rules can override global policy)
228
- *
229
- * @param instanceSafety - Per-instance safety config from dw.json
230
- * @param globalSafety - Global safety config from safety.json
231
- * @returns Merged SafetyConfig
232
- */
233
- export function resolveEffectiveSafetyConfig(instanceSafety, globalSafety) {
234
- const envLevel = getSafetyLevel('NONE');
235
- const envConfirm = process.env['SFCC_SAFETY_CONFIRM'] === 'true' || process.env['SFCC_SAFETY_CONFIRM'] === '1';
236
- const instanceLevel = instanceSafety?.level ?? 'NONE';
237
- const globalLevel = globalSafety?.level ?? 'NONE';
238
- // Merge rules: instance first, then global (first-match-wins)
239
- const instanceRules = instanceSafety?.rules ?? [];
240
- const globalRules = globalSafety?.rules ?? [];
241
- const mergedRules = [...instanceRules, ...globalRules];
242
- return {
243
- level: maxSafetyLevel(envLevel, maxSafetyLevel(globalLevel, instanceLevel)),
244
- confirm: envConfirm || instanceSafety?.confirm === true || globalSafety?.confirm === true,
245
- rules: mergedRules.length > 0 ? mergedRules : undefined,
246
- };
247
- }
248
- //# sourceMappingURL=safety-middleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safety-middleware.js","sourceRoot":"","sources":["../../../src/safety/safety-middleware.ts"],"names":[],"mappings":"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"}