aws-service-stack 0.18.295 → 0.18.296

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.
@@ -59,6 +59,7 @@ const parseHttpRequest = (event, adminGroupNames) => {
59
59
  isAdmin,
60
60
  parentId,
61
61
  groups,
62
+ username,
62
63
  Authorization: event?.headers?.Authorization,
63
64
  identityId: event && "x-cognito-identity-id" in event.headers ? event.headers["x-cognito-identity-id"] : undefined,
64
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http.util.js","sourceRoot":"","sources":["../../../src/utils/http/http.util.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CognitoUser,\n EndpointPolicy,\n Filter,\n HttpMethod,\n RequestType,\n ResponseFields,\n SortOrder,\n toCaseInsensitive,\n} from \"../../index\";\nimport { APIGatewayProxyEvent } from \"aws-lambda\";\nimport { getFirst, normalizeLower, toArray, trimSpecialChar } from \"../string.util\";\n\nexport type APIResponse = {\n statusCode: number;\n headers?: Record<string, string>;\n body: string;\n};\n\nexport type APIResponseOptions = {\n origin?: string;\n contentType: string;\n fields?: ResponseFields;\n};\n\nexport const DEFAULT_API_RESPONSE_OPTIONS: APIResponseOptions = {\n origin: \"*\",\n contentType: \"application/json\",\n};\n\nexport const createApiResponse = (statusCode: number, body: any, options?: APIResponseOptions): APIResponse => {\n const { origin, contentType } = options || DEFAULT_API_RESPONSE_OPTIONS;\n\n return {\n statusCode: statusCode,\n body: JSON.stringify(body),\n headers: {\n \"Access-Control-Allow-Origin\": origin || DEFAULT_API_RESPONSE_OPTIONS.origin,\n \"Content-Type\": contentType || DEFAULT_API_RESPONSE_OPTIONS.contentType,\n },\n };\n};\n\nexport interface HttpRequest<B = any, Q = any, P = any> {\n event: any;\n methode: HttpMethod;\n resourcePath: string;\n body?: B;\n queryStringParameters?: Q;\n filter?: Filter;\n customQueryParameters?: Record<string, string>;\n multiValueQueryStringParameters?: Q;\n pathParameters?: P;\n identity?: CognitoUser;\n headers?: Record<string, string>;\n requestType: RequestType;\n entityId: string;\n}\n\nexport const parseHttpRequest = (event: APIGatewayProxyEvent, adminGroupNames: any): HttpRequest => {\n const identity = event?.requestContext?.authorizer?.claims;\n\n // request user data\n const groupsCognito = toArray(identity?.[\"cognito:groups\"]);\n\n const username = identity?.[\"cognito:username\"] || \"\";\n const isParent: boolean = identity?.[\"custom:isParent\"] === \"1\";\n const userId = identity?.sub || \"\";\n const profileId = identity?.profile || username;\n const parentId: boolean = identity?.[\"custom:parentId\"];\n\n const adminGroups = new Set(normalizeLower(toArray(adminGroupNames)));\n const groups = normalizeLower(toArray(groupsCognito));\n const isAdmin = groups.some((g) => adminGroups.has(g));\n let requestType: RequestType = RequestType.GUEST;\n\n if (isAdmin) {\n requestType = RequestType.ADMIN;\n } else if (profileId || userId) requestType = RequestType.USER;\n\n const entityId = decodeURIComponent(event?.pathParameters?.id || \"\");\n const resourcePath = event.httpMethod + \" \" + event?.requestContext?.resourcePath;\n\n const parsedParams: HttpRequest = {\n event: event,\n methode: event.httpMethod as HttpMethod,\n queryStringParameters: event?.queryStringParameters || undefined,\n\n filter: event?.queryStringParameters\n ? parseFilter(\n event?.queryStringParameters as Record<string, any>,\n event.multiValueQueryStringParameters[\"searchBy\"],\n )\n : {},\n\n multiValueQueryStringParameters: event?.multiValueQueryStringParameters || undefined,\n pathParameters: event?.pathParameters || undefined,\n body: undefined,\n identity: identity\n ? {\n ...identity,\n isParent,\n isAdmin,\n parentId,\n groups,\n Authorization: event?.headers?.Authorization,\n identityId:\n event && \"x-cognito-identity-id\" in event.headers ? event.headers[\"x-cognito-identity-id\"] : undefined,\n }\n : undefined,\n // username,\n // userId,\n // profileId,\n // isAdmin,\n requestType,\n resourcePath,\n entityId,\n // groups,\n headers: { ...event?.headers },\n };\n\n // if (isParent) parsedParams.filter[\"ownerParentId\"] = profileId;\n // else parsedParams.filter[\"profileId\"] = profileId;\n // if (parentId) parsedParams.filter[\"ownerParentId\"] = parentId;\n\n if (event?.body) parsedParams.body = typeof event.body === \"string\" ? JSON.parse(event.body) : event.body;\n\n return parsedParams;\n};\n\nexport function parseFilter(params: Record<string, any> | string, searchBy?: string[]): Filter {\n const result: Filter = {};\n\n if (searchBy && searchBy.length > 0) {\n result.searchBy = searchBy;\n }\n\n // If the params is a string (URL query string), parse it first\n let parsedParams: Record<string, any>;\n if (typeof params === \"string\") {\n parsedParams = toRecord(params);\n } else {\n parsedParams = params;\n }\n\n parsedParams.searchKeyword = getFirst(parsedParams.searchKeyword);\n\n const parseParam = (key: string, parseFunc: (value: string) => any) => {\n const value = parsedParams[key];\n if (value !== undefined && value !== null && String(value).trim() !== \"\") {\n result[key] = parseFunc(value);\n }\n };\n\n parseParam(\"page\", (value) => Number.parseInt(value, 10));\n parseParam(\"size\", (value) => Number.parseInt(value, 10));\n parseParam(\"sortBy\", (value) => value);\n parseParam(\"sort\", (value) => value as SortOrder);\n // parseParam(\"searchBy\", (value) => searchBy);\n parseParam(\"searchKeyword\", (value) => toCaseInsensitive(value));\n parseParam(\"lastKey\", (value) => value);\n parseParam(\"indexName\", (value) => value);\n parseParam(\"indexValue\", (value) => value);\n\n const parseRangeValue = (value: any) => {\n // If value is already a number, return it\n if (typeof value === \"number\") {\n return value;\n }\n\n // If the value is already a Date, return it\n if (value instanceof Date) {\n return value;\n }\n\n // Convert to string for parsing\n const stringValue = String(value);\n\n // Check if it's a valid date first (before number parsing)\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(stringValue) || /^\\d{4}\\.\\d{2}\\.\\d{2}/.test(stringValue)) {\n const date = new Date(stringValue);\n if (!Number.isNaN(date.getTime())) return date;\n }\n\n // Check for another date format that might be used in range filters\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(stringValue)) {\n const date = new Date(stringValue);\n if (!Number.isNaN(date.getTime())) return date;\n }\n\n // Check if it's a valid number (including decimals)\n const numberValue = Number.parseFloat(stringValue);\n if (!Number.isNaN(numberValue)) {\n // Handle zero values (both \"0\" and \"0.0\" should become 0)\n if (numberValue === 0) {\n return 0;\n }\n // Handle integer values\n if (Number.isInteger(numberValue)) {\n return Number.parseInt(stringValue, 10);\n }\n return numberValue;\n }\n\n return value;\n };\n\n // Initialize rangeFilters array\n result.rangeFilters = [];\n\n // Auto-detect range filter patterns with min_ and max_ prefixes\n for (const key in parsedParams) {\n const value = parsedParams[key];\n if (value !== undefined && value !== null && String(value).trim() !== \"\") {\n // Check for min_ and max_ patterns\n const minMatch = key.match(/^min_(.+)$/i);\n const maxMatch = key.match(/^max_(.+)$/i);\n\n if (minMatch) {\n const fieldName = minMatch[1]; // Remove .toLowerCase() to preserve case\n // Find existing range filter or create new one\n let rangeFilter = result.rangeFilters!.find((rf) => rf.fieldName === fieldName);\n if (!rangeFilter) {\n rangeFilter = { fieldName };\n result.rangeFilters!.push(rangeFilter);\n }\n rangeFilter.minValue = parseRangeValue(value);\n } else if (maxMatch) {\n const fieldName = maxMatch[1]; // Remove .toLowerCase() to preserve case\n // Find existing range filter or create new one\n let rangeFilter = result.rangeFilters!.find((rf) => rf.fieldName === fieldName);\n if (!rangeFilter) {\n rangeFilter = { fieldName };\n result.rangeFilters!.push(rangeFilter);\n }\n rangeFilter.maxValue = parseRangeValue(value);\n } else if (!(key in result)) {\n result[key] = value;\n }\n }\n }\n\n // Clean up empty rangeFilters array\n if (result.rangeFilters!.length === 0) {\n delete result.rangeFilters;\n }\n\n return result;\n}\n\nfunction smartParse(value: string): any {\n if (value.includes(\"*\")) return value;\n\n // Boolean\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n\n // Integer\n if (/^-?\\d+$/.test(value)) return parseInt(value, 10);\n\n // Float / Double\n if (/^-?\\d*\\.\\d+$/.test(value)) return parseFloat(value);\n\n // ISO Date (YYYY-MM-DD) or Dot Date (YYYY.MM.DD)\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) return date;\n }\n if (/^\\d{4}\\.\\d{2}\\.\\d{2}/.test(value)) {\n // Convert to ISO format for Date constructor\n const isoValue = value.replace(/\\./g, \"-\");\n const date = new Date(isoValue);\n if (!isNaN(date.getTime())) return date;\n }\n\n if (typeof value === \"string\" && value.includes(\",\")) {\n const valueList = value.split(\",\");\n for (let i = 1; i < valueList.length; i++) {\n valueList[i] = smartParse(valueList[i]);\n }\n return valueList;\n }\n\n // Default: string\n return value;\n}\n\nexport function toRecord(queryString: string): Record<string, any> {\n const result: Record<string, any> = {};\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const [key, value] = pair.split(\"=\");\n if (key && value !== undefined) {\n result[key] = smartParse(decodeURIComponent(value));\n }\n }\n\n return result;\n}\n\nexport function findMatchedPolicy(methode: HttpMethod, path: string, policies: EndpointPolicy[]): EndpointPolicy {\n if (!methode || !path || !policies.length) {\n return null;\n }\n\n return policies.find((policy) => policy.method === methode && trimSpecialChar(policy.path) === trimSpecialChar(path));\n}\n"]}
1
+ {"version":3,"file":"http.util.js","sourceRoot":"","sources":["../../../src/utils/http/http.util.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CognitoUser,\n EndpointPolicy,\n Filter,\n HttpMethod,\n RequestType,\n ResponseFields,\n SortOrder,\n toCaseInsensitive,\n} from \"../../index\";\nimport { APIGatewayProxyEvent } from \"aws-lambda\";\nimport { getFirst, normalizeLower, toArray, trimSpecialChar } from \"../string.util\";\n\nexport type APIResponse = {\n statusCode: number;\n headers?: Record<string, string>;\n body: string;\n};\n\nexport type APIResponseOptions = {\n origin?: string;\n contentType: string;\n fields?: ResponseFields;\n};\n\nexport const DEFAULT_API_RESPONSE_OPTIONS: APIResponseOptions = {\n origin: \"*\",\n contentType: \"application/json\",\n};\n\nexport const createApiResponse = (statusCode: number, body: any, options?: APIResponseOptions): APIResponse => {\n const { origin, contentType } = options || DEFAULT_API_RESPONSE_OPTIONS;\n\n return {\n statusCode: statusCode,\n body: JSON.stringify(body),\n headers: {\n \"Access-Control-Allow-Origin\": origin || DEFAULT_API_RESPONSE_OPTIONS.origin,\n \"Content-Type\": contentType || DEFAULT_API_RESPONSE_OPTIONS.contentType,\n },\n };\n};\n\nexport interface HttpRequest<B = any, Q = any, P = any> {\n event: any;\n methode: HttpMethod;\n resourcePath: string;\n body?: B;\n queryStringParameters?: Q;\n filter?: Filter;\n customQueryParameters?: Record<string, string>;\n multiValueQueryStringParameters?: Q;\n pathParameters?: P;\n identity?: CognitoUser;\n headers?: Record<string, string>;\n requestType: RequestType;\n entityId: string;\n}\n\nexport const parseHttpRequest = (event: APIGatewayProxyEvent, adminGroupNames: any): HttpRequest => {\n const identity = event?.requestContext?.authorizer?.claims;\n\n // request user data\n const groupsCognito = toArray(identity?.[\"cognito:groups\"]);\n\n const username = identity?.[\"cognito:username\"] || \"\";\n const isParent: boolean = identity?.[\"custom:isParent\"] === \"1\";\n const userId = identity?.sub || \"\";\n const profileId = identity?.profile || username;\n const parentId: boolean = identity?.[\"custom:parentId\"];\n\n const adminGroups = new Set(normalizeLower(toArray(adminGroupNames)));\n const groups = normalizeLower(toArray(groupsCognito));\n const isAdmin = groups.some((g) => adminGroups.has(g));\n let requestType: RequestType = RequestType.GUEST;\n\n if (isAdmin) {\n requestType = RequestType.ADMIN;\n } else if (profileId || userId) requestType = RequestType.USER;\n\n const entityId = decodeURIComponent(event?.pathParameters?.id || \"\");\n const resourcePath = event.httpMethod + \" \" + event?.requestContext?.resourcePath;\n\n const parsedParams: HttpRequest = {\n event: event,\n methode: event.httpMethod as HttpMethod,\n queryStringParameters: event?.queryStringParameters || undefined,\n\n filter: event?.queryStringParameters\n ? parseFilter(\n event?.queryStringParameters as Record<string, any>,\n event.multiValueQueryStringParameters[\"searchBy\"],\n )\n : {},\n\n multiValueQueryStringParameters: event?.multiValueQueryStringParameters || undefined,\n pathParameters: event?.pathParameters || undefined,\n body: undefined,\n identity: identity\n ? {\n ...identity,\n isParent,\n isAdmin,\n parentId,\n groups,\n username,\n Authorization: event?.headers?.Authorization,\n identityId:\n event && \"x-cognito-identity-id\" in event.headers ? event.headers[\"x-cognito-identity-id\"] : undefined,\n }\n : undefined,\n // username,\n // userId,\n // profileId,\n // isAdmin,\n requestType,\n resourcePath,\n entityId,\n // groups,\n headers: { ...event?.headers },\n };\n\n // if (isParent) parsedParams.filter[\"ownerParentId\"] = profileId;\n // else parsedParams.filter[\"profileId\"] = profileId;\n // if (parentId) parsedParams.filter[\"ownerParentId\"] = parentId;\n\n if (event?.body) parsedParams.body = typeof event.body === \"string\" ? JSON.parse(event.body) : event.body;\n\n return parsedParams;\n};\n\nexport function parseFilter(params: Record<string, any> | string, searchBy?: string[]): Filter {\n const result: Filter = {};\n\n if (searchBy && searchBy.length > 0) {\n result.searchBy = searchBy;\n }\n\n // If the params is a string (URL query string), parse it first\n let parsedParams: Record<string, any>;\n if (typeof params === \"string\") {\n parsedParams = toRecord(params);\n } else {\n parsedParams = params;\n }\n\n parsedParams.searchKeyword = getFirst(parsedParams.searchKeyword);\n\n const parseParam = (key: string, parseFunc: (value: string) => any) => {\n const value = parsedParams[key];\n if (value !== undefined && value !== null && String(value).trim() !== \"\") {\n result[key] = parseFunc(value);\n }\n };\n\n parseParam(\"page\", (value) => Number.parseInt(value, 10));\n parseParam(\"size\", (value) => Number.parseInt(value, 10));\n parseParam(\"sortBy\", (value) => value);\n parseParam(\"sort\", (value) => value as SortOrder);\n // parseParam(\"searchBy\", (value) => searchBy);\n parseParam(\"searchKeyword\", (value) => toCaseInsensitive(value));\n parseParam(\"lastKey\", (value) => value);\n parseParam(\"indexName\", (value) => value);\n parseParam(\"indexValue\", (value) => value);\n\n const parseRangeValue = (value: any) => {\n // If value is already a number, return it\n if (typeof value === \"number\") {\n return value;\n }\n\n // If the value is already a Date, return it\n if (value instanceof Date) {\n return value;\n }\n\n // Convert to string for parsing\n const stringValue = String(value);\n\n // Check if it's a valid date first (before number parsing)\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(stringValue) || /^\\d{4}\\.\\d{2}\\.\\d{2}/.test(stringValue)) {\n const date = new Date(stringValue);\n if (!Number.isNaN(date.getTime())) return date;\n }\n\n // Check for another date format that might be used in range filters\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(stringValue)) {\n const date = new Date(stringValue);\n if (!Number.isNaN(date.getTime())) return date;\n }\n\n // Check if it's a valid number (including decimals)\n const numberValue = Number.parseFloat(stringValue);\n if (!Number.isNaN(numberValue)) {\n // Handle zero values (both \"0\" and \"0.0\" should become 0)\n if (numberValue === 0) {\n return 0;\n }\n // Handle integer values\n if (Number.isInteger(numberValue)) {\n return Number.parseInt(stringValue, 10);\n }\n return numberValue;\n }\n\n return value;\n };\n\n // Initialize rangeFilters array\n result.rangeFilters = [];\n\n // Auto-detect range filter patterns with min_ and max_ prefixes\n for (const key in parsedParams) {\n const value = parsedParams[key];\n if (value !== undefined && value !== null && String(value).trim() !== \"\") {\n // Check for min_ and max_ patterns\n const minMatch = key.match(/^min_(.+)$/i);\n const maxMatch = key.match(/^max_(.+)$/i);\n\n if (minMatch) {\n const fieldName = minMatch[1]; // Remove .toLowerCase() to preserve case\n // Find existing range filter or create new one\n let rangeFilter = result.rangeFilters!.find((rf) => rf.fieldName === fieldName);\n if (!rangeFilter) {\n rangeFilter = { fieldName };\n result.rangeFilters!.push(rangeFilter);\n }\n rangeFilter.minValue = parseRangeValue(value);\n } else if (maxMatch) {\n const fieldName = maxMatch[1]; // Remove .toLowerCase() to preserve case\n // Find existing range filter or create new one\n let rangeFilter = result.rangeFilters!.find((rf) => rf.fieldName === fieldName);\n if (!rangeFilter) {\n rangeFilter = { fieldName };\n result.rangeFilters!.push(rangeFilter);\n }\n rangeFilter.maxValue = parseRangeValue(value);\n } else if (!(key in result)) {\n result[key] = value;\n }\n }\n }\n\n // Clean up empty rangeFilters array\n if (result.rangeFilters!.length === 0) {\n delete result.rangeFilters;\n }\n\n return result;\n}\n\nfunction smartParse(value: string): any {\n if (value.includes(\"*\")) return value;\n\n // Boolean\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n\n // Integer\n if (/^-?\\d+$/.test(value)) return parseInt(value, 10);\n\n // Float / Double\n if (/^-?\\d*\\.\\d+$/.test(value)) return parseFloat(value);\n\n // ISO Date (YYYY-MM-DD) or Dot Date (YYYY.MM.DD)\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n const date = new Date(value);\n if (!isNaN(date.getTime())) return date;\n }\n if (/^\\d{4}\\.\\d{2}\\.\\d{2}/.test(value)) {\n // Convert to ISO format for Date constructor\n const isoValue = value.replace(/\\./g, \"-\");\n const date = new Date(isoValue);\n if (!isNaN(date.getTime())) return date;\n }\n\n if (typeof value === \"string\" && value.includes(\",\")) {\n const valueList = value.split(\",\");\n for (let i = 1; i < valueList.length; i++) {\n valueList[i] = smartParse(valueList[i]);\n }\n return valueList;\n }\n\n // Default: string\n return value;\n}\n\nexport function toRecord(queryString: string): Record<string, any> {\n const result: Record<string, any> = {};\n const pairs = queryString.split(\"&\");\n\n for (const pair of pairs) {\n const [key, value] = pair.split(\"=\");\n if (key && value !== undefined) {\n result[key] = smartParse(decodeURIComponent(value));\n }\n }\n\n return result;\n}\n\nexport function findMatchedPolicy(methode: HttpMethod, path: string, policies: EndpointPolicy[]): EndpointPolicy {\n if (!methode || !path || !policies.length) {\n return null;\n }\n\n return policies.find((policy) => policy.method === methode && trimSpecialChar(policy.path) === trimSpecialChar(path));\n}\n"]}
@@ -265,47 +265,11 @@ function flattenDiff(diff, prefix = "") {
265
265
  const fullKey = prefix ? `${prefix}.${key}` : key;
266
266
  if (value && typeof value === "object" && "old" in value && "new" in value) {
267
267
  // direct primitive/string diff
268
- const oldVal = value.old;
269
- const newVal = value.new;
270
- // if both old and new are objects, flatten them into separate fields
271
- if (isObject(oldVal) && isObject(newVal)) {
272
- const allKeys = new Set([...Object.keys(oldVal || {}), ...Object.keys(newVal || {})]);
273
- for (const subKey of allKeys) {
274
- changes.push({
275
- fieldName: `${fullKey}.${subKey}`,
276
- oldValue: String(oldVal?.[subKey] ?? ""),
277
- newValue: String(newVal?.[subKey] ?? ""),
278
- });
279
- }
280
- }
281
- else if (isObject(oldVal) && !newVal) {
282
- // old was object, new is null/undefined - flatten old object
283
- for (const [subKey, subVal] of Object.entries(oldVal)) {
284
- changes.push({
285
- fieldName: `${fullKey}.${subKey}`,
286
- oldValue: String(subVal ?? ""),
287
- newValue: "",
288
- });
289
- }
290
- }
291
- else if (isObject(newVal) && !oldVal) {
292
- // new is object, old was null/undefined - flatten new object
293
- for (const [subKey, subVal] of Object.entries(newVal)) {
294
- changes.push({
295
- fieldName: `${fullKey}.${subKey}`,
296
- oldValue: "",
297
- newValue: String(subVal ?? ""),
298
- });
299
- }
300
- }
301
- else {
302
- // both are primitives or null
303
- changes.push({
304
- fieldName: fullKey,
305
- oldValue: String(oldVal ?? ""),
306
- newValue: String(newVal ?? ""),
307
- });
308
- }
268
+ changes.push({
269
+ fieldName: fullKey,
270
+ oldValue: value.old,
271
+ newValue: value.new,
272
+ });
309
273
  }
310
274
  else if (typeof value === "object" && !Array.isArray(value)) {
311
275
  // nested object diff (recursive)
@@ -315,8 +279,8 @@ function flattenDiff(diff, prefix = "") {
315
279
  // fallback: primitive or unexpected shape
316
280
  changes.push({
317
281
  fieldName: fullKey,
318
- oldValue: String(value?.old ?? ""),
319
- newValue: String(value?.new ?? ""),
282
+ oldValue: value?.old ?? null,
283
+ newValue: value?.new ?? null,
320
284
  });
321
285
  }
322
286
  }
@@ -352,39 +316,35 @@ function diffObjects(oldObj, newObj) {
352
316
  if (skipKeys.has(key))
353
317
  continue;
354
318
  const newVal = newObj[key];
319
+ // if caller didn't supply the key (explicitly undefined) -> skip
355
320
  if (newVal === undefined)
356
321
  continue;
357
322
  const oldVal = oldObj[key];
323
+ // equal -> skip
358
324
  if (deepEqualIgnoreKeyOrder(oldVal, newVal))
359
325
  continue;
360
- // Both objects -> recursive
361
- if (isObject(newVal) && isObject(oldVal)) {
326
+ // both objects -> nested diff
327
+ if (isObject(oldVal) && isObject(newVal)) {
362
328
  const nested = diffObjects(oldVal, newVal);
363
329
  if (Object.keys(nested).length > 0)
364
330
  result[key] = nested;
365
331
  continue;
366
332
  }
367
- // NEW: new object but old was missing/empty → treat as full nested diff
368
- if (isObject(newVal) && !isObject(oldVal)) {
369
- const nested = diffObjects({}, newVal);
370
- result[key] = nested;
371
- continue;
372
- }
373
- // Both arrays
374
- if (Array.isArray(newVal) && Array.isArray(oldVal)) {
333
+ // both arrays -> array diff
334
+ if (Array.isArray(oldVal) && Array.isArray(newVal)) {
375
335
  const arrDiff = diffArrays(oldVal, newVal);
376
336
  if (arrDiff && Object.keys(arrDiff).length > 0)
377
337
  result[key] = arrDiff;
378
338
  continue;
379
339
  }
380
- // Strings with snippets
340
+ // strings: summarize long text changes
381
341
  if (typeof oldVal === "string" && typeof newVal === "string") {
382
342
  const oldSnippet = oldVal.length > 200 ? (0, string_util_1.extractChangedSnippet)(oldVal, newVal) : oldVal;
383
343
  const newSnippet = newVal.length > 200 ? (0, string_util_1.extractChangedSnippet)(newVal, oldVal) : newVal;
384
344
  result[key] = { old: oldSnippet, new: newSnippet };
385
345
  continue;
386
346
  }
387
- // Fallback
347
+ // fallback: primitive change or type change
388
348
  result[key] = { old: oldVal, new: newVal };
389
349
  }
390
350
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"reflection.util.js","sourceRoot":"","sources":["../../src/utils/reflection.util.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseEntity, ChangedField, InclusionMode, TraceChange } from \"../model/base.model\";\nimport { DynamoIndexMap } from \"../model/dynamodb.model\";\nimport { Filter } from \"../model/filter.model\";\nimport { toRecord } from \"./http/http.util\";\nimport dayjs from \"dayjs\";\nimport { extractChangedSnippet } from \"./string.util\";\n\nexport const hasField = (obj: object, fieldName: string): boolean => {\n return Object.hasOwn(obj, fieldName);\n};\n\nexport function isMethodeHasKeyword(methodName: string, keywords: string[]): boolean {\n if (!methodName) return false;\n return keywords.some((keyword) => methodName.toLowerCase().includes(keyword));\n}\n\nexport function handleRangeFilters(filter: Filter): Filter {\n // Use regex to match keys like ageMin, ageMax, tempFrom, etc.\n const rangeFilters: any[] = [];\n const rangeFieldMap: Record<string, { minValue?: any; maxValue?: any }> = {};\n // Suffix mapping\n const minSuffixes = [\"Min\", \"From\", \"Start\"];\n const maxSuffixes = [\"Max\", \"To\", \"End\"];\n const suffixToType: Record<string, \"minValue\" | \"maxValue\"> = {};\n for (const s of minSuffixes) {\n suffixToType[s] = \"minValue\";\n }\n for (const s of maxSuffixes) {\n suffixToType[s] = \"maxValue\";\n }\n // Build regex: (field)(Min|Max|From|To|Start|End)\n const suffixPattern = [...minSuffixes, ...maxSuffixes].join(\"|\");\n const regex = new RegExp(`^(.*)(${suffixPattern})$`);\n\n for (const key of Object.keys(filter)) {\n const match = regex.exec(key); // <- use exec instead of match\n if (match) {\n const fieldName = match[1];\n const suffix = match[2];\n const type = suffixToType[suffix];\n if (!rangeFieldMap[fieldName]) rangeFieldMap[fieldName] = {};\n rangeFieldMap[fieldName][type] = filter[key];\n }\n }\n\n // Remove the original min/max keys from filter and build rangeFilters\n for (const fieldName in rangeFieldMap) {\n const { minValue, maxValue } = rangeFieldMap[fieldName];\n if (minValue !== undefined || maxValue !== undefined) {\n rangeFilters.push({ fieldName, minValue, maxValue });\n for (const suffix of [...minSuffixes, ...maxSuffixes]) {\n delete filter[`${fieldName}${suffix}`];\n }\n }\n }\n\n if (rangeFilters.length > 0) {\n filter.rangeFilters = rangeFilters;\n }\n\n return filter;\n}\n\nexport function parseIndexFilter(filter: Filter | string, indexMap?: DynamoIndexMap): Filter {\n if (!filter) return undefined;\n if (typeof filter === \"string\") {\n filter = toRecord(filter);\n }\n let result: Filter = { ...filter };\n\n result = handleRangeFilters(result);\n\n if (indexMap === undefined || !indexMap || (filter?.indexName && filter?.indexValue)) return result;\n\n let bestMatch: {\n indexName: string;\n rFields: string[];\n fieldSeparator?: string;\n } | null = null;\n\n for (const [indexName, { rFields, fieldSeparator }] of indexMap.entries()) {\n const allFieldsPresent = rFields.every((field) => Object.hasOwn(filter, field));\n if (!allFieldsPresent) continue;\n\n if (!bestMatch || rFields.length > bestMatch.rFields.length) {\n bestMatch = { indexName, rFields, fieldSeparator: fieldSeparator };\n }\n }\n\n if (bestMatch) {\n const indexValues = bestMatch.rFields.map((field) => filter[field]);\n result.indexName = bestMatch.indexName;\n result.indexValue = indexValues.join(bestMatch.fieldSeparator ?? \"\");\n\n // rFields-ийг result-аас хасна\n for (const field of bestMatch.rFields) {\n delete result[field];\n }\n }\n\n return result;\n}\n\nexport function excludeKeys(obj: Record<string, any>, keysToExclude: string[]) {\n if (!obj) return obj;\n const result: Record<string, any> = {};\n for (const key in obj) {\n if (!keysToExclude.includes(key)) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/*\n * remove all fields except the ones in the fieldName array\n * */\nexport const fieldsInclude = (object: any, fieldName: string[]): any => {\n if (typeof object !== \"object\" || object === null) {\n throw new Error(\"Input must be an object\");\n }\n\n // Create a new object with only the specified fields\n return fieldName.reduce(\n (result, field) => {\n if (field in object) {\n result[field] = object[field];\n }\n return result;\n },\n {} as Record<string, any>,\n );\n};\n\nexport const copyField = (object: any, fromFieldName: string, toFieldName: string): any => {\n if (typeof object !== \"object\" || object === null) throw new Error(\"Input must be an object\");\n object[toFieldName] = object[fromFieldName];\n};\n\n/**\n * Removes or keeps specific fields from a list of objects.\n *\n * @param dataList - Array of objects to process\n * @param includes - Optional list of fields to include (whitelist)\n * @param excludes - Optional list of fields to exclude (blacklist)\n * @returns New array of objects with filtered fields\n */\nexport function removeFields<T extends object>(dataList: T[], includes?: string[], excludes?: string[]): Partial<T>[] {\n if (!includes && !excludes) return dataList;\n\n return dataList.map((item) => {\n // If includes are provided, only keep those fields\n if (includes && includes.length > 0) {\n const included: Partial<T> = {};\n for (const key of includes) {\n if (key in item) {\n included[key] = item[key];\n }\n }\n return included;\n }\n\n // If excludes are provided, remove those fields\n if (excludes && excludes.length > 0) {\n const cloned: Partial<T> = { ...item };\n for (const key of excludes) {\n delete cloned[key];\n }\n return cloned;\n }\n\n // If neither includes nor excludes: return the item as is\n return item;\n });\n}\n\n/**\n * @deprecated Use `setSystemData methode in crudService` instead.\n */\nexport const addDates = (entity: Partial<BaseEntity>): Partial<BaseEntity> => {\n if (!entity.createdAt) entity.createdAt = dayjs().toISOString();\n entity.updatedAt = dayjs().toISOString();\n return entity;\n};\n\n/**\n * @deprecated Use `setSystemData methode in crudService` instead.\n */\nexport const addDatesAndId = (entity: Partial<BaseEntity>): Partial<BaseEntity> => {\n if (!entity.id) entity.id = crypto.randomUUID();\n return addDates(entity);\n};\n\n/**\n * Recursively checks if an object contains any meaningful content.\n * - Returns false for null, undefined, empty objects, or empty arrays.\n * - Returns true for primitive values (string, number, boolean, etc.).\n * - Recursively checks arrays and nested objects to determine if at least one value is meaningful.\n *\n * This ensures that objects like { bool: {} } are considered empty,\n * and only objects with actual values (e.g., { bool: { must: [...] } }) are considered meaningful.\n */\nexport function hasContent(obj: any): boolean {\n if (obj == null) return false; // null/undefined\n if (typeof obj !== \"object\") return true; // primitive values are meaningful\n if (Array.isArray(obj)) return obj.some(hasContent);\n\n const values = Object.values(obj);\n if (values.length === 0) return false; // empty object\n\n // recursively check if any value is meaningful\n return values.some(hasContent);\n}\n\n/**\n * Recursively removes all \"empty\" fields from an object.\n *\n * Definition of empty:\n * - null or undefined\n * - empty objects {}\n * - empty arrays []\n *\n * Primitives (number, string, boolean) and non-empty objects/arrays are preserved.\n *\n * Usage:\n * ```ts\n * const input = { a: 1, b: null, c: {}, d: [], e: { f: null, g: { h: [] }, i: 2 }, j: [null, {}, 3] };\n * const cleaned = removeEmptyFields(input);\n * // cleaned => { a: 1, e: { i: 2 }, j: [3] }\n * ```\n *\n * This is especially useful when preparing Elasticsearch/OpenSearch queries:\n * - Removes empty objects like `{ bool: {} }`\n * - Removes empty arrays in filters\n * - Ensures the `body` only contains meaningful fields before sending\n */\nexport function removeEmptyFields(obj: any): any {\n if (obj == null) return undefined; // null or undefined -> remove\n if (typeof obj !== \"object\") return obj; // primitives remain\n\n if (Array.isArray(obj)) {\n const arr = obj\n .map(removeEmptyFields) // recursive\n .filter((v) => v !== undefined); // remove empty elements\n return arr.length > 0 ? arr : undefined;\n }\n\n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n const cleaned = removeEmptyFields(value);\n if (cleaned !== undefined) {\n result[key] = cleaned;\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nexport function computeChangedFields<T extends Record<string, any>>(\n oldItem: Partial<T>,\n newItem: Partial<T>,\n traceChange: TraceChange,\n): ChangedField[] {\n const diff = diffObjects(oldItem as Record<string, any>, newItem as Record<string, any>);\n const flattened = flattenDiff(diff);\n\n return traceChange.mode === InclusionMode.INCLUDE\n ? flattened.filter((f) => traceChange.fields.includes(f.fieldName))\n : flattened.filter((f) => !traceChange.fields.includes(f.fieldName));\n}\n\n/**\n * Flatten nested diff object into a ChangedField[] list\n * e.g. { address: { city: { old, new } } } => [{ fieldName: \"address.city\", oldValue, newValue }]\n */\nfunction flattenDiff(diff: Record<string, any>, prefix = \"\"): ChangedField[] {\n const changes: ChangedField[] = [];\n\n for (const [key, value] of Object.entries(diff)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (value && typeof value === \"object\" && \"old\" in value && \"new\" in value) {\n // direct primitive/string diff\n const oldVal = value.old;\n const newVal = value.new;\n\n // if both old and new are objects, flatten them into separate fields\n if (isObject(oldVal) && isObject(newVal)) {\n const allKeys = new Set([...Object.keys(oldVal || {}), ...Object.keys(newVal || {})]);\n for (const subKey of allKeys) {\n changes.push({\n fieldName: `${fullKey}.${subKey}`,\n oldValue: String(oldVal?.[subKey] ?? \"\"),\n newValue: String(newVal?.[subKey] ?? \"\"),\n });\n }\n } else if (isObject(oldVal) && !newVal) {\n // old was object, new is null/undefined - flatten old object\n for (const [subKey, subVal] of Object.entries(oldVal)) {\n changes.push({\n fieldName: `${fullKey}.${subKey}`,\n oldValue: String(subVal ?? \"\"),\n newValue: \"\",\n });\n }\n } else if (isObject(newVal) && !oldVal) {\n // new is object, old was null/undefined - flatten new object\n for (const [subKey, subVal] of Object.entries(newVal)) {\n changes.push({\n fieldName: `${fullKey}.${subKey}`,\n oldValue: \"\",\n newValue: String(subVal ?? \"\"),\n });\n }\n } else {\n // both are primitives or null\n changes.push({\n fieldName: fullKey,\n oldValue: String(oldVal ?? \"\"),\n newValue: String(newVal ?? \"\"),\n });\n }\n } else if (typeof value === \"object\" && !Array.isArray(value)) {\n // nested object diff (recursive)\n changes.push(...flattenDiff(value, fullKey));\n } else {\n // fallback: primitive or unexpected shape\n changes.push({\n fieldName: fullKey,\n oldValue: String(value?.old ?? \"\"),\n newValue: String(value?.new ?? \"\"),\n });\n }\n }\n\n return changes;\n}\n\n/* helpers */\nfunction isObject(v: any): v is Record<string, any> {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\nfunction isPrimitive(v: any): boolean {\n return v === null || (typeof v !== \"object\" && typeof v !== \"function\");\n}\nfunction stableStringify(value: any): string {\n if (isPrimitive(value)) return JSON.stringify(value);\n if (Array.isArray(value)) return \"[\" + value.map((v) => stableStringify(v)).join(\",\") + \"]\";\n // object: sort keys\n const keys = Object.keys(value).sort();\n return \"{\" + keys.map((k) => JSON.stringify(k) + \":\" + stableStringify(value[k])).join(\",\") + \"}\";\n}\nfunction deepEqualIgnoreKeyOrder(a: any, b: any): boolean {\n return stableStringify(a) === stableStringify(b);\n}\n\n/**\n * Only iterate keys from newObj (so fields not provided in the update are ignored).\n * Skip keys where newVal === undefined (treat as \"not provided\" -> no change recorded).\n */\nfunction diffObjects(oldObj: Record<string, any>, newObj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n const skipKeys = new Set([\"history\", \"createdAt\", \"updatedAt\"]);\n\n for (const key of Object.keys(newObj)) {\n if (skipKeys.has(key)) continue;\n\n const newVal = newObj[key];\n if (newVal === undefined) continue;\n\n const oldVal = oldObj[key];\n if (deepEqualIgnoreKeyOrder(oldVal, newVal)) continue;\n\n // Both objects -> recursive\n if (isObject(newVal) && isObject(oldVal)) {\n const nested = diffObjects(oldVal, newVal);\n if (Object.keys(nested).length > 0) result[key] = nested;\n continue;\n }\n\n // ✅ NEW: new object but old was missing/empty → treat as full nested diff\n if (isObject(newVal) && !isObject(oldVal)) {\n const nested = diffObjects({}, newVal);\n result[key] = nested;\n continue;\n }\n\n // Both arrays\n if (Array.isArray(newVal) && Array.isArray(oldVal)) {\n const arrDiff = diffArrays(oldVal, newVal);\n if (arrDiff && Object.keys(arrDiff).length > 0) result[key] = arrDiff;\n continue;\n }\n\n // Strings with snippets\n if (typeof oldVal === \"string\" && typeof newVal === \"string\") {\n const oldSnippet = oldVal.length > 200 ? extractChangedSnippet(oldVal, newVal) : oldVal;\n const newSnippet = newVal.length > 200 ? extractChangedSnippet(newVal, oldVal) : newVal;\n result[key] = { old: oldSnippet, new: newSnippet };\n continue;\n }\n\n // Fallback\n result[key] = { old: oldVal, new: newVal };\n }\n\n return result;\n}\n\n/** array diff similar to earlier, but kept compact */\nfunction diffArrays(oldArr: any[], newArr: any[]): any {\n if (deepEqualIgnoreKeyOrder(oldArr, newArr)) return {};\n\n const allPrimitives = oldArr.every(isPrimitive) && newArr.every(isPrimitive);\n if (allPrimitives) {\n const removed = oldArr.filter((x) => !newArr.includes(x));\n const added = newArr.filter((x) => !oldArr.includes(x));\n const out: any = {};\n if (added.length) out.added = added;\n if (removed.length) out.removed = removed;\n return out;\n }\n\n // complex arrays: index-wise diff\n const maxLen = Math.max(oldArr.length, newArr.length);\n const idxDiffs: Record<string, any> = {};\n for (let i = 0; i < maxLen; i++) {\n const a = oldArr[i];\n const b = newArr[i];\n if (deepEqualIgnoreKeyOrder(a, b)) continue;\n\n if (isObject(a) && isObject(b)) {\n const nested = diffObjects(a, b);\n if (Object.keys(nested).length > 0) idxDiffs[i] = nested;\n continue;\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n const nestedArr = diffArrays(a, b);\n if (Object.keys(nestedArr || {}).length > 0) idxDiffs[i] = nestedArr;\n continue;\n }\n\n idxDiffs[i] = { old: a, new: b };\n }\n\n if (Object.keys(idxDiffs).length === 0) {\n return { oldLength: oldArr.length, newLength: newArr.length };\n }\n return idxDiffs;\n}\n"]}
1
+ {"version":3,"file":"reflection.util.js","sourceRoot":"","sources":["../../src/utils/reflection.util.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseEntity, ChangedField, InclusionMode, TraceChange } from \"../model/base.model\";\nimport { DynamoIndexMap } from \"../model/dynamodb.model\";\nimport { Filter } from \"../model/filter.model\";\nimport { toRecord } from \"./http/http.util\";\nimport dayjs from \"dayjs\";\nimport { extractChangedSnippet } from \"./string.util\";\n\nexport const hasField = (obj: object, fieldName: string): boolean => {\n return Object.hasOwn(obj, fieldName);\n};\n\nexport function isMethodeHasKeyword(methodName: string, keywords: string[]): boolean {\n if (!methodName) return false;\n return keywords.some((keyword) => methodName.toLowerCase().includes(keyword));\n}\n\nexport function handleRangeFilters(filter: Filter): Filter {\n // Use regex to match keys like ageMin, ageMax, tempFrom, etc.\n const rangeFilters: any[] = [];\n const rangeFieldMap: Record<string, { minValue?: any; maxValue?: any }> = {};\n // Suffix mapping\n const minSuffixes = [\"Min\", \"From\", \"Start\"];\n const maxSuffixes = [\"Max\", \"To\", \"End\"];\n const suffixToType: Record<string, \"minValue\" | \"maxValue\"> = {};\n for (const s of minSuffixes) {\n suffixToType[s] = \"minValue\";\n }\n for (const s of maxSuffixes) {\n suffixToType[s] = \"maxValue\";\n }\n // Build regex: (field)(Min|Max|From|To|Start|End)\n const suffixPattern = [...minSuffixes, ...maxSuffixes].join(\"|\");\n const regex = new RegExp(`^(.*)(${suffixPattern})$`);\n\n for (const key of Object.keys(filter)) {\n const match = regex.exec(key); // <- use exec instead of match\n if (match) {\n const fieldName = match[1];\n const suffix = match[2];\n const type = suffixToType[suffix];\n if (!rangeFieldMap[fieldName]) rangeFieldMap[fieldName] = {};\n rangeFieldMap[fieldName][type] = filter[key];\n }\n }\n\n // Remove the original min/max keys from filter and build rangeFilters\n for (const fieldName in rangeFieldMap) {\n const { minValue, maxValue } = rangeFieldMap[fieldName];\n if (minValue !== undefined || maxValue !== undefined) {\n rangeFilters.push({ fieldName, minValue, maxValue });\n for (const suffix of [...minSuffixes, ...maxSuffixes]) {\n delete filter[`${fieldName}${suffix}`];\n }\n }\n }\n\n if (rangeFilters.length > 0) {\n filter.rangeFilters = rangeFilters;\n }\n\n return filter;\n}\n\nexport function parseIndexFilter(filter: Filter | string, indexMap?: DynamoIndexMap): Filter {\n if (!filter) return undefined;\n if (typeof filter === \"string\") {\n filter = toRecord(filter);\n }\n let result: Filter = { ...filter };\n\n result = handleRangeFilters(result);\n\n if (indexMap === undefined || !indexMap || (filter?.indexName && filter?.indexValue)) return result;\n\n let bestMatch: {\n indexName: string;\n rFields: string[];\n fieldSeparator?: string;\n } | null = null;\n\n for (const [indexName, { rFields, fieldSeparator }] of indexMap.entries()) {\n const allFieldsPresent = rFields.every((field) => Object.hasOwn(filter, field));\n if (!allFieldsPresent) continue;\n\n if (!bestMatch || rFields.length > bestMatch.rFields.length) {\n bestMatch = { indexName, rFields, fieldSeparator: fieldSeparator };\n }\n }\n\n if (bestMatch) {\n const indexValues = bestMatch.rFields.map((field) => filter[field]);\n result.indexName = bestMatch.indexName;\n result.indexValue = indexValues.join(bestMatch.fieldSeparator ?? \"\");\n\n // rFields-ийг result-аас хасна\n for (const field of bestMatch.rFields) {\n delete result[field];\n }\n }\n\n return result;\n}\n\nexport function excludeKeys(obj: Record<string, any>, keysToExclude: string[]) {\n if (!obj) return obj;\n const result: Record<string, any> = {};\n for (const key in obj) {\n if (!keysToExclude.includes(key)) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/*\n * remove all fields except the ones in the fieldName array\n * */\nexport const fieldsInclude = (object: any, fieldName: string[]): any => {\n if (typeof object !== \"object\" || object === null) {\n throw new Error(\"Input must be an object\");\n }\n\n // Create a new object with only the specified fields\n return fieldName.reduce(\n (result, field) => {\n if (field in object) {\n result[field] = object[field];\n }\n return result;\n },\n {} as Record<string, any>,\n );\n};\n\nexport const copyField = (object: any, fromFieldName: string, toFieldName: string): any => {\n if (typeof object !== \"object\" || object === null) throw new Error(\"Input must be an object\");\n object[toFieldName] = object[fromFieldName];\n};\n\n/**\n * Removes or keeps specific fields from a list of objects.\n *\n * @param dataList - Array of objects to process\n * @param includes - Optional list of fields to include (whitelist)\n * @param excludes - Optional list of fields to exclude (blacklist)\n * @returns New array of objects with filtered fields\n */\nexport function removeFields<T extends object>(dataList: T[], includes?: string[], excludes?: string[]): Partial<T>[] {\n if (!includes && !excludes) return dataList;\n\n return dataList.map((item) => {\n // If includes are provided, only keep those fields\n if (includes && includes.length > 0) {\n const included: Partial<T> = {};\n for (const key of includes) {\n if (key in item) {\n included[key] = item[key];\n }\n }\n return included;\n }\n\n // If excludes are provided, remove those fields\n if (excludes && excludes.length > 0) {\n const cloned: Partial<T> = { ...item };\n for (const key of excludes) {\n delete cloned[key];\n }\n return cloned;\n }\n\n // If neither includes nor excludes: return the item as is\n return item;\n });\n}\n\n/**\n * @deprecated Use `setSystemData methode in crudService` instead.\n */\nexport const addDates = (entity: Partial<BaseEntity>): Partial<BaseEntity> => {\n if (!entity.createdAt) entity.createdAt = dayjs().toISOString();\n entity.updatedAt = dayjs().toISOString();\n return entity;\n};\n\n/**\n * @deprecated Use `setSystemData methode in crudService` instead.\n */\nexport const addDatesAndId = (entity: Partial<BaseEntity>): Partial<BaseEntity> => {\n if (!entity.id) entity.id = crypto.randomUUID();\n return addDates(entity);\n};\n\n/**\n * Recursively checks if an object contains any meaningful content.\n * - Returns false for null, undefined, empty objects, or empty arrays.\n * - Returns true for primitive values (string, number, boolean, etc.).\n * - Recursively checks arrays and nested objects to determine if at least one value is meaningful.\n *\n * This ensures that objects like { bool: {} } are considered empty,\n * and only objects with actual values (e.g., { bool: { must: [...] } }) are considered meaningful.\n */\nexport function hasContent(obj: any): boolean {\n if (obj == null) return false; // null/undefined\n if (typeof obj !== \"object\") return true; // primitive values are meaningful\n if (Array.isArray(obj)) return obj.some(hasContent);\n\n const values = Object.values(obj);\n if (values.length === 0) return false; // empty object\n\n // recursively check if any value is meaningful\n return values.some(hasContent);\n}\n\n/**\n * Recursively removes all \"empty\" fields from an object.\n *\n * Definition of empty:\n * - null or undefined\n * - empty objects {}\n * - empty arrays []\n *\n * Primitives (number, string, boolean) and non-empty objects/arrays are preserved.\n *\n * Usage:\n * ```ts\n * const input = { a: 1, b: null, c: {}, d: [], e: { f: null, g: { h: [] }, i: 2 }, j: [null, {}, 3] };\n * const cleaned = removeEmptyFields(input);\n * // cleaned => { a: 1, e: { i: 2 }, j: [3] }\n * ```\n *\n * This is especially useful when preparing Elasticsearch/OpenSearch queries:\n * - Removes empty objects like `{ bool: {} }`\n * - Removes empty arrays in filters\n * - Ensures the `body` only contains meaningful fields before sending\n */\nexport function removeEmptyFields(obj: any): any {\n if (obj == null) return undefined; // null or undefined -> remove\n if (typeof obj !== \"object\") return obj; // primitives remain\n\n if (Array.isArray(obj)) {\n const arr = obj\n .map(removeEmptyFields) // recursive\n .filter((v) => v !== undefined); // remove empty elements\n return arr.length > 0 ? arr : undefined;\n }\n\n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n const cleaned = removeEmptyFields(value);\n if (cleaned !== undefined) {\n result[key] = cleaned;\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nexport function computeChangedFields<T extends Record<string, any>>(\n oldItem: Partial<T>,\n newItem: Partial<T>,\n traceChange: TraceChange,\n): ChangedField[] {\n const diff = diffObjects(oldItem as Record<string, any>, newItem as Record<string, any>);\n const flattened = flattenDiff(diff);\n\n return traceChange.mode === InclusionMode.INCLUDE\n ? flattened.filter((f) => traceChange.fields.includes(f.fieldName))\n : flattened.filter((f) => !traceChange.fields.includes(f.fieldName));\n}\n\n/**\n * Flatten nested diff object into a ChangedField[] list\n * e.g. { address: { city: { old, new } } } => [{ fieldName: \"address.city\", oldValue, newValue }]\n */\nfunction flattenDiff(diff: Record<string, any>, prefix = \"\"): ChangedField[] {\n const changes: ChangedField[] = [];\n\n for (const [key, value] of Object.entries(diff)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (value && typeof value === \"object\" && \"old\" in value && \"new\" in value) {\n // direct primitive/string diff\n changes.push({\n fieldName: fullKey,\n oldValue: value.old,\n newValue: value.new,\n });\n } else if (typeof value === \"object\" && !Array.isArray(value)) {\n // nested object diff (recursive)\n changes.push(...flattenDiff(value, fullKey));\n } else {\n // fallback: primitive or unexpected shape\n changes.push({\n fieldName: fullKey,\n oldValue: value?.old ?? null,\n newValue: value?.new ?? null,\n });\n }\n }\n\n return changes;\n}\n\n/* helpers */\nfunction isObject(v: any): v is Record<string, any> {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\nfunction isPrimitive(v: any): boolean {\n return v === null || (typeof v !== \"object\" && typeof v !== \"function\");\n}\nfunction stableStringify(value: any): string {\n if (isPrimitive(value)) return JSON.stringify(value);\n if (Array.isArray(value)) return \"[\" + value.map((v) => stableStringify(v)).join(\",\") + \"]\";\n // object: sort keys\n const keys = Object.keys(value).sort();\n return \"{\" + keys.map((k) => JSON.stringify(k) + \":\" + stableStringify(value[k])).join(\",\") + \"}\";\n}\nfunction deepEqualIgnoreKeyOrder(a: any, b: any): boolean {\n return stableStringify(a) === stableStringify(b);\n}\n\n/**\n * Only iterate keys from newObj (so fields not provided in the update are ignored).\n * Skip keys where newVal === undefined (treat as \"not provided\" -> no change recorded).\n */\nfunction diffObjects(oldObj: Record<string, any>, newObj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n const skipKeys = new Set([\"history\", \"createdAt\", \"updatedAt\"]);\n\n for (const key of Object.keys(newObj)) {\n if (skipKeys.has(key)) continue;\n\n const newVal = newObj[key];\n\n // if caller didn't supply the key (explicitly undefined) -> skip\n if (newVal === undefined) continue;\n\n const oldVal = oldObj[key];\n\n // equal -> skip\n if (deepEqualIgnoreKeyOrder(oldVal, newVal)) continue;\n\n // both objects -> nested diff\n if (isObject(oldVal) && isObject(newVal)) {\n const nested = diffObjects(oldVal, newVal);\n if (Object.keys(nested).length > 0) result[key] = nested;\n continue;\n }\n\n // both arrays -> array diff\n if (Array.isArray(oldVal) && Array.isArray(newVal)) {\n const arrDiff = diffArrays(oldVal, newVal);\n if (arrDiff && Object.keys(arrDiff).length > 0) result[key] = arrDiff;\n continue;\n }\n\n // strings: summarize long text changes\n if (typeof oldVal === \"string\" && typeof newVal === \"string\") {\n const oldSnippet = oldVal.length > 200 ? extractChangedSnippet(oldVal, newVal) : oldVal;\n const newSnippet = newVal.length > 200 ? extractChangedSnippet(newVal, oldVal) : newVal;\n result[key] = { old: oldSnippet, new: newSnippet };\n continue;\n }\n\n // fallback: primitive change or type change\n result[key] = { old: oldVal, new: newVal };\n }\n\n return result;\n}\n\n/** array diff similar to earlier, but kept compact */\nfunction diffArrays(oldArr: any[], newArr: any[]): any {\n if (deepEqualIgnoreKeyOrder(oldArr, newArr)) return {};\n\n const allPrimitives = oldArr.every(isPrimitive) && newArr.every(isPrimitive);\n if (allPrimitives) {\n const removed = oldArr.filter((x) => !newArr.includes(x));\n const added = newArr.filter((x) => !oldArr.includes(x));\n const out: any = {};\n if (added.length) out.added = added;\n if (removed.length) out.removed = removed;\n return out;\n }\n\n // complex arrays: index-wise diff\n const maxLen = Math.max(oldArr.length, newArr.length);\n const idxDiffs: Record<string, any> = {};\n for (let i = 0; i < maxLen; i++) {\n const a = oldArr[i];\n const b = newArr[i];\n if (deepEqualIgnoreKeyOrder(a, b)) continue;\n\n if (isObject(a) && isObject(b)) {\n const nested = diffObjects(a, b);\n if (Object.keys(nested).length > 0) idxDiffs[i] = nested;\n continue;\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n const nestedArr = diffArrays(a, b);\n if (Object.keys(nestedArr || {}).length > 0) idxDiffs[i] = nestedArr;\n continue;\n }\n\n idxDiffs[i] = { old: a, new: b };\n }\n\n if (Object.keys(idxDiffs).length === 0) {\n return { oldLength: oldArr.length, newLength: newArr.length };\n }\n return idxDiffs;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aws-service-stack",
3
- "version": "0.18.295",
3
+ "version": "0.18.296",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "author": "chinggis.systems",