@salesforce/b2c-tooling-sdk 1.12.0 → 1.14.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.
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/operations/cip/index.d.ts +1 -0
- package/dist/esm/operations/cip/index.js +56 -19
- package/dist/esm/operations/cip/index.js.map +1 -1
- package/dist/esm/operations/cip/reports.js +394 -15
- package/dist/esm/operations/cip/reports.js.map +1 -1
- package/dist/esm/operations/cip/sql.d.ts +66 -0
- package/dist/esm/operations/cip/sql.js +136 -0
- package/dist/esm/operations/cip/sql.js.map +1 -0
- package/dist/esm/operations/cip/types.d.ts +23 -0
- package/dist/esm/skills/sources.d.ts +4 -3
- package/dist/esm/skills/sources.js +12 -3
- package/dist/esm/skills/sources.js.map +1 -1
- package/dist/esm/skills/types.d.ts +1 -1
- package/dist/esm/telemetry/telemetry.js +6 -1
- package/dist/esm/telemetry/telemetry.js.map +1 -1
- package/package.json +3 -2
package/dist/esm/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export type { DocEntry, SearchIndex, SearchResult, SchemaEntry, SchemaIndex, Sch
|
|
|
19
19
|
export { isUuid, isFriendlySandboxId, parseFriendlySandboxId, resolveSandboxId, SandboxNotFoundError, waitForSandbox, SandboxPollingTimeoutError, SandboxPollingError, SandboxTerminalStateError, waitForClone, ClonePollingTimeoutError, ClonePollingError, CloneFailedError, } from './operations/ods/index.js';
|
|
20
20
|
export type { SandboxState, WaitForSandboxOptions, WaitForSandboxPollInfo } from './operations/ods/index.js';
|
|
21
21
|
export type { CloneState, WaitForCloneOptions, WaitForClonePollInfo } from './operations/ods/index.js';
|
|
22
|
-
export { buildCipReportSql, describeCipTable, executeCipReport, getCipReportByName, listCipReports, listCipTables, } from './operations/cip/index.js';
|
|
22
|
+
export { booleanLiteral, buildCipReportSql, dateLiteral, describeCipTable, escapeSqlString, executeCipReport, getCipReportByName, integerLiteral, isReservedIdentifier, listCipReports, listCipTables, quoteIdentifierIfReserved, stringInList, stringLiteral, } 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
25
|
export { validateCap, commerceAppInstall, commerceAppUninstall, commerceAppPackage, discoverLocalApps, listInstalledApps, parseCommerceFeatureStatesXml, readManifest, pullCommerceApps, } from './operations/cap/index.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -23,7 +23,7 @@ export { searchDocs, readDoc, readDocByQuery, listDocs, loadSearchIndex, listSch
|
|
|
23
23
|
// Operations - ODS
|
|
24
24
|
export { isUuid, isFriendlySandboxId, parseFriendlySandboxId, resolveSandboxId, SandboxNotFoundError, waitForSandbox, SandboxPollingTimeoutError, SandboxPollingError, SandboxTerminalStateError, waitForClone, ClonePollingTimeoutError, ClonePollingError, CloneFailedError, } from './operations/ods/index.js';
|
|
25
25
|
// Operations - CIP
|
|
26
|
-
export { buildCipReportSql, describeCipTable, executeCipReport, getCipReportByName, listCipReports, listCipTables, } from './operations/cip/index.js';
|
|
26
|
+
export { booleanLiteral, buildCipReportSql, dateLiteral, describeCipTable, escapeSqlString, executeCipReport, getCipReportByName, integerLiteral, isReservedIdentifier, listCipReports, listCipTables, quoteIdentifierIfReserved, stringInList, stringLiteral, } 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
29
|
// Operations - CAP (Commerce App Packages)
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import type { CipDescribeTableOptions, CipDescribeTableResult, CipListTablesOpti
|
|
|
9
9
|
* @module operations/cip
|
|
10
10
|
*/
|
|
11
11
|
export type { CipColumnMetadata, CipDescribeTableOptions, CipDescribeTableResult, CipListTablesOptions, CipListTablesResult, CipReportDefinition, CipReportExecutionOptions, CipReportParamType, CipReportParamDefinition, CipReportQueryExecutor, CipReportQueryResult, CipReportSqlResult, CipTableMetadata, } from './types.js';
|
|
12
|
+
export { booleanLiteral, dateLiteral, escapeSqlString, integerLiteral, isReservedIdentifier, quoteIdentifierIfReserved, stringInList, stringLiteral, } from './sql.js';
|
|
12
13
|
/**
|
|
13
14
|
* Lists tables from the CIP metadata catalog.
|
|
14
15
|
*
|
|
@@ -4,9 +4,30 @@
|
|
|
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
6
|
import { CIP_REPORTS } from './reports.js';
|
|
7
|
+
import { escapeSqlString } from './sql.js';
|
|
8
|
+
export { booleanLiteral, dateLiteral, escapeSqlString, integerLiteral, isReservedIdentifier, quoteIdentifierIfReserved, stringInList, stringLiteral, } from './sql.js';
|
|
7
9
|
function toStringOrEmpty(value) {
|
|
8
10
|
return typeof value === 'string' ? value : '';
|
|
9
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolves a value from a metadata row by matching candidate column patterns
|
|
14
|
+
* case-insensitively (ignoring underscores).
|
|
15
|
+
*
|
|
16
|
+
* CIP's Avatica metadata results are keyed by the column *labels* the JDBC
|
|
17
|
+
* driver emits. Depending on the tenant/driver these can be the camelCase
|
|
18
|
+
* aliases from our SELECT (`tableName`) or the standard uppercase JDBC metadata
|
|
19
|
+
* names (`TABLE_NAME`). Hard-coding a single casing makes the mapping silently
|
|
20
|
+
* yield empty strings for the other variant — so match tolerantly instead.
|
|
21
|
+
*/
|
|
22
|
+
function pickRowValue(row, ...patterns) {
|
|
23
|
+
for (const key of Object.keys(row)) {
|
|
24
|
+
const normalizedKey = key.replaceAll('_', '').toLowerCase();
|
|
25
|
+
if (patterns.some((pattern) => pattern.test(normalizedKey))) {
|
|
26
|
+
return row[key];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
10
31
|
function toBoolean(value) {
|
|
11
32
|
if (typeof value === 'boolean') {
|
|
12
33
|
return value;
|
|
@@ -22,9 +43,6 @@ function toNumber(value) {
|
|
|
22
43
|
}
|
|
23
44
|
return Number(value ?? 0);
|
|
24
45
|
}
|
|
25
|
-
function escapeSqlLiteral(value) {
|
|
26
|
-
return value.replaceAll("'", "''");
|
|
27
|
-
}
|
|
28
46
|
/**
|
|
29
47
|
* Lists tables from the CIP metadata catalog.
|
|
30
48
|
*
|
|
@@ -35,21 +53,21 @@ function escapeSqlLiteral(value) {
|
|
|
35
53
|
export async function listCipTables(client, options = {}) {
|
|
36
54
|
const whereClauses = [];
|
|
37
55
|
if (options.schema) {
|
|
38
|
-
whereClauses.push(`tableSchem = '${
|
|
56
|
+
whereClauses.push(`tableSchem = '${escapeSqlString(options.schema)}'`);
|
|
39
57
|
}
|
|
40
58
|
if (options.tableNamePattern) {
|
|
41
|
-
whereClauses.push(`tableName LIKE '${
|
|
59
|
+
whereClauses.push(`tableName LIKE '${escapeSqlString(options.tableNamePattern)}'`);
|
|
42
60
|
}
|
|
43
61
|
if (options.tableType) {
|
|
44
|
-
whereClauses.push(`tableType = '${
|
|
62
|
+
whereClauses.push(`tableType = '${escapeSqlString(options.tableType)}'`);
|
|
45
63
|
}
|
|
46
64
|
const whereClauseSql = whereClauses.length > 0 ? ` WHERE ${whereClauses.join(' AND ')}` : '';
|
|
47
65
|
const sql = `SELECT tableSchem, tableName, tableType FROM metadata.TABLES${whereClauseSql} ORDER BY tableSchem, tableName`;
|
|
48
66
|
const result = await client.query(sql, { fetchSize: options.fetchSize });
|
|
49
67
|
const tables = result.rows.map((row) => ({
|
|
50
|
-
tableName: toStringOrEmpty(row
|
|
51
|
-
tableSchema: toStringOrEmpty(row
|
|
52
|
-
tableType: toStringOrEmpty(row
|
|
68
|
+
tableName: toStringOrEmpty(pickRowValue(row, /^tablename$/)),
|
|
69
|
+
tableSchema: toStringOrEmpty(pickRowValue(row, /^tableschem(a)?$/)),
|
|
70
|
+
tableType: toStringOrEmpty(pickRowValue(row, /^tabletype$/)),
|
|
53
71
|
}));
|
|
54
72
|
return {
|
|
55
73
|
schema: options.schema,
|
|
@@ -68,16 +86,16 @@ export async function listCipTables(client, options = {}) {
|
|
|
68
86
|
export async function describeCipTable(client, tableName, options = {}) {
|
|
69
87
|
const tableSchema = options.schema ?? 'warehouse';
|
|
70
88
|
const sql = `SELECT tableSchem, tableName, columnName, typeName, isNullable, ordinalPosition FROM metadata.COLUMNS ` +
|
|
71
|
-
`WHERE tableSchem = '${
|
|
89
|
+
`WHERE tableSchem = '${escapeSqlString(tableSchema)}' AND tableName = '${escapeSqlString(tableName)}' ` +
|
|
72
90
|
`ORDER BY ordinalPosition`;
|
|
73
91
|
const result = await client.query(sql, { fetchSize: options.fetchSize });
|
|
74
92
|
const columns = result.rows.map((row) => ({
|
|
75
|
-
columnName: toStringOrEmpty(row
|
|
76
|
-
dataType: toStringOrEmpty(row
|
|
77
|
-
isNullable: toBoolean(row
|
|
78
|
-
ordinalPosition: toNumber(row
|
|
79
|
-
tableName: toStringOrEmpty(row
|
|
80
|
-
tableSchema: toStringOrEmpty(row
|
|
93
|
+
columnName: toStringOrEmpty(pickRowValue(row, /^columnname$/)),
|
|
94
|
+
dataType: toStringOrEmpty(pickRowValue(row, /^(typename|datatype)$/)),
|
|
95
|
+
isNullable: toBoolean(pickRowValue(row, /^isnullable$/)),
|
|
96
|
+
ordinalPosition: toNumber(pickRowValue(row, /^ordinalposition$/)),
|
|
97
|
+
tableName: toStringOrEmpty(pickRowValue(row, /^tablename$/)),
|
|
98
|
+
tableSchema: toStringOrEmpty(pickRowValue(row, /^tableschem(a)?$/)),
|
|
81
99
|
}));
|
|
82
100
|
return {
|
|
83
101
|
columnCount: columns.length,
|
|
@@ -103,16 +121,35 @@ export function listCipReports() {
|
|
|
103
121
|
export function getCipReportByName(name) {
|
|
104
122
|
return CIP_REPORTS.find((report) => report.name === name);
|
|
105
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Validates supplied params against the report contract and returns a normalized
|
|
126
|
+
* copy with defaults applied. Enforces required params and, where declared,
|
|
127
|
+
* enum `options` (including per-value checks for `multiple` parameters).
|
|
128
|
+
*/
|
|
106
129
|
function validateReportParams(report, params) {
|
|
107
130
|
const unknownParams = Object.keys(params).filter((key) => !report.parameters.some((parameter) => parameter.name === key));
|
|
108
131
|
if (unknownParams.length > 0) {
|
|
109
132
|
throw new Error(`Unknown parameters for report "${report.name}": ${unknownParams.join(', ')}`);
|
|
110
133
|
}
|
|
134
|
+
const normalized = { ...params };
|
|
111
135
|
for (const parameter of report.parameters) {
|
|
112
|
-
if (parameter.
|
|
136
|
+
if (!normalized[parameter.name] && parameter.default !== undefined) {
|
|
137
|
+
normalized[parameter.name] = parameter.default;
|
|
138
|
+
}
|
|
139
|
+
const value = normalized[parameter.name];
|
|
140
|
+
if (parameter.required && !value) {
|
|
113
141
|
throw new Error(`Missing required parameter for report "${report.name}": ${parameter.name}`);
|
|
114
142
|
}
|
|
143
|
+
if (value && parameter.options && parameter.options.length > 0) {
|
|
144
|
+
const candidates = parameter.multiple ? value.split(',').map((item) => item.trim()) : [value];
|
|
145
|
+
const invalid = candidates.filter((candidate) => !parameter.options?.includes(candidate));
|
|
146
|
+
if (invalid.length > 0) {
|
|
147
|
+
throw new Error(`Invalid value(s) for parameter "${parameter.name}" in report "${report.name}": ${invalid.join(', ')}. ` +
|
|
148
|
+
`Allowed: ${parameter.options.join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
115
151
|
}
|
|
152
|
+
return normalized;
|
|
116
153
|
}
|
|
117
154
|
/**
|
|
118
155
|
* Builds SQL for a curated report after validating provided parameters.
|
|
@@ -127,10 +164,10 @@ export function buildCipReportSql(name, params) {
|
|
|
127
164
|
if (!report) {
|
|
128
165
|
throw new Error(`Unknown CIP report: ${name}`);
|
|
129
166
|
}
|
|
130
|
-
validateReportParams(report, params);
|
|
167
|
+
const normalizedParams = validateReportParams(report, params);
|
|
131
168
|
return {
|
|
132
169
|
report,
|
|
133
|
-
sql: report.buildSql(
|
|
170
|
+
sql: report.buildSql(normalizedParams),
|
|
134
171
|
};
|
|
135
172
|
}
|
|
136
173
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/operations/cip/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAuCzC,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IACzE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/operations/cip/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +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
|
-
|
|
7
|
-
return value.replaceAll("'", "''");
|
|
8
|
-
}
|
|
6
|
+
import { booleanLiteral, dateLiteral, integerLiteral, quoteIdentifierIfReserved, stringLiteral } from './sql.js';
|
|
9
7
|
function getRequiredString(params, key) {
|
|
10
8
|
const value = params[key];
|
|
11
9
|
if (!value) {
|
|
@@ -14,33 +12,52 @@ function getRequiredString(params, key) {
|
|
|
14
12
|
return value;
|
|
15
13
|
}
|
|
16
14
|
function getDateLiteral(params, key) {
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
try {
|
|
16
|
+
return dateLiteral(getRequiredString(params, key));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
19
|
throw new Error(`Invalid date for parameter "${key}": expected YYYY-MM-DD`);
|
|
20
20
|
}
|
|
21
|
-
return `'${escapeSqlString(value)}'`;
|
|
22
21
|
}
|
|
23
22
|
function getStringLiteral(params, key) {
|
|
24
|
-
|
|
25
|
-
return `'${escapeSqlString(value)}'`;
|
|
23
|
+
return stringLiteral(getRequiredString(params, key));
|
|
26
24
|
}
|
|
27
25
|
function getBooleanLiteral(params, key) {
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
try {
|
|
27
|
+
return booleanLiteral(getRequiredString(params, key));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
30
|
throw new Error(`Invalid boolean for parameter "${key}": expected true or false`);
|
|
31
31
|
}
|
|
32
|
-
return value;
|
|
33
32
|
}
|
|
34
33
|
function getOptionalIntegerLiteral(params, key, fallback, min, max) {
|
|
35
34
|
const raw = params[key];
|
|
36
35
|
if (!raw) {
|
|
37
36
|
return String(fallback);
|
|
38
37
|
}
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
try {
|
|
39
|
+
return integerLiteral(raw, min, max);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
41
42
|
throw new Error(`Invalid integer for parameter "${key}": expected ${min}-${max}`);
|
|
42
43
|
}
|
|
43
|
-
|
|
44
|
+
}
|
|
45
|
+
/** Alias for builders that reference reserved column names (for example `method`). */
|
|
46
|
+
const col = quoteIdentifierIfReserved;
|
|
47
|
+
/**
|
|
48
|
+
* Builds the optional site-dimension join and WHERE predicate for tables whose
|
|
49
|
+
* `site_id` is nullable or where site scoping is optional (for example the SCAPI
|
|
50
|
+
* and OCAPI request tables). When `siteId` is absent both fragments are empty so
|
|
51
|
+
* the report spans all sites; when present an inner join restricts to that site.
|
|
52
|
+
*/
|
|
53
|
+
function optionalSiteJoin(params, factAlias) {
|
|
54
|
+
if (!params.siteId) {
|
|
55
|
+
return { join: '', predicate: '' };
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
join: ` JOIN ccdw_dim_site s ON s.site_id = ${factAlias}.site_id`,
|
|
59
|
+
predicate: ` AND s.nsite_id = ${getStringLiteral(params, 'siteId')}`,
|
|
60
|
+
};
|
|
44
61
|
}
|
|
45
62
|
export const CIP_REPORTS = [
|
|
46
63
|
{
|
|
@@ -144,7 +161,13 @@ export const CIP_REPORTS = [
|
|
|
144
161
|
category: 'Search Analytics',
|
|
145
162
|
parameters: [
|
|
146
163
|
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
147
|
-
{
|
|
164
|
+
{
|
|
165
|
+
name: 'hasResults',
|
|
166
|
+
description: 'Filter successful/unsuccessful searches',
|
|
167
|
+
type: 'boolean',
|
|
168
|
+
required: true,
|
|
169
|
+
options: ['true', 'false'],
|
|
170
|
+
},
|
|
148
171
|
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
149
172
|
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
150
173
|
],
|
|
@@ -206,5 +229,361 @@ export const CIP_REPORTS = [
|
|
|
206
229
|
return `WITH total AS (SELECT SUM(num_visits) AS total_visits FROM ccdw_aggr_visit_referrer WHERE visit_date >= ${from} AND visit_date <= ${to}) SELECT vr.referrer_medium AS traffic_medium, vr.referrer_source AS traffic_source, SUM(vr.num_visits) AS total_visits, SUM(vr.num_visits) * 100.0 / total.total_visits AS visit_percentage FROM ccdw_aggr_visit_referrer vr JOIN ccdw_dim_site s ON s.site_id = vr.site_id JOIN total ON TRUE WHERE vr.visit_date >= ${from} AND vr.visit_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY vr.referrer_medium, vr.referrer_source, total.total_visits ORDER BY total_visits DESC LIMIT ${limit}`;
|
|
207
230
|
},
|
|
208
231
|
},
|
|
232
|
+
{
|
|
233
|
+
name: 'scapi-traffic-latency',
|
|
234
|
+
description: 'Rank SCAPI endpoints by request volume and average latency',
|
|
235
|
+
category: 'Technical Analytics',
|
|
236
|
+
tablesUsed: ['ccdw_aggr_scapi_request', 'ccdw_dim_site'],
|
|
237
|
+
parameters: [
|
|
238
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
239
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
240
|
+
{
|
|
241
|
+
name: 'siteId',
|
|
242
|
+
description: 'Optional natural site id; SCAPI rows may be unattributed (omit to span all sites)',
|
|
243
|
+
type: 'string',
|
|
244
|
+
},
|
|
245
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
246
|
+
],
|
|
247
|
+
buildSql(params) {
|
|
248
|
+
const from = getDateLiteral(params, 'from');
|
|
249
|
+
const to = getDateLiteral(params, 'to');
|
|
250
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 20, 1, 500);
|
|
251
|
+
const site = optionalSiteJoin(params, 'r');
|
|
252
|
+
return `SELECT r.api_family, r.api_name, r.api_resource, r.${col('method')}, SUM(r.num_requests) AS total_requests, SUM(r.response_time) AS total_response_ms, CAST(SUM(r.response_time) / NULLIF(SUM(r.num_requests), 0) AS DECIMAL(15,2)) AS avg_response_ms FROM ccdw_aggr_scapi_request r${site.join} WHERE r.request_date >= ${from} AND r.request_date <= ${to}${site.predicate} GROUP BY r.api_family, r.api_name, r.api_resource, r.${col('method')} ORDER BY total_requests DESC LIMIT ${limit}`;
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
name: 'scapi-error-rate-by-status',
|
|
257
|
+
description: 'Rank SCAPI endpoints by 4xx/5xx error rate over a date range',
|
|
258
|
+
category: 'Technical Analytics',
|
|
259
|
+
tablesUsed: ['ccdw_aggr_scapi_request', 'ccdw_dim_site'],
|
|
260
|
+
parameters: [
|
|
261
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
262
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
263
|
+
{ name: 'siteId', description: 'Optional natural site id (omit to span all sites)', type: 'string' },
|
|
264
|
+
{
|
|
265
|
+
name: 'statusClass',
|
|
266
|
+
description: 'Optional HTTP error class filter',
|
|
267
|
+
type: 'string',
|
|
268
|
+
options: ['4xx', '5xx'],
|
|
269
|
+
},
|
|
270
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
271
|
+
],
|
|
272
|
+
buildSql(params) {
|
|
273
|
+
const from = getDateLiteral(params, 'from');
|
|
274
|
+
const to = getDateLiteral(params, 'to');
|
|
275
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 50, 1, 500);
|
|
276
|
+
const site = optionalSiteJoin(params, 'r');
|
|
277
|
+
const classFilter = params.statusClass === '4xx'
|
|
278
|
+
? ' AND r.status_code BETWEEN 400 AND 499'
|
|
279
|
+
: params.statusClass === '5xx'
|
|
280
|
+
? ' AND r.status_code BETWEEN 500 AND 599'
|
|
281
|
+
: '';
|
|
282
|
+
return `SELECT r.api_family, r.api_name, r.api_resource, r.${col('method')}, SUM(r.num_requests) AS total_requests, SUM(CASE WHEN r.status_code BETWEEN 400 AND 499 THEN r.num_requests ELSE 0 END) AS error_4xx, SUM(CASE WHEN r.status_code BETWEEN 500 AND 599 THEN r.num_requests ELSE 0 END) AS error_5xx, SUM(CASE WHEN r.status_code BETWEEN 400 AND 599 THEN r.num_requests ELSE 0 END) AS error_total, CAST(100.0 * SUM(CASE WHEN r.status_code BETWEEN 400 AND 599 THEN r.num_requests ELSE 0 END) / NULLIF(SUM(r.num_requests), 0) AS DECIMAL(15,2)) AS error_pct FROM ccdw_aggr_scapi_request r${site.join} WHERE r.request_date >= ${from} AND r.request_date <= ${to}${site.predicate}${classFilter} GROUP BY r.api_family, r.api_name, r.api_resource, r.${col('method')} HAVING SUM(CASE WHEN r.status_code BETWEEN 400 AND 599 THEN r.num_requests ELSE 0 END) > 0 ORDER BY error_total DESC, error_pct DESC LIMIT ${limit}`;
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
name: 'scapi-latency-distribution',
|
|
287
|
+
description: 'Surface the SCAPI latency histogram and slow-tail (SLA breach) percentage per endpoint',
|
|
288
|
+
category: 'Technical Analytics',
|
|
289
|
+
tablesUsed: ['ccdw_aggr_scapi_request', 'ccdw_dim_site'],
|
|
290
|
+
parameters: [
|
|
291
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
292
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
293
|
+
{ name: 'siteId', description: 'Optional natural site id (omit to span all sites)', type: 'string' },
|
|
294
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
295
|
+
],
|
|
296
|
+
buildSql(params) {
|
|
297
|
+
const from = getDateLiteral(params, 'from');
|
|
298
|
+
const to = getDateLiteral(params, 'to');
|
|
299
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 20, 1, 500);
|
|
300
|
+
const site = optionalSiteJoin(params, 'r');
|
|
301
|
+
return `SELECT r.api_family, r.api_name, r.api_resource, SUM(r.num_requests) AS total_requests, CAST(100.0 * SUM(r.num_requests_bucket1 + r.num_requests_bucket2 + r.num_requests_bucket3) / NULLIF(SUM(r.num_requests), 0) AS DECIMAL(15,2)) AS fast_pct, CAST(100.0 * SUM(r.num_requests_bucket9 + r.num_requests_bucket10 + r.num_requests_bucket11) / NULLIF(SUM(r.num_requests), 0) AS DECIMAL(15,2)) AS slow_tail_pct, SUM(r.num_requests_bucket1) AS bucket1, SUM(r.num_requests_bucket2) AS bucket2, SUM(r.num_requests_bucket3) AS bucket3, SUM(r.num_requests_bucket4) AS bucket4, SUM(r.num_requests_bucket5) AS bucket5, SUM(r.num_requests_bucket6) AS bucket6, SUM(r.num_requests_bucket7) AS bucket7, SUM(r.num_requests_bucket8) AS bucket8, SUM(r.num_requests_bucket9) AS bucket9, SUM(r.num_requests_bucket10) AS bucket10, SUM(r.num_requests_bucket11) AS bucket11, CAST(SUM(r.response_time) / NULLIF(SUM(r.num_requests), 0) AS DECIMAL(15,2)) AS avg_response_ms FROM ccdw_aggr_scapi_request r${site.join} WHERE r.request_date >= ${from} AND r.request_date <= ${to}${site.predicate} GROUP BY r.api_family, r.api_name, r.api_resource ORDER BY total_requests DESC LIMIT ${limit}`;
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: 'scapi-cache-hit-ratio',
|
|
306
|
+
description: 'Measure SCAPI cache hit ratio per endpoint to find cacheable resources running as MISS',
|
|
307
|
+
category: 'Technical Analytics',
|
|
308
|
+
tablesUsed: ['ccdw_aggr_scapi_request', 'ccdw_dim_site'],
|
|
309
|
+
parameters: [
|
|
310
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
311
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
312
|
+
{ name: 'siteId', description: 'Optional natural site id (omit to span all sites)', type: 'string' },
|
|
313
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
314
|
+
],
|
|
315
|
+
buildSql(params) {
|
|
316
|
+
const from = getDateLiteral(params, 'from');
|
|
317
|
+
const to = getDateLiteral(params, 'to');
|
|
318
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 50, 1, 500);
|
|
319
|
+
const site = optionalSiteJoin(params, 'r');
|
|
320
|
+
return `SELECT r.api_family, r.api_name, r.api_resource, SUM(r.num_requests) AS total_requests, SUM(CASE WHEN r.cache_behavior = 'HIT' THEN r.num_requests ELSE 0 END) AS hits, SUM(CASE WHEN r.cache_behavior = 'MISS' THEN r.num_requests ELSE 0 END) AS misses, SUM(CASE WHEN r.cache_behavior = '__NON_CACHEABLE__' THEN r.num_requests ELSE 0 END) AS non_cacheable, CAST(100.0 * SUM(CASE WHEN r.cache_behavior = 'HIT' THEN r.num_requests ELSE 0 END) / NULLIF(SUM(CASE WHEN r.cache_behavior IN ('HIT', 'MISS') THEN r.num_requests ELSE 0 END), 0) AS DECIMAL(15,2)) AS hit_ratio_pct FROM ccdw_aggr_scapi_request r${site.join} WHERE r.request_date >= ${from} AND r.request_date <= ${to}${site.predicate} GROUP BY r.api_family, r.api_name, r.api_resource ORDER BY total_requests DESC LIMIT ${limit}`;
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: 'ocapi-client-usage',
|
|
325
|
+
description: 'Rank OCAPI client_ids by request volume with per-client error rate and latency',
|
|
326
|
+
category: 'Technical Analytics',
|
|
327
|
+
tablesUsed: ['ccdw_aggr_ocapi_request', 'ccdw_dim_site'],
|
|
328
|
+
parameters: [
|
|
329
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
330
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
331
|
+
{ name: 'siteId', description: 'Optional natural site id (omit to span all sites)', type: 'string' },
|
|
332
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
333
|
+
],
|
|
334
|
+
buildSql(params) {
|
|
335
|
+
const from = getDateLiteral(params, 'from');
|
|
336
|
+
const to = getDateLiteral(params, 'to');
|
|
337
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 50, 1, 500);
|
|
338
|
+
const site = optionalSiteJoin(params, 'o');
|
|
339
|
+
return `WITH totals AS (SELECT SUM(o.num_requests) AS grand_total FROM ccdw_aggr_ocapi_request o${site.join} WHERE o.request_date >= ${from} AND o.request_date <= ${to}${site.predicate}) SELECT o.client_id, SUM(o.num_requests) AS total_requests, CAST(SUM(o.num_requests) * 100.0 / NULLIF(t.grand_total, 0) AS DECIMAL(15,2)) AS traffic_pct, CAST(100.0 * SUM(CASE WHEN o.status_code >= 400 THEN o.num_requests ELSE 0 END) / NULLIF(SUM(o.num_requests), 0) AS DECIMAL(15,2)) AS error_pct, CAST(SUM(o.response_time) / NULLIF(SUM(o.num_requests), 0) AS DECIMAL(15,2)) AS avg_response_ms, COUNT(DISTINCT o.api_resource) AS distinct_resources FROM ccdw_aggr_ocapi_request o${site.join} JOIN totals t ON TRUE WHERE o.request_date >= ${from} AND o.request_date <= ${to}${site.predicate} GROUP BY o.client_id, t.grand_total ORDER BY total_requests DESC LIMIT ${limit}`;
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
name: 'controller-health-scorecard',
|
|
344
|
+
description: 'Score SFRA controller health by volume, errors, slow tail, and cache hit rate',
|
|
345
|
+
category: 'Technical Analytics',
|
|
346
|
+
tablesUsed: ['ccdw_aggr_controller_request', 'ccdw_dim_site'],
|
|
347
|
+
parameters: [
|
|
348
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
349
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
350
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
351
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
352
|
+
],
|
|
353
|
+
buildSql(params) {
|
|
354
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
355
|
+
const from = getDateLiteral(params, 'from');
|
|
356
|
+
const to = getDateLiteral(params, 'to');
|
|
357
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 25, 1, 500);
|
|
358
|
+
return `SELECT cr.controller_name, SUM(cr.num_requests) AS total_requests, CAST(SUM(cr.response_time) / NULLIF(SUM(cr.num_requests), 0) AS DECIMAL(15,2)) AS avg_response_ms, CAST(100.0 * SUM(CASE WHEN cr.status_code >= 400 THEN cr.num_requests ELSE 0 END) / NULLIF(SUM(cr.num_requests), 0) AS DECIMAL(15,2)) AS error_pct, CAST(100.0 * SUM(cr.num_requests_bucket9 + cr.num_requests_bucket10 + cr.num_requests_bucket11) / NULLIF(SUM(cr.num_requests), 0) AS DECIMAL(15,2)) AS slow_tail_pct, CAST(100.0 * SUM(CASE WHEN cr.cache_behavior = 'HIT' THEN cr.num_requests ELSE 0 END) / NULLIF(SUM(CASE WHEN cr.cache_behavior IN ('HIT', 'MISS') THEN cr.num_requests ELSE 0 END), 0) AS DECIMAL(15,2)) AS cache_hit_pct FROM ccdw_aggr_controller_request cr JOIN ccdw_dim_site s ON s.site_id = cr.site_id WHERE cr.request_date >= ${from} AND cr.request_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY cr.controller_name ORDER BY total_requests DESC LIMIT ${limit}`;
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
name: 'controller-error-rate-trend',
|
|
363
|
+
description: 'Daily 4xx/5xx error rate per storefront controller for catching deploy regressions',
|
|
364
|
+
category: 'Technical Analytics',
|
|
365
|
+
tablesUsed: ['ccdw_aggr_controller_request', 'ccdw_dim_site'],
|
|
366
|
+
parameters: [
|
|
367
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
368
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
369
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
370
|
+
{ name: 'limit', description: 'Max controller/day rows (1-1000)', type: 'number', min: 1, max: 1000 },
|
|
371
|
+
],
|
|
372
|
+
buildSql(params) {
|
|
373
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
374
|
+
const from = getDateLiteral(params, 'from');
|
|
375
|
+
const to = getDateLiteral(params, 'to');
|
|
376
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 100, 1, 1000);
|
|
377
|
+
return `SELECT CAST(CAST(r.request_date AS DATE) AS VARCHAR) AS request_day, r.controller_name, SUM(r.num_requests) AS total_requests, SUM(CASE WHEN r.status_code BETWEEN 400 AND 499 THEN r.num_requests ELSE 0 END) AS client_error_4xx, SUM(CASE WHEN r.status_code BETWEEN 500 AND 599 THEN r.num_requests ELSE 0 END) AS server_error_5xx, CAST(100.0 * (SUM(CASE WHEN r.status_code BETWEEN 400 AND 499 THEN r.num_requests ELSE 0 END) + SUM(CASE WHEN r.status_code BETWEEN 500 AND 599 THEN r.num_requests ELSE 0 END)) / NULLIF(SUM(r.num_requests), 0) AS DECIMAL(15,2)) AS error_rate_pct FROM ccdw_aggr_controller_request r JOIN ccdw_dim_site s ON s.site_id = r.site_id WHERE CAST(r.request_date AS DATE) BETWEEN ${from} AND ${to} AND s.nsite_id = ${siteId} GROUP BY CAST(r.request_date AS DATE), r.controller_name ORDER BY server_error_5xx DESC, client_error_4xx DESC, request_day DESC LIMIT ${limit}`;
|
|
378
|
+
},
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
name: 'remote-include-performance',
|
|
382
|
+
description: 'Rank remote-include child controllers by load, latency, errors, and cache hit rate per parent page',
|
|
383
|
+
category: 'Technical Analytics',
|
|
384
|
+
tablesUsed: ['ccdw_aggr_include_controller_request', 'ccdw_dim_site'],
|
|
385
|
+
parameters: [
|
|
386
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
387
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
388
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
389
|
+
{ name: 'limit', description: 'Max rows (1-1000)', type: 'number', min: 1, max: 1000 },
|
|
390
|
+
],
|
|
391
|
+
buildSql(params) {
|
|
392
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
393
|
+
const from = getDateLiteral(params, 'from');
|
|
394
|
+
const to = getDateLiteral(params, 'to');
|
|
395
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 50, 1, 1000);
|
|
396
|
+
return `SELECT ic.main_controller_name, ic.controller_name, SUM(ic.num_requests) AS total_requests, SUM(ic.response_time) AS total_response_ms, CAST(SUM(ic.response_time) / NULLIF(SUM(ic.num_requests), 0) AS DECIMAL(15,2)) AS avg_response_ms, CAST(100.0 * SUM(CASE WHEN ic.status_code >= 400 THEN ic.num_requests ELSE 0 END) / NULLIF(SUM(ic.num_requests), 0) AS DECIMAL(15,2)) AS error_pct, CAST(100.0 * SUM(CASE WHEN ic.cache_behavior = 'HIT' THEN ic.num_requests ELSE 0 END) / NULLIF(SUM(CASE WHEN ic.cache_behavior IN ('HIT','MISS') THEN ic.num_requests ELSE 0 END), 0) AS DECIMAL(15,2)) AS cache_hit_pct FROM ccdw_aggr_include_controller_request ic JOIN ccdw_dim_site s ON s.site_id = ic.site_id WHERE ic.request_date >= ${from} AND ic.request_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY ic.main_controller_name, ic.controller_name ORDER BY total_requests DESC, total_response_ms DESC LIMIT ${limit}`;
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
name: 'revenue-by-channel',
|
|
401
|
+
description: 'Break down revenue, orders, AOV, and discount rate by channel, device, and locale',
|
|
402
|
+
category: 'Sales Analytics',
|
|
403
|
+
tablesUsed: ['ccdw_aggr_sales_summary', 'ccdw_dim_business_channel', 'ccdw_dim_site'],
|
|
404
|
+
parameters: [
|
|
405
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
406
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
407
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
408
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
409
|
+
],
|
|
410
|
+
buildSql(params) {
|
|
411
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
412
|
+
const from = getDateLiteral(params, 'from');
|
|
413
|
+
const to = getDateLiteral(params, 'to');
|
|
414
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 50, 1, 500);
|
|
415
|
+
return `WITH site_total AS (SELECT SUM(ss.std_revenue) AS total_std_revenue FROM ccdw_aggr_sales_summary ss JOIN ccdw_dim_site s ON s.site_id = ss.site_id WHERE ss.submit_date >= ${from} AND ss.submit_date <= ${to} AND s.nsite_id = ${siteId}) SELECT bc.order_channel, bc.business_type, ss.device_class_code, ss.locale_code, SUM(ss.std_revenue) AS std_revenue, SUM(ss.num_orders) AS orders, SUM(ss.num_units) AS units, CAST(SUM(ss.std_revenue) / NULLIF(SUM(ss.num_orders), 0) AS DECIMAL(15,2)) AS std_aov, CAST(SUM(ss.std_revenue) * 100.0 / NULLIF(t.total_std_revenue, 0) AS DECIMAL(15,2)) AS revenue_share_pct, CAST(SUM(ss.std_total_discount) * 100.0 / NULLIF(SUM(ss.std_revenue) + SUM(ss.std_total_discount), 0) AS DECIMAL(15,2)) AS discount_rate_pct FROM ccdw_aggr_sales_summary ss JOIN ccdw_dim_site s ON s.site_id = ss.site_id JOIN ccdw_dim_business_channel bc ON bc.business_channel_id = ss.business_channel_id JOIN site_total t ON TRUE WHERE ss.submit_date >= ${from} AND ss.submit_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY bc.order_channel, bc.business_type, ss.device_class_code, ss.locale_code, t.total_std_revenue ORDER BY std_revenue DESC LIMIT ${limit}`;
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
name: 'new-vs-returning-buyer-revenue',
|
|
420
|
+
description: 'Split revenue, orders, AOV, and discount depth between first-time and returning buyers',
|
|
421
|
+
category: 'Customer Analytics',
|
|
422
|
+
tablesUsed: ['ccdw_aggr_sales_summary', 'ccdw_dim_site'],
|
|
423
|
+
parameters: [
|
|
424
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
425
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
426
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
427
|
+
],
|
|
428
|
+
buildSql(params) {
|
|
429
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
430
|
+
const from = getDateLiteral(params, 'from');
|
|
431
|
+
const to = getDateLiteral(params, 'to');
|
|
432
|
+
return `WITH site_total AS (SELECT SUM(ss.std_revenue) AS total_std_revenue FROM ccdw_aggr_sales_summary ss JOIN ccdw_dim_site s ON s.site_id = ss.site_id WHERE s.nsite_id = ${siteId} AND ss.submit_date >= ${from} AND ss.submit_date <= ${to}) SELECT CASE WHEN ss.first_time_buyer THEN 'first_time' ELSE 'returning' END AS buyer_type, CASE WHEN ss.registered THEN 'registered' ELSE 'guest' END AS customer_type, SUM(ss.std_revenue) AS std_revenue, SUM(ss.num_orders) AS orders, SUM(ss.num_units) AS units, CAST(SUM(ss.std_revenue) / NULLIF(SUM(ss.num_orders), 0) AS DECIMAL(15,2)) AS std_aov, CAST(SUM(ss.std_revenue) * 100.0 / NULLIF(t.total_std_revenue, 0) AS DECIMAL(15,2)) AS revenue_share_pct, CAST(SUM(ss.std_total_discount) * 100.0 / NULLIF(SUM(ss.std_revenue) + SUM(ss.std_total_discount), 0) AS DECIMAL(15,2)) AS discount_rate_pct FROM ccdw_aggr_sales_summary ss JOIN ccdw_dim_site s ON s.site_id = ss.site_id JOIN site_total t ON TRUE WHERE s.nsite_id = ${siteId} AND ss.submit_date >= ${from} AND ss.submit_date <= ${to} GROUP BY ss.first_time_buyer, ss.registered, t.total_std_revenue ORDER BY std_revenue DESC`;
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
name: 'discount-depth-breakdown',
|
|
437
|
+
description: 'Break down total discount into promotional vs manual by product, order, and shipping',
|
|
438
|
+
category: 'Promotion Analytics',
|
|
439
|
+
tablesUsed: ['ccdw_aggr_sales_summary', 'ccdw_dim_site'],
|
|
440
|
+
parameters: [
|
|
441
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
442
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
443
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
444
|
+
],
|
|
445
|
+
buildSql(params) {
|
|
446
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
447
|
+
const from = getDateLiteral(params, 'from');
|
|
448
|
+
const to = getDateLiteral(params, 'to');
|
|
449
|
+
return `SELECT SUM(ss.std_revenue) AS std_revenue, SUM(COALESCE(ss.std_promotional_product_discount, 0)) AS std_promotional_product_discount, SUM(COALESCE(ss.std_promotional_order_discount, 0)) AS std_promotional_order_discount, SUM(COALESCE(ss.std_promotional_shipping_discount, 0)) AS std_promotional_shipping_discount, SUM(COALESCE(ss.std_manual_product_discount, 0)) AS std_manual_product_discount, SUM(COALESCE(ss.std_manual_order_discount, 0)) AS std_manual_order_discount, SUM(COALESCE(ss.std_manual_shipping_discount, 0)) AS std_manual_shipping_discount, SUM(COALESCE(ss.std_promotional_product_discount, 0) + COALESCE(ss.std_promotional_order_discount, 0) + COALESCE(ss.std_promotional_shipping_discount, 0)) AS promo_discount_total, SUM(COALESCE(ss.std_manual_product_discount, 0) + COALESCE(ss.std_manual_order_discount, 0) + COALESCE(ss.std_manual_shipping_discount, 0)) AS manual_discount_total, SUM(ss.std_total_discount) AS std_total_discount, CAST(SUM(ss.std_total_discount) * 100.0 / NULLIF(SUM(ss.std_revenue) + SUM(ss.std_total_discount), 0) AS DECIMAL(15,2)) AS effective_discount_rate_pct FROM ccdw_aggr_sales_summary ss JOIN ccdw_dim_site s ON s.site_id = ss.site_id WHERE ss.submit_date >= ${from} AND ss.submit_date <= ${to} AND s.nsite_id = ${siteId}`;
|
|
450
|
+
},
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
name: 'promotion-roi-leaderboard',
|
|
454
|
+
description: 'Rank promotions by revenue per dollar of discount, with orders, uses, and AOV',
|
|
455
|
+
category: 'Promotion Analytics',
|
|
456
|
+
tablesUsed: ['ccdw_aggr_promotion_sales_summary', 'ccdw_dim_promotion', 'ccdw_dim_site'],
|
|
457
|
+
parameters: [
|
|
458
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
459
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
460
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
461
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
462
|
+
],
|
|
463
|
+
buildSql(params) {
|
|
464
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
465
|
+
const from = getDateLiteral(params, 'from');
|
|
466
|
+
const to = getDateLiteral(params, 'to');
|
|
467
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 50, 1, 500);
|
|
468
|
+
return `SELECT p.npromotion_id AS promotion_id, p.display_name AS promotion_name, p.promotion_class, SUM(pss.std_revenue) AS std_revenue, SUM(pss.std_total_discount) AS std_total_discount, SUM(pss.num_orders) AS num_orders, SUM(pss.num_promotion_uses) AS num_promotion_uses, CAST(SUM(pss.std_revenue) / NULLIF(SUM(pss.num_orders), 0) AS DECIMAL(15,2)) AS std_aov, CAST(SUM(pss.std_revenue) / NULLIF(SUM(pss.std_total_discount), 0) AS DECIMAL(15,2)) AS revenue_per_discount_dollar FROM ccdw_aggr_promotion_sales_summary pss JOIN ccdw_dim_promotion p ON p.promotion_id = pss.promotion_id JOIN ccdw_dim_site s ON s.site_id = pss.site_id WHERE pss.submit_date >= ${from} AND pss.submit_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY p.npromotion_id, p.display_name, p.promotion_class ORDER BY revenue_per_discount_dollar DESC, std_revenue DESC LIMIT ${limit}`;
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
name: 'recommender-effectiveness',
|
|
473
|
+
description: 'Rank product recommenders by engagement, attributed revenue, and conversion',
|
|
474
|
+
category: 'Product Analytics',
|
|
475
|
+
tablesUsed: ['ccdw_aggr_product_recommendation_recommender', 'ccdw_dim_site'],
|
|
476
|
+
parameters: [
|
|
477
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
478
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
479
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
480
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
481
|
+
],
|
|
482
|
+
buildSql(params) {
|
|
483
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
484
|
+
const from = getDateLiteral(params, 'from');
|
|
485
|
+
const to = getDateLiteral(params, 'to');
|
|
486
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 20, 1, 500);
|
|
487
|
+
// Note: the CIP JDBC service rejects projections with too many SUM() calls
|
|
488
|
+
// (observed ~7+ bare aggregate columns), so this report keeps the highest-value
|
|
489
|
+
// raw metrics (views/clicks/cart_adds/orders/revenue) and derives CTR and
|
|
490
|
+
// view-to-cart ratios rather than also projecting every raw funnel count.
|
|
491
|
+
return `SELECT rr.recommender_name, SUM(rr.num_recommender_views) AS recommender_views, SUM(rr.num_clicks) AS clicks, SUM(rr.num_cart_adds) AS cart_adds, SUM(rr.num_orders) AS orders, SUM(rr.std_attributed_revenue) AS std_attributed_revenue, CAST(SUM(rr.num_clicks) * 100.0 / NULLIF(SUM(rr.num_recommender_views), 0) AS DECIMAL(15,2)) AS ctr_pct, CAST(SUM(rr.num_cart_adds) * 100.0 / NULLIF(SUM(rr.num_product_views), 0) AS DECIMAL(15,2)) AS view_to_cart_pct FROM ccdw_aggr_product_recommendation_recommender rr JOIN ccdw_dim_site s ON s.site_id = rr.site_id WHERE rr.recommendation_date >= ${from} AND rr.recommendation_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY rr.recommender_name ORDER BY std_attributed_revenue DESC LIMIT ${limit}`;
|
|
492
|
+
},
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
name: 'zero-result-searches',
|
|
496
|
+
description: 'Surface search terms that most often return zero results and the demand lost to them',
|
|
497
|
+
category: 'Search Analytics',
|
|
498
|
+
tablesUsed: ['ccdw_aggr_search_query', 'ccdw_dim_site'],
|
|
499
|
+
parameters: [
|
|
500
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
501
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
502
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
503
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
504
|
+
],
|
|
505
|
+
buildSql(params) {
|
|
506
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
507
|
+
const from = getDateLiteral(params, 'from');
|
|
508
|
+
const to = getDateLiteral(params, 'to');
|
|
509
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 50, 1, 500);
|
|
510
|
+
return `SELECT LOWER(sq.query) AS query, SUM(sq.num_searches_without_results) AS no_result_searches, SUM(sq.num_searches_with_results) AS with_result_searches, SUM(sq.num_visits_without_search_results) AS visits_without_results, CAST(100.0 * SUM(sq.num_searches_without_results) / NULLIF(SUM(sq.num_searches_without_results) + SUM(sq.num_searches_with_results), 0) AS DECIMAL(15,2)) AS no_result_rate_pct FROM ccdw_aggr_search_query sq JOIN ccdw_dim_site s ON s.site_id = sq.site_id WHERE sq.search_date >= ${from} AND sq.search_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY LOWER(sq.query) HAVING SUM(sq.num_searches_without_results) > 0 ORDER BY no_result_searches DESC, no_result_rate_pct DESC LIMIT ${limit}`;
|
|
511
|
+
},
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
name: 'checkout-funnel-dropoff',
|
|
515
|
+
description: 'Visits reaching each checkout step with step-over-step drop-off to pinpoint funnel leaks',
|
|
516
|
+
category: 'Traffic Analytics',
|
|
517
|
+
tablesUsed: ['ccdw_aggr_visit_checkout', 'ccdw_dim_site'],
|
|
518
|
+
parameters: [
|
|
519
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
520
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
521
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
522
|
+
],
|
|
523
|
+
buildSql(params) {
|
|
524
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
525
|
+
const from = getDateLiteral(params, 'from');
|
|
526
|
+
const to = getDateLiteral(params, 'to');
|
|
527
|
+
// Some tenants run parallel checkout implementations (e.g. SFRA + headless) that
|
|
528
|
+
// write colliding step_numbers under different step_names into this table, which
|
|
529
|
+
// makes a step_number-only funnel produce nonsensical drop-offs. Group by the
|
|
530
|
+
// (step_number, step_name) identity and order the window by step_number then total
|
|
531
|
+
// visits so each distinct checkout flow's steps stay in sequence; the dividend is
|
|
532
|
+
// promoted with * 1.0 so Calcite does not truncate the ratio with integer division.
|
|
533
|
+
return `WITH steps AS (SELECT vc.step_number AS step_number, vc.step_name AS step_name, SUM(vc.num_visits) AS num_visits, SUM(vc.num_hits) AS num_hits FROM ccdw_aggr_visit_checkout vc JOIN ccdw_dim_site s ON s.site_id = vc.site_id WHERE vc.visit_date >= ${from} AND vc.visit_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY vc.step_number, vc.step_name) SELECT step_number, step_name, num_visits, num_hits, CAST(num_visits * 100.0 / NULLIF(FIRST_VALUE(num_visits) OVER (ORDER BY step_number, num_visits DESC), 0) AS DECIMAL(15,2)) AS pct_of_first_step, CAST((1.0 - num_visits * 1.0 / NULLIF(LAG(num_visits) OVER (ORDER BY step_number, num_visits DESC), 0)) * 100.0 AS DECIMAL(15,2)) AS dropoff_from_prev_pct FROM steps ORDER BY step_number, num_visits DESC`;
|
|
534
|
+
},
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
name: 'bot-traffic-share',
|
|
538
|
+
description: 'Daily bot/crawler vs human visit share with the top bot family driving crawler traffic',
|
|
539
|
+
category: 'Traffic Analytics',
|
|
540
|
+
tablesUsed: ['ccdw_aggr_visit_robot', 'ccdw_aggr_visit_user_agent', 'ccdw_dim_site'],
|
|
541
|
+
parameters: [
|
|
542
|
+
{ name: 'siteId', description: 'Natural site id', type: 'string', required: true },
|
|
543
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
544
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
545
|
+
{ name: 'limit', description: 'Max days returned (1-500)', type: 'number', min: 1, max: 500 },
|
|
546
|
+
],
|
|
547
|
+
buildSql(params) {
|
|
548
|
+
const siteId = getStringLiteral(params, 'siteId');
|
|
549
|
+
const from = getDateLiteral(params, 'from');
|
|
550
|
+
const to = getDateLiteral(params, 'to');
|
|
551
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 60, 1, 500);
|
|
552
|
+
// Robot and human (user-agent) visits live in separate daily aggregate tables;
|
|
553
|
+
// FULL OUTER JOIN on visit_date keeps days present in only one table. The top bot
|
|
554
|
+
// family per day comes from a ROW_NUMBER() ranking CTE (ua_family is nullable, so
|
|
555
|
+
// COALESCE to '(unknown)'). visit_date is CAST to VARCHAR for plain-string output.
|
|
556
|
+
return `WITH robot AS (SELECT vr.visit_date AS visit_date, SUM(vr.num_visits) AS robot_visits FROM ccdw_aggr_visit_robot vr JOIN ccdw_dim_site s ON s.site_id = vr.site_id WHERE vr.visit_date >= ${from} AND vr.visit_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY vr.visit_date), human AS (SELECT vu.visit_date AS visit_date, SUM(vu.num_visits) AS human_visits FROM ccdw_aggr_visit_user_agent vu JOIN ccdw_dim_site s ON s.site_id = vu.site_id WHERE vu.visit_date >= ${from} AND vu.visit_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY vu.visit_date), bot_family_ranked AS (SELECT vr.visit_date AS visit_date, COALESCE(vr.ua_family, '(unknown)') AS ua_family, COALESCE(vr.ua_os_family, '(unknown)') AS ua_os_family, ROW_NUMBER() OVER (PARTITION BY vr.visit_date ORDER BY SUM(vr.num_visits) DESC, COALESCE(vr.ua_family, '(unknown)')) AS rn FROM ccdw_aggr_visit_robot vr JOIN ccdw_dim_site s ON s.site_id = vr.site_id WHERE vr.visit_date >= ${from} AND vr.visit_date <= ${to} AND s.nsite_id = ${siteId} GROUP BY vr.visit_date, COALESCE(vr.ua_family, '(unknown)'), COALESCE(vr.ua_os_family, '(unknown)')), top_bot_family AS (SELECT visit_date, ua_family, ua_os_family FROM bot_family_ranked WHERE rn = 1) SELECT CAST(COALESCE(r.visit_date, h.visit_date) AS VARCHAR) AS visit_day, COALESCE(r.robot_visits, 0) AS robot_visits, COALESCE(h.human_visits, 0) AS human_visits, COALESCE(r.robot_visits, 0) + COALESCE(h.human_visits, 0) AS total_visits, CAST(COALESCE(r.robot_visits, 0) * 100.0 / NULLIF(COALESCE(r.robot_visits, 0) + COALESCE(h.human_visits, 0), 0) AS DECIMAL(15,2)) AS bot_share_pct, tbf.ua_family AS top_bot_family, tbf.ua_os_family AS top_bot_os_family FROM robot r FULL OUTER JOIN human h ON r.visit_date = h.visit_date LEFT JOIN top_bot_family tbf ON tbf.visit_date = COALESCE(r.visit_date, h.visit_date) ORDER BY visit_day LIMIT ${limit}`;
|
|
557
|
+
},
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
name: 'inventory-stockout-by-location',
|
|
561
|
+
description: 'Surface out-of-stock and low-stock SKUs by location for replenishment',
|
|
562
|
+
category: 'Inventory Analytics',
|
|
563
|
+
tablesUsed: ['ccdw_aggr_inventory_by_location', 'ccdw_dim_location', 'ccdw_dim_product'],
|
|
564
|
+
parameters: [
|
|
565
|
+
{ name: 'from', description: 'Inclusive start date (YYYY-MM-DD)', type: 'date', required: true },
|
|
566
|
+
{ name: 'to', description: 'Inclusive end date (YYYY-MM-DD)', type: 'date', required: true },
|
|
567
|
+
{
|
|
568
|
+
name: 'threshold',
|
|
569
|
+
description: 'Low-stock cutoff: available_to_order at or below this is flagged (default 10)',
|
|
570
|
+
type: 'number',
|
|
571
|
+
min: 0,
|
|
572
|
+
max: 1000000,
|
|
573
|
+
},
|
|
574
|
+
{ name: 'limit', description: 'Max rows (1-500)', type: 'number', min: 1, max: 500 },
|
|
575
|
+
],
|
|
576
|
+
buildSql(params) {
|
|
577
|
+
const from = getDateLiteral(params, 'from');
|
|
578
|
+
const to = getDateLiteral(params, 'to');
|
|
579
|
+
const threshold = getOptionalIntegerLiteral(params, 'threshold', 10, 0, 1000000);
|
|
580
|
+
const limit = getOptionalIntegerLiteral(params, 'limit', 100, 1, 500);
|
|
581
|
+
// The CIP JDBC service rejects this 3-table join past ~9 projected columns
|
|
582
|
+
// (a service-side query-complexity limit; the error misleadingly names the first
|
|
583
|
+
// column). Keep the operationally essential columns and drop the surrogate id,
|
|
584
|
+
// available_to_fulfill, and soft_reserved to stay within the limit.
|
|
585
|
+
return `SELECT CAST(inv.record_date AS VARCHAR) AS record_date, l.nlocation_id AS location_id, p.nsku_id AS sku_id, p.sku_display_name, COALESCE(inv.on_hand, 0) AS on_hand, COALESCE(inv.available_to_order, 0) AS available_to_order, COALESCE(inv.reserved, 0) AS reserved, CASE WHEN COALESCE(inv.available_to_order, 0) <= 0 THEN 'out_of_stock' ELSE 'low' END AS stock_status, CAST(${threshold} - COALESCE(inv.available_to_order, 0) AS DECIMAL(15,2)) AS shortfall FROM ccdw_aggr_inventory_by_location inv JOIN ccdw_dim_location l ON l.location_id = inv.location_id JOIN ccdw_dim_product p ON p.sku_id = inv.sku_id WHERE inv.record_date >= ${from} AND inv.record_date <= ${to} AND COALESCE(inv.available_to_order, 0) <= ${threshold} ORDER BY shortfall DESC, l.nlocation_id, p.nsku_id LIMIT ${limit}`;
|
|
586
|
+
},
|
|
587
|
+
},
|
|
209
588
|
];
|
|
210
589
|
//# sourceMappingURL=reports.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reports.js","sourceRoot":"","sources":["../../../../src/operations/cip/reports.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reports.js","sourceRoot":"","sources":["../../../../src/operations/cip/reports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escapes single quotes in a value destined for a single-quoted SQL string literal.
|
|
3
|
+
*
|
|
4
|
+
* @param value - Raw string value to escape
|
|
5
|
+
* @returns The value with embedded single quotes doubled per SQL string-literal rules
|
|
6
|
+
*/
|
|
7
|
+
export declare function escapeSqlString(value: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Quotes a SQL identifier if it collides with a Calcite reserved word.
|
|
10
|
+
*
|
|
11
|
+
* Pass a bare column name; if it is a reserved word it is returned double-quoted
|
|
12
|
+
* (for example `method` -> `"method"`), otherwise it is returned unchanged. Use this
|
|
13
|
+
* whenever a report references a column whose name might be reserved.
|
|
14
|
+
*
|
|
15
|
+
* @param name - Bare column or identifier name
|
|
16
|
+
* @returns The identifier, double-quoted only if it is a Calcite reserved word
|
|
17
|
+
*/
|
|
18
|
+
export declare function quoteIdentifierIfReserved(name: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Returns true if the given bare identifier is a Calcite reserved word.
|
|
21
|
+
*
|
|
22
|
+
* @param name - Bare identifier name
|
|
23
|
+
* @returns Whether the name requires double-quoting in Calcite SQL
|
|
24
|
+
*/
|
|
25
|
+
export declare function isReservedIdentifier(name: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Builds a quoted, escaped SQL string literal from a raw value.
|
|
28
|
+
*
|
|
29
|
+
* @param value - Raw string value
|
|
30
|
+
* @returns A single-quoted, escaped SQL string literal (for example `O'Brien` -> `'O''Brien'`)
|
|
31
|
+
*/
|
|
32
|
+
export declare function stringLiteral(value: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Validates a `YYYY-MM-DD` date string and returns it as a quoted SQL date literal.
|
|
35
|
+
*
|
|
36
|
+
* @param value - Date string expected in `YYYY-MM-DD` form
|
|
37
|
+
* @returns A quoted SQL date literal
|
|
38
|
+
* @throws {Error} If the value is not a valid `YYYY-MM-DD` date
|
|
39
|
+
*/
|
|
40
|
+
export declare function dateLiteral(value: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Validates a boolean string (`true`/`false`, case-insensitive) and returns the SQL literal.
|
|
43
|
+
*
|
|
44
|
+
* @param value - Boolean string value
|
|
45
|
+
* @returns The lowercase boolean literal `true` or `false`
|
|
46
|
+
* @throws {Error} If the value is not `true` or `false`
|
|
47
|
+
*/
|
|
48
|
+
export declare function booleanLiteral(value: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Validates and returns an integer SQL literal within an inclusive range.
|
|
51
|
+
*
|
|
52
|
+
* @param value - Raw integer string
|
|
53
|
+
* @param min - Inclusive lower bound
|
|
54
|
+
* @param max - Inclusive upper bound
|
|
55
|
+
* @returns The integer rendered as a bare SQL literal
|
|
56
|
+
* @throws {Error} If the value is not an integer within `[min, max]`
|
|
57
|
+
*/
|
|
58
|
+
export declare function integerLiteral(value: string, min: number, max: number): string;
|
|
59
|
+
/**
|
|
60
|
+
* Builds a comma-separated, quoted string list for a SQL `IN (...)` clause.
|
|
61
|
+
*
|
|
62
|
+
* @param values - Raw string values
|
|
63
|
+
* @returns The escaped, single-quoted values joined by commas (no surrounding parens)
|
|
64
|
+
* @throws {Error} If `values` is empty
|
|
65
|
+
*/
|
|
66
|
+
export declare function stringInList(values: string[]): string;
|
|
@@ -0,0 +1,136 @@
|
|
|
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
|
+
* Shared SQL literal and identifier helpers for CIP report and metadata queries.
|
|
8
|
+
*
|
|
9
|
+
* CIP runs an Apache Calcite (Avatica JDBC) backend. These helpers centralize the
|
|
10
|
+
* single most security-sensitive logic in the CIP subsystem — turning untrusted
|
|
11
|
+
* parameter values into safe SQL literals — plus the Calcite-specific quoting of
|
|
12
|
+
* reserved words used as identifiers. Both report SQL builders and metadata catalog
|
|
13
|
+
* queries import from here so the escaping rules live (and are tested) in one place.
|
|
14
|
+
*
|
|
15
|
+
* @module operations/cip/sql
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Apache Calcite reserved words that are also real CIP warehouse column names.
|
|
19
|
+
*
|
|
20
|
+
* Selecting or grouping by any of these as a bare identifier is a parse error; they
|
|
21
|
+
* must be double-quoted. Confirmed against the live JDBC service (for example
|
|
22
|
+
* `SELECT method FROM ...` fails until quoted). Keep lowercase; matching is
|
|
23
|
+
* case-insensitive.
|
|
24
|
+
*/
|
|
25
|
+
const CALCITE_RESERVED_IDENTIFIERS = new Set([
|
|
26
|
+
'date',
|
|
27
|
+
'method',
|
|
28
|
+
'rows',
|
|
29
|
+
'time',
|
|
30
|
+
'timestamp',
|
|
31
|
+
'user',
|
|
32
|
+
'value',
|
|
33
|
+
'year',
|
|
34
|
+
'month',
|
|
35
|
+
'day',
|
|
36
|
+
'hour',
|
|
37
|
+
'minute',
|
|
38
|
+
'second',
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* Escapes single quotes in a value destined for a single-quoted SQL string literal.
|
|
42
|
+
*
|
|
43
|
+
* @param value - Raw string value to escape
|
|
44
|
+
* @returns The value with embedded single quotes doubled per SQL string-literal rules
|
|
45
|
+
*/
|
|
46
|
+
export function escapeSqlString(value) {
|
|
47
|
+
return value.replaceAll("'", "''");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Quotes a SQL identifier if it collides with a Calcite reserved word.
|
|
51
|
+
*
|
|
52
|
+
* Pass a bare column name; if it is a reserved word it is returned double-quoted
|
|
53
|
+
* (for example `method` -> `"method"`), otherwise it is returned unchanged. Use this
|
|
54
|
+
* whenever a report references a column whose name might be reserved.
|
|
55
|
+
*
|
|
56
|
+
* @param name - Bare column or identifier name
|
|
57
|
+
* @returns The identifier, double-quoted only if it is a Calcite reserved word
|
|
58
|
+
*/
|
|
59
|
+
export function quoteIdentifierIfReserved(name) {
|
|
60
|
+
return CALCITE_RESERVED_IDENTIFIERS.has(name.toLowerCase()) ? `"${name}"` : name;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Returns true if the given bare identifier is a Calcite reserved word.
|
|
64
|
+
*
|
|
65
|
+
* @param name - Bare identifier name
|
|
66
|
+
* @returns Whether the name requires double-quoting in Calcite SQL
|
|
67
|
+
*/
|
|
68
|
+
export function isReservedIdentifier(name) {
|
|
69
|
+
return CALCITE_RESERVED_IDENTIFIERS.has(name.toLowerCase());
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Builds a quoted, escaped SQL string literal from a raw value.
|
|
73
|
+
*
|
|
74
|
+
* @param value - Raw string value
|
|
75
|
+
* @returns A single-quoted, escaped SQL string literal (for example `O'Brien` -> `'O''Brien'`)
|
|
76
|
+
*/
|
|
77
|
+
export function stringLiteral(value) {
|
|
78
|
+
return `'${escapeSqlString(value)}'`;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validates a `YYYY-MM-DD` date string and returns it as a quoted SQL date literal.
|
|
82
|
+
*
|
|
83
|
+
* @param value - Date string expected in `YYYY-MM-DD` form
|
|
84
|
+
* @returns A quoted SQL date literal
|
|
85
|
+
* @throws {Error} If the value is not a valid `YYYY-MM-DD` date
|
|
86
|
+
*/
|
|
87
|
+
export function dateLiteral(value) {
|
|
88
|
+
if (!/^\d{4}-\d{2}-\d{2}$/u.test(value)) {
|
|
89
|
+
throw new Error(`Invalid date: expected YYYY-MM-DD, got "${value}"`);
|
|
90
|
+
}
|
|
91
|
+
return `'${escapeSqlString(value)}'`;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Validates a boolean string (`true`/`false`, case-insensitive) and returns the SQL literal.
|
|
95
|
+
*
|
|
96
|
+
* @param value - Boolean string value
|
|
97
|
+
* @returns The lowercase boolean literal `true` or `false`
|
|
98
|
+
* @throws {Error} If the value is not `true` or `false`
|
|
99
|
+
*/
|
|
100
|
+
export function booleanLiteral(value) {
|
|
101
|
+
const normalized = value.toLowerCase();
|
|
102
|
+
if (normalized !== 'true' && normalized !== 'false') {
|
|
103
|
+
throw new Error(`Invalid boolean: expected true or false, got "${value}"`);
|
|
104
|
+
}
|
|
105
|
+
return normalized;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Validates and returns an integer SQL literal within an inclusive range.
|
|
109
|
+
*
|
|
110
|
+
* @param value - Raw integer string
|
|
111
|
+
* @param min - Inclusive lower bound
|
|
112
|
+
* @param max - Inclusive upper bound
|
|
113
|
+
* @returns The integer rendered as a bare SQL literal
|
|
114
|
+
* @throws {Error} If the value is not an integer within `[min, max]`
|
|
115
|
+
*/
|
|
116
|
+
export function integerLiteral(value, min, max) {
|
|
117
|
+
const parsed = Number.parseInt(value, 10);
|
|
118
|
+
if (!Number.isInteger(parsed) || String(parsed) !== value.trim() || parsed < min || parsed > max) {
|
|
119
|
+
throw new Error(`Invalid integer: expected ${min}-${max}, got "${value}"`);
|
|
120
|
+
}
|
|
121
|
+
return String(parsed);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Builds a comma-separated, quoted string list for a SQL `IN (...)` clause.
|
|
125
|
+
*
|
|
126
|
+
* @param values - Raw string values
|
|
127
|
+
* @returns The escaped, single-quoted values joined by commas (no surrounding parens)
|
|
128
|
+
* @throws {Error} If `values` is empty
|
|
129
|
+
*/
|
|
130
|
+
export function stringInList(values) {
|
|
131
|
+
if (values.length === 0) {
|
|
132
|
+
throw new Error('Cannot build an IN list from an empty value set');
|
|
133
|
+
}
|
|
134
|
+
return values.map((value) => stringLiteral(value)).join(', ');
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../../src/operations/cip/sql.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC;IAC3C,MAAM;IACN,QAAQ;IACR,MAAM;IACN,MAAM;IACN,WAAW;IACX,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAO,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACnF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,iDAAiD,KAAK,GAAG,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QACjG,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,IAAI,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,MAAgB;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -11,6 +11,24 @@ export interface CipReportParamDefinition {
|
|
|
11
11
|
required?: boolean;
|
|
12
12
|
min?: number;
|
|
13
13
|
max?: number;
|
|
14
|
+
/**
|
|
15
|
+
* Allowed values for an enum-style parameter (for example `['4xx', '5xx']`).
|
|
16
|
+
* When set, {@link CipReportParamType} should be `string` and the value is
|
|
17
|
+
* validated against this set before the report's SQL builder runs.
|
|
18
|
+
*/
|
|
19
|
+
options?: string[];
|
|
20
|
+
/**
|
|
21
|
+
* When true, the parameter accepts multiple comma-separated values, suitable
|
|
22
|
+
* for a SQL `IN (...)` clause. Each value is validated against `options` when
|
|
23
|
+
* both are set.
|
|
24
|
+
*/
|
|
25
|
+
multiple?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Default value applied when the parameter is omitted. For `multiple`
|
|
28
|
+
* parameters this may be a comma-separated string. Defaults are injected
|
|
29
|
+
* before validation so a report can rely on the value being present.
|
|
30
|
+
*/
|
|
31
|
+
default?: string;
|
|
14
32
|
}
|
|
15
33
|
/**
|
|
16
34
|
* Curated CIP report definition.
|
|
@@ -21,6 +39,11 @@ export interface CipReportDefinition {
|
|
|
21
39
|
category: string;
|
|
22
40
|
parameters: CipReportParamDefinition[];
|
|
23
41
|
buildSql: (params: Record<string, string>) => string;
|
|
42
|
+
/**
|
|
43
|
+
* Optional list of warehouse tables the report reads, for discoverability in
|
|
44
|
+
* `--describe` output and the report listing command. Does not affect SQL.
|
|
45
|
+
*/
|
|
46
|
+
tablesUsed?: string[];
|
|
24
47
|
}
|
|
25
48
|
/**
|
|
26
49
|
* Generated SQL for a curated report execution.
|
|
@@ -2,14 +2,15 @@ import type { SkillSet, SkillSourceConfig } from './types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Registry mapping skill sets to their source configurations.
|
|
4
4
|
*
|
|
5
|
-
* Each skill set (b2c, b2c-cli, storefront-next, cap-dev)
|
|
6
|
-
* GitHub repository and download configuration for
|
|
5
|
+
* Each skill set (b2c, b2c-cli, storefront-next, storefront-next-figma, cap-dev)
|
|
6
|
+
* maps to its respective GitHub repository and download configuration for
|
|
7
|
+
* artifact retrieval.
|
|
7
8
|
*/
|
|
8
9
|
export declare const SKILL_SOURCES: Record<SkillSet, SkillSourceConfig>;
|
|
9
10
|
/**
|
|
10
11
|
* Get the source configuration for a specific skill set.
|
|
11
12
|
*
|
|
12
|
-
* @param skillSet - The skill set identifier ('b2c', 'b2c-cli', 'storefront-next', or 'cap-dev')
|
|
13
|
+
* @param skillSet - The skill set identifier ('b2c', 'b2c-cli', 'storefront-next', 'storefront-next-figma', or 'cap-dev')
|
|
13
14
|
* @returns The source configuration for the skill set
|
|
14
15
|
* @throws Error if the skill set is not recognized
|
|
15
16
|
*/
|
|
@@ -10,8 +10,9 @@ function pluginsTag(version) {
|
|
|
10
10
|
/**
|
|
11
11
|
* Registry mapping skill sets to their source configurations.
|
|
12
12
|
*
|
|
13
|
-
* Each skill set (b2c, b2c-cli, storefront-next, cap-dev)
|
|
14
|
-
* GitHub repository and download configuration for
|
|
13
|
+
* Each skill set (b2c, b2c-cli, storefront-next, storefront-next-figma, cap-dev)
|
|
14
|
+
* maps to its respective GitHub repository and download configuration for
|
|
15
|
+
* artifact retrieval.
|
|
15
16
|
*/
|
|
16
17
|
export const SKILL_SOURCES = {
|
|
17
18
|
b2c: {
|
|
@@ -38,6 +39,14 @@ export const SKILL_SOURCES = {
|
|
|
38
39
|
assetName: 'storefront-next-skills.zip',
|
|
39
40
|
tagPattern: pluginsTag,
|
|
40
41
|
},
|
|
42
|
+
'storefront-next-figma': {
|
|
43
|
+
id: 'storefront-next-figma',
|
|
44
|
+
displayName: 'Storefront Next Figma design-kit skills (requires the Figma MCP server)',
|
|
45
|
+
type: 'release-artifact',
|
|
46
|
+
repo: 'SalesforceCommerceCloud/b2c-developer-tooling',
|
|
47
|
+
assetName: 'storefront-next-figma-skills.zip',
|
|
48
|
+
tagPattern: pluginsTag,
|
|
49
|
+
},
|
|
41
50
|
'cap-dev': {
|
|
42
51
|
id: 'cap-dev',
|
|
43
52
|
displayName: 'Commerce Apps development skills',
|
|
@@ -50,7 +59,7 @@ export const SKILL_SOURCES = {
|
|
|
50
59
|
/**
|
|
51
60
|
* Get the source configuration for a specific skill set.
|
|
52
61
|
*
|
|
53
|
-
* @param skillSet - The skill set identifier ('b2c', 'b2c-cli', 'storefront-next', or 'cap-dev')
|
|
62
|
+
* @param skillSet - The skill set identifier ('b2c', 'b2c-cli', 'storefront-next', 'storefront-next-figma', or 'cap-dev')
|
|
54
63
|
* @returns The source configuration for the skill set
|
|
55
64
|
* @throws Error if the skill set is not recognized
|
|
56
65
|
*/
|
|
@@ -1 +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
|
|
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;;;;;;GAMG;AACH,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,iBAAiB,EAAE;QACjB,EAAE,EAAE,iBAAiB;QACrB,WAAW,EAAE,oCAAoC;QACjD,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,+CAA+C;QACrD,SAAS,EAAE,4BAA4B;QACvC,UAAU,EAAE,UAAU;KACvB;IACD,uBAAuB,EAAE;QACvB,EAAE,EAAE,uBAAuB;QAC3B,WAAW,EAAE,yEAAyE;QACtF,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,+CAA+C;QACrD,SAAS,EAAE,kCAAkC;QAC7C,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;;;;;;GAMG;AACH,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;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAe,MAAM,CAAC,IAAI,CAAC,aAAa,CAAe,CAAC"}
|
|
@@ -5,7 +5,7 @@ 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' | 'cap-dev' | 'storefront-next';
|
|
8
|
+
export type SkillSet = 'b2c' | 'b2c-cli' | 'cap-dev' | 'storefront-next' | 'storefront-next-figma';
|
|
9
9
|
/**
|
|
10
10
|
* Configuration for a skill source — defines how to fetch skills from a particular repository.
|
|
11
11
|
*/
|
|
@@ -6,7 +6,12 @@
|
|
|
6
6
|
import { randomBytes } from 'node:crypto';
|
|
7
7
|
import fs from 'node:fs';
|
|
8
8
|
import path from 'node:path';
|
|
9
|
-
import
|
|
9
|
+
// Namespace import (not default): `applicationinsights` is a legacy CommonJS
|
|
10
|
+
// module whose default-export interop is not synthesized when the file is
|
|
11
|
+
// loaded as native ESM (e.g. mocha 11's tsx loader), leaving the default
|
|
12
|
+
// binding `undefined`. The namespace form resolves `TelemetryClient` correctly
|
|
13
|
+
// under every loader — mocha, tsx, and the production ESM build.
|
|
14
|
+
import * as appInsights from 'applicationinsights';
|
|
10
15
|
import { getLogger } from '../logging/index.js';
|
|
11
16
|
const generateRandomId = () => randomBytes(20).toString('hex');
|
|
12
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/telemetry/telemetry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,WAAW,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/telemetry/telemetry.ts"],"names":[],"mappings":"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"}
|
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.
|
|
4
|
+
"version": "1.14.0",
|
|
5
5
|
"author": "Charles Lavery",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"repository": "SalesforceCommerceCloud/b2c-developer-tooling",
|
|
@@ -192,7 +192,7 @@
|
|
|
192
192
|
"eslint-config-prettier": "^10",
|
|
193
193
|
"eslint-plugin-header": "^3.1.1",
|
|
194
194
|
"eslint-plugin-prettier": "^5.5.5",
|
|
195
|
-
"mocha": "^
|
|
195
|
+
"mocha": "^11",
|
|
196
196
|
"msw": "^2.12.4",
|
|
197
197
|
"openapi-typescript": "^7.10.1",
|
|
198
198
|
"prettier": "^3.8.3",
|
|
@@ -248,6 +248,7 @@
|
|
|
248
248
|
"pretest": "tsc --noEmit -p test",
|
|
249
249
|
"test": "c8 mocha --forbid-only \"test/**/*.test.ts\"",
|
|
250
250
|
"test:ci": "c8 mocha --forbid-only --reporter json --reporter-option output=test-results.json \"test/**/*.test.ts\"",
|
|
251
|
+
"test:ci:win": "c8 --check-coverage=false mocha --forbid-only --reporter json --reporter-option output=test-results.json \"test/**/*.test.ts\"",
|
|
251
252
|
"test:unit": "mocha --forbid-only \"test/**/*.test.ts\"",
|
|
252
253
|
"test:agent": "mocha --forbid-only --parallel --jobs 4 --reporter min \"test/**/*.test.ts\"",
|
|
253
254
|
"test:watch": "mocha --watch \"test/**/*.test.ts\"",
|