@elevasis/core 0.23.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +4343 -2690
- package/dist/index.js +1101 -156
- package/dist/knowledge/index.d.ts +574 -210
- package/dist/knowledge/index.js +104 -1
- package/dist/organization-model/index.d.ts +4343 -2690
- package/dist/organization-model/index.js +1101 -156
- package/dist/test-utils/index.d.ts +483 -109
- package/dist/test-utils/index.js +904 -144
- package/package.json +3 -3
- package/src/README.md +14 -14
- package/src/__tests__/publish.test.ts +24 -24
- package/src/__tests__/template-core-compatibility.test.ts +9 -12
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2137 -2093
- package/src/_gen/__tests__/scaffold-contracts.test.ts +30 -30
- package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +217 -217
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +69 -69
- package/src/auth/multi-tenancy/credentials/server/kek-loader.ts +37 -37
- package/src/auth/multi-tenancy/index.ts +26 -26
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +104 -104
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +143 -143
- package/src/auth/multi-tenancy/memberships/index.ts +26 -26
- package/src/auth/multi-tenancy/memberships/membership.ts +130 -130
- package/src/auth/multi-tenancy/organizations/__tests__/api-schemas.test.ts +194 -194
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +136 -136
- package/src/auth/multi-tenancy/permissions.test.ts +42 -42
- package/src/auth/multi-tenancy/permissions.ts +123 -123
- package/src/auth/multi-tenancy/role-management/api-schemas.ts +78 -78
- package/src/auth/multi-tenancy/role-management/index.ts +16 -16
- package/src/auth/multi-tenancy/theme-presets.ts +45 -45
- package/src/auth/multi-tenancy/types.ts +57 -57
- package/src/auth/multi-tenancy/users/api-schemas.ts +165 -165
- package/src/business/README.md +2 -2
- package/src/business/acquisition/activity-events.test.ts +250 -250
- package/src/business/acquisition/activity-events.ts +93 -93
- package/src/business/acquisition/api-schemas.test.ts +1883 -1843
- package/src/business/acquisition/api-schemas.ts +1492 -1497
- package/src/business/acquisition/build-templates.test.ts +240 -240
- package/src/business/acquisition/build-templates.ts +98 -98
- package/src/business/acquisition/crm-next-action.test.ts +262 -262
- package/src/business/acquisition/crm-next-action.ts +220 -220
- package/src/business/acquisition/crm-priority.test.ts +216 -216
- package/src/business/acquisition/crm-priority.ts +349 -349
- package/src/business/acquisition/crm-state-actions.test.ts +153 -153
- package/src/business/acquisition/deal-ownership.test.ts +351 -351
- package/src/business/acquisition/deal-ownership.ts +120 -120
- package/src/business/acquisition/derive-actions.test.ts +129 -104
- package/src/business/acquisition/derive-actions.ts +74 -84
- package/src/business/acquisition/index.ts +171 -170
- package/src/business/acquisition/ontology-validation.ts +309 -0
- package/src/business/acquisition/stateful.ts +30 -30
- package/src/business/acquisition/types.ts +396 -396
- package/src/business/clients/api-schemas.test.ts +115 -115
- package/src/business/clients/api-schemas.ts +158 -158
- package/src/business/clients/index.ts +1 -1
- package/src/business/crm/api-schemas.ts +40 -40
- package/src/business/crm/index.ts +1 -1
- package/src/business/deals/api-schemas.ts +87 -87
- package/src/business/deals/index.ts +1 -1
- package/src/business/index.ts +5 -5
- package/src/business/projects/types.ts +144 -144
- package/src/commands/queue/types/task.ts +15 -15
- package/src/execution/core/runner-types.ts +61 -61
- package/src/execution/core/sse-executions.ts +7 -7
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +10 -10
- package/src/execution/engine/agent/core/__tests__/agent.test.ts +16 -16
- package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +4 -4
- package/src/execution/engine/agent/core/types.ts +25 -25
- package/src/execution/engine/agent/index.ts +6 -6
- package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +24 -24
- package/src/execution/engine/index.ts +443 -443
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +298 -298
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.test.ts +55 -55
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +107 -107
- package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.test.ts +48 -48
- package/src/execution/engine/tools/integration/server/adapters/apollo/apollo-adapter.ts +99 -99
- package/src/execution/engine/tools/integration/server/adapters/apollo/index.ts +1 -1
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +363 -363
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +162 -162
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +316 -316
- package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.test.ts +18 -18
- package/src/execution/engine/tools/integration/server/adapters/clickup/clickup-adapter.ts +194 -194
- package/src/execution/engine/tools/integration/server/adapters/clickup/index.ts +7 -7
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +204 -204
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +105 -105
- package/src/execution/engine/tools/integration/server/adapters/google-calendar/google-calendar-adapter.ts +428 -428
- package/src/execution/engine/tools/integration/server/adapters/google-calendar/index.ts +2 -2
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1474 -1474
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +103 -103
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.test.ts +88 -88
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +141 -141
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +76 -76
- package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +182 -182
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +310 -310
- package/src/execution/engine/tools/integration/service.test.ts +239 -239
- package/src/execution/engine/tools/integration/service.ts +172 -172
- package/src/execution/engine/tools/integration/tool.ts +255 -255
- package/src/execution/engine/tools/lead-service-types.ts +1005 -1005
- package/src/execution/engine/tools/messages.ts +43 -43
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +7 -7
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +6 -6
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +6 -6
- package/src/execution/engine/tools/platform/acquisition/types.ts +280 -280
- package/src/execution/engine/tools/platform/email/types.ts +97 -97
- package/src/execution/engine/tools/registry.ts +704 -704
- package/src/execution/engine/tools/tool-maps.ts +831 -831
- package/src/execution/engine/tools/types.ts +234 -234
- package/src/execution/engine/workflow/types.ts +195 -197
- package/src/execution/external/__tests__/api-schemas.test.ts +127 -127
- package/src/execution/external/api-schemas.ts +40 -40
- package/src/execution/external/index.ts +1 -1
- package/src/index.ts +18 -18
- package/src/integrations/credentials/__tests__/api-schemas.test.ts +420 -420
- package/src/integrations/credentials/api-schemas.ts +146 -146
- package/src/integrations/credentials/schemas.ts +200 -200
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +7 -7
- package/src/integrations/oauth/provider-registry.ts +74 -74
- package/src/integrations/oauth/server/credentials.ts +43 -43
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +327 -327
- package/src/integrations/webhook-endpoints/api-schemas.ts +103 -103
- package/src/integrations/webhook-endpoints/types.ts +58 -58
- package/src/knowledge/README.md +32 -32
- package/src/knowledge/__tests__/queries.test.ts +626 -535
- package/src/knowledge/format.ts +99 -99
- package/src/knowledge/index.ts +5 -5
- package/src/knowledge/published.ts +5 -5
- package/src/knowledge/queries.ts +269 -218
- package/src/operations/activities/api-schemas.ts +80 -80
- package/src/operations/activities/types.ts +64 -64
- package/src/organization-model/README.md +149 -149
- package/src/organization-model/__tests__/content-kinds-registry.test.ts +210 -210
- package/src/organization-model/__tests__/defaults.test.ts +168 -168
- package/src/organization-model/__tests__/domains/actions.test.ts +78 -56
- package/src/organization-model/__tests__/domains/customers.test.ts +299 -299
- package/src/organization-model/__tests__/domains/entities.test.ts +56 -56
- package/src/organization-model/__tests__/domains/goals.test.ts +493 -493
- package/src/organization-model/__tests__/domains/identity.test.ts +280 -280
- package/src/organization-model/__tests__/domains/navigation.test.ts +268 -268
- package/src/organization-model/__tests__/domains/offerings.test.ts +414 -414
- package/src/organization-model/__tests__/domains/policies.test.ts +323 -323
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +293 -293
- package/src/organization-model/__tests__/domains/resources.test.ts +387 -277
- package/src/organization-model/__tests__/domains/roles.test.ts +463 -463
- package/src/organization-model/__tests__/domains/statuses.test.ts +246 -246
- package/src/organization-model/__tests__/domains/systems.test.ts +209 -209
- package/src/organization-model/__tests__/domains/topology.test.ts +188 -0
- package/src/organization-model/__tests__/flatten-additive-merge.test.ts +362 -361
- package/src/organization-model/__tests__/foundation.test.ts +77 -77
- package/src/organization-model/__tests__/get-resources-for-system.test.ts +144 -144
- package/src/organization-model/__tests__/graph.test.ts +1312 -862
- package/src/organization-model/__tests__/icons.test.ts +10 -1
- package/src/organization-model/__tests__/knowledge.test.ts +251 -15
- package/src/organization-model/__tests__/lookup-helpers.test.ts +438 -438
- package/src/organization-model/__tests__/migration-helpers.test.ts +591 -591
- package/src/organization-model/__tests__/prospecting-ssot.test.ts +103 -103
- package/src/organization-model/__tests__/recursive-system-schema.test.ts +535 -506
- package/src/organization-model/__tests__/resolve.test.ts +274 -164
- package/src/organization-model/__tests__/schema.test.ts +844 -301
- package/src/organization-model/__tests__/surface-projection.test.ts +284 -284
- package/src/organization-model/catalogs/lead-gen.ts +144 -144
- package/src/organization-model/content-kinds/config.ts +36 -36
- package/src/organization-model/content-kinds/index.ts +76 -72
- package/src/organization-model/content-kinds/pipeline.ts +68 -68
- package/src/organization-model/content-kinds/registry.ts +44 -44
- package/src/organization-model/content-kinds/status.ts +71 -71
- package/src/organization-model/content-kinds/template.ts +83 -83
- package/src/organization-model/content-kinds/types.ts +117 -117
- package/src/organization-model/contracts.ts +27 -27
- package/src/organization-model/defaults.ts +42 -50
- package/src/organization-model/domains/actions.ts +333 -239
- package/src/organization-model/domains/customers.ts +78 -78
- package/src/organization-model/domains/entities.ts +144 -144
- package/src/organization-model/domains/goals.ts +83 -83
- package/src/organization-model/domains/knowledge.ts +117 -101
- package/src/organization-model/domains/navigation.ts +139 -139
- package/src/organization-model/domains/offerings.ts +71 -71
- package/src/organization-model/domains/policies.ts +102 -102
- package/src/organization-model/domains/projects.ts +14 -14
- package/src/organization-model/domains/prospecting.ts +395 -395
- package/src/organization-model/domains/resources.ts +202 -124
- package/src/organization-model/domains/roles.ts +96 -96
- package/src/organization-model/domains/sales.test.ts +218 -218
- package/src/organization-model/domains/sales.ts +380 -380
- package/src/organization-model/domains/shared.ts +63 -63
- package/src/organization-model/domains/statuses.ts +339 -339
- package/src/organization-model/domains/systems.ts +217 -172
- package/src/organization-model/domains/topology.ts +261 -0
- package/src/organization-model/foundation.ts +75 -75
- package/src/organization-model/graph/build.ts +1043 -867
- package/src/organization-model/graph/index.ts +4 -4
- package/src/organization-model/graph/link.ts +10 -10
- package/src/organization-model/graph/schema.ts +75 -68
- package/src/organization-model/graph/types.ts +71 -64
- package/src/organization-model/helpers.ts +289 -241
- package/src/organization-model/icons.ts +78 -66
- package/src/organization-model/index.ts +128 -125
- package/src/organization-model/migration-helpers.ts +247 -244
- package/src/organization-model/ontology.ts +658 -0
- package/src/organization-model/organization-graph.mdx +110 -90
- package/src/organization-model/organization-model.mdx +225 -213
- package/src/organization-model/published.ts +299 -222
- package/src/organization-model/resolve.ts +146 -91
- package/src/organization-model/schema.ts +818 -659
- package/src/organization-model/surface-projection.ts +212 -212
- package/src/organization-model/types.ts +179 -155
- package/src/platform/api/types.ts +38 -38
- package/src/platform/constants/versions.ts +3 -3
- package/src/platform/index.ts +23 -23
- package/src/platform/registry/__tests__/command-view.test.ts +10 -10
- package/src/platform/registry/__tests__/resource-link.test.ts +35 -35
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +20 -20
- package/src/platform/registry/__tests__/resource-registry.nested-systems.test.ts +245 -245
- package/src/platform/registry/__tests__/resource-registry.test.ts +2053 -2053
- package/src/platform/registry/__tests__/validation.test.ts +1444 -1259
- package/src/platform/registry/command-view.ts +10 -10
- package/src/platform/registry/index.ts +103 -103
- package/src/platform/registry/resource-link.ts +32 -32
- package/src/platform/registry/resource-registry.ts +886 -886
- package/src/platform/registry/serialization.ts +295 -295
- package/src/platform/registry/serialized-types.ts +166 -166
- package/src/platform/registry/stats-types.ts +68 -68
- package/src/platform/registry/types.ts +425 -425
- package/src/platform/registry/validation.ts +876 -684
- package/src/platform/utils/__tests__/validation.test.ts +1084 -1084
- package/src/platform/utils/validation.ts +425 -425
- package/src/projects/api-schemas.test.ts +39 -39
- package/src/projects/api-schemas.ts +291 -291
- package/src/reference/_generated/contracts.md +2136 -2093
- package/src/reference/glossary.md +76 -76
- package/src/scaffold-registry/__tests__/index.test.ts +206 -206
- package/src/scaffold-registry/__tests__/schema.test.ts +166 -166
- package/src/scaffold-registry/index.ts +392 -392
- package/src/scaffold-registry/schema.ts +243 -243
- package/src/server.ts +289 -289
- package/src/supabase/database.types.ts +3 -0
- package/src/test-utils/README.md +37 -37
- package/src/test-utils/entities.ts +108 -108
- package/src/test-utils/fixtures/memberships.ts +82 -82
- package/src/test-utils/index.ts +12 -12
- package/src/test-utils/organization-model.ts +65 -65
- package/src/test-utils/published.ts +6 -6
- package/src/test-utils/rls/RLSTestContext.ts +588 -588
- package/src/test-utils/test-utils.test.ts +44 -44
|
@@ -1,210 +1,210 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest'
|
|
2
|
-
import {
|
|
3
|
-
CONTENT_KIND_REGISTRY,
|
|
4
|
-
defineContentType,
|
|
5
|
-
lookupContentType,
|
|
6
|
-
pipelineKind,
|
|
7
|
-
stageKind,
|
|
8
|
-
templateKind,
|
|
9
|
-
templateStepKind,
|
|
10
|
-
statusFlowKind,
|
|
11
|
-
statusKind,
|
|
12
|
-
configKvKind
|
|
13
|
-
} from '../content-kinds/index'
|
|
14
|
-
import type { ContentTypeDefinition, ContentTypeKey } from '../content-kinds/types'
|
|
15
|
-
|
|
16
|
-
// ---------------------------------------------------------------------------
|
|
17
|
-
// CONTENT_KIND_REGISTRY shape (D8: static object literal)
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
|
|
20
|
-
describe('CONTENT_KIND_REGISTRY', () => {
|
|
21
|
-
it('contains all 7 expected keys', () => {
|
|
22
|
-
const expectedKeys: ContentTypeKey[] = [
|
|
23
|
-
'schema:pipeline',
|
|
24
|
-
'schema:stage',
|
|
25
|
-
'schema:template',
|
|
26
|
-
'schema:template-step',
|
|
27
|
-
'schema:status-flow',
|
|
28
|
-
'schema:status',
|
|
29
|
-
'config:kv'
|
|
30
|
-
]
|
|
31
|
-
for (const key of expectedKeys) {
|
|
32
|
-
expect(CONTENT_KIND_REGISTRY).toHaveProperty(key)
|
|
33
|
-
}
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('maps schema:pipeline to the pipelineKind definition', () => {
|
|
37
|
-
expect(CONTENT_KIND_REGISTRY['schema:pipeline']).toBe(pipelineKind)
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it('maps schema:stage to the stageKind definition', () => {
|
|
41
|
-
expect(CONTENT_KIND_REGISTRY['schema:stage']).toBe(stageKind)
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
it('maps schema:template to the templateKind definition', () => {
|
|
45
|
-
expect(CONTENT_KIND_REGISTRY['schema:template']).toBe(templateKind)
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
it('maps schema:template-step to the templateStepKind definition', () => {
|
|
49
|
-
expect(CONTENT_KIND_REGISTRY['schema:template-step']).toBe(templateStepKind)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('maps schema:status-flow to the statusFlowKind definition', () => {
|
|
53
|
-
expect(CONTENT_KIND_REGISTRY['schema:status-flow']).toBe(statusFlowKind)
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
it('maps schema:status to the statusKind definition', () => {
|
|
57
|
-
expect(CONTENT_KIND_REGISTRY['schema:status']).toBe(statusKind)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
it('maps config:kv to the configKvKind definition', () => {
|
|
61
|
-
expect(CONTENT_KIND_REGISTRY['config:kv']).toBe(configKvKind)
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it('has exactly 7 keys (no extra unintended entries)', () => {
|
|
65
|
-
expect(Object.keys(CONTENT_KIND_REGISTRY)).toHaveLength(7)
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('every entry has kind, type, payloadSchema, label, and description fields', () => {
|
|
69
|
-
for (const [key, def] of Object.entries(CONTENT_KIND_REGISTRY)) {
|
|
70
|
-
expect(def).toHaveProperty('kind')
|
|
71
|
-
expect(def).toHaveProperty('type')
|
|
72
|
-
expect(def).toHaveProperty('payloadSchema')
|
|
73
|
-
expect(typeof def.kind).toBe('string')
|
|
74
|
-
expect(typeof def.type).toBe('string')
|
|
75
|
-
expect(def.label).toBeTruthy()
|
|
76
|
-
expect(def.description).toBeTruthy()
|
|
77
|
-
// key must equal kind:type
|
|
78
|
-
expect(key).toBe(`${def.kind}:${def.type}`)
|
|
79
|
-
}
|
|
80
|
-
})
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
// ---------------------------------------------------------------------------
|
|
84
|
-
// parentTypes constraint
|
|
85
|
-
// ---------------------------------------------------------------------------
|
|
86
|
-
|
|
87
|
-
describe('parentTypes constraints', () => {
|
|
88
|
-
it('schema:pipeline has empty parentTypes (top-level, no parent required)', () => {
|
|
89
|
-
expect(pipelineKind.parentTypes).toEqual([])
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it('schema:stage parentTypes is ["schema:pipeline"]', () => {
|
|
93
|
-
expect(stageKind.parentTypes).toEqual(['schema:pipeline'])
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('schema:template has empty parentTypes', () => {
|
|
97
|
-
expect(templateKind.parentTypes).toEqual([])
|
|
98
|
-
})
|
|
99
|
-
|
|
100
|
-
it('schema:template-step parentTypes is ["schema:template"]', () => {
|
|
101
|
-
expect(templateStepKind.parentTypes).toEqual(['schema:template'])
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('schema:status-flow has empty parentTypes', () => {
|
|
105
|
-
expect(statusFlowKind.parentTypes).toEqual([])
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
it('schema:status parentTypes is ["schema:status-flow"]', () => {
|
|
109
|
-
expect(statusKind.parentTypes).toEqual(['schema:status-flow'])
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
it('config:kv has empty parentTypes', () => {
|
|
113
|
-
expect(configKvKind.parentTypes).toEqual([])
|
|
114
|
-
})
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
// ---------------------------------------------------------------------------
|
|
118
|
-
// lookupContentType
|
|
119
|
-
// ---------------------------------------------------------------------------
|
|
120
|
-
|
|
121
|
-
describe('lookupContentType', () => {
|
|
122
|
-
it('returns the correct definition for schema:pipeline', () => {
|
|
123
|
-
const def = lookupContentType('schema', 'pipeline')
|
|
124
|
-
expect(def).toBe(pipelineKind)
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
it('returns the correct definition for schema:stage', () => {
|
|
128
|
-
const def = lookupContentType('schema', 'stage')
|
|
129
|
-
expect(def).toBe(stageKind)
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
it('returns the correct definition for config:kv', () => {
|
|
133
|
-
const def = lookupContentType('config', 'kv')
|
|
134
|
-
expect(def).toBe(configKvKind)
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
it('returns undefined for an unregistered kind (D2: not an error)', () => {
|
|
138
|
-
const def = lookupContentType('tenant', 'custom-thing')
|
|
139
|
-
expect(def).toBeUndefined()
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
it('returns undefined for unknown kind with valid type', () => {
|
|
143
|
-
const def = lookupContentType('unknown', 'pipeline')
|
|
144
|
-
expect(def).toBeUndefined()
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
it('returns undefined for valid kind with unknown type', () => {
|
|
148
|
-
const def = lookupContentType('schema', 'not-a-real-type')
|
|
149
|
-
expect(def).toBeUndefined()
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
it('returns undefined for empty kind string', () => {
|
|
153
|
-
const def = lookupContentType('', 'pipeline')
|
|
154
|
-
expect(def).toBeUndefined()
|
|
155
|
-
})
|
|
156
|
-
|
|
157
|
-
it('returns undefined for empty type string', () => {
|
|
158
|
-
const def = lookupContentType('schema', '')
|
|
159
|
-
expect(def).toBeUndefined()
|
|
160
|
-
})
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
// ---------------------------------------------------------------------------
|
|
164
|
-
// defineContentType (identity factory, L16)
|
|
165
|
-
// ---------------------------------------------------------------------------
|
|
166
|
-
|
|
167
|
-
describe('defineContentType', () => {
|
|
168
|
-
it('is an identity function — returns the same object reference', () => {
|
|
169
|
-
const def: ContentTypeDefinition<{ name: string }> = {
|
|
170
|
-
kind: 'tenant',
|
|
171
|
-
type: 'custom',
|
|
172
|
-
payloadSchema: { safeParse: () => ({ success: true, data: { name: 'x' } }) } as unknown as ContentTypeDefinition<{
|
|
173
|
-
name: string
|
|
174
|
-
}>['payloadSchema'],
|
|
175
|
-
label: 'Custom',
|
|
176
|
-
description: 'A tenant-defined type.',
|
|
177
|
-
parentTypes: []
|
|
178
|
-
}
|
|
179
|
-
const result = defineContentType(def)
|
|
180
|
-
expect(result).toBe(def)
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
it('does NOT mutate the input definition', () => {
|
|
184
|
-
const def: ContentTypeDefinition<unknown> = {
|
|
185
|
-
kind: 'schema',
|
|
186
|
-
type: 'pipeline',
|
|
187
|
-
payloadSchema: {
|
|
188
|
-
safeParse: () => ({ success: true, data: {} })
|
|
189
|
-
} as unknown as ContentTypeDefinition<unknown>['payloadSchema'],
|
|
190
|
-
parentTypes: []
|
|
191
|
-
}
|
|
192
|
-
const original = { ...def }
|
|
193
|
-
defineContentType(def)
|
|
194
|
-
expect(def).toEqual(original)
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
it('does NOT register the definition globally (no side-effects on CONTENT_KIND_REGISTRY)', () => {
|
|
198
|
-
const tenantKey = 'tenant:my-new-type'
|
|
199
|
-
defineContentType({
|
|
200
|
-
kind: 'tenant',
|
|
201
|
-
type: 'my-new-type',
|
|
202
|
-
payloadSchema: {
|
|
203
|
-
safeParse: () => ({ success: true, data: {} })
|
|
204
|
-
} as unknown as ContentTypeDefinition<unknown>['payloadSchema'],
|
|
205
|
-
parentTypes: []
|
|
206
|
-
})
|
|
207
|
-
// After calling defineContentType, the registry must remain unchanged (D8: static)
|
|
208
|
-
expect(CONTENT_KIND_REGISTRY).not.toHaveProperty(tenantKey)
|
|
209
|
-
})
|
|
210
|
-
})
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
CONTENT_KIND_REGISTRY,
|
|
4
|
+
defineContentType,
|
|
5
|
+
lookupContentType,
|
|
6
|
+
pipelineKind,
|
|
7
|
+
stageKind,
|
|
8
|
+
templateKind,
|
|
9
|
+
templateStepKind,
|
|
10
|
+
statusFlowKind,
|
|
11
|
+
statusKind,
|
|
12
|
+
configKvKind
|
|
13
|
+
} from '../content-kinds/index'
|
|
14
|
+
import type { ContentTypeDefinition, ContentTypeKey } from '../content-kinds/types'
|
|
15
|
+
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// CONTENT_KIND_REGISTRY shape (D8: static object literal)
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
describe('CONTENT_KIND_REGISTRY', () => {
|
|
21
|
+
it('contains all 7 expected keys', () => {
|
|
22
|
+
const expectedKeys: ContentTypeKey[] = [
|
|
23
|
+
'schema:pipeline',
|
|
24
|
+
'schema:stage',
|
|
25
|
+
'schema:template',
|
|
26
|
+
'schema:template-step',
|
|
27
|
+
'schema:status-flow',
|
|
28
|
+
'schema:status',
|
|
29
|
+
'config:kv'
|
|
30
|
+
]
|
|
31
|
+
for (const key of expectedKeys) {
|
|
32
|
+
expect(CONTENT_KIND_REGISTRY).toHaveProperty(key)
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('maps schema:pipeline to the pipelineKind definition', () => {
|
|
37
|
+
expect(CONTENT_KIND_REGISTRY['schema:pipeline']).toBe(pipelineKind)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it('maps schema:stage to the stageKind definition', () => {
|
|
41
|
+
expect(CONTENT_KIND_REGISTRY['schema:stage']).toBe(stageKind)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('maps schema:template to the templateKind definition', () => {
|
|
45
|
+
expect(CONTENT_KIND_REGISTRY['schema:template']).toBe(templateKind)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('maps schema:template-step to the templateStepKind definition', () => {
|
|
49
|
+
expect(CONTENT_KIND_REGISTRY['schema:template-step']).toBe(templateStepKind)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('maps schema:status-flow to the statusFlowKind definition', () => {
|
|
53
|
+
expect(CONTENT_KIND_REGISTRY['schema:status-flow']).toBe(statusFlowKind)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it('maps schema:status to the statusKind definition', () => {
|
|
57
|
+
expect(CONTENT_KIND_REGISTRY['schema:status']).toBe(statusKind)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it('maps config:kv to the configKvKind definition', () => {
|
|
61
|
+
expect(CONTENT_KIND_REGISTRY['config:kv']).toBe(configKvKind)
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('has exactly 7 keys (no extra unintended entries)', () => {
|
|
65
|
+
expect(Object.keys(CONTENT_KIND_REGISTRY)).toHaveLength(7)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('every entry has kind, type, payloadSchema, label, and description fields', () => {
|
|
69
|
+
for (const [key, def] of Object.entries(CONTENT_KIND_REGISTRY)) {
|
|
70
|
+
expect(def).toHaveProperty('kind')
|
|
71
|
+
expect(def).toHaveProperty('type')
|
|
72
|
+
expect(def).toHaveProperty('payloadSchema')
|
|
73
|
+
expect(typeof def.kind).toBe('string')
|
|
74
|
+
expect(typeof def.type).toBe('string')
|
|
75
|
+
expect(def.label).toBeTruthy()
|
|
76
|
+
expect(def.description).toBeTruthy()
|
|
77
|
+
// key must equal kind:type
|
|
78
|
+
expect(key).toBe(`${def.kind}:${def.type}`)
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
// parentTypes constraint
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
|
|
87
|
+
describe('parentTypes constraints', () => {
|
|
88
|
+
it('schema:pipeline has empty parentTypes (top-level, no parent required)', () => {
|
|
89
|
+
expect(pipelineKind.parentTypes).toEqual([])
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('schema:stage parentTypes is ["schema:pipeline"]', () => {
|
|
93
|
+
expect(stageKind.parentTypes).toEqual(['schema:pipeline'])
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
it('schema:template has empty parentTypes', () => {
|
|
97
|
+
expect(templateKind.parentTypes).toEqual([])
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it('schema:template-step parentTypes is ["schema:template"]', () => {
|
|
101
|
+
expect(templateStepKind.parentTypes).toEqual(['schema:template'])
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('schema:status-flow has empty parentTypes', () => {
|
|
105
|
+
expect(statusFlowKind.parentTypes).toEqual([])
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('schema:status parentTypes is ["schema:status-flow"]', () => {
|
|
109
|
+
expect(statusKind.parentTypes).toEqual(['schema:status-flow'])
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it('config:kv has empty parentTypes', () => {
|
|
113
|
+
expect(configKvKind.parentTypes).toEqual([])
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// lookupContentType
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
|
|
121
|
+
describe('lookupContentType', () => {
|
|
122
|
+
it('returns the correct definition for schema:pipeline', () => {
|
|
123
|
+
const def = lookupContentType('schema', 'pipeline')
|
|
124
|
+
expect(def).toBe(pipelineKind)
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
it('returns the correct definition for schema:stage', () => {
|
|
128
|
+
const def = lookupContentType('schema', 'stage')
|
|
129
|
+
expect(def).toBe(stageKind)
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it('returns the correct definition for config:kv', () => {
|
|
133
|
+
const def = lookupContentType('config', 'kv')
|
|
134
|
+
expect(def).toBe(configKvKind)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
it('returns undefined for an unregistered kind (D2: not an error)', () => {
|
|
138
|
+
const def = lookupContentType('tenant', 'custom-thing')
|
|
139
|
+
expect(def).toBeUndefined()
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
it('returns undefined for unknown kind with valid type', () => {
|
|
143
|
+
const def = lookupContentType('unknown', 'pipeline')
|
|
144
|
+
expect(def).toBeUndefined()
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
it('returns undefined for valid kind with unknown type', () => {
|
|
148
|
+
const def = lookupContentType('schema', 'not-a-real-type')
|
|
149
|
+
expect(def).toBeUndefined()
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
it('returns undefined for empty kind string', () => {
|
|
153
|
+
const def = lookupContentType('', 'pipeline')
|
|
154
|
+
expect(def).toBeUndefined()
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
it('returns undefined for empty type string', () => {
|
|
158
|
+
const def = lookupContentType('schema', '')
|
|
159
|
+
expect(def).toBeUndefined()
|
|
160
|
+
})
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
// defineContentType (identity factory, L16)
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
|
|
167
|
+
describe('defineContentType', () => {
|
|
168
|
+
it('is an identity function — returns the same object reference', () => {
|
|
169
|
+
const def: ContentTypeDefinition<{ name: string }> = {
|
|
170
|
+
kind: 'tenant',
|
|
171
|
+
type: 'custom',
|
|
172
|
+
payloadSchema: { safeParse: () => ({ success: true, data: { name: 'x' } }) } as unknown as ContentTypeDefinition<{
|
|
173
|
+
name: string
|
|
174
|
+
}>['payloadSchema'],
|
|
175
|
+
label: 'Custom',
|
|
176
|
+
description: 'A tenant-defined type.',
|
|
177
|
+
parentTypes: []
|
|
178
|
+
}
|
|
179
|
+
const result = defineContentType(def)
|
|
180
|
+
expect(result).toBe(def)
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
it('does NOT mutate the input definition', () => {
|
|
184
|
+
const def: ContentTypeDefinition<unknown> = {
|
|
185
|
+
kind: 'schema',
|
|
186
|
+
type: 'pipeline',
|
|
187
|
+
payloadSchema: {
|
|
188
|
+
safeParse: () => ({ success: true, data: {} })
|
|
189
|
+
} as unknown as ContentTypeDefinition<unknown>['payloadSchema'],
|
|
190
|
+
parentTypes: []
|
|
191
|
+
}
|
|
192
|
+
const original = { ...def }
|
|
193
|
+
defineContentType(def)
|
|
194
|
+
expect(def).toEqual(original)
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
it('does NOT register the definition globally (no side-effects on CONTENT_KIND_REGISTRY)', () => {
|
|
198
|
+
const tenantKey = 'tenant:my-new-type'
|
|
199
|
+
defineContentType({
|
|
200
|
+
kind: 'tenant',
|
|
201
|
+
type: 'my-new-type',
|
|
202
|
+
payloadSchema: {
|
|
203
|
+
safeParse: () => ({ success: true, data: {} })
|
|
204
|
+
} as unknown as ContentTypeDefinition<unknown>['payloadSchema'],
|
|
205
|
+
parentTypes: []
|
|
206
|
+
})
|
|
207
|
+
// After calling defineContentType, the registry must remain unchanged (D8: static)
|
|
208
|
+
expect(CONTENT_KIND_REGISTRY).not.toHaveProperty(tenantKey)
|
|
209
|
+
})
|
|
210
|
+
})
|