@nordcraft/core 2.0.6 → 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/api/LegacyToddleApi.d.ts +1 -0
  2. package/dist/api/LegacyToddleApi.js +3 -0
  3. package/dist/api/LegacyToddleApi.js.map +1 -1
  4. package/dist/api/ToddleApiV2.d.ts +2 -1
  5. package/dist/api/ToddleApiV2.js +3 -0
  6. package/dist/api/ToddleApiV2.js.map +1 -1
  7. package/dist/api/api.d.ts +2 -4
  8. package/dist/api/api.js +1 -42
  9. package/dist/api/api.js.map +1 -1
  10. package/dist/api/apiTypes.d.ts +2 -0
  11. package/dist/api/apiTypes.js.map +1 -1
  12. package/dist/component/ToddleComponent.d.ts +1 -3
  13. package/dist/component/ToddleComponent.js +22 -24
  14. package/dist/component/ToddleComponent.js.map +1 -1
  15. package/dist/component/component.types.d.ts +3 -1
  16. package/dist/component/component.types.js.map +1 -1
  17. package/dist/component/schemas/api-schema.js +5 -0
  18. package/dist/component/schemas/api-schema.js.map +1 -1
  19. package/dist/styling/className.d.ts +4 -1
  20. package/dist/styling/className.js +4 -1
  21. package/dist/styling/className.js.map +1 -1
  22. package/dist/styling/style.css.js +4 -1
  23. package/dist/styling/style.css.js.map +1 -1
  24. package/package.json +1 -1
  25. package/src/api/LegacyToddleApi.ts +3 -0
  26. package/src/api/ToddleApiV2.ts +5 -1
  27. package/src/api/api.test.ts +47 -0
  28. package/src/api/api.ts +3 -63
  29. package/src/api/apiTypes.ts +2 -0
  30. package/src/component/ToddleComponent.subComponents.test.ts +219 -0
  31. package/src/component/ToddleComponent.ts +25 -59
  32. package/src/component/component.types.ts +6 -1
  33. package/src/component/schemas/api-schema.ts +5 -0
  34. package/src/styling/className.test.ts +16 -1
  35. package/src/styling/className.ts +15 -2
  36. package/src/styling/style.css.ts +6 -4
  37. package/src/component/ToddleComponent.actionReferences.test.ts +0 -112
@@ -1 +1 @@
1
- {"version":3,"file":"style.css.js","sourceRoot":"","sources":["../../src/styling/style.css.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"style.css.js","sourceRoot":"","sources":["../../src/styling/style.css.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -19,5 +19,5 @@
19
19
  "zod": "4.2.1"
20
20
  },
21
21
  "main": "dist/index.js",
22
- "version": "2.0.6"
22
+ "version": "2.0.8"
23
23
  }
@@ -135,6 +135,9 @@ export class LegacyToddleApi<Handler> {
135
135
  get onFailed() {
136
136
  return this.api.onFailed
137
137
  }
138
+ get dependsOn() {
139
+ return this.api.dependsOn
140
+ }
138
141
  *formulasInApi(): Generator<{
139
142
  path: (string | number)[]
140
143
  formula: Formula
@@ -27,7 +27,7 @@ export class ToddleApiV2<Handler> implements ApiRequest {
27
27
  this.globalFormulas = globalFormulas
28
28
  }
29
29
 
30
- get apiReferences(): Set<string> {
30
+ private get apiReferences(): Set<string> {
31
31
  if (this._apiReferences) {
32
32
  // Only compute apiReferences once
33
33
  return this._apiReferences
@@ -174,6 +174,10 @@ export class ToddleApiV2<Handler> implements ApiRequest {
174
174
  return this.api['@nordcraft/metadata']
175
175
  }
176
176
 
177
+ get dependsOn() {
178
+ return Array.from(this.apiReferences)
179
+ }
180
+
177
181
  *formulasInApi(): Generator<{
178
182
  path: (string | number)[]
179
183
  formula: Formula
@@ -7,10 +7,13 @@ import {
7
7
  getRequestPath,
8
8
  getRequestQueryParams,
9
9
  getUrl,
10
+ isLegacyApi,
10
11
  toFormData,
11
12
  } from './api'
12
13
  import type { ApiRequest } from './apiTypes'
13
14
  import { ApiMethod } from './apiTypes'
15
+ import { LegacyToddleApi } from './LegacyToddleApi'
16
+ import { ToddleApiV2 } from './ToddleApiV2'
14
17
 
15
18
  describe('getApiPath()', () => {
16
19
  test('it returns a valid url path string', () => {
@@ -486,3 +489,47 @@ describe('toFormData()', () => {
486
489
  expect(formData.get('valid')).toBe('working')
487
490
  })
488
491
  })
492
+ describe('isLegacyApi()', () => {
493
+ test('it checks if an API is legacy', () => {
494
+ expect(
495
+ isLegacyApi({
496
+ name: 'Legacy API',
497
+ type: 'REST',
498
+ }),
499
+ ).toBe(true)
500
+ expect(
501
+ isLegacyApi({
502
+ name: 'New API',
503
+ type: 'http',
504
+ version: 2,
505
+ inputs: {},
506
+ }),
507
+ ).toBe(false)
508
+ expect(
509
+ isLegacyApi(
510
+ new LegacyToddleApi(
511
+ {
512
+ name: 'Legacy API',
513
+ type: 'REST',
514
+ },
515
+ 'myLegacyApi',
516
+ {},
517
+ ),
518
+ ),
519
+ ).toBe(true)
520
+ expect(
521
+ isLegacyApi(
522
+ new ToddleApiV2(
523
+ {
524
+ name: 'New API',
525
+ type: 'http',
526
+ version: 2,
527
+ inputs: {},
528
+ },
529
+ 'myNewApi',
530
+ {},
531
+ ),
532
+ ),
533
+ ).toBe(false)
534
+ })
535
+ })
package/src/api/api.ts CHANGED
@@ -14,15 +14,14 @@ import type {
14
14
  } from './apiTypes'
15
15
  import { ApiMethod } from './apiTypes'
16
16
  import { isJsonHeader } from './headers'
17
- import { LegacyToddleApi } from './LegacyToddleApi'
18
- import { ToddleApiV2 } from './ToddleApiV2'
17
+ import type { LegacyToddleApi } from './LegacyToddleApi'
18
+ import type { ToddleApiV2 } from './ToddleApiV2'
19
19
 
20
20
  export const NON_BODY_RESPONSE_CODES = [101, 204, 205, 304]
21
21
 
22
22
  export const isLegacyApi = <Handler>(
23
23
  api: ComponentAPI | LegacyToddleApi<Handler> | ToddleApiV2<Handler>,
24
- ): api is LegacyComponentAPI | LegacyToddleApi<Handler> =>
25
- api instanceof LegacyToddleApi ? true : !('version' in api)
24
+ ): api is LegacyComponentAPI | LegacyToddleApi<Handler> => !('version' in api)
26
25
 
27
26
  export const createApiRequest = <Handler>({
28
27
  api,
@@ -420,62 +419,3 @@ export const createApiEvent = (
420
419
  detail,
421
420
  })
422
421
  }
423
-
424
- const compareApiDependencies = <Handler>(
425
- a: LegacyToddleApi<Handler> | ToddleApiV2<Handler>,
426
- b: LegacyToddleApi<Handler> | ToddleApiV2<Handler>,
427
- ) => {
428
- const isADependentOnB = a.apiReferences.has(b.name)
429
- const isBDependentOnA = b.apiReferences.has(a.name)
430
- if (isADependentOnB === isBDependentOnA) {
431
- return 0
432
- }
433
- // 1 means A goes last - hence B is evaluated before A
434
- return isADependentOnB ? 1 : -1
435
- }
436
-
437
- export const sortApiObjects = <Handler>(
438
- apis: Array<[string, ComponentAPI]>,
439
- ) => {
440
- const apiMap = new Map<
441
- string,
442
- LegacyToddleApi<Handler> | ToddleApiV2<Handler>
443
- >()
444
- const getApi = (apiObj: ComponentAPI, key: string) => {
445
- let api = apiMap.get(key)
446
- if (!api) {
447
- api =
448
- apiObj.version === 2
449
- ? new ToddleApiV2<Handler>(
450
- apiObj,
451
- key,
452
- // global formulas are not required for sorting
453
- {
454
- formulas: {},
455
- packages: {},
456
- },
457
- )
458
- : new LegacyToddleApi<Handler>(
459
- apiObj,
460
- key,
461
- // global formulas are not required for sorting
462
- {
463
- formulas: {},
464
- packages: {},
465
- },
466
- )
467
- apiMap.set(key, api)
468
- }
469
- return api
470
- }
471
-
472
- return [...apis].sort(([aKey, aObj], [bKey, bObj]) => {
473
- const a = getApi(aObj, aKey)
474
- const b = getApi(bObj, bKey)
475
- return compareApiDependencies(a, b)
476
- })
477
- }
478
-
479
- export const sortApiEntries = <Handler>(
480
- apis: Array<[string, LegacyToddleApi<Handler> | ToddleApiV2<Handler>]>,
481
- ) => [...apis].sort(([_, a], [__, b]) => compareApiDependencies(a, b))
@@ -23,6 +23,7 @@ export interface LegacyComponentAPI {
23
23
  onCompleted?: Nullable<EventModel>
24
24
  onFailed?: Nullable<EventModel>
25
25
  version?: never
26
+ dependsOn?: string[]
26
27
  }
27
28
 
28
29
  export interface LegacyApiStatus {
@@ -137,6 +138,7 @@ export interface ApiRequest extends ApiBase {
137
138
  isError?: Nullable<{ formula: Formula }>
138
139
  // Formula for determining when the request should time out
139
140
  timeout?: Nullable<{ formula: Formula }>
141
+ dependsOn?: string[]
140
142
  }
141
143
 
142
144
  export interface ApiStatus {
@@ -0,0 +1,219 @@
1
+ import { describe, expect, test } from 'bun:test'
2
+ import { ToddleComponent } from './ToddleComponent'
3
+ import type { Component } from './component.types'
4
+
5
+ describe('ToddleComponent.uniqueSubComponents', () => {
6
+ test('it should pass down the package name to sub-components', () => {
7
+ const packagedComp: Component = {
8
+ name: 'PackagedComp',
9
+ nodes: {
10
+ node1: {
11
+ type: 'component',
12
+ name: 'InternalComp',
13
+ },
14
+ },
15
+ apis: {},
16
+ attributes: {},
17
+ variables: {},
18
+ workflows: {},
19
+ }
20
+
21
+ const internalComp: Component = {
22
+ name: 'InternalComp',
23
+ nodes: {},
24
+ apis: {},
25
+ attributes: {},
26
+ variables: {},
27
+ workflows: {},
28
+ }
29
+
30
+ const root: Component = {
31
+ name: 'root',
32
+ nodes: {
33
+ node1: {
34
+ type: 'component',
35
+ name: 'PackagedComp',
36
+ package: 'my-package',
37
+ },
38
+ },
39
+ apis: {},
40
+ attributes: {},
41
+ variables: {},
42
+ workflows: {},
43
+ }
44
+
45
+ const componentsMap: Record<string, Component> = {
46
+ 'my-package/PackagedComp': packagedComp,
47
+ 'my-package/InternalComp': internalComp,
48
+ }
49
+
50
+ const getComponent = (name: string, packageName?: string) => {
51
+ const key = packageName ? `${packageName}/${name}` : name
52
+ return componentsMap[key]
53
+ }
54
+
55
+ const demo = new ToddleComponent({
56
+ component: root,
57
+ getComponent,
58
+ packageName: undefined,
59
+ globalFormulas: { formulas: {}, packages: {} },
60
+ })
61
+
62
+ const subComponents = demo.uniqueSubComponents
63
+ expect(subComponents).toHaveLength(2)
64
+ expect(subComponents[0].name).toBe('PackagedComp')
65
+ expect(subComponents[0].packageName).toBe('my-package')
66
+ expect(subComponents[1].name).toBe('InternalComp')
67
+ expect(subComponents[1].packageName).toBe('my-package')
68
+ })
69
+
70
+ test('it should handle nested components and avoid duplicates', () => {
71
+ const compA: Component = {
72
+ name: 'CompA',
73
+ nodes: {
74
+ node1: {
75
+ type: 'component',
76
+ name: 'CompB',
77
+ },
78
+ },
79
+ apis: {},
80
+ attributes: {},
81
+ variables: {},
82
+ workflows: {},
83
+ }
84
+
85
+ const compB: Component = {
86
+ name: 'CompB',
87
+ nodes: {},
88
+ apis: {},
89
+ attributes: {},
90
+ variables: {},
91
+ workflows: {},
92
+ }
93
+
94
+ const root: Component = {
95
+ name: 'root',
96
+ nodes: {
97
+ node1: {
98
+ type: 'component',
99
+ name: 'CompA',
100
+ },
101
+ node2: {
102
+ type: 'component',
103
+ name: 'CompB',
104
+ },
105
+ },
106
+ apis: {},
107
+ attributes: {},
108
+ variables: {},
109
+ workflows: {},
110
+ }
111
+
112
+ const componentsMap: Record<string, Component> = {
113
+ CompA: compA,
114
+ CompB: compB,
115
+ }
116
+
117
+ const getComponent = (name: string, packageName?: string) => {
118
+ const key = packageName ? `${packageName}/${name}` : name
119
+ return componentsMap[key]
120
+ }
121
+
122
+ const demo = new ToddleComponent({
123
+ component: root,
124
+ getComponent,
125
+ packageName: undefined,
126
+ globalFormulas: { formulas: {}, packages: {} },
127
+ })
128
+
129
+ const subComponents = demo.uniqueSubComponents
130
+ expect(subComponents).toHaveLength(2)
131
+ const names = subComponents.map((c) => c.name).sort()
132
+ expect(names).toEqual(['CompA', 'CompB'])
133
+ })
134
+
135
+ test('it should allow sub-components to override the package name', () => {
136
+ const pkgAComp: Component = {
137
+ name: 'PkgAComp',
138
+ nodes: {
139
+ node1: {
140
+ type: 'component',
141
+ name: 'PkgBComp',
142
+ package: 'package-b',
143
+ },
144
+ },
145
+ apis: {},
146
+ attributes: {},
147
+ variables: {},
148
+ workflows: {},
149
+ }
150
+
151
+ const pkgBComp: Component = {
152
+ name: 'PkgBComp',
153
+ nodes: {
154
+ node1: {
155
+ type: 'component',
156
+ name: 'InternalComp',
157
+ },
158
+ },
159
+ apis: {},
160
+ attributes: {},
161
+ variables: {},
162
+ workflows: {},
163
+ }
164
+
165
+ const internalComp: Component = {
166
+ name: 'InternalComp',
167
+ nodes: {},
168
+ apis: {},
169
+ attributes: {},
170
+ variables: {},
171
+ workflows: {},
172
+ }
173
+
174
+ const root: Component = {
175
+ name: 'root',
176
+ nodes: {
177
+ node1: {
178
+ type: 'component',
179
+ name: 'PkgAComp',
180
+ package: 'package-a',
181
+ },
182
+ },
183
+ apis: {},
184
+ attributes: {},
185
+ variables: {},
186
+ workflows: {},
187
+ }
188
+
189
+ const componentsMap: Record<string, Component> = {
190
+ 'package-a/PkgAComp': pkgAComp,
191
+ 'package-b/PkgBComp': pkgBComp,
192
+ 'package-b/InternalComp': internalComp,
193
+ }
194
+
195
+ const getComponent = (name: string, packageName?: string) => {
196
+ const key = packageName ? `${packageName}/${name}` : name
197
+ return componentsMap[key]
198
+ }
199
+
200
+ const demo = new ToddleComponent({
201
+ component: root,
202
+ getComponent,
203
+ packageName: undefined,
204
+ globalFormulas: { formulas: {}, packages: {} },
205
+ })
206
+
207
+ const subComponents = demo.uniqueSubComponents
208
+ expect(subComponents).toHaveLength(3)
209
+
210
+ const pA = subComponents.find((c) => c.name === 'PkgAComp')
211
+ expect(pA?.packageName).toBe('package-a')
212
+
213
+ const pB = subComponents.find((c) => c.name === 'PkgBComp')
214
+ expect(pB?.packageName).toBe('package-b')
215
+
216
+ const internal = subComponents.find((c) => c.name === 'InternalComp')
217
+ expect(internal?.packageName).toBe('package-b')
218
+ })
219
+ })
@@ -2,7 +2,7 @@ import { isLegacyApi } from '../api/api'
2
2
  import type { ComponentAPI } from '../api/apiTypes'
3
3
  import { LegacyToddleApi } from '../api/LegacyToddleApi'
4
4
  import { ToddleApiV2 } from '../api/ToddleApiV2'
5
- import type { Formula, FunctionOperation } from '../formula/formula'
5
+ import type { Formula } from '../formula/formula'
6
6
  import type { GlobalFormulas } from '../formula/formulaTypes'
7
7
  import {
8
8
  getFormulasInAction,
@@ -10,12 +10,7 @@ import {
10
10
  } from '../formula/formulaUtils'
11
11
  import { isDefined } from '../utils/util'
12
12
  import { getActionsInAction } from './actionUtils'
13
- import type {
14
- ActionModel,
15
- Component,
16
- CustomActionModel,
17
- NodeModel,
18
- } from './component.types'
13
+ import type { ActionModel, Component, NodeModel } from './component.types'
19
14
  import { isPageComponent } from './isPageComponent'
20
15
 
21
16
  export class ToddleComponent<Handler> {
@@ -54,10 +49,8 @@ export class ToddleComponent<Handler> {
54
49
  if (components.has(node.name)) {
55
50
  return
56
51
  }
57
- const component = this.getComponent(
58
- node.name,
59
- node.package ?? packageName,
60
- )
52
+ const componentPackageName = node.package ?? packageName
53
+ const component = this.getComponent(node.name, componentPackageName)
61
54
  if (!component) {
62
55
  return
63
56
  }
@@ -66,59 +59,28 @@ export class ToddleComponent<Handler> {
66
59
  new ToddleComponent({
67
60
  component,
68
61
  getComponent: this.getComponent,
69
- packageName: node.package ?? packageName,
62
+ packageName: componentPackageName,
70
63
  globalFormulas: this.globalFormulas,
71
64
  }),
72
65
  )
73
- Object.values(component.nodes ?? {}).forEach(
74
- visitNode(node.package ?? packageName),
75
- )
66
+ Object.values(component.nodes ?? {}).forEach((node) => {
67
+ if (isDefined(node)) {
68
+ const nodePackageName =
69
+ (node.type === 'component' ? node.package : undefined) ??
70
+ componentPackageName ??
71
+ packageName
72
+ visitNode(nodePackageName)(node)
73
+ }
74
+ })
76
75
  }
77
- Object.values(this.nodes ?? {}).forEach(visitNode())
76
+ Object.values(this.nodes ?? {}).forEach((node) => {
77
+ if (isDefined(node)) {
78
+ visitNode()(node)
79
+ }
80
+ })
78
81
  return [...components.values()]
79
82
  }
80
83
 
81
- get formulaReferences() {
82
- return new Set(
83
- Array.from(this.formulasInComponent())
84
- .filter(
85
- (
86
- entry,
87
- ): entry is {
88
- path: (string | number)[]
89
- formula: FunctionOperation
90
- packageName?: string
91
- } => entry.formula.type === 'function',
92
- )
93
- .flatMap((entry) => {
94
- const refs = [entry.formula.name]
95
- const packageName =
96
- entry.formula.package ?? entry.packageName ?? this.packageName
97
- if (
98
- packageName &&
99
- this.globalFormulas.packages?.[packageName]?.formulas?.[
100
- entry.formula.name
101
- ]
102
- ) {
103
- refs.push([packageName, entry.formula.name].join('/'))
104
- }
105
-
106
- return refs
107
- }),
108
- )
109
- }
110
-
111
- get actionReferences(): Set<string> {
112
- return new Set(
113
- Array.from(this.actionModelsInComponent())
114
- .filter(
115
- (entry): entry is [(string | number)[], CustomActionModel] =>
116
- entry[1].type === 'Custom' || entry[1].type === undefined,
117
- )
118
- .map(([, a]) => [a.package, a.name].filter(isDefined).join('/')),
119
- )
120
- }
121
-
122
84
  /**
123
85
  * Traverse all formulas in the component.
124
86
  * @returns An iterable that yields the path and formula.
@@ -455,7 +417,9 @@ export class ToddleComponent<Handler> {
455
417
  })
456
418
  }
457
419
  for (const [nodeKey, node] of Object.entries(this.nodes ?? {})) {
458
- yield* visitNode(node, ['nodes', nodeKey])
420
+ if (isDefined(node)) {
421
+ yield* visitNode(node, ['nodes', nodeKey])
422
+ }
459
423
  }
460
424
  }
461
425
 
@@ -542,7 +506,9 @@ export class ToddleComponent<Handler> {
542
506
  ])
543
507
  }
544
508
  for (const [nodeKey, node] of Object.entries(this.nodes ?? {})) {
545
- yield* visitNode(node, ['nodes', nodeKey])
509
+ if (isDefined(node)) {
510
+ yield* visitNode(node, ['nodes', nodeKey])
511
+ }
546
512
  }
547
513
  }
548
514
 
@@ -196,7 +196,7 @@ export interface Component {
196
196
  >
197
197
  workflows?: Nullable<Record<string, Nullable<ComponentWorkflow>>>
198
198
  apis?: Nullable<Record<string, Nullable<ComponentAPI>>>
199
- nodes?: Nullable<Record<string, NodeModel>>
199
+ nodes?: Nullable<Partial<Record<string, NodeModel | null>>>
200
200
  events?: Nullable<Nullable<ComponentEvent>[]>
201
201
  onLoad?: Nullable<EventModel>
202
202
  onAttributeChange?: Nullable<EventModel>
@@ -206,6 +206,8 @@ export interface Component {
206
206
  // Later, we will add information about allowed origins here
207
207
  enabled?: Nullable<Formula>
208
208
  }>
209
+ // Used to indicate if a page or any of its child components use custom actions/formulas
210
+ customCode?: Nullable<boolean>
209
211
  }
210
212
 
211
213
  export interface ComponentFormula extends NordcraftMetadata {
@@ -418,6 +420,9 @@ export interface ComponentEvent extends NordcraftMetadata {
418
420
 
419
421
  export interface ComponentVariable extends NordcraftMetadata {
420
422
  initialValue: Formula
423
+ // @deprecated - variables should be referenced by their key in component.variables
424
+ // name is only here to better reflect how variables are stored in legacy components
425
+ name?: never
421
426
  }
422
427
 
423
428
  export interface ComponentAttribute extends NordcraftMetadata {
@@ -210,6 +210,10 @@ const ApiRequestSchema: z.ZodType<ApiRequest> = z
210
210
  .describe(
211
211
  'Rules for redirecting based on response data. The key is a unique identifier for the rule.',
212
212
  ),
213
+ dependsOn: z
214
+ .array(z.string())
215
+ .optional()
216
+ .describe('List of APIs that this API depends on.'),
213
217
  })
214
218
  .describe('Schema defining an API request from a component or a page.')
215
219
 
@@ -244,6 +248,7 @@ const LegacyComponentAPISchema: z.ZodType<LegacyComponentAPI> = z
244
248
  type: z.enum(['Bearer id_token', 'Bearer access_token']),
245
249
  })
246
250
  .nullish(),
251
+ dependsOn: z.array(z.string()).optional(),
247
252
  })
248
253
  .describe(
249
254
  'Legacy API schema for backward compatibility. Never use this for new APIs.',
@@ -1,4 +1,5 @@
1
- import { toValidClassName } from './className'
1
+ import { describe, expect, test } from 'bun:test'
2
+ import { getClassName, toValidClassName } from './className'
2
3
 
3
4
  describe('toValidClassName()', () => {
4
5
  test('it trims leading and trailing whitespace and replace the remaining whitespace with hyphens', () => {
@@ -17,3 +18,17 @@ describe('toValidClassName()', () => {
17
18
  expect(toValidClassName('1class')).toBe('_1class')
18
19
  })
19
20
  })
21
+
22
+ describe('getClassName()', () => {
23
+ test('it produces the same classname whether a nullish entry is provided or not', () => {
24
+ expect(getClassName([null, undefined, { color: 'red' }])).toBe(
25
+ getClassName([{ color: 'red' }]),
26
+ )
27
+ })
28
+
29
+ test('it produces the same classname whether an empty object is provided or not', () => {
30
+ expect(getClassName([{}, { color: 'red' }])).toBe(
31
+ getClassName([{ color: 'red' }]),
32
+ )
33
+ })
34
+ })
@@ -1,9 +1,22 @@
1
+ import type { NodeStyleModel } from '../component/component.types'
2
+ import type { Nullable } from '../types'
1
3
  import { generateAlphabeticName, hash } from './hash'
4
+ import type { StyleVariant } from './variantSelector'
2
5
 
3
6
  // Classnames are reused a lot, and JS hashing is expensive, so there is benefit in caching them in a native hashmap.
4
7
  const CLASSNAME_LOOKUP = new Map<string, string>()
5
- export const getClassName = (object: any) => {
6
- const stringified = JSON.stringify(object)
8
+ export const getClassName = (
9
+ object: [Nullable<NodeStyleModel>, Nullable<StyleVariant[]>],
10
+ ) => {
11
+ const stringified = JSON.stringify(
12
+ object.filter(
13
+ (item) =>
14
+ item !== null && // Skip nullish values
15
+ item !== undefined &&
16
+ (Array.isArray(item) ? item.length > 0 : true) && // Skip empty arrays/objects
17
+ (typeof item === 'object' ? Object.keys(item).length > 0 : true),
18
+ ),
19
+ )
7
20
  if (CLASSNAME_LOOKUP.has(stringified)) {
8
21
  return CLASSNAME_LOOKUP.get(stringified)!
9
22
  }