@salesforce/b2c-tooling-sdk 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +180 -13
  2. package/data/scaffolds/cartridge/files/.project.ejs +17 -0
  3. package/data/scaffolds/cartridge/files/cartridge/cartridge.properties.ejs +4 -0
  4. package/data/scaffolds/cartridge/files/cartridge/controllers/Example.js.ejs +19 -0
  5. package/data/scaffolds/cartridge/files/cartridge/models/example.js.ejs +14 -0
  6. package/data/scaffolds/cartridge/files/cartridge/scripts/helpers/exampleHelpers.js.ejs +18 -0
  7. package/data/scaffolds/cartridge/files/cartridge/static/default/css/example.css +6 -0
  8. package/data/scaffolds/cartridge/files/cartridge/templates/default/example/show.isml.ejs +11 -0
  9. package/data/scaffolds/cartridge/scaffold.json +88 -0
  10. package/data/scaffolds/controller/files/controller.js.ejs +134 -0
  11. package/data/scaffolds/controller/files/template.isml.ejs +22 -0
  12. package/data/scaffolds/controller/scaffold.json +64 -0
  13. package/data/scaffolds/custom-api/files/api.json.ejs +11 -0
  14. package/data/scaffolds/custom-api/files/schema.yaml.ejs +188 -0
  15. package/data/scaffolds/custom-api/files/script.js.ejs +95 -0
  16. package/data/scaffolds/custom-api/scaffold.json +65 -0
  17. package/data/scaffolds/hook/files/hook.js.ejs +99 -0
  18. package/data/scaffolds/hook/files/hooks-entry.json.ejs +6 -0
  19. package/data/scaffolds/hook/scaffold.json +60 -0
  20. package/data/scaffolds/job-step/files/step-chunk.js.ejs +136 -0
  21. package/data/scaffolds/job-step/files/step-task.js.ejs +47 -0
  22. package/data/scaffolds/job-step/files/steptypes-entry.json.ejs +41 -0
  23. package/data/scaffolds/job-step/scaffold.json +64 -0
  24. package/data/scaffolds/page-designer-component/files/component.isml.ejs +23 -0
  25. package/data/scaffolds/page-designer-component/files/component.js.ejs +35 -0
  26. package/data/scaffolds/page-designer-component/files/component.json.ejs +50 -0
  27. package/data/scaffolds/page-designer-component/scaffold.json +66 -0
  28. package/data/scaffolds/service/files/service-http.js.ejs +245 -0
  29. package/data/scaffolds/service/files/service-sftp.js.ejs +371 -0
  30. package/data/scaffolds/service/files/service-soap.js.ejs +230 -0
  31. package/data/scaffolds/service/scaffold.json +83 -0
  32. package/data/script-api/dw.extensions.payments.SalesforcePaymentsMgr.md +48 -0
  33. package/data/script-api/dw.system.Request.md +5 -0
  34. package/data/script-api/dw.web.Cookie.md +108 -31
  35. package/data/script-api/index.json +2 -2
  36. package/data/script-api/index.md +1 -1
  37. package/dist/cjs/auth/oauth-implicit.d.ts +1 -0
  38. package/dist/cjs/auth/oauth-implicit.js +8 -3
  39. package/dist/cjs/auth/oauth-implicit.js.map +1 -1
  40. package/dist/cjs/auth/oauth.d.ts +1 -0
  41. package/dist/cjs/auth/oauth.js +8 -3
  42. package/dist/cjs/auth/oauth.js.map +1 -1
  43. package/dist/cjs/auth/types.d.ts +5 -0
  44. package/dist/cjs/auth/types.js.map +1 -1
  45. package/dist/cjs/cli/am-command.d.ts +74 -0
  46. package/dist/cjs/cli/am-command.js +191 -0
  47. package/dist/cjs/cli/am-command.js.map +1 -0
  48. package/dist/cjs/cli/base-command.d.ts +38 -0
  49. package/dist/cjs/cli/base-command.js +142 -0
  50. package/dist/cjs/cli/base-command.js.map +1 -1
  51. package/dist/cjs/cli/config.d.ts +9 -0
  52. package/dist/cjs/cli/config.js +20 -3
  53. package/dist/cjs/cli/config.js.map +1 -1
  54. package/dist/cjs/cli/index.d.ts +1 -0
  55. package/dist/cjs/cli/index.js +1 -0
  56. package/dist/cjs/cli/index.js.map +1 -1
  57. package/dist/cjs/cli/instance-command.d.ts +2 -1
  58. package/dist/cjs/cli/oauth-command.d.ts +22 -2
  59. package/dist/cjs/cli/oauth-command.js +53 -8
  60. package/dist/cjs/cli/oauth-command.js.map +1 -1
  61. package/dist/cjs/cli/ods-command.d.ts +6 -2
  62. package/dist/cjs/cli/ods-command.js +10 -4
  63. package/dist/cjs/cli/ods-command.js.map +1 -1
  64. package/dist/cjs/cli/webdav-command.d.ts +2 -1
  65. package/dist/cjs/clients/am-api.d.ts +521 -0
  66. package/dist/cjs/clients/am-api.js +986 -0
  67. package/dist/cjs/clients/am-api.js.map +1 -0
  68. package/dist/cjs/clients/am-apiclients-api.generated.d.ts +803 -0
  69. package/dist/cjs/clients/am-apiclients-api.generated.js +6 -0
  70. package/dist/cjs/clients/am-apiclients-api.generated.js.map +1 -0
  71. package/dist/cjs/clients/am-roles-api.generated.d.ts +298 -0
  72. package/dist/cjs/clients/am-roles-api.generated.js +6 -0
  73. package/dist/cjs/clients/am-roles-api.generated.js.map +1 -0
  74. package/dist/cjs/clients/am-users-api.generated.d.ts +954 -0
  75. package/dist/cjs/clients/am-users-api.generated.js +6 -0
  76. package/dist/cjs/clients/am-users-api.generated.js.map +1 -0
  77. package/dist/cjs/clients/index.d.ts +4 -2
  78. package/dist/cjs/clients/index.js +2 -1
  79. package/dist/cjs/clients/index.js.map +1 -1
  80. package/dist/cjs/clients/middleware-registry.d.ts +1 -1
  81. package/dist/cjs/clients/middleware-registry.js.map +1 -1
  82. package/dist/cjs/clients/middleware.d.ts +49 -2
  83. package/dist/cjs/clients/middleware.js +214 -2
  84. package/dist/cjs/clients/middleware.js.map +1 -1
  85. package/dist/cjs/clients/mrt.js +5 -1
  86. package/dist/cjs/clients/mrt.js.map +1 -1
  87. package/dist/cjs/config/dw-json.d.ts +104 -33
  88. package/dist/cjs/config/dw-json.js +167 -2
  89. package/dist/cjs/config/dw-json.js.map +1 -1
  90. package/dist/cjs/config/index.d.ts +6 -4
  91. package/dist/cjs/config/index.js +6 -2
  92. package/dist/cjs/config/index.js.map +1 -1
  93. package/dist/cjs/config/instance-manager.d.ts +97 -0
  94. package/dist/cjs/config/instance-manager.js +166 -0
  95. package/dist/cjs/config/instance-manager.js.map +1 -0
  96. package/dist/cjs/config/mapping.d.ts +63 -5
  97. package/dist/cjs/config/mapping.js +165 -20
  98. package/dist/cjs/config/mapping.js.map +1 -1
  99. package/dist/cjs/config/sources/dw-json-source.d.ts +17 -1
  100. package/dist/cjs/config/sources/dw-json-source.js +70 -3
  101. package/dist/cjs/config/sources/dw-json-source.js.map +1 -1
  102. package/dist/cjs/config/sources/package-json-source.js +6 -3
  103. package/dist/cjs/config/sources/package-json-source.js.map +1 -1
  104. package/dist/cjs/config/types.d.ts +72 -0
  105. package/dist/cjs/defaults.d.ts +6 -0
  106. package/dist/cjs/defaults.js +6 -0
  107. package/dist/cjs/defaults.js.map +1 -1
  108. package/dist/cjs/i18n/index.js +3 -0
  109. package/dist/cjs/i18n/index.js.map +1 -1
  110. package/dist/cjs/index.d.ts +8 -4
  111. package/dist/cjs/index.js +9 -3
  112. package/dist/cjs/index.js.map +1 -1
  113. package/dist/cjs/logging/logger.js +13 -1
  114. package/dist/cjs/logging/logger.js.map +1 -1
  115. package/dist/cjs/operations/content/asset-query.d.ts +22 -0
  116. package/dist/cjs/operations/content/asset-query.js +77 -0
  117. package/dist/cjs/operations/content/asset-query.js.map +1 -0
  118. package/dist/cjs/operations/content/export.d.ts +57 -0
  119. package/dist/cjs/operations/content/export.js +224 -0
  120. package/dist/cjs/operations/content/export.js.map +1 -0
  121. package/dist/cjs/operations/content/index.d.ts +43 -0
  122. package/dist/cjs/operations/content/index.js +48 -0
  123. package/dist/cjs/operations/content/index.js.map +1 -0
  124. package/dist/cjs/operations/content/library.d.ts +137 -0
  125. package/dist/cjs/operations/content/library.js +392 -0
  126. package/dist/cjs/operations/content/library.js.map +1 -0
  127. package/dist/cjs/operations/content/types.d.ts +144 -0
  128. package/dist/cjs/operations/content/types.js +7 -0
  129. package/dist/cjs/operations/content/types.js.map +1 -0
  130. package/dist/cjs/operations/mrt/b2c-config.js +19 -4
  131. package/dist/cjs/operations/mrt/b2c-config.js.map +1 -1
  132. package/dist/cjs/operations/mrt/index.d.ts +2 -0
  133. package/dist/cjs/operations/mrt/index.js +2 -0
  134. package/dist/cjs/operations/mrt/index.js.map +1 -1
  135. package/dist/cjs/operations/mrt/tail-logs.d.ts +130 -0
  136. package/dist/cjs/operations/mrt/tail-logs.js +223 -0
  137. package/dist/cjs/operations/mrt/tail-logs.js.map +1 -0
  138. package/dist/cjs/operations/ods/index.d.ts +2 -0
  139. package/dist/cjs/operations/ods/index.js +1 -0
  140. package/dist/cjs/operations/ods/index.js.map +1 -1
  141. package/dist/cjs/operations/ods/wait-for-sandbox.d.ts +64 -0
  142. package/dist/cjs/operations/ods/wait-for-sandbox.js +114 -0
  143. package/dist/cjs/operations/ods/wait-for-sandbox.js.map +1 -0
  144. package/dist/cjs/operations/orgs/index.d.ts +74 -0
  145. package/dist/cjs/operations/orgs/index.js +33 -0
  146. package/dist/cjs/operations/orgs/index.js.map +1 -0
  147. package/dist/cjs/operations/roles/index.d.ts +43 -0
  148. package/dist/cjs/operations/roles/index.js +48 -0
  149. package/dist/cjs/operations/roles/index.js.map +1 -0
  150. package/dist/cjs/operations/users/index.d.ts +153 -0
  151. package/dist/cjs/operations/users/index.js +139 -0
  152. package/dist/cjs/operations/users/index.js.map +1 -0
  153. package/dist/cjs/scaffold/engine.d.ts +68 -0
  154. package/dist/cjs/scaffold/engine.js +149 -0
  155. package/dist/cjs/scaffold/engine.js.map +1 -0
  156. package/dist/cjs/scaffold/executor.d.ts +36 -0
  157. package/dist/cjs/scaffold/executor.js +285 -0
  158. package/dist/cjs/scaffold/executor.js.map +1 -0
  159. package/dist/cjs/scaffold/index.d.ts +74 -0
  160. package/dist/cjs/scaffold/index.js +23 -0
  161. package/dist/cjs/scaffold/index.js.map +1 -0
  162. package/dist/cjs/scaffold/merge.d.ts +56 -0
  163. package/dist/cjs/scaffold/merge.js +183 -0
  164. package/dist/cjs/scaffold/merge.js.map +1 -0
  165. package/dist/cjs/scaffold/parameter-resolver.d.ts +86 -0
  166. package/dist/cjs/scaffold/parameter-resolver.js +179 -0
  167. package/dist/cjs/scaffold/parameter-resolver.js.map +1 -0
  168. package/dist/cjs/scaffold/registry.d.ts +45 -0
  169. package/dist/cjs/scaffold/registry.js +219 -0
  170. package/dist/cjs/scaffold/registry.js.map +1 -0
  171. package/dist/cjs/scaffold/sources.d.ts +45 -0
  172. package/dist/cjs/scaffold/sources.js +113 -0
  173. package/dist/cjs/scaffold/sources.js.map +1 -0
  174. package/dist/cjs/scaffold/types.d.ts +280 -0
  175. package/dist/cjs/scaffold/types.js +14 -0
  176. package/dist/cjs/scaffold/types.js.map +1 -0
  177. package/dist/cjs/scaffold/validation.d.ts +81 -0
  178. package/dist/cjs/scaffold/validation.js +250 -0
  179. package/dist/cjs/scaffold/validation.js.map +1 -0
  180. package/dist/cjs/scaffold/validators.d.ts +33 -0
  181. package/dist/cjs/scaffold/validators.js +334 -0
  182. package/dist/cjs/scaffold/validators.js.map +1 -0
  183. package/dist/cjs/telemetry/index.d.ts +26 -0
  184. package/dist/cjs/telemetry/index.js +32 -0
  185. package/dist/cjs/telemetry/index.js.map +1 -0
  186. package/dist/cjs/telemetry/telemetry.d.ts +90 -0
  187. package/dist/cjs/telemetry/telemetry.js +283 -0
  188. package/dist/cjs/telemetry/telemetry.js.map +1 -0
  189. package/dist/cjs/telemetry/types.d.ts +62 -0
  190. package/dist/cjs/telemetry/types.js +7 -0
  191. package/dist/cjs/telemetry/types.js.map +1 -0
  192. package/dist/esm/auth/oauth-implicit.d.ts +1 -0
  193. package/dist/esm/auth/oauth-implicit.js +8 -3
  194. package/dist/esm/auth/oauth-implicit.js.map +1 -1
  195. package/dist/esm/auth/oauth.d.ts +1 -0
  196. package/dist/esm/auth/oauth.js +8 -3
  197. package/dist/esm/auth/oauth.js.map +1 -1
  198. package/dist/esm/auth/types.d.ts +5 -0
  199. package/dist/esm/auth/types.js.map +1 -1
  200. package/dist/esm/cli/am-command.d.ts +74 -0
  201. package/dist/esm/cli/am-command.js +198 -0
  202. package/dist/esm/cli/am-command.js.map +1 -0
  203. package/dist/esm/cli/base-command.d.ts +38 -0
  204. package/dist/esm/cli/base-command.js +142 -0
  205. package/dist/esm/cli/base-command.js.map +1 -1
  206. package/dist/esm/cli/config.d.ts +9 -0
  207. package/dist/esm/cli/config.js +20 -3
  208. package/dist/esm/cli/config.js.map +1 -1
  209. package/dist/esm/cli/index.d.ts +1 -0
  210. package/dist/esm/cli/index.js +1 -0
  211. package/dist/esm/cli/index.js.map +1 -1
  212. package/dist/esm/cli/instance-command.d.ts +2 -1
  213. package/dist/esm/cli/oauth-command.d.ts +22 -2
  214. package/dist/esm/cli/oauth-command.js +53 -8
  215. package/dist/esm/cli/oauth-command.js.map +1 -1
  216. package/dist/esm/cli/ods-command.d.ts +6 -2
  217. package/dist/esm/cli/ods-command.js +10 -4
  218. package/dist/esm/cli/ods-command.js.map +1 -1
  219. package/dist/esm/cli/webdav-command.d.ts +2 -1
  220. package/dist/esm/clients/am-api.d.ts +521 -0
  221. package/dist/esm/clients/am-api.js +986 -0
  222. package/dist/esm/clients/am-api.js.map +1 -0
  223. package/dist/esm/clients/am-apiclients-api.generated.d.ts +803 -0
  224. package/dist/esm/clients/am-apiclients-api.generated.js +6 -0
  225. package/dist/esm/clients/am-apiclients-api.generated.js.map +1 -0
  226. package/dist/esm/clients/am-roles-api.generated.d.ts +298 -0
  227. package/dist/esm/clients/am-roles-api.generated.js +6 -0
  228. package/dist/esm/clients/am-roles-api.generated.js.map +1 -0
  229. package/dist/esm/clients/am-users-api.generated.d.ts +954 -0
  230. package/dist/esm/clients/am-users-api.generated.js +6 -0
  231. package/dist/esm/clients/am-users-api.generated.js.map +1 -0
  232. package/dist/esm/clients/index.d.ts +4 -2
  233. package/dist/esm/clients/index.js +2 -1
  234. package/dist/esm/clients/index.js.map +1 -1
  235. package/dist/esm/clients/middleware-registry.d.ts +1 -1
  236. package/dist/esm/clients/middleware-registry.js.map +1 -1
  237. package/dist/esm/clients/middleware.d.ts +49 -2
  238. package/dist/esm/clients/middleware.js +214 -2
  239. package/dist/esm/clients/middleware.js.map +1 -1
  240. package/dist/esm/clients/mrt.js +5 -1
  241. package/dist/esm/clients/mrt.js.map +1 -1
  242. package/dist/esm/config/dw-json.d.ts +104 -33
  243. package/dist/esm/config/dw-json.js +167 -2
  244. package/dist/esm/config/dw-json.js.map +1 -1
  245. package/dist/esm/config/index.d.ts +6 -4
  246. package/dist/esm/config/index.js +6 -2
  247. package/dist/esm/config/index.js.map +1 -1
  248. package/dist/esm/config/instance-manager.d.ts +97 -0
  249. package/dist/esm/config/instance-manager.js +166 -0
  250. package/dist/esm/config/instance-manager.js.map +1 -0
  251. package/dist/esm/config/mapping.d.ts +63 -5
  252. package/dist/esm/config/mapping.js +165 -20
  253. package/dist/esm/config/mapping.js.map +1 -1
  254. package/dist/esm/config/sources/dw-json-source.d.ts +17 -1
  255. package/dist/esm/config/sources/dw-json-source.js +70 -3
  256. package/dist/esm/config/sources/dw-json-source.js.map +1 -1
  257. package/dist/esm/config/sources/package-json-source.js +6 -3
  258. package/dist/esm/config/sources/package-json-source.js.map +1 -1
  259. package/dist/esm/config/types.d.ts +72 -0
  260. package/dist/esm/defaults.d.ts +6 -0
  261. package/dist/esm/defaults.js +6 -0
  262. package/dist/esm/defaults.js.map +1 -1
  263. package/dist/esm/i18n/index.js +3 -0
  264. package/dist/esm/i18n/index.js.map +1 -1
  265. package/dist/esm/index.d.ts +8 -4
  266. package/dist/esm/index.js +9 -3
  267. package/dist/esm/index.js.map +1 -1
  268. package/dist/esm/logging/logger.js +13 -1
  269. package/dist/esm/logging/logger.js.map +1 -1
  270. package/dist/esm/operations/content/asset-query.d.ts +22 -0
  271. package/dist/esm/operations/content/asset-query.js +77 -0
  272. package/dist/esm/operations/content/asset-query.js.map +1 -0
  273. package/dist/esm/operations/content/export.d.ts +57 -0
  274. package/dist/esm/operations/content/export.js +224 -0
  275. package/dist/esm/operations/content/export.js.map +1 -0
  276. package/dist/esm/operations/content/index.d.ts +43 -0
  277. package/dist/esm/operations/content/index.js +48 -0
  278. package/dist/esm/operations/content/index.js.map +1 -0
  279. package/dist/esm/operations/content/library.d.ts +137 -0
  280. package/dist/esm/operations/content/library.js +392 -0
  281. package/dist/esm/operations/content/library.js.map +1 -0
  282. package/dist/esm/operations/content/types.d.ts +144 -0
  283. package/dist/esm/operations/content/types.js +7 -0
  284. package/dist/esm/operations/content/types.js.map +1 -0
  285. package/dist/esm/operations/mrt/b2c-config.js +19 -4
  286. package/dist/esm/operations/mrt/b2c-config.js.map +1 -1
  287. package/dist/esm/operations/mrt/index.d.ts +2 -0
  288. package/dist/esm/operations/mrt/index.js +2 -0
  289. package/dist/esm/operations/mrt/index.js.map +1 -1
  290. package/dist/esm/operations/mrt/tail-logs.d.ts +130 -0
  291. package/dist/esm/operations/mrt/tail-logs.js +223 -0
  292. package/dist/esm/operations/mrt/tail-logs.js.map +1 -0
  293. package/dist/esm/operations/ods/index.d.ts +2 -0
  294. package/dist/esm/operations/ods/index.js +1 -0
  295. package/dist/esm/operations/ods/index.js.map +1 -1
  296. package/dist/esm/operations/ods/wait-for-sandbox.d.ts +64 -0
  297. package/dist/esm/operations/ods/wait-for-sandbox.js +114 -0
  298. package/dist/esm/operations/ods/wait-for-sandbox.js.map +1 -0
  299. package/dist/esm/operations/orgs/index.d.ts +74 -0
  300. package/dist/esm/operations/orgs/index.js +33 -0
  301. package/dist/esm/operations/orgs/index.js.map +1 -0
  302. package/dist/esm/operations/roles/index.d.ts +43 -0
  303. package/dist/esm/operations/roles/index.js +48 -0
  304. package/dist/esm/operations/roles/index.js.map +1 -0
  305. package/dist/esm/operations/users/index.d.ts +153 -0
  306. package/dist/esm/operations/users/index.js +139 -0
  307. package/dist/esm/operations/users/index.js.map +1 -0
  308. package/dist/esm/scaffold/engine.d.ts +68 -0
  309. package/dist/esm/scaffold/engine.js +149 -0
  310. package/dist/esm/scaffold/engine.js.map +1 -0
  311. package/dist/esm/scaffold/executor.d.ts +36 -0
  312. package/dist/esm/scaffold/executor.js +285 -0
  313. package/dist/esm/scaffold/executor.js.map +1 -0
  314. package/dist/esm/scaffold/index.d.ts +74 -0
  315. package/dist/esm/scaffold/index.js +23 -0
  316. package/dist/esm/scaffold/index.js.map +1 -0
  317. package/dist/esm/scaffold/merge.d.ts +56 -0
  318. package/dist/esm/scaffold/merge.js +183 -0
  319. package/dist/esm/scaffold/merge.js.map +1 -0
  320. package/dist/esm/scaffold/parameter-resolver.d.ts +86 -0
  321. package/dist/esm/scaffold/parameter-resolver.js +179 -0
  322. package/dist/esm/scaffold/parameter-resolver.js.map +1 -0
  323. package/dist/esm/scaffold/registry.d.ts +45 -0
  324. package/dist/esm/scaffold/registry.js +219 -0
  325. package/dist/esm/scaffold/registry.js.map +1 -0
  326. package/dist/esm/scaffold/sources.d.ts +45 -0
  327. package/dist/esm/scaffold/sources.js +113 -0
  328. package/dist/esm/scaffold/sources.js.map +1 -0
  329. package/dist/esm/scaffold/types.d.ts +280 -0
  330. package/dist/esm/scaffold/types.js +14 -0
  331. package/dist/esm/scaffold/types.js.map +1 -0
  332. package/dist/esm/scaffold/validation.d.ts +81 -0
  333. package/dist/esm/scaffold/validation.js +250 -0
  334. package/dist/esm/scaffold/validation.js.map +1 -0
  335. package/dist/esm/scaffold/validators.d.ts +33 -0
  336. package/dist/esm/scaffold/validators.js +334 -0
  337. package/dist/esm/scaffold/validators.js.map +1 -0
  338. package/dist/esm/telemetry/index.d.ts +26 -0
  339. package/dist/esm/telemetry/index.js +32 -0
  340. package/dist/esm/telemetry/index.js.map +1 -0
  341. package/dist/esm/telemetry/telemetry.d.ts +90 -0
  342. package/dist/esm/telemetry/telemetry.js +283 -0
  343. package/dist/esm/telemetry/telemetry.js.map +1 -0
  344. package/dist/esm/telemetry/types.d.ts +62 -0
  345. package/dist/esm/telemetry/types.js +7 -0
  346. package/dist/esm/telemetry/types.js.map +1 -0
  347. package/package.json +86 -17
  348. package/specs/am-apiclients-api-v1.yaml +965 -0
  349. package/specs/am-roles-api-v1.yaml +316 -0
  350. package/specs/am-users-api-v1.yaml +1142 -0
package/README.md CHANGED
@@ -125,23 +125,190 @@ const result = await waitForJob(instance, 'my-job-id', execution.id);
125
125
  await siteArchiveImport(instance, './site-data.zip');
126
126
  ```
127
127
 
128
+ ### Account Manager User Management
129
+
130
+ ```typescript
131
+ import {
132
+ getUserByLogin,
133
+ listUsers,
134
+ createUser,
135
+ updateUser,
136
+ deleteUser,
137
+ resetUser,
138
+ grantRole,
139
+ revokeRole,
140
+ } from '@salesforce/b2c-tooling-sdk/operations/users';
141
+ import {createAccountManagerUsersClient} from '@salesforce/b2c-tooling-sdk/clients';
142
+ import {OAuthStrategy} from '@salesforce/b2c-tooling-sdk/auth';
143
+
144
+ const auth = new OAuthStrategy({
145
+ clientId: 'your-client-id',
146
+ clientSecret: 'your-client-secret',
147
+ });
148
+
149
+ const client = createAccountManagerUsersClient({}, auth);
150
+
151
+ // List users with pagination
152
+ const users = await listUsers(client, {size: 25, page: 0});
153
+
154
+ // Get user by email
155
+ const user = await getUserByLogin(client, 'user@example.com');
156
+
157
+ // Create a new user
158
+ const newUser = await createUser(client, {
159
+ user: {
160
+ mail: 'newuser@example.com',
161
+ firstName: 'John',
162
+ lastName: 'Doe',
163
+ organizations: ['org-id'],
164
+ primaryOrganization: 'org-id',
165
+ },
166
+ });
167
+
168
+ // Update a user
169
+ await updateUser(client, {
170
+ userId: user.id!,
171
+ changes: {firstName: 'Jane'},
172
+ });
173
+
174
+ // Grant a role to a user
175
+ await grantRole(client, {
176
+ userId: user.id!,
177
+ role: 'bm-admin',
178
+ scope: 'tenant1,tenant2', // Optional tenant filter
179
+ });
180
+
181
+ // Reset user to INITIAL state
182
+ await resetUser(client, user.id!);
183
+ ```
184
+
185
+ ### Account Manager Role Management
186
+
187
+ ```typescript
188
+ import {getRole, listRoles} from '@salesforce/b2c-tooling-sdk/operations/roles';
189
+ import {createAccountManagerRolesClient} from '@salesforce/b2c-tooling-sdk/clients';
190
+ import {OAuthStrategy} from '@salesforce/b2c-tooling-sdk/auth';
191
+
192
+ const auth = new OAuthStrategy({
193
+ clientId: 'your-client-id',
194
+ clientSecret: 'your-client-secret',
195
+ });
196
+
197
+ const client = createAccountManagerRolesClient({}, auth);
198
+
199
+ // Get role details by ID
200
+ const role = await getRole(client, 'bm-admin');
201
+
202
+ // List all roles with pagination
203
+ const roles = await listRoles(client, {size: 25, page: 0});
204
+
205
+ // List roles filtered by target type
206
+ const userRoles = await listRoles(client, {
207
+ size: 25,
208
+ page: 0,
209
+ roleTargetType: 'User',
210
+ });
211
+ ```
212
+
213
+ ### Account Manager Organization Management
214
+
215
+ ```typescript
216
+ import {getOrg, getOrgByName, listOrgs, getOrgAuditLogs} from '@salesforce/b2c-tooling-sdk/operations/orgs';
217
+ import {createAccountManagerOrgsClient} from '@salesforce/b2c-tooling-sdk/clients';
218
+ import {OAuthStrategy} from '@salesforce/b2c-tooling-sdk/auth';
219
+
220
+ const auth = new OAuthStrategy({
221
+ clientId: 'your-client-id',
222
+ clientSecret: 'your-client-secret',
223
+ });
224
+
225
+ const client = createAccountManagerOrgsClient({}, auth);
226
+
227
+ // Get organization by ID
228
+ const org = await getOrg(client, 'org-123');
229
+
230
+ // Get organization by name
231
+ const orgByName = await getOrgByName(client, 'My Organization');
232
+
233
+ // List organizations with pagination
234
+ const orgs = await listOrgs(client, {size: 25, page: 0});
235
+
236
+ // List all organizations (uses max page size of 5000)
237
+ const allOrgs = await listOrgs(client, {all: true});
238
+
239
+ // Get audit logs for an organization
240
+ const auditLogs = await getOrgAuditLogs(client, 'org-123');
241
+ ```
242
+
243
+ ### Account Manager API Client Management
244
+
245
+ Manage Account Manager API clients (OAuth client credentials used for API access) via the unified Account Manager client:
246
+
247
+ ```typescript
248
+ import {
249
+ createAccountManagerClient,
250
+ type APIClientCreate,
251
+ type APIClientUpdate,
252
+ } from '@salesforce/b2c-tooling-sdk/clients';
253
+ import {OAuthStrategy} from '@salesforce/b2c-tooling-sdk/auth';
254
+
255
+ const auth = new OAuthStrategy({
256
+ clientId: 'your-client-id',
257
+ clientSecret: 'your-client-secret',
258
+ });
259
+
260
+ const client = createAccountManagerClient({}, auth);
261
+
262
+ // List API clients with pagination
263
+ const apiClients = await client.listApiClients({size: 25, page: 0});
264
+
265
+ // Get a single API client by ID (optional expand: organizations, roles)
266
+ const apiClient = await client.getApiClient('api-client-id', ['organizations', 'roles']);
267
+
268
+ // Create a new API client
269
+ const newClient = await client.createApiClient({
270
+ name: 'My API Client',
271
+ password: 'initial-password',
272
+ organizations: ['org-id'],
273
+ roles: ['ECOM_ADMIN'],
274
+ active: true,
275
+ });
276
+
277
+ // Update an API client (e.g. disable, change name, roles, or organizations)
278
+ await client.updateApiClient('api-client-id', {
279
+ name: 'Updated Name',
280
+ active: false,
281
+ });
282
+
283
+ // Change API client password (requires old password)
284
+ await client.changeApiClientPassword('api-client-id', 'old-password', 'new-password');
285
+
286
+ // Delete an API client (must be disabled for at least 7 days first)
287
+ await client.deleteApiClient('api-client-id');
288
+ ```
289
+
290
+ For direct access to the API Clients API only, use `createAccountManagerApiClientsClient` from `@salesforce/b2c-tooling-sdk/clients`.
291
+
128
292
  ## Module Exports
129
293
 
130
294
  The SDK provides subpath exports for tree-shaking and organization:
131
295
 
132
- | Export | Description |
133
- | ---------------------------------------------- | ----------------------------------------------------- |
134
- | `@salesforce/b2c-tooling-sdk` | Main entry point with all exports |
135
- | `@salesforce/b2c-tooling-sdk/config` | Configuration resolution (resolveConfig) |
136
- | `@salesforce/b2c-tooling-sdk/auth` | Authentication strategies (OAuth, Basic, API Key) |
137
- | `@salesforce/b2c-tooling-sdk/instance` | B2CInstance class |
138
- | `@salesforce/b2c-tooling-sdk/clients` | Low-level API clients (WebDAV, OCAPI, SLAS, ODS, MRT) |
139
- | `@salesforce/b2c-tooling-sdk/operations/code` | Code deployment operations |
140
- | `@salesforce/b2c-tooling-sdk/operations/jobs` | Job execution and site import/export |
141
- | `@salesforce/b2c-tooling-sdk/operations/sites` | Site management |
142
- | `@salesforce/b2c-tooling-sdk/discovery` | Workspace type detection (PWA Kit, SFRA, etc.) |
143
- | `@salesforce/b2c-tooling-sdk/cli` | CLI utilities (BaseCommand, table rendering) |
144
- | `@salesforce/b2c-tooling-sdk/logging` | Structured logging utilities |
296
+ | Export | Description |
297
+ | ---------------------------------------------- | ------------------------------------------------------------------------------ |
298
+ | `@salesforce/b2c-tooling-sdk` | Main entry point with all exports |
299
+ | `@salesforce/b2c-tooling-sdk/config` | Configuration resolution (resolveConfig) |
300
+ | `@salesforce/b2c-tooling-sdk/auth` | Authentication strategies (OAuth, Basic, API Key) |
301
+ | `@salesforce/b2c-tooling-sdk/instance` | B2CInstance class |
302
+ | `@salesforce/b2c-tooling-sdk/clients` | Low-level API clients (WebDAV, OCAPI, SLAS, ODS, MRT, Account Manager clients) |
303
+ | `@salesforce/b2c-tooling-sdk/operations/code` | Code deployment operations |
304
+ | `@salesforce/b2c-tooling-sdk/operations/jobs` | Job execution and site import/export |
305
+ | `@salesforce/b2c-tooling-sdk/operations/sites` | Site management |
306
+ | `@salesforce/b2c-tooling-sdk/operations/users` | Account Manager user management |
307
+ | `@salesforce/b2c-tooling-sdk/operations/roles` | Account Manager role management |
308
+ | `@salesforce/b2c-tooling-sdk/operations/orgs` | Account Manager organization management |
309
+ | `@salesforce/b2c-tooling-sdk/discovery` | Workspace type detection (PWA Kit, SFRA, etc.) |
310
+ | `@salesforce/b2c-tooling-sdk/cli` | CLI utilities (BaseCommand, table rendering) |
311
+ | `@salesforce/b2c-tooling-sdk/logging` | Structured logging utilities |
145
312
 
146
313
  ## Logging
147
314
 
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projectDescription>
3
+ <name><%= cartridgeName %></name>
4
+ <comment></comment>
5
+ <projects>
6
+ </projects>
7
+ <buildSpec>
8
+ <buildCommand>
9
+ <name>com.demandware.studio.core.beehiveElementBuilder</name>
10
+ <arguments>
11
+ </arguments>
12
+ </buildCommand>
13
+ </buildSpec>
14
+ <natures>
15
+ <nature>com.demandware.studio.core.beehiveNature</nature>
16
+ </natures>
17
+ </projectDescription>
@@ -0,0 +1,4 @@
1
+ # <%= cartridgeName %> cartridge properties
2
+ # Generated on <%= date %>
3
+
4
+ demandware.cartridges.<%= cartridgeName %>.multipleLanguageStorefront=true
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Example controller for <%= cartridgeName %>
5
+ */
6
+
7
+ var server = require('server');
8
+
9
+ /**
10
+ * Example-Show: Renders an example page
11
+ */
12
+ server.get('Show', function (req, res, next) {
13
+ res.render('example/show', {
14
+ message: 'Hello from <%= cartridgeName %>!'
15
+ });
16
+ next();
17
+ });
18
+
19
+ module.exports = server.exports();
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Example model for <%= cartridgeName %>
5
+ * @param {Object} data - The input data
6
+ * @constructor
7
+ */
8
+ function ExampleModel(data) {
9
+ this.id = data.id || null;
10
+ this.name = data.name || '';
11
+ this.description = data.description || '';
12
+ }
13
+
14
+ module.exports = ExampleModel;
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Example helper functions for <%= cartridgeName %>
5
+ */
6
+
7
+ /**
8
+ * Formats a string for display
9
+ * @param {string} input - The input string
10
+ * @returns {string} The formatted string
11
+ */
12
+ function formatString(input) {
13
+ return input ? input.trim() : '';
14
+ }
15
+
16
+ module.exports = {
17
+ formatString: formatString
18
+ };
@@ -0,0 +1,6 @@
1
+ /* Example styles */
2
+ .example-container {
3
+ padding: 20px;
4
+ margin: 10px auto;
5
+ max-width: 1200px;
6
+ }
@@ -0,0 +1,11 @@
1
+ <isdecorate template="common/layout/page">
2
+ <isscript>
3
+ var assets = require('*/cartridge/scripts/assets');
4
+ assets.addCss('/css/example.css');
5
+ </isscript>
6
+
7
+ <div class="container">
8
+ <h1>${pdict.message}</h1>
9
+ <p>This is an example page from the <%= cartridgeName %> cartridge.</p>
10
+ </div>
11
+ </isdecorate>
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "cartridge",
3
+ "displayName": "Cartridge",
4
+ "description": "Create a new B2C Commerce cartridge with standard structure",
5
+ "category": "cartridge",
6
+ "defaultOutputDir": "cartridges",
7
+ "parameters": [
8
+ {
9
+ "name": "cartridgeName",
10
+ "prompt": "What is the cartridge name?",
11
+ "type": "string",
12
+ "required": true,
13
+ "pattern": "^[a-z][a-z0-9_]*$",
14
+ "validationMessage": "Cartridge name must start with a lowercase letter and contain only lowercase letters, numbers, and underscores"
15
+ },
16
+ {
17
+ "name": "includeControllers",
18
+ "prompt": "Include controllers directory?",
19
+ "type": "boolean",
20
+ "required": false,
21
+ "default": true
22
+ },
23
+ {
24
+ "name": "includeModels",
25
+ "prompt": "Include models directory?",
26
+ "type": "boolean",
27
+ "required": false,
28
+ "default": true
29
+ },
30
+ {
31
+ "name": "includeScripts",
32
+ "prompt": "Include scripts directory?",
33
+ "type": "boolean",
34
+ "required": false,
35
+ "default": true
36
+ },
37
+ {
38
+ "name": "includeTemplates",
39
+ "prompt": "Include templates directory?",
40
+ "type": "boolean",
41
+ "required": false,
42
+ "default": true
43
+ },
44
+ {
45
+ "name": "includeStatic",
46
+ "prompt": "Include static assets directory?",
47
+ "type": "boolean",
48
+ "required": false,
49
+ "default": false
50
+ }
51
+ ],
52
+ "files": [
53
+ {
54
+ "template": ".project.ejs",
55
+ "destination": "{{cartridgeName}}/.project"
56
+ },
57
+ {
58
+ "template": "cartridge/cartridge.properties.ejs",
59
+ "destination": "{{cartridgeName}}/cartridge/{{cartridgeName}}.properties"
60
+ },
61
+ {
62
+ "template": "cartridge/controllers/Example.js.ejs",
63
+ "destination": "{{cartridgeName}}/cartridge/controllers/Example.js",
64
+ "condition": "includeControllers"
65
+ },
66
+ {
67
+ "template": "cartridge/models/example.js.ejs",
68
+ "destination": "{{cartridgeName}}/cartridge/models/example.js",
69
+ "condition": "includeModels"
70
+ },
71
+ {
72
+ "template": "cartridge/scripts/helpers/exampleHelpers.js.ejs",
73
+ "destination": "{{cartridgeName}}/cartridge/scripts/helpers/exampleHelpers.js",
74
+ "condition": "includeScripts"
75
+ },
76
+ {
77
+ "template": "cartridge/templates/default/example/show.isml.ejs",
78
+ "destination": "{{cartridgeName}}/cartridge/templates/default/example/show.isml",
79
+ "condition": "includeTemplates"
80
+ },
81
+ {
82
+ "template": "cartridge/static/default/css/example.css",
83
+ "destination": "{{cartridgeName}}/cartridge/static/default/css/example.css",
84
+ "condition": "includeStatic"
85
+ }
86
+ ],
87
+ "postInstructions": "Cartridge '<%= cartridgeName %>' has been created.\n\nNext steps:\n1. Add the cartridge to your cartridge path in Business Manager\n2. Deploy the cartridge to your instance"
88
+ }
@@ -0,0 +1,134 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * <%= controllerName %> Controller
5
+ *
6
+ * @module controllers/<%= controllerName %>
7
+ */
8
+
9
+ var server = require('server');
10
+ <% if (useMiddleware) { %>
11
+ var cache = require('*/cartridge/scripts/middleware/cache');
12
+ var consentTracking = require('*/cartridge/scripts/middleware/consentTracking');
13
+ var pageMetaData = require('*/cartridge/scripts/middleware/pageMetaData');
14
+ <% } %>
15
+
16
+ <% if (routes.includes('Show')) { %>
17
+ /**
18
+ * <%= controllerName %>-Show : Renders the <%= controllerName.toLowerCase() %> page
19
+ * @name <%= controllerName %>-Show
20
+ * @function
21
+ * @memberof <%= controllerName %>
22
+ <% if (useMiddleware) { %> * @param {middleware} - server.middleware.https
23
+ * @param {middleware} - consentTracking.consent
24
+ * @param {middleware} - cache.applyDefaultCache<% } %>
25
+ * @param {category} - sensitive
26
+ * @param {renders} - isml
27
+ * @param {serverfunction} - get
28
+ */
29
+ server.get(
30
+ 'Show',
31
+ <% if (useMiddleware) { %> server.middleware.https,
32
+ consentTracking.consent,
33
+ cache.applyDefaultCache,
34
+ <% } %> function (req, res, next) {
35
+ var viewData = {
36
+ title: '<%= controllerName %>',
37
+ message: 'Hello from <%= controllerName %>!'
38
+ };
39
+
40
+ res.render('<%= kebabCase(controllerName) %>/show', viewData);
41
+ next();
42
+ }
43
+ );
44
+ <% if (useMiddleware) { %>
45
+ server.append('Show', pageMetaData.computedPageMetaData);
46
+ <% } %>
47
+ <% } %>
48
+ <% if (routes.includes('Submit')) { %>
49
+ /**
50
+ * <%= controllerName %>-Submit : Handles form submission for <%= controllerName.toLowerCase() %>
51
+ * @name <%= controllerName %>-Submit
52
+ * @function
53
+ * @memberof <%= controllerName %>
54
+ <% if (useMiddleware) { %> * @param {middleware} - server.middleware.https<% } %>
55
+ * @param {httpparameter} - csrf_token - CSRF token
56
+ * @param {category} - sensitive
57
+ * @param {returns} - json
58
+ * @param {serverfunction} - post
59
+ */
60
+ server.post(
61
+ 'Submit',
62
+ <% if (useMiddleware) { %> server.middleware.https,
63
+ <% } %> function (req, res, next) {
64
+ var form = req.form;
65
+
66
+ // TODO: Process form data
67
+ var result = {
68
+ success: true,
69
+ message: 'Form submitted successfully'
70
+ };
71
+
72
+ res.json(result);
73
+ next();
74
+ }
75
+ );
76
+ <% } %>
77
+ <% if (routes.includes('JSON')) { %>
78
+ /**
79
+ * <%= controllerName %>-JSON : Returns JSON data for <%= controllerName.toLowerCase() %>
80
+ * @name <%= controllerName %>-JSON
81
+ * @function
82
+ * @memberof <%= controllerName %>
83
+ <% if (useMiddleware) { %> * @param {middleware} - cache.applyDefaultCache<% } %>
84
+ * @param {category} - non-sensitive
85
+ * @param {returns} - json
86
+ * @param {serverfunction} - get
87
+ */
88
+ server.get(
89
+ 'JSON',
90
+ <% if (useMiddleware) { %> cache.applyDefaultCache,
91
+ <% } %> function (req, res, next) {
92
+ var data = {
93
+ success: true,
94
+ data: {
95
+ // TODO: Add your data here
96
+ }
97
+ };
98
+
99
+ res.json(data);
100
+ next();
101
+ }
102
+ );
103
+ <% } %>
104
+ <% if (routes.includes('SubmitJSON')) { %>
105
+ /**
106
+ * <%= controllerName %>-SubmitJSON : Handles AJAX form submission for <%= controllerName.toLowerCase() %>
107
+ * @name <%= controllerName %>-SubmitJSON
108
+ * @function
109
+ * @memberof <%= controllerName %>
110
+ <% if (useMiddleware) { %> * @param {middleware} - server.middleware.https<% } %>
111
+ * @param {httpparameter} - csrf_token - CSRF token
112
+ * @param {category} - sensitive
113
+ * @param {returns} - json
114
+ * @param {serverfunction} - post
115
+ */
116
+ server.post(
117
+ 'SubmitJSON',
118
+ <% if (useMiddleware) { %> server.middleware.https,
119
+ <% } %> function (req, res, next) {
120
+ var form = req.form;
121
+
122
+ // TODO: Validate and process form data
123
+ var result = {
124
+ success: true,
125
+ redirectUrl: null
126
+ };
127
+
128
+ res.json(result);
129
+ next();
130
+ }
131
+ );
132
+ <% } %>
133
+
134
+ module.exports = server.exports();
@@ -0,0 +1,22 @@
1
+ <iscontent type="text/html" charset="UTF-8" compact="true"/>
2
+
3
+ <isinclude template="/components/modules"/>
4
+
5
+ <!--- <%= controllerName %> Show Template --->
6
+
7
+ <isdecorate template="common/layout/page">
8
+ <isscript>
9
+ var assets = require('*/cartridge/scripts/assets');
10
+ assets.addCss('/css/<%= kebabCase(controllerName) %>.css');
11
+ assets.addJs('/js/<%= kebabCase(controllerName) %>.js');
12
+ </isscript>
13
+
14
+ <div class="container <%= kebabCase(controllerName) %>-page">
15
+ <div class="row">
16
+ <div class="col-12">
17
+ <h1 class="page-title">${pdict.title}</h1>
18
+ <p class="lead">${pdict.message}</p>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </isdecorate>
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "controller",
3
+ "displayName": "SFRA Controller",
4
+ "description": "Create an SFRA controller with route handlers and middleware",
5
+ "category": "cartridge",
6
+ "parameters": [
7
+ {
8
+ "name": "controllerName",
9
+ "prompt": "What is the controller name?",
10
+ "type": "string",
11
+ "required": true,
12
+ "pattern": "^[A-Z][a-zA-Z0-9]*$",
13
+ "validationMessage": "Controller name must be PascalCase (start with uppercase letter)"
14
+ },
15
+ {
16
+ "name": "cartridgeName",
17
+ "prompt": "Which cartridge should contain this controller?",
18
+ "type": "string",
19
+ "required": true,
20
+ "source": "cartridges",
21
+ "pattern": "^[a-z][a-z0-9_]*$",
22
+ "validationMessage": "Cartridge name must start with a lowercase letter and contain only lowercase letters, numbers, and underscores"
23
+ },
24
+ {
25
+ "name": "routes",
26
+ "prompt": "Which route types do you want to include?",
27
+ "type": "multi-choice",
28
+ "required": true,
29
+ "choices": [
30
+ { "value": "Show", "label": "Show (GET - render page)" },
31
+ { "value": "Submit", "label": "Submit (POST - form handler)" },
32
+ { "value": "JSON", "label": "JSON (GET - AJAX endpoint)" },
33
+ { "value": "SubmitJSON", "label": "SubmitJSON (POST - AJAX form)" }
34
+ ],
35
+ "default": ["Show"]
36
+ },
37
+ {
38
+ "name": "useMiddleware",
39
+ "prompt": "Include middleware chain example?",
40
+ "type": "boolean",
41
+ "required": false,
42
+ "default": true
43
+ },
44
+ {
45
+ "name": "includeTemplate",
46
+ "prompt": "Generate accompanying ISML template?",
47
+ "type": "boolean",
48
+ "required": false,
49
+ "default": true
50
+ }
51
+ ],
52
+ "files": [
53
+ {
54
+ "template": "controller.js.ejs",
55
+ "destination": "{{cartridgeNamePath}}/cartridge/controllers/{{controllerName}}.js"
56
+ },
57
+ {
58
+ "template": "template.isml.ejs",
59
+ "destination": "{{cartridgeNamePath}}/cartridge/templates/default/{{kebabCase controllerName}}/show.isml",
60
+ "condition": "includeTemplate"
61
+ }
62
+ ],
63
+ "postInstructions": "Controller '<%= controllerName %>' has been created in '<%= cartridgeName %>'.\n\nRoutes created:\n<% routes.forEach(function(route) { %>\n- <%= controllerName %>-<%= route %>: /<%= controllerName %>-<%= route %>\n<% }); %>\n\nNext steps:\n1. Deploy the cartridge to your instance\n2. Ensure <%= cartridgeName %> is in your cartridge path"
64
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "endpoints": [
3
+ <% if (includeExampleEndpoints) { %>
4
+ {"endpoint": "getHello", "schema": "schema.yaml", "implementation": "script"},
5
+ {"endpoint": "getItems", "schema": "schema.yaml", "implementation": "script"},
6
+ {"endpoint": "getItem", "schema": "schema.yaml", "implementation": "script"}
7
+ <% } else { %>
8
+ {"endpoint": "getExample", "schema": "schema.yaml", "implementation": "script"}
9
+ <% } %>
10
+ ]
11
+ }