@salesforce/b2c-tooling-sdk 1.19.0 → 1.19.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.
@@ -28,6 +28,7 @@ import type { DetectionResult, DetectOptions } from './types.js';
28
28
  export declare class WorkspaceTypeDetector {
29
29
  private workspacePath;
30
30
  private patterns;
31
+ private context;
31
32
  /**
32
33
  * Creates a new WorkspaceTypeDetector.
33
34
  *
@@ -39,6 +39,7 @@ import { DEFAULT_PATTERNS } from './patterns/index.js';
39
39
  export class WorkspaceTypeDetector {
40
40
  workspacePath;
41
41
  patterns;
42
+ context;
42
43
  /**
43
44
  * Creates a new WorkspaceTypeDetector.
44
45
  *
@@ -48,6 +49,7 @@ export class WorkspaceTypeDetector {
48
49
  constructor(workspacePath, options = {}) {
49
50
  this.workspacePath = workspacePath;
50
51
  this.patterns = this.resolvePatterns(options);
52
+ this.context = { maxDepth: options.maxDepth };
51
53
  }
52
54
  /**
53
55
  * Performs workspace detection.
@@ -67,7 +69,7 @@ export class WorkspaceTypeDetector {
67
69
  logger.trace({ workspacePath: this.workspacePath, patternCount: this.patterns.length }, 'Detecting workspace/storefront type');
68
70
  for (const pattern of this.patterns) {
69
71
  try {
70
- const matched = await pattern.detect(this.workspacePath);
72
+ const matched = await pattern.detect(this.workspacePath, this.context);
71
73
  logger.trace({ pattern: pattern.name, projectType: pattern.projectType, matched }, 'Detection pattern evaluated');
72
74
  if (matched) {
73
75
  matchedPatterns.push(pattern.name);
@@ -1 +1 @@
1
- {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/discovery/detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/discovery/detector.ts"],"names":[],"mappings":"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"}
@@ -57,7 +57,7 @@
57
57
  * @module discovery
58
58
  */
59
59
  export { WorkspaceTypeDetector, detectWorkspaceType } from './detector.js';
60
- export type { ProjectType, DetectionPattern, DetectionResult, DetectOptions } from './types.js';
60
+ export type { ProjectType, DetectionContext, DetectionPattern, DetectionResult, DetectOptions } from './types.js';
61
61
  export { PROJECT_TYPES } from './types.js';
62
62
  export { DEFAULT_PATTERNS, cartridgesPattern, pwaKitV3Pattern, storefrontNextPattern, sfraPattern, } from './patterns/index.js';
63
63
  export { readPackageJson, exists, glob, globDirs } from './utils.js';
@@ -8,8 +8,10 @@ import { findCartridges } from '../../operations/code/cartridges.js';
8
8
  export const cartridgesPattern = {
9
9
  name: 'cartridges',
10
10
  projectType: 'cartridges',
11
- detect: async (workspacePath) => {
12
- const cartridges = findCartridges(workspacePath);
11
+ detect: async (workspacePath, context) => {
12
+ // Existence check only — stop at the first cartridge and honor the depth
13
+ // bound so a broad root (e.g. a home directory) is not fully scanned.
14
+ const cartridges = findCartridges(workspacePath, { firstMatchOnly: true, maxDepth: context?.maxDepth });
13
15
  return cartridges.length > 0;
14
16
  },
15
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"cartridges.js","sourceRoot":"","sources":["../../../../src/discovery/patterns/cartridges.ts"],"names":[],"mappings":"AAcA,OAAO,EAAC,cAAc,EAAC,MAAM,qCAAqC,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAqB;IACjD,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,YAAY;IACzB,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"cartridges.js","sourceRoot":"","sources":["../../../../src/discovery/patterns/cartridges.ts"],"names":[],"mappings":"AAcA,OAAO,EAAC,cAAc,EAAC,MAAM,qCAAqC,CAAC;AAEnE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAqB;IACjD,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,YAAY;IACzB,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE;QACvC,yEAAyE;QACzE,sEAAsE;QACtE,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,EAAE,EAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAC,CAAC,CAAC;QACtG,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC"}
@@ -25,12 +25,17 @@ import { readPackageJson } from '../utils.js';
25
25
  export const sfraPattern = {
26
26
  name: 'sfra',
27
27
  projectType: 'sfra',
28
- detect: async (workspacePath) => {
28
+ detect: async (workspacePath, context) => {
29
29
  // Primary check: Look for app_storefront_base cartridge (the core SFRA cartridge)
30
- // This is the definitive indicator per Salesforce documentation
31
- const cartridges = findCartridges(workspacePath);
32
- const hasSfraCartridge = cartridges.some((cartridge) => cartridge.name === 'app_storefront_base');
33
- if (hasSfraCartridge) {
30
+ // This is the definitive indicator per Salesforce documentation. Filter to
31
+ // that name and stop at the first hit so we don't enumerate every cartridge,
32
+ // and honor the depth bound so a broad root isn't fully scanned.
33
+ const cartridges = findCartridges(workspacePath, {
34
+ include: ['app_storefront_base'],
35
+ firstMatchOnly: true,
36
+ maxDepth: context?.maxDepth,
37
+ });
38
+ if (cartridges.length > 0) {
34
39
  return true;
35
40
  }
36
41
  // Secondary check: Look for package.json with paths.base pointing to app_storefront_base
@@ -1 +1 @@
1
- {"version":3,"file":"sfra.js","sourceRoot":"","sources":["../../../../src/discovery/patterns/sfra.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAC,cAAc,EAAC,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,MAAM;IACnB,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE;QAC9B,kFAAkF;QAClF,gEAAgE;QAChE,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC;QAClG,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yFAAyF;QACzF,oFAAoF;QACpF,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,WAAW,CAAC,KAA2C,CAAC;YACtE,IAAI,KAAK,EAAE,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClD,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"sfra.js","sourceRoot":"","sources":["../../../../src/discovery/patterns/sfra.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAC,cAAc,EAAC,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,MAAM;IACnB,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE;QACvC,kFAAkF;QAClF,2EAA2E;QAC3E,6EAA6E;QAC7E,iEAAiE;QACjE,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,EAAE;YAC/C,OAAO,EAAE,CAAC,qBAAqB,CAAC;YAChC,cAAc,EAAE,IAAI;YACpB,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,CAAC,CAAC;QACH,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yFAAyF;QACzF,oFAAoF;QACpF,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,WAAW,CAAC,KAA2C,CAAC;YACtE,IAAI,KAAK,EAAE,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClD,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAC"}
@@ -21,6 +21,18 @@ export type ProjectType = 'cartridges' | 'sfra' | 'pwa-kit-v3' | 'storefront-nex
21
21
  * with {@link ProjectType} by the `satisfies` check below.
22
22
  */
23
23
  export declare const PROJECT_TYPES: readonly ["cartridges", "sfra", "pwa-kit-v3", "storefront-next"];
24
+ /**
25
+ * Context passed to a detection pattern's `detect` function.
26
+ */
27
+ export interface DetectionContext {
28
+ /**
29
+ * Maximum directory depth (in path segments, relative to the workspace root)
30
+ * that filesystem-scanning patterns should recurse. Undefined means unbounded.
31
+ * Bounding this protects against costly walks when the workspace root is broad
32
+ * (e.g. an MCP server launched from a home directory).
33
+ */
34
+ maxDepth?: number;
35
+ }
24
36
  /**
25
37
  * Detection pattern definition.
26
38
  */
@@ -30,7 +42,7 @@ export interface DetectionPattern {
30
42
  /** Project type this pattern detects */
31
43
  projectType: ProjectType;
32
44
  /** Detection function */
33
- detect: (workspacePath: string) => Promise<boolean>;
45
+ detect: (workspacePath: string, context?: DetectionContext) => Promise<boolean>;
34
46
  }
35
47
  /**
36
48
  * Result of workspace detection.
@@ -53,4 +65,11 @@ export interface DetectOptions {
53
65
  additionalPatterns?: DetectionPattern[];
54
66
  /** Patterns to exclude by name */
55
67
  excludePatterns?: string[];
68
+ /**
69
+ * Maximum directory depth (in path segments, relative to the workspace root)
70
+ * that filesystem-scanning patterns recurse. Undefined means unbounded.
71
+ * Passed to each pattern via {@link DetectionContext}. Set this when detecting
72
+ * from a potentially broad root to keep the scan bounded.
73
+ */
74
+ maxDepth?: number;
56
75
  }
@@ -17,6 +17,24 @@ export interface FindCartridgesOptions {
17
17
  include?: string[];
18
18
  /** Cartridge names to exclude */
19
19
  exclude?: string[];
20
+ /**
21
+ * Maximum directory depth to recurse when searching for `.project` files,
22
+ * counted in path segments relative to the search directory (so a cartridge
23
+ * at `cartridges/<name>/.project` is depth 3). When omitted the search is
24
+ * unbounded (default), preserving behavior for callers that expect a full
25
+ * recursive walk. Bound this for untrusted/broad roots (e.g. an MCP server
26
+ * that may be launched from a home directory) to avoid scanning the whole
27
+ * filesystem tree.
28
+ */
29
+ maxDepth?: number;
30
+ /**
31
+ * When true, stop at the first matching cartridge and return only that one.
32
+ * Useful for existence checks (e.g. workspace-type detection) where the full
33
+ * list is not needed — it lets the underlying scan short-circuit instead of
34
+ * enumerating every `.project` file. Filters from `include`/`exclude` are
35
+ * applied while scanning, so the returned cartridge always satisfies them.
36
+ */
37
+ firstMatchOnly?: boolean;
20
38
  }
21
39
  /**
22
40
  * Find cartridges recursively in a directory.
@@ -3,7 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2
4
4
  * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
5
  */
6
- import { globSync } from 'glob';
6
+ import { globSync, globIterateSync } from 'glob';
7
7
  import path from 'node:path';
8
8
  /**
9
9
  * Find cartridges recursively in a directory.
@@ -32,9 +32,9 @@ import path from 'node:path';
32
32
  */
33
33
  export function findCartridges(directory, options = {}) {
34
34
  const searchDir = directory ? path.resolve(directory) : process.cwd();
35
- // Find all .project files (Eclipse project markers).
36
- // Ignore common non-cartridge dirs to keep discovery fast when projectRoot is broad (e.g. MCP working directory).
37
- const projectFiles = globSync('**/.project', {
35
+ // Ignore common non-cartridge dirs to keep discovery fast when the search
36
+ // root is broad (e.g. an MCP server's working directory).
37
+ const globOptions = {
38
38
  cwd: searchDir,
39
39
  ignore: [
40
40
  '**/node_modules/**',
@@ -46,24 +46,35 @@ export function findCartridges(directory, options = {}) {
46
46
  '**/tmp/**',
47
47
  '**/temp/**',
48
48
  ],
49
- });
50
- let cartridges = projectFiles.map((f) => {
49
+ // maxDepth is only forwarded when set so unbounded callers keep prior behavior.
50
+ ...(options.maxDepth === undefined ? {} : { maxDepth: options.maxDepth }),
51
+ };
52
+ const toCartridge = (f) => {
51
53
  const dirname = path.resolve(searchDir, path.dirname(f));
52
54
  const cartridgeName = path.basename(dirname);
53
- return {
54
- name: cartridgeName,
55
- dest: cartridgeName,
56
- src: dirname,
57
- };
58
- });
59
- // Apply include filter
60
- if (options.include && options.include.length > 0) {
61
- cartridges = cartridges.filter((c) => options.include.includes(c.name));
62
- }
63
- // Apply exclude filter
64
- if (options.exclude && options.exclude.length > 0) {
65
- cartridges = cartridges.filter((c) => !options.exclude.includes(c.name));
55
+ return { name: cartridgeName, dest: cartridgeName, src: dirname };
56
+ };
57
+ const matches = (c) => {
58
+ if (options.include && options.include.length > 0 && !options.include.includes(c.name)) {
59
+ return false;
60
+ }
61
+ if (options.exclude && options.exclude.length > 0 && options.exclude.includes(c.name)) {
62
+ return false;
63
+ }
64
+ return true;
65
+ };
66
+ // Existence-check fast path: stream matches and stop at the first one that
67
+ // passes the filters, so a large tree isn't fully enumerated.
68
+ if (options.firstMatchOnly) {
69
+ for (const f of globIterateSync('**/.project', globOptions)) {
70
+ const cartridge = toCartridge(f);
71
+ if (matches(cartridge)) {
72
+ return [cartridge];
73
+ }
74
+ }
75
+ return [];
66
76
  }
67
- return cartridges;
77
+ // Find all .project files (Eclipse project markers).
78
+ return globSync('**/.project', globOptions).map(toCartridge).filter(matches);
68
79
  }
69
80
  //# sourceMappingURL=cartridges.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartridges.js","sourceRoot":"","sources":["../../../../src/operations/code/cartridges.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,QAAQ,EAAC,MAAM,MAAM,CAAC;AAC9B,OAAO,IAAI,MAAM,WAAW,CAAC;AAwB7B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,cAAc,CAAC,SAAkB,EAAE,UAAiC,EAAE;IACpF,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEtE,qDAAqD;IACrD,kHAAkH;IAClH,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE;QAC3C,GAAG,EAAE,SAAS;QACd,MAAM,EAAE;YACN,oBAAoB;YACpB,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,gBAAgB;YAChB,cAAc;YACd,WAAW;YACX,YAAY;SACb;KACF,CAAC,CAAC;IAEH,IAAI,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,aAAa;YACnB,GAAG,EAAE,OAAO;SACb,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"cartridges.js","sourceRoot":"","sources":["../../../../src/operations/code/cartridges.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,QAAQ,EAAE,eAAe,EAAC,MAAM,MAAM,CAAC;AAC/C,OAAO,IAAI,MAAM,WAAW,CAAC;AA0C7B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,cAAc,CAAC,SAAkB,EAAE,UAAiC,EAAE;IACpF,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEtE,0EAA0E;IAC1E,0DAA0D;IAC1D,MAAM,WAAW,GAAG;QAClB,GAAG,EAAE,SAAS;QACd,MAAM,EAAE;YACN,oBAAoB;YACpB,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,gBAAgB;YAChB,cAAc;YACd,WAAW;YACX,YAAY;SACb;QACD,gFAAgF;QAChF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAC,CAAC;KACxE,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,CAAS,EAAoB,EAAE;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAC,CAAC;IAClE,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,CAAmB,EAAW,EAAE;QAC/C,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACvF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACtF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,2EAA2E;IAC3E,8DAA8D;IAC9D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC;YAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,qDAAqD;IACrD,OAAO,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/E,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@salesforce/b2c-tooling-sdk",
3
3
  "description": "Core tooling library for Salesforce B2C Commerce CLI",
4
- "version": "1.19.0",
4
+ "version": "1.19.1",
5
5
  "author": "Charles Lavery",
6
6
  "license": "Apache-2.0",
7
7
  "repository": "SalesforceCommerceCloud/b2c-developer-tooling",