refactor(sim): consolidate record guards + pure utils into @sim/utils (#5061)

* feat(utils): add record guards and pure helpers to @sim/utils

Add isRecordLike (loose, non-prototype-checked record guard) and
sortObjectKeysDeep; relocate isPlainRecord (strict) and normalizeEmail
into @sim/utils so they are reusable across apps and packages. Unit tests
cover the loose-vs-strict distinction, deep key sorting, and email
normalization.

* refactor(sim): consolidate record guards and normalize helpers onto @sim/utils

Replace ~55 re-implemented loose record guards with the canonical
@sim/utils isRecordLike (and one strict site with isPlainRecord), and
dedupe three normalize clusters: sortObjectKeysDeep (sanitization +
copilot builders), normalizeToken (salesforce + servicenow triggers),
and normalizeEmail. Array-allowing guards and domain-specific normalizers
are intentionally left untouched. Pure refactor — identical predicates
and transforms, no behavior change.
This commit is contained in:
Waleed
2026-06-15 12:32:19 -07:00
committed by GitHub
parent cefb2dc239
commit 0673e3c0f7
73 changed files with 491 additions and 529 deletions
+11 -1
View File
@@ -2,7 +2,7 @@
* @vitest-environment node
*/
import { describe, expect, it } from 'vitest'
import { isVersionedType, stripVersionSuffix, truncate } from './string.js'
import { isVersionedType, normalizeEmail, stripVersionSuffix, truncate } from './string.js'
describe('truncate', () => {
it('appends the suffix when the string exceeds the slice length', () => {
@@ -55,3 +55,13 @@ describe('isVersionedType', () => {
expect(isVersionedType('x')).toBe(false)
})
})
describe('normalizeEmail', () => {
it('trims surrounding whitespace and lowercases', () => {
expect(normalizeEmail(' USER@Example.COM ')).toBe('user@example.com')
})
it('leaves an already-normalized email unchanged', () => {
expect(normalizeEmail('user@example.com')).toBe('user@example.com')
})
})