@salesforce/b2c-tooling-sdk 1.4.0 → 1.6.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 (105) hide show
  1. package/data/xsd/abtest.xsd +14 -1
  2. package/data/xsd/bmext.xsd +18 -0
  3. package/data/xsd/commercefeaturestate.xsd +101 -0
  4. package/data/xsd/index.json +10 -2
  5. package/data/xsd/library.xsd +33 -0
  6. package/data/xsd/order.xsd +2 -0
  7. package/data/xsd/pagemetatag.xsd +1 -0
  8. package/data/xsd/search2.xsd +39 -0
  9. package/data/xsd/sort.xsd +31 -1
  10. package/data/xsd/storefronts.xsd +104 -0
  11. package/dist/cjs/cli/lifecycle.d.ts +1 -1
  12. package/dist/cjs/cli/lifecycle.js.map +1 -1
  13. package/dist/cjs/index.d.ts +2 -0
  14. package/dist/cjs/index.js +2 -0
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/operations/cap/index.d.ts +56 -0
  17. package/dist/cjs/operations/cap/index.js +57 -0
  18. package/dist/cjs/operations/cap/index.js.map +1 -0
  19. package/dist/cjs/operations/cap/install.d.ts +53 -0
  20. package/dist/cjs/operations/cap/install.js +181 -0
  21. package/dist/cjs/operations/cap/install.js.map +1 -0
  22. package/dist/cjs/operations/cap/list.d.ts +92 -0
  23. package/dist/cjs/operations/cap/list.js +230 -0
  24. package/dist/cjs/operations/cap/list.js.map +1 -0
  25. package/dist/cjs/operations/cap/package.d.ts +39 -0
  26. package/dist/cjs/operations/cap/package.js +77 -0
  27. package/dist/cjs/operations/cap/package.js.map +1 -0
  28. package/dist/cjs/operations/cap/pull.d.ts +21 -0
  29. package/dist/cjs/operations/cap/pull.js +77 -0
  30. package/dist/cjs/operations/cap/pull.js.map +1 -0
  31. package/dist/cjs/operations/cap/uninstall.d.ts +46 -0
  32. package/dist/cjs/operations/cap/uninstall.js +87 -0
  33. package/dist/cjs/operations/cap/uninstall.js.map +1 -0
  34. package/dist/cjs/operations/cap/validate.d.ts +47 -0
  35. package/dist/cjs/operations/cap/validate.js +235 -0
  36. package/dist/cjs/operations/cap/validate.js.map +1 -0
  37. package/dist/cjs/operations/jobs/site-archive.d.ts +1 -0
  38. package/dist/cjs/operations/jobs/site-archive.js +30 -39
  39. package/dist/cjs/operations/jobs/site-archive.js.map +1 -1
  40. package/dist/cjs/operations/util/zip.d.ts +5 -0
  41. package/dist/cjs/operations/util/zip.js +25 -0
  42. package/dist/cjs/operations/util/zip.js.map +1 -0
  43. package/dist/cjs/plugins/loader.js +6 -1
  44. package/dist/cjs/plugins/loader.js.map +1 -1
  45. package/dist/cjs/skills/github.d.ts +2 -18
  46. package/dist/cjs/skills/github.js +195 -108
  47. package/dist/cjs/skills/github.js.map +1 -1
  48. package/dist/cjs/skills/index.d.ts +2 -1
  49. package/dist/cjs/skills/index.js +2 -0
  50. package/dist/cjs/skills/index.js.map +1 -1
  51. package/dist/cjs/skills/parser.d.ts +2 -2
  52. package/dist/cjs/skills/parser.js +13 -18
  53. package/dist/cjs/skills/parser.js.map +1 -1
  54. package/dist/cjs/skills/sources.d.ts +4 -0
  55. package/dist/cjs/skills/sources.js +44 -0
  56. package/dist/cjs/skills/sources.js.map +1 -0
  57. package/dist/cjs/skills/types.d.ts +16 -1
  58. package/dist/esm/cli/lifecycle.d.ts +1 -1
  59. package/dist/esm/cli/lifecycle.js.map +1 -1
  60. package/dist/esm/index.d.ts +2 -0
  61. package/dist/esm/index.js +2 -0
  62. package/dist/esm/index.js.map +1 -1
  63. package/dist/esm/operations/cap/index.d.ts +56 -0
  64. package/dist/esm/operations/cap/index.js +57 -0
  65. package/dist/esm/operations/cap/index.js.map +1 -0
  66. package/dist/esm/operations/cap/install.d.ts +53 -0
  67. package/dist/esm/operations/cap/install.js +183 -0
  68. package/dist/esm/operations/cap/install.js.map +1 -0
  69. package/dist/esm/operations/cap/list.d.ts +92 -0
  70. package/dist/esm/operations/cap/list.js +231 -0
  71. package/dist/esm/operations/cap/list.js.map +1 -0
  72. package/dist/esm/operations/cap/package.d.ts +39 -0
  73. package/dist/esm/operations/cap/package.js +78 -0
  74. package/dist/esm/operations/cap/package.js.map +1 -0
  75. package/dist/esm/operations/cap/pull.d.ts +21 -0
  76. package/dist/esm/operations/cap/pull.js +78 -0
  77. package/dist/esm/operations/cap/pull.js.map +1 -0
  78. package/dist/esm/operations/cap/uninstall.d.ts +46 -0
  79. package/dist/esm/operations/cap/uninstall.js +98 -0
  80. package/dist/esm/operations/cap/uninstall.js.map +1 -0
  81. package/dist/esm/operations/cap/validate.d.ts +47 -0
  82. package/dist/esm/operations/cap/validate.js +235 -0
  83. package/dist/esm/operations/cap/validate.js.map +1 -0
  84. package/dist/esm/operations/jobs/site-archive.d.ts +1 -0
  85. package/dist/esm/operations/jobs/site-archive.js +30 -39
  86. package/dist/esm/operations/jobs/site-archive.js.map +1 -1
  87. package/dist/esm/operations/util/zip.d.ts +5 -0
  88. package/dist/esm/operations/util/zip.js +26 -0
  89. package/dist/esm/operations/util/zip.js.map +1 -0
  90. package/dist/esm/plugins/loader.js +6 -1
  91. package/dist/esm/plugins/loader.js.map +1 -1
  92. package/dist/esm/skills/github.d.ts +2 -18
  93. package/dist/esm/skills/github.js +195 -108
  94. package/dist/esm/skills/github.js.map +1 -1
  95. package/dist/esm/skills/index.d.ts +2 -1
  96. package/dist/esm/skills/index.js +2 -0
  97. package/dist/esm/skills/index.js.map +1 -1
  98. package/dist/esm/skills/parser.d.ts +2 -2
  99. package/dist/esm/skills/parser.js +13 -18
  100. package/dist/esm/skills/parser.js.map +1 -1
  101. package/dist/esm/skills/sources.d.ts +4 -0
  102. package/dist/esm/skills/sources.js +44 -0
  103. package/dist/esm/skills/sources.js.map +1 -0
  104. package/dist/esm/skills/types.d.ts +16 -1
  105. package/package.json +13 -1
@@ -0,0 +1,44 @@
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
+ function pluginsTag(version) {
7
+ const bare = version.replace(/^v/, '');
8
+ return `b2c-agent-plugins@${bare}`;
9
+ }
10
+ export const SKILL_SOURCES = {
11
+ b2c: {
12
+ id: 'b2c',
13
+ displayName: 'B2C Commerce development patterns',
14
+ type: 'release-artifact',
15
+ repo: 'SalesforceCommerceCloud/b2c-developer-tooling',
16
+ assetName: 'b2c-skills.zip',
17
+ tagPattern: pluginsTag,
18
+ },
19
+ 'b2c-cli': {
20
+ id: 'b2c-cli',
21
+ displayName: 'B2C CLI commands and operations',
22
+ type: 'release-artifact',
23
+ repo: 'SalesforceCommerceCloud/b2c-developer-tooling',
24
+ assetName: 'b2c-cli-skills.zip',
25
+ tagPattern: pluginsTag,
26
+ },
27
+ 'cap-dev': {
28
+ id: 'cap-dev',
29
+ displayName: 'Commerce Apps development skills',
30
+ type: 'repo-contents',
31
+ repo: 'SalesforceCommerceCloud/commerce-apps',
32
+ ref: 'main',
33
+ skillsPath: '.claude/skills',
34
+ },
35
+ };
36
+ export function getSkillSource(skillSet) {
37
+ const source = SKILL_SOURCES[skillSet];
38
+ if (!source) {
39
+ throw new Error(`Unknown skill set: ${skillSet}`);
40
+ }
41
+ return source;
42
+ }
43
+ export const ALL_SKILL_SETS = Object.keys(SKILL_SOURCES);
44
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../../src/skills/sources.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,SAAS,UAAU,CAAC,OAAe;IACjC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,qBAAqB,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAwC;IAChE,GAAG,EAAE;QACH,EAAE,EAAE,KAAK;QACT,WAAW,EAAE,mCAAmC;QAChD,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,+CAA+C;QACrD,SAAS,EAAE,gBAAgB;QAC3B,UAAU,EAAE,UAAU;KACvB;IACD,SAAS,EAAE;QACT,EAAE,EAAE,SAAS;QACb,WAAW,EAAE,iCAAiC;QAC9C,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,+CAA+C;QACrD,SAAS,EAAE,oBAAoB;QAC/B,UAAU,EAAE,UAAU;KACvB;IACD,SAAS,EAAE;QACT,EAAE,EAAE,SAAS;QACb,WAAW,EAAE,kCAAkC;QAC/C,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,uCAAuC;QAC7C,GAAG,EAAE,MAAM;QACX,UAAU,EAAE,gBAAgB;KAC7B;CACF,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAe,MAAM,CAAC,IAAI,CAAC,aAAa,CAAe,CAAC"}
@@ -5,7 +5,20 @@ export type IdeType = 'claude-code' | 'cursor' | 'windsurf' | 'vscode' | 'codex'
5
5
  /**
6
6
  * Skill set categories matching the plugins directory structure.
7
7
  */
8
- export type SkillSet = 'b2c' | 'b2c-cli';
8
+ export type SkillSet = 'b2c' | 'b2c-cli' | 'cap-dev';
9
+ /**
10
+ * Configuration for a skill source — defines how to fetch skills from a particular repository.
11
+ */
12
+ export interface SkillSourceConfig {
13
+ id: SkillSet;
14
+ displayName: string;
15
+ type: 'release-artifact' | 'repo-contents';
16
+ repo: string;
17
+ assetName?: string;
18
+ tagPattern?: (version: string) => string;
19
+ ref?: string;
20
+ skillsPath?: string;
21
+ }
9
22
  /**
10
23
  * IDE path configuration for skill installation.
11
24
  */
@@ -133,4 +146,6 @@ export interface CachedArtifact {
133
146
  path: string;
134
147
  /** ISO date string when artifact was downloaded */
135
148
  downloadedAt: string;
149
+ /** For repo-contents sources: the resolved commit SHA */
150
+ commitSha?: string;
136
151
  }
@@ -4,7 +4,7 @@ import type { Logger } from '../logging/index.js';
4
4
  /**
5
5
  * Types of B2C operations that support lifecycle hooks.
6
6
  */
7
- export type B2COperationType = 'job:run' | 'job:import' | 'job:export' | 'code:deploy' | 'code:download' | 'code:activate' | 'site-archive:import' | 'site-archive:export';
7
+ export type B2COperationType = 'job:run' | 'job:import' | 'job:export' | 'code:deploy' | 'code:download' | 'code:activate' | 'site-archive:import' | 'site-archive:export' | 'cap:install' | 'cap:uninstall';
8
8
  /**
9
9
  * Context provided to lifecycle hooks for a B2C operation.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cli/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAwKvC;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,aAA+B,EAC/B,QAAiC,EACjC,QAAqB;IAErB,OAAO;QACL,aAAa;QACb,WAAW,EAAE,UAAU,EAAE;QACzB,QAAQ;QACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACrB,SAAS,GAAoC,EAAE,CAAC;IAChD,MAAM,CAAU;IAExB,YAAY,MAAe;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAA0C;QACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,OAA4B;QAC1C,MAAM,gBAAgB,GAA6B,EAAE,CAAC;QAEtD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,eAAe;gBAAE,SAAS;YAExC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;oBACjB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,QAAQ,CAAC,IAAI,oBAAoB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;oBACrF,OAAO,MAAM,CAAC,CAAC,kBAAkB;gBACnC,CAAC;gBACD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACpB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,0CAA0C;gBAC1C,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,QAAQ,CAAC,IAAI,4BAA4B,KAAK,EAAE,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,OAA4B,EAAE,MAA0B;QACrE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,cAAc;gBAAE,SAAS;YAEvC,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,4BAA4B;gBAC5B,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,QAAQ,CAAC,IAAI,2BAA2B,KAAK,EAAE,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cli/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AA0KvC;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,aAA+B,EAC/B,QAAiC,EACjC,QAAqB;IAErB,OAAO;QACL,aAAa;QACb,WAAW,EAAE,UAAU,EAAE;QACzB,QAAQ;QACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACrB,SAAS,GAAoC,EAAE,CAAC;IAChD,MAAM,CAAU;IAExB,YAAY,MAAe;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAA0C;QACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,OAA4B;QAC1C,MAAM,gBAAgB,GAA6B,EAAE,CAAC;QAEtD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,eAAe;gBAAE,SAAS;YAExC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;oBACjB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,QAAQ,CAAC,IAAI,oBAAoB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;oBACrF,OAAO,MAAM,CAAC,CAAC,kBAAkB;gBACnC,CAAC;gBACD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACpB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,0CAA0C;gBAC1C,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,QAAQ,CAAC,IAAI,4BAA4B,KAAK,EAAE,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,OAA4B,EAAE,MAA0B;QACrE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,cAAc;gBAAE,SAAS;YAEvC,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,4BAA4B;gBAC5B,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,QAAQ,CAAC,IAAI,2BAA2B,KAAK,EAAE,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;CACF"}
@@ -22,6 +22,8 @@ export type { CloneState, WaitForCloneOptions, WaitForClonePollInfo } from './op
22
22
  export { buildCipReportSql, describeCipTable, executeCipReport, getCipReportByName, listCipReports, listCipTables, } from './operations/cip/index.js';
23
23
  export type { CipColumnMetadata, CipDescribeTableOptions, CipDescribeTableResult, CipListTablesOptions, CipListTablesResult, CipReportDefinition, CipReportExecutionOptions, CipReportParamType, CipReportParamDefinition, CipReportQueryExecutor, CipReportQueryResult, CipReportSqlResult, CipTableMetadata, } from './operations/cip/index.js';
24
24
  export { getUser, getUserByLogin, listUsers, createUser, updateUser, deleteUser, purgeUser, resetUser, grantRole, revokeRole, } from './operations/users/index.js';
25
+ export { validateCap, commerceAppInstall, commerceAppUninstall, commerceAppPackage, discoverLocalApps, listInstalledApps, parseCommerceFeatureStatesXml, readManifest, pullCommerceApps, } from './operations/cap/index.js';
26
+ export type { CapValidationResult, CommerceAppManifest, CommerceAppInstallOptions, CommerceAppInstallResult, CommerceAppUninstallOptions, CommerceAppUninstallResult, CommerceAppPackageOptions, CommerceAppPackageResult, CommerceFeatureState, LocalCommerceApp, ListInstalledAppsOptions, ListInstalledAppsResult, PullCommerceAppsOptions, PullCommerceAppsResult, PulledApp, PullSource, } from './operations/cap/index.js';
25
27
  export { getRole, listRoles } from './operations/roles/index.js';
26
28
  export { getOrg, getOrgByName, listOrgs } from './operations/orgs/index.js';
27
29
  export { getSafetyLevel, describeSafetyLevel, checkSafetyViolation, checkLevelViolation, SafetyBlockedError, SafetyConfirmationRequired, SafetyGuard, extractJobIdFromPath, maxSafetyLevel, isValidSafetyLevel, parseSafetyLevelString, resolveEffectiveSafetyConfig, loadGlobalSafetyConfig, isValidSafetyAction, VALID_SAFETY_ACTIONS, withSafetyConfirmation, } from './safety/index.js';
package/dist/esm/index.js CHANGED
@@ -26,6 +26,8 @@ export { isUuid, isFriendlySandboxId, parseFriendlySandboxId, resolveSandboxId,
26
26
  export { buildCipReportSql, describeCipTable, executeCipReport, getCipReportByName, listCipReports, listCipTables, } from './operations/cip/index.js';
27
27
  // Operations - Users
28
28
  export { getUser, getUserByLogin, listUsers, createUser, updateUser, deleteUser, purgeUser, resetUser, grantRole, revokeRole, } from './operations/users/index.js';
29
+ // Operations - CAP (Commerce App Packages)
30
+ export { validateCap, commerceAppInstall, commerceAppUninstall, commerceAppPackage, discoverLocalApps, listInstalledApps, parseCommerceFeatureStatesXml, readManifest, pullCommerceApps, } from './operations/cap/index.js';
29
31
  // Operations - Roles
30
32
  export { getRole, listRoles } from './operations/roles/index.js';
31
33
  // Operations - Organizations
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAG7G,OAAO;AACP,OAAO,EAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAGlH,SAAS;AACT,OAAO,EAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAC,MAAM,mBAAmB,CAAC;AAe9G,yCAAyC;AACzC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,SAAS,EACT,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAiBzB,2BAA2B;AAC3B,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAGhD,UAAU;AACV,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,2BAA2B,EAC3B,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,+BAA+B,EAC/B,+BAA+B,EAC/B,oCAAoC,EACpC,8BAA8B,EAC9B,oBAAoB,EACpB,gCAAgC,EAChC,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAwF5B,oBAAoB;AACpB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AAYpC,oBAAoB;AACpB,OAAO,EACL,UAAU,EACV,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AAoBpC,8BAA8B;AAC9B,OAAO,EACL,UAAU,EACV,OAAO,EACP,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC;AAYzB,mBAAmB;AACnB,OAAO,EACL,MAAM,EACN,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAKnC,mBAAmB;AACnB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,aAAa,GACd,MAAM,2BAA2B,CAAC;AAiBnC,qBAAqB;AACrB,OAAO,EACL,OAAO,EACP,cAAc,EACd,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,GACX,MAAM,6BAA6B,CAAC;AAErC,2CAA2C;AAC3C,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,6BAA6B,EAC7B,YAAY,EACZ,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAoBnC,qBAAqB;AACrB,OAAO,EAAC,OAAO,EAAE,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAE/D,6BAA6B;AAC7B,OAAO,EAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAC,MAAM,4BAA4B,CAAC;AAE1E,qDAAqD;AACrD,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,WAAW,EACX,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAI3B,WAAW;AACX,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAEvB,eAAe;AACf,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Commerce App Package (CAP) operations for B2C Commerce.
3
+ *
4
+ * This module provides functions for validating, packaging, installing, and
5
+ * uninstalling Commerce App Packages (CAPs) on B2C Commerce instances.
6
+ *
7
+ * ## CAP Operations
8
+ *
9
+ * - {@link validateCap} - Validate CAP structure and manifest (local, no instance required)
10
+ * - {@link commerceAppInstall} - Install a CAP via the sfcc-install-commerce-app job
11
+ * - {@link commerceAppUninstall} - Uninstall a CAP via the sfcc-uninstall-commerce-app job
12
+ * - {@link commerceAppPackage} - Package a CAP directory into a distributable .zip
13
+ * - {@link discoverLocalApps} - Discover local CAPs by finding commerce-app.json files
14
+ * - {@link listInstalledApps} - List installed apps on an instance via commerce_feature_states export
15
+ *
16
+ * ## Usage
17
+ *
18
+ * ```typescript
19
+ * import {
20
+ * validateCap,
21
+ * commerceAppInstall,
22
+ * commerceAppUninstall,
23
+ * commerceAppPackage,
24
+ * discoverLocalApps,
25
+ * listInstalledApps,
26
+ * } from '@salesforce/b2c-tooling-sdk/operations/cap';
27
+ *
28
+ * // Validate locally
29
+ * const result = await validateCap('./my-commerce-app');
30
+ * if (!result.valid) console.error(result.errors);
31
+ *
32
+ * // Package for distribution
33
+ * const pkg = await commerceAppPackage('./my-commerce-app');
34
+ *
35
+ * // Install on an instance
36
+ * await commerceAppInstall(instance, './my-commerce-app', { siteId: 'RefArch' });
37
+ *
38
+ * // Uninstall
39
+ * await commerceAppUninstall(instance, 'my-app', 'tax', { siteId: 'RefArch' });
40
+ * ```
41
+ *
42
+ * @module operations/cap
43
+ */
44
+ export { validateCap } from './validate.js';
45
+ export type { CapValidationResult, CommerceAppManifest } from './validate.js';
46
+ export { JobExecutionError } from '../jobs/run.js';
47
+ export { commerceAppInstall, readManifest } from './install.js';
48
+ export type { CommerceAppInstallOptions, CommerceAppInstallResult } from './install.js';
49
+ export { commerceAppUninstall } from './uninstall.js';
50
+ export type { CommerceAppUninstallOptions, CommerceAppUninstallResult } from './uninstall.js';
51
+ export { commerceAppPackage } from './package.js';
52
+ export type { CommerceAppPackageOptions, CommerceAppPackageResult } from './package.js';
53
+ export { discoverLocalApps, listInstalledApps, parseCommerceFeatureStatesXml } from './list.js';
54
+ export { pullCommerceApps } from './pull.js';
55
+ export type { PullCommerceAppsOptions, PullCommerceAppsResult, PulledApp, PullSource } from './pull.js';
56
+ export type { CommerceFeatureState, LocalCommerceApp, ListInstalledAppsOptions, ListInstalledAppsResult, } from './list.js';
@@ -0,0 +1,57 @@
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
+ * Commerce App Package (CAP) operations for B2C Commerce.
8
+ *
9
+ * This module provides functions for validating, packaging, installing, and
10
+ * uninstalling Commerce App Packages (CAPs) on B2C Commerce instances.
11
+ *
12
+ * ## CAP Operations
13
+ *
14
+ * - {@link validateCap} - Validate CAP structure and manifest (local, no instance required)
15
+ * - {@link commerceAppInstall} - Install a CAP via the sfcc-install-commerce-app job
16
+ * - {@link commerceAppUninstall} - Uninstall a CAP via the sfcc-uninstall-commerce-app job
17
+ * - {@link commerceAppPackage} - Package a CAP directory into a distributable .zip
18
+ * - {@link discoverLocalApps} - Discover local CAPs by finding commerce-app.json files
19
+ * - {@link listInstalledApps} - List installed apps on an instance via commerce_feature_states export
20
+ *
21
+ * ## Usage
22
+ *
23
+ * ```typescript
24
+ * import {
25
+ * validateCap,
26
+ * commerceAppInstall,
27
+ * commerceAppUninstall,
28
+ * commerceAppPackage,
29
+ * discoverLocalApps,
30
+ * listInstalledApps,
31
+ * } from '@salesforce/b2c-tooling-sdk/operations/cap';
32
+ *
33
+ * // Validate locally
34
+ * const result = await validateCap('./my-commerce-app');
35
+ * if (!result.valid) console.error(result.errors);
36
+ *
37
+ * // Package for distribution
38
+ * const pkg = await commerceAppPackage('./my-commerce-app');
39
+ *
40
+ * // Install on an instance
41
+ * await commerceAppInstall(instance, './my-commerce-app', { siteId: 'RefArch' });
42
+ *
43
+ * // Uninstall
44
+ * await commerceAppUninstall(instance, 'my-app', 'tax', { siteId: 'RefArch' });
45
+ * ```
46
+ *
47
+ * @module operations/cap
48
+ */
49
+ export { validateCap } from './validate.js';
50
+ // Re-export JobExecutionError for convenience in CLI commands
51
+ export { JobExecutionError } from '../jobs/run.js';
52
+ export { commerceAppInstall, readManifest } from './install.js';
53
+ export { commerceAppUninstall } from './uninstall.js';
54
+ export { commerceAppPackage } from './package.js';
55
+ export { discoverLocalApps, listInstalledApps, parseCommerceFeatureStatesXml } from './list.js';
56
+ export { pullCommerceApps } from './pull.js';
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/operations/cap/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAG1C,8DAA8D;AAC9D,OAAO,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAC,kBAAkB,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AAG9D,OAAO,EAAC,oBAAoB,EAAC,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAC,iBAAiB,EAAE,iBAAiB,EAAE,6BAA6B,EAAC,MAAM,WAAW,CAAC;AAE9F,OAAO,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { B2CInstance } from '../../instance/index.js';
2
+ import { type JobExecution, type WaitForJobOptions } from '../jobs/run.js';
3
+ import { type CommerceAppManifest } from './validate.js';
4
+ /**
5
+ * Options for CAP installation.
6
+ */
7
+ export interface CommerceAppInstallOptions {
8
+ /** Target site ID to install the app on. */
9
+ siteId: string;
10
+ /** Keep the uploaded zip on the instance after install (default: false). */
11
+ keepArchive?: boolean;
12
+ /** Wait options for job completion. */
13
+ waitOptions?: WaitForJobOptions;
14
+ }
15
+ /**
16
+ * Result of a CAP installation.
17
+ */
18
+ export interface CommerceAppInstallResult {
19
+ /** Job execution details. */
20
+ execution: JobExecution;
21
+ /** App name (id from commerce-app.json). */
22
+ appName: string;
23
+ /** App version. */
24
+ appVersion: string;
25
+ /** Uploaded archive filename. */
26
+ archiveFilename: string;
27
+ /** Whether the archive was kept on the instance. */
28
+ archiveKept: boolean;
29
+ }
30
+ /**
31
+ * Installs a Commerce App Package (CAP) on a B2C Commerce instance.
32
+ *
33
+ * Accepts a local directory or zip file. Reads the commerce-app.json manifest
34
+ * to determine app name, version, and domain. Uploads the zip to WebDAV and
35
+ * executes the sfcc-install-commerce-app system job.
36
+ *
37
+ * @param instance - B2C instance to install to
38
+ * @param target - Path to a CAP directory or .zip file
39
+ * @param options - Install options including required siteId
40
+ * @returns Install result with job execution details
41
+ * @throws JobExecutionError if the install job fails
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const result = await commerceAppInstall(instance, './commerce-avalara-tax-app-v0.2.5', {
46
+ * siteId: 'RefArch',
47
+ * });
48
+ * ```
49
+ */
50
+ export declare function commerceAppInstall(instance: B2CInstance, target: string, options: CommerceAppInstallOptions): Promise<CommerceAppInstallResult>;
51
+ export declare function readManifest(capDir: string): CommerceAppManifest;
52
+ /** Prefix site ID with "Sites-" if not already present. */
53
+ export declare function normalizeSiteId(siteId: string): string;
@@ -0,0 +1,183 @@
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
+ * Commerce App Package (CAP) installation.
8
+ *
9
+ * Uploads a CAP to WebDAV and runs the sfcc-install-commerce-app system job.
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import JSZip from 'jszip';
14
+ import { B2CInstance } from '../../instance/index.js';
15
+ import { getLogger } from '../../logging/logger.js';
16
+ import { waitForJob, JobExecutionError, getJobLog } from '../jobs/run.js';
17
+ import { addDirectoryToZip } from '../util/zip.js';
18
+ import {} from './validate.js';
19
+ const INSTALL_JOB_ID = 'sfcc-install-commerce-app';
20
+ /**
21
+ * Installs a Commerce App Package (CAP) on a B2C Commerce instance.
22
+ *
23
+ * Accepts a local directory or zip file. Reads the commerce-app.json manifest
24
+ * to determine app name, version, and domain. Uploads the zip to WebDAV and
25
+ * executes the sfcc-install-commerce-app system job.
26
+ *
27
+ * @param instance - B2C instance to install to
28
+ * @param target - Path to a CAP directory or .zip file
29
+ * @param options - Install options including required siteId
30
+ * @returns Install result with job execution details
31
+ * @throws JobExecutionError if the install job fails
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * const result = await commerceAppInstall(instance, './commerce-avalara-tax-app-v0.2.5', {
36
+ * siteId: 'RefArch',
37
+ * });
38
+ * ```
39
+ */
40
+ export async function commerceAppInstall(instance, target, options) {
41
+ const logger = getLogger();
42
+ const { siteId: rawSiteId, keepArchive = false, waitOptions } = options;
43
+ const siteId = normalizeSiteId(rawSiteId);
44
+ if (!fs.existsSync(target)) {
45
+ throw new Error(`Target not found: ${target}`);
46
+ }
47
+ const stat = fs.statSync(target);
48
+ let archiveContent;
49
+ let archiveFilename;
50
+ let manifest;
51
+ if (stat.isDirectory()) {
52
+ manifest = readManifest(target);
53
+ archiveFilename = `${manifest.id}-v${manifest.version}.zip`;
54
+ logger.debug({ path: target }, `Packaging CAP directory: ${target}`);
55
+ archiveContent = await createArchiveFromDirectory(target, `${manifest.id}-v${manifest.version}`);
56
+ }
57
+ else if (stat.isFile() && target.endsWith('.zip')) {
58
+ manifest = await readManifestFromZip(target);
59
+ archiveFilename = path.basename(target);
60
+ archiveContent = await fs.promises.readFile(target);
61
+ }
62
+ else {
63
+ throw new Error(`Target must be a directory or .zip file: ${target}`);
64
+ }
65
+ const uploadDir = 'Impex/commerce-apps';
66
+ const webdavUploadPath = `${uploadDir}/${archiveFilename}`;
67
+ const appPath = `webdav/Sites/${webdavUploadPath}`;
68
+ logger.debug({ path: webdavUploadPath }, `Uploading CAP to ${webdavUploadPath}`);
69
+ await instance.webdav.mkcol(uploadDir);
70
+ await instance.webdav.put(webdavUploadPath, archiveContent, 'application/zip');
71
+ logger.debug({ path: webdavUploadPath }, `CAP uploaded: ${webdavUploadPath}`);
72
+ // Execute the install job
73
+ logger.debug({ jobId: INSTALL_JOB_ID, appName: manifest.id, siteId }, `Executing ${INSTALL_JOB_ID} job`);
74
+ let execution;
75
+ // Try direct body format first (standard OCAPI format)
76
+ const { data, error } = await instance.ocapi.POST('/jobs/{job_id}/executions', {
77
+ params: { path: { job_id: INSTALL_JOB_ID } },
78
+ body: {
79
+ app_name: manifest.id,
80
+ app_source: 'WebDAV',
81
+ app_domain: manifest.domain,
82
+ site_id: siteId,
83
+ app_path: appPath,
84
+ },
85
+ });
86
+ if (error?.fault?.type === 'UnknownPropertyException' &&
87
+ error.fault.arguments?.document === 'job_execution_request') {
88
+ // Retry with parameters format (internal/support users)
89
+ logger.warn('Retrying with parameters format for internal users');
90
+ const { data: retryData, error: retryError } = await instance.ocapi.POST('/jobs/{job_id}/executions', {
91
+ params: { path: { job_id: INSTALL_JOB_ID } },
92
+ body: {
93
+ parameters: [
94
+ { name: 'AppName', value: manifest.id },
95
+ { name: 'AppSource', value: 'WebDAV' },
96
+ { name: 'AppDomain', value: manifest.domain },
97
+ { name: 'SiteId', value: siteId },
98
+ { name: 'AppPath', value: appPath },
99
+ ],
100
+ },
101
+ });
102
+ if (retryError || !retryData) {
103
+ throw new Error(retryError?.fault?.message ?? 'Failed to start install job');
104
+ }
105
+ execution = retryData;
106
+ }
107
+ else if (error || !data) {
108
+ throw new Error(error?.fault?.message ?? 'Failed to start install job');
109
+ }
110
+ else {
111
+ execution = data;
112
+ }
113
+ logger.debug({ jobId: INSTALL_JOB_ID, executionId: execution.id }, `Install job started: ${execution.id}`);
114
+ // Wait for job completion
115
+ let finalExecution;
116
+ try {
117
+ finalExecution = await waitForJob(instance, INSTALL_JOB_ID, execution.id, waitOptions);
118
+ }
119
+ catch (err) {
120
+ if (err instanceof JobExecutionError) {
121
+ try {
122
+ const log = await getJobLog(instance, err.execution);
123
+ logger.error({ jobId: INSTALL_JOB_ID, log }, `Job log:\n${log}`);
124
+ }
125
+ catch {
126
+ logger.error({ jobId: INSTALL_JOB_ID }, 'Could not retrieve job log');
127
+ }
128
+ }
129
+ throw err;
130
+ }
131
+ // Clean up archive unless keeping
132
+ if (!keepArchive) {
133
+ await instance.webdav.delete(webdavUploadPath);
134
+ logger.debug({ path: webdavUploadPath }, `Archive deleted: ${webdavUploadPath}`);
135
+ }
136
+ return {
137
+ execution: finalExecution,
138
+ appName: manifest.id,
139
+ appVersion: manifest.version,
140
+ archiveFilename,
141
+ archiveKept: keepArchive,
142
+ };
143
+ }
144
+ export function readManifest(capDir) {
145
+ const manifestPath = path.join(capDir, 'commerce-app.json');
146
+ if (!fs.existsSync(manifestPath)) {
147
+ throw new Error(`commerce-app.json not found in: ${capDir}`);
148
+ }
149
+ try {
150
+ return JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
151
+ }
152
+ catch {
153
+ throw new Error(`Failed to parse commerce-app.json in: ${capDir}`);
154
+ }
155
+ }
156
+ async function readManifestFromZip(zipPath) {
157
+ const data = await fs.promises.readFile(zipPath);
158
+ const zip = await JSZip.loadAsync(data);
159
+ // Find commerce-app.json at root or one level deep
160
+ for (const [filePath, entry] of Object.entries(zip.files)) {
161
+ if (!entry.dir && (filePath === 'commerce-app.json' || filePath.match(/^[^/]+\/commerce-app\.json$/))) {
162
+ try {
163
+ const content = await entry.async('string');
164
+ return JSON.parse(content);
165
+ }
166
+ catch {
167
+ throw new Error('Failed to parse commerce-app.json from zip');
168
+ }
169
+ }
170
+ }
171
+ throw new Error('commerce-app.json not found in zip');
172
+ }
173
+ /** Prefix site ID with "Sites-" if not already present. */
174
+ export function normalizeSiteId(siteId) {
175
+ return siteId.startsWith('Sites-') ? siteId : `Sites-${siteId}`;
176
+ }
177
+ async function createArchiveFromDirectory(dirPath, archiveDirName) {
178
+ const zip = new JSZip();
179
+ const rootFolder = zip.folder(archiveDirName);
180
+ await addDirectoryToZip(rootFolder, dirPath);
181
+ return zip.generateAsync({ type: 'nodebuffer', compression: 'DEFLATE', compressionOptions: { level: 9 } });
182
+ }
183
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../../src/operations/cap/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { B2CInstance } from '../../instance/index.js';
2
+ import type { JobExecution, WaitForJobOptions } from '../jobs/run.js';
3
+ import type { CommerceAppManifest } from './validate.js';
4
+ /**
5
+ * A commerce feature state parsed from the commerce-feature-states.xml export.
6
+ */
7
+ export interface CommerceFeatureState {
8
+ siteId: string;
9
+ featureName: string;
10
+ featureType: string;
11
+ featureSource: string;
12
+ featureDomain: string;
13
+ installStatus: string;
14
+ configStatus: string;
15
+ featureVersionId: string;
16
+ installedAt: string;
17
+ configTasks?: unknown[];
18
+ installationMetadata?: unknown;
19
+ }
20
+ /**
21
+ * A locally discovered Commerce App Package.
22
+ */
23
+ export interface LocalCommerceApp {
24
+ /** Absolute path to the directory containing commerce-app.json. */
25
+ path: string;
26
+ /** Parsed manifest from commerce-app.json. */
27
+ manifest: CommerceAppManifest;
28
+ }
29
+ /**
30
+ * Options for listing installed apps on an instance.
31
+ */
32
+ export interface ListInstalledAppsOptions {
33
+ /** Specific site IDs to query. If omitted, discovers all sites via OCAPI. */
34
+ sites?: string[];
35
+ /** Wait options for the export job. */
36
+ waitOptions?: WaitForJobOptions;
37
+ }
38
+ /**
39
+ * Result of listing installed apps on an instance.
40
+ */
41
+ export interface ListInstalledAppsResult {
42
+ /** Parsed commerce feature states from all queried sites. */
43
+ features: CommerceFeatureState[];
44
+ /** Job execution details. */
45
+ execution: JobExecution;
46
+ }
47
+ /**
48
+ * Discovers local Commerce App Packages by searching for commerce-app.json files.
49
+ *
50
+ * Walks the directory tree starting from `searchPath`, finds directories
51
+ * containing a `commerce-app.json` file, and reads each manifest.
52
+ *
53
+ * @param searchPath - Root directory to search
54
+ * @returns Array of discovered local apps with their paths and manifests
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * const apps = await discoverLocalApps('./my-workspace');
59
+ * for (const app of apps) {
60
+ * console.log(`${app.manifest.id}@${app.manifest.version} at ${app.path}`);
61
+ * }
62
+ * ```
63
+ */
64
+ export declare function discoverLocalApps(searchPath: string): Promise<LocalCommerceApp[]>;
65
+ /**
66
+ * Lists installed Commerce Apps on a B2C instance by exporting commerce feature states.
67
+ *
68
+ * Attempts to export the `commerce_feature_states` data unit for each site.
69
+ * If the export fails (e.g. because the data unit is not yet supported on the server),
70
+ * falls back to a bundled stub fixture.
71
+ *
72
+ * @param instance - B2C instance to query
73
+ * @param options - Options including optional site filter and wait options
74
+ * @returns List of commerce feature states across all queried sites
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const result = await listInstalledApps(instance);
79
+ * for (const state of result.features) {
80
+ * console.log(`${state.featureName} (${state.installStatus}) on ${state.siteId}`);
81
+ * }
82
+ * ```
83
+ */
84
+ export declare function listInstalledApps(instance: B2CInstance, options?: ListInstalledAppsOptions): Promise<ListInstalledAppsResult>;
85
+ /**
86
+ * Parses a commerce-feature-states.xml string into CommerceFeatureState objects.
87
+ *
88
+ * @param xml - XML string to parse
89
+ * @param siteId - Site ID to associate with parsed states (used as fallback if not in XML attributes)
90
+ * @returns Array of parsed commerce feature states
91
+ */
92
+ export declare function parseCommerceFeatureStatesXml(xml: string, siteId: string): Promise<CommerceFeatureState[]>;