ai-database 2.1.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -1
- package/README.md +1063 -186
- package/dist/actions.d.ts +2 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +1 -1
- package/dist/actions.js.map +1 -1
- package/dist/ai-promise-db.d.ts +52 -23
- package/dist/ai-promise-db.d.ts.map +1 -1
- package/dist/ai-promise-db.js +185 -164
- package/dist/ai-promise-db.js.map +1 -1
- package/dist/authorization.d.ts.map +1 -1
- package/dist/authorization.js +38 -30
- package/dist/authorization.js.map +1 -1
- package/dist/cascade-orchestrator.d.ts +404 -0
- package/dist/cascade-orchestrator.d.ts.map +1 -0
- package/dist/cascade-orchestrator.js +828 -0
- package/dist/cascade-orchestrator.js.map +1 -0
- package/dist/cascade-write-strategy.d.ts +584 -0
- package/dist/cascade-write-strategy.d.ts.map +1 -0
- package/dist/cascade-write-strategy.js +590 -0
- package/dist/cascade-write-strategy.js.map +1 -0
- package/dist/ch-adapter.d.ts +358 -0
- package/dist/ch-adapter.d.ts.map +1 -0
- package/dist/ch-adapter.js +929 -0
- package/dist/ch-adapter.js.map +1 -0
- package/dist/client/index.d.ts +42 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +43 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client.d.ts +266 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +81 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +64 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +52 -2
- package/dist/constants.js.map +1 -1
- package/dist/dataloader.d.ts +99 -0
- package/dist/dataloader.d.ts.map +1 -0
- package/dist/dataloader.js +225 -0
- package/dist/dataloader.js.map +1 -0
- package/dist/db-provider-port.d.ts +501 -0
- package/dist/db-provider-port.d.ts.map +1 -0
- package/dist/db-provider-port.js +113 -0
- package/dist/db-provider-port.js.map +1 -0
- package/dist/digital-objects-provider.d.ts +49 -0
- package/dist/digital-objects-provider.d.ts.map +1 -0
- package/dist/digital-objects-provider.js +55 -0
- package/dist/digital-objects-provider.js.map +1 -0
- package/dist/do-sqlite-adapter.d.ts +402 -0
- package/dist/do-sqlite-adapter.d.ts.map +1 -0
- package/dist/do-sqlite-adapter.js +745 -0
- package/dist/do-sqlite-adapter.js.map +1 -0
- package/dist/docs-rels/custom-types.d.ts +134 -0
- package/dist/docs-rels/custom-types.d.ts.map +1 -0
- package/dist/docs-rels/custom-types.js +70 -0
- package/dist/docs-rels/custom-types.js.map +1 -0
- package/dist/docs-rels/index.d.ts +16 -0
- package/dist/docs-rels/index.d.ts.map +1 -0
- package/dist/docs-rels/index.js +16 -0
- package/dist/docs-rels/index.js.map +1 -0
- package/dist/docs-rels/migrations/index.d.ts +30 -0
- package/dist/docs-rels/migrations/index.d.ts.map +1 -0
- package/dist/docs-rels/migrations/index.js +128 -0
- package/dist/docs-rels/migrations/index.js.map +1 -0
- package/dist/docs-rels/schema.d.ts +2961 -0
- package/dist/docs-rels/schema.d.ts.map +1 -0
- package/dist/docs-rels/schema.js +244 -0
- package/dist/docs-rels/schema.js.map +1 -0
- package/dist/durable-clickhouse.d.ts.map +1 -1
- package/dist/durable-clickhouse.js +16 -13
- package/dist/durable-clickhouse.js.map +1 -1
- package/dist/durable-promise.d.ts.map +1 -1
- package/dist/durable-promise.js +34 -15
- package/dist/durable-promise.js.map +1 -1
- package/dist/errors.d.ts +127 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +210 -0
- package/dist/errors.js.map +1 -0
- package/dist/eventbridge.d.ts +117 -0
- package/dist/eventbridge.d.ts.map +1 -0
- package/dist/eventbridge.js +238 -0
- package/dist/eventbridge.js.map +1 -0
- package/dist/events.d.ts +2 -2
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +1 -1
- package/dist/events.js.map +1 -1
- package/dist/execution-queue.d.ts.map +1 -1
- package/dist/execution-queue.js +4 -5
- package/dist/execution-queue.js.map +1 -1
- package/dist/index.d.ts +37 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -6
- package/dist/index.js.map +1 -1
- package/dist/linguistic.d.ts +3 -108
- package/dist/linguistic.d.ts.map +1 -1
- package/dist/linguistic.js +3 -372
- package/dist/linguistic.js.map +1 -1
- package/dist/logger.d.ts +132 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +137 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory-provider.d.ts +129 -0
- package/dist/memory-provider.d.ts.map +1 -1
- package/dist/memory-provider.js +592 -257
- package/dist/memory-provider.js.map +1 -1
- package/dist/pg-adapter.d.ts +424 -0
- package/dist/pg-adapter.d.ts.map +1 -0
- package/dist/pg-adapter.js +921 -0
- package/dist/pg-adapter.js.map +1 -0
- package/dist/pipelines-iceberg-emitter.d.ts +327 -0
- package/dist/pipelines-iceberg-emitter.d.ts.map +1 -0
- package/dist/pipelines-iceberg-emitter.js +351 -0
- package/dist/pipelines-iceberg-emitter.js.map +1 -0
- package/dist/provider-capabilities.d.ts +146 -0
- package/dist/provider-capabilities.d.ts.map +1 -0
- package/dist/provider-capabilities.js +214 -0
- package/dist/provider-capabilities.js.map +1 -0
- package/dist/rdb-provider-adapter.d.ts +195 -0
- package/dist/rdb-provider-adapter.d.ts.map +1 -0
- package/dist/rdb-provider-adapter.js +291 -0
- package/dist/rdb-provider-adapter.js.map +1 -0
- package/dist/schema/cascade.d.ts +49 -10
- package/dist/schema/cascade.d.ts.map +1 -1
- package/dist/schema/cascade.js +491 -273
- package/dist/schema/cascade.js.map +1 -1
- package/dist/schema/definition-caches.d.ts +24 -0
- package/dist/schema/definition-caches.d.ts.map +1 -0
- package/dist/schema/definition-caches.js +26 -0
- package/dist/schema/definition-caches.js.map +1 -0
- package/dist/schema/dependency-graph.d.ts +45 -0
- package/dist/schema/dependency-graph.d.ts.map +1 -0
- package/dist/schema/dependency-graph.js +47 -0
- package/dist/schema/dependency-graph.js.map +1 -0
- package/dist/schema/diff.d.ts +103 -0
- package/dist/schema/diff.d.ts.map +1 -0
- package/dist/schema/diff.js +329 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/entity-operations.d.ts +99 -0
- package/dist/schema/entity-operations.d.ts.map +1 -0
- package/dist/schema/entity-operations.js +818 -0
- package/dist/schema/entity-operations.js.map +1 -0
- package/dist/schema/generation-context.d.ts +202 -0
- package/dist/schema/generation-context.d.ts.map +1 -0
- package/dist/schema/generation-context.js +393 -0
- package/dist/schema/generation-context.js.map +1 -0
- package/dist/schema/index.d.ts +32 -34
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +462 -519
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/migration.d.ts +205 -0
- package/dist/schema/migration.d.ts.map +1 -0
- package/dist/schema/migration.js +327 -0
- package/dist/schema/migration.js.map +1 -0
- package/dist/schema/nl-query-generator.d.ts +68 -0
- package/dist/schema/nl-query-generator.d.ts.map +1 -0
- package/dist/schema/nl-query-generator.js +362 -0
- package/dist/schema/nl-query-generator.js.map +1 -0
- package/dist/schema/nl-query.d.ts +65 -0
- package/dist/schema/nl-query.d.ts.map +1 -0
- package/dist/schema/nl-query.js +178 -0
- package/dist/schema/nl-query.js.map +1 -0
- package/dist/schema/parse.d.ts.map +1 -1
- package/dist/schema/parse.js +152 -89
- package/dist/schema/parse.js.map +1 -1
- package/dist/schema/provider.d.ts +38 -0
- package/dist/schema/provider.d.ts.map +1 -1
- package/dist/schema/provider.js +15 -7
- package/dist/schema/provider.js.map +1 -1
- package/dist/schema/resolve.d.ts +46 -5
- package/dist/schema/resolve.d.ts.map +1 -1
- package/dist/schema/resolve.js +334 -117
- package/dist/schema/resolve.js.map +1 -1
- package/dist/schema/search-utils.d.ts +76 -0
- package/dist/schema/search-utils.d.ts.map +1 -0
- package/dist/schema/search-utils.js +86 -0
- package/dist/schema/search-utils.js.map +1 -0
- package/dist/schema/seed.d.ts +53 -0
- package/dist/schema/seed.d.ts.map +1 -0
- package/dist/schema/seed.js +94 -0
- package/dist/schema/seed.js.map +1 -0
- package/dist/schema/semantic.d.ts +11 -0
- package/dist/schema/semantic.d.ts.map +1 -1
- package/dist/schema/semantic.js +262 -68
- package/dist/schema/semantic.js.map +1 -1
- package/dist/schema/sub-apis.d.ts +52 -0
- package/dist/schema/sub-apis.d.ts.map +1 -0
- package/dist/schema/sub-apis.js +216 -0
- package/dist/schema/sub-apis.js.map +1 -0
- package/dist/schema/system-entities.d.ts +42 -0
- package/dist/schema/system-entities.d.ts.map +1 -0
- package/dist/schema/system-entities.js +101 -0
- package/dist/schema/system-entities.js.map +1 -0
- package/dist/schema/types.d.ts +91 -9
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/union-fallback.d.ts +219 -0
- package/dist/schema/union-fallback.d.ts.map +1 -0
- package/dist/schema/union-fallback.js +331 -0
- package/dist/schema/union-fallback.js.map +1 -0
- package/dist/schema/value-generators/ai.d.ts +54 -0
- package/dist/schema/value-generators/ai.d.ts.map +1 -0
- package/dist/schema/value-generators/ai.js +136 -0
- package/dist/schema/value-generators/ai.js.map +1 -0
- package/dist/schema/value-generators/index.d.ts +126 -0
- package/dist/schema/value-generators/index.d.ts.map +1 -0
- package/dist/schema/value-generators/index.js +219 -0
- package/dist/schema/value-generators/index.js.map +1 -0
- package/dist/schema/value-generators/placeholder.d.ts +52 -0
- package/dist/schema/value-generators/placeholder.d.ts.map +1 -0
- package/dist/schema/value-generators/placeholder.js +328 -0
- package/dist/schema/value-generators/placeholder.js.map +1 -0
- package/dist/schema/value-generators/types.d.ts +116 -0
- package/dist/schema/value-generators/types.d.ts.map +1 -0
- package/dist/schema/value-generators/types.js +11 -0
- package/dist/schema/value-generators/types.js.map +1 -0
- package/dist/schema/verb-derivation.d.ts +167 -0
- package/dist/schema/verb-derivation.d.ts.map +1 -0
- package/dist/schema/verb-derivation.js +281 -0
- package/dist/schema/verb-derivation.js.map +1 -0
- package/dist/schema/version.d.ts +111 -0
- package/dist/schema/version.d.ts.map +1 -0
- package/dist/schema/version.js +190 -0
- package/dist/schema/version.js.map +1 -0
- package/dist/schema.d.ts +1095 -23
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2854 -38
- package/dist/schema.js.map +1 -1
- package/dist/semantic-vectors.d.ts +39 -0
- package/dist/semantic-vectors.d.ts.map +1 -0
- package/dist/semantic-vectors.js +334 -0
- package/dist/semantic-vectors.js.map +1 -0
- package/dist/semantic.d.ts +29 -1
- package/dist/semantic.d.ts.map +1 -1
- package/dist/semantic.js +26 -16
- package/dist/semantic.js.map +1 -1
- package/dist/telemetry.d.ts +128 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +305 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tests.d.ts.map +1 -1
- package/dist/tests.js +30 -22
- package/dist/tests.js.map +1 -1
- package/dist/type-guards.d.ts +212 -0
- package/dist/type-guards.d.ts.map +1 -0
- package/dist/type-guards.js +318 -0
- package/dist/type-guards.js.map +1 -0
- package/dist/types.d.ts +33 -245
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +62 -72
- package/dist/types.js.map +1 -1
- package/dist/validation.d.ts +165 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +639 -0
- package/dist/validation.js.map +1 -0
- package/dist/worker/db-provider.d.ts +168 -0
- package/dist/worker/db-provider.d.ts.map +1 -0
- package/dist/worker/db-provider.js +277 -0
- package/dist/worker/db-provider.js.map +1 -0
- package/dist/worker/index.d.ts +35 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +37 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker.d.ts +779 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +2786 -0
- package/dist/worker.js.map +1 -0
- package/package.json +38 -8
- package/src/docs-rels/migrations/0001-init.sql +125 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verb Derivation for Backward Cascade Resolution
|
|
3
|
+
*
|
|
4
|
+
* Derives reverse verbs for backward relationships:
|
|
5
|
+
* - manages -> managedBy
|
|
6
|
+
* - owns -> ownedBy
|
|
7
|
+
* - creates -> createdBy
|
|
8
|
+
* - parent_of <-> child_of (bidirectional)
|
|
9
|
+
*
|
|
10
|
+
* Used by the cascade resolver to determine the reverse relationship
|
|
11
|
+
* when traversing relationships in the opposite direction.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { deriveReverseVerb, fieldNameToVerb, isPassiveVerb } from './verb-derivation.js'
|
|
16
|
+
*
|
|
17
|
+
* deriveReverseVerb('manages') // 'managedBy'
|
|
18
|
+
* deriveReverseVerb('parent_of') // 'child_of'
|
|
19
|
+
* deriveReverseVerb('managedBy') // 'manages'
|
|
20
|
+
*
|
|
21
|
+
* fieldNameToVerb('manager') // 'manages'
|
|
22
|
+
* fieldNameToVerb('owner') // 'owns'
|
|
23
|
+
*
|
|
24
|
+
* isPassiveVerb('managedBy') // true
|
|
25
|
+
* isPassiveVerb('manages') // false
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @packageDocumentation
|
|
29
|
+
*/
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Forward to Reverse Verb Mapping
|
|
32
|
+
// =============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* Mutable copy for runtime registration of custom verb pairs.
|
|
35
|
+
* Initialized from INITIAL_FORWARD_TO_REVERSE.
|
|
36
|
+
*/
|
|
37
|
+
const _forwardToReverse = {
|
|
38
|
+
manages: 'managedBy',
|
|
39
|
+
owns: 'ownedBy',
|
|
40
|
+
creates: 'createdBy',
|
|
41
|
+
reviews: 'reviewedBy',
|
|
42
|
+
employs: 'employedBy',
|
|
43
|
+
contains: 'containedBy',
|
|
44
|
+
assigns: 'assignedBy',
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Mutable copy for runtime registration of reverse to forward mappings.
|
|
48
|
+
*/
|
|
49
|
+
const _reverseToForward = {
|
|
50
|
+
managedBy: 'manages',
|
|
51
|
+
ownedBy: 'owns',
|
|
52
|
+
createdBy: 'creates',
|
|
53
|
+
reviewedBy: 'reviews',
|
|
54
|
+
employedBy: 'employs',
|
|
55
|
+
containedBy: 'contains',
|
|
56
|
+
assignedBy: 'assigns',
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Forward verbs to their reverse forms.
|
|
60
|
+
* Common active verbs mapped to their passive counterparts.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```ts
|
|
64
|
+
* FORWARD_TO_REVERSE.manages // 'managedBy'
|
|
65
|
+
* FORWARD_TO_REVERSE.owns // 'ownedBy'
|
|
66
|
+
* FORWARD_TO_REVERSE.creates // 'createdBy'
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export const FORWARD_TO_REVERSE = _forwardToReverse;
|
|
70
|
+
// =============================================================================
|
|
71
|
+
// Bidirectional Pairs
|
|
72
|
+
// =============================================================================
|
|
73
|
+
/**
|
|
74
|
+
* Mutable copy for runtime registration of bidirectional pairs.
|
|
75
|
+
*/
|
|
76
|
+
const _bidirectionalPairs = {
|
|
77
|
+
parent_of: 'child_of',
|
|
78
|
+
child_of: 'parent_of',
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Known verb pairs for bidirectional relationships.
|
|
82
|
+
* These are symmetric - each maps to the other.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* BIDIRECTIONAL_PAIRS.parent_of // 'child_of'
|
|
87
|
+
* BIDIRECTIONAL_PAIRS.child_of // 'parent_of'
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export const BIDIRECTIONAL_PAIRS = _bidirectionalPairs;
|
|
91
|
+
// =============================================================================
|
|
92
|
+
// Field Name to Verb Mapping
|
|
93
|
+
// =============================================================================
|
|
94
|
+
/**
|
|
95
|
+
* Mutable copy for runtime registration of field to verb mappings.
|
|
96
|
+
*/
|
|
97
|
+
const _fieldToVerb = {
|
|
98
|
+
manager: 'manages',
|
|
99
|
+
owner: 'owns',
|
|
100
|
+
creator: 'creates',
|
|
101
|
+
reviewer: 'reviews',
|
|
102
|
+
employer: 'employs',
|
|
103
|
+
parent: 'parent_of',
|
|
104
|
+
child: 'child_of',
|
|
105
|
+
assignee: 'assigns',
|
|
106
|
+
};
|
|
107
|
+
// =============================================================================
|
|
108
|
+
// Core Functions
|
|
109
|
+
// =============================================================================
|
|
110
|
+
/**
|
|
111
|
+
* Derives the reverse verb for a given forward verb.
|
|
112
|
+
*
|
|
113
|
+
* Resolution order:
|
|
114
|
+
* 1. Check bidirectional pairs first (parent_of <-> child_of)
|
|
115
|
+
* 2. Check known forward verbs (manages -> managedBy)
|
|
116
|
+
* 3. Check if already a reversed verb (managedBy -> manages)
|
|
117
|
+
* 4. Apply standard transformation for verbs ending in 's'
|
|
118
|
+
* 5. Add 'By' suffix for unknown verbs
|
|
119
|
+
*
|
|
120
|
+
* @param verb - The verb to derive the reverse of
|
|
121
|
+
* @returns The reverse verb
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```ts
|
|
125
|
+
* deriveReverseVerb('manages') // 'managedBy'
|
|
126
|
+
* deriveReverseVerb('owns') // 'ownedBy'
|
|
127
|
+
* deriveReverseVerb('parent_of') // 'child_of'
|
|
128
|
+
* deriveReverseVerb('managedBy') // 'manages' (already reversed)
|
|
129
|
+
* deriveReverseVerb('customAction') // 'customActionBy' (unknown verb)
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export function deriveReverseVerb(verb) {
|
|
133
|
+
// Check bidirectional pairs first
|
|
134
|
+
if (verb in _bidirectionalPairs) {
|
|
135
|
+
return _bidirectionalPairs[verb];
|
|
136
|
+
}
|
|
137
|
+
// Check known forward verbs
|
|
138
|
+
if (verb in _forwardToReverse) {
|
|
139
|
+
return _forwardToReverse[verb];
|
|
140
|
+
}
|
|
141
|
+
// Check if this is already a reversed verb (ends with 'By')
|
|
142
|
+
if (verb in _reverseToForward) {
|
|
143
|
+
return _reverseToForward[verb];
|
|
144
|
+
}
|
|
145
|
+
// Check if verb ends with 'By' - try to find its forward form
|
|
146
|
+
if (verb.endsWith('By')) {
|
|
147
|
+
// Check if there's a known forward form
|
|
148
|
+
const forwardVerb = _reverseToForward[verb];
|
|
149
|
+
if (forwardVerb) {
|
|
150
|
+
return forwardVerb;
|
|
151
|
+
}
|
|
152
|
+
// Otherwise just return the base (customActionBy -> customAction)
|
|
153
|
+
return verb.slice(0, -2);
|
|
154
|
+
}
|
|
155
|
+
// Apply standard verb transformation for third person singular verbs
|
|
156
|
+
// (verbs ending in 's' like manages, owns, creates, reviews, employs, contains)
|
|
157
|
+
if (verb.endsWith('s') && verb.length > 2) {
|
|
158
|
+
// Remove trailing 's' to get base form, then add 'edBy'
|
|
159
|
+
// manages -> manage -> managedBy
|
|
160
|
+
// owns -> own -> ownedBy
|
|
161
|
+
// creates -> create -> createdBy
|
|
162
|
+
const base = verb.slice(0, -1);
|
|
163
|
+
return base + 'dBy';
|
|
164
|
+
}
|
|
165
|
+
// For other verbs, just add 'By' suffix
|
|
166
|
+
return verb + 'By';
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Derives a verb from a field name.
|
|
170
|
+
*
|
|
171
|
+
* Common field names like "manager", "owner", "creator" are mapped
|
|
172
|
+
* to their corresponding verbs. Unknown field names are returned as-is.
|
|
173
|
+
*
|
|
174
|
+
* @param fieldName - The field name to derive a verb from
|
|
175
|
+
* @returns The derived verb or the field name if no mapping exists
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```ts
|
|
179
|
+
* fieldNameToVerb('manager') // 'manages'
|
|
180
|
+
* fieldNameToVerb('owner') // 'owns'
|
|
181
|
+
* fieldNameToVerb('creator') // 'creates'
|
|
182
|
+
* fieldNameToVerb('customField') // 'customField' (no mapping)
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export function fieldNameToVerb(fieldName) {
|
|
186
|
+
return _fieldToVerb[fieldName] ?? fieldName;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Checks if a verb is in passive form.
|
|
190
|
+
*
|
|
191
|
+
* A verb is considered passive if it ends with:
|
|
192
|
+
* - 'By' (managedBy, ownedBy, createdBy)
|
|
193
|
+
* - 'To' (relatedTo, linkedTo, connectedTo)
|
|
194
|
+
* - 'Of' (parent_of, child_of, partOf)
|
|
195
|
+
*
|
|
196
|
+
* @param verb - The verb to check
|
|
197
|
+
* @returns True if the verb is passive, false otherwise
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```ts
|
|
201
|
+
* isPassiveVerb('managedBy') // true
|
|
202
|
+
* isPassiveVerb('relatedTo') // true
|
|
203
|
+
* isPassiveVerb('parent_of') // true
|
|
204
|
+
* isPassiveVerb('manages') // false
|
|
205
|
+
* ```
|
|
206
|
+
*/
|
|
207
|
+
export function isPassiveVerb(verb) {
|
|
208
|
+
if (verb.length === 0) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
// Check for common passive suffixes
|
|
212
|
+
return (verb.endsWith('By') ||
|
|
213
|
+
verb.endsWith('To') ||
|
|
214
|
+
verb.endsWith('Of') ||
|
|
215
|
+
verb.endsWith('_of'));
|
|
216
|
+
}
|
|
217
|
+
// =============================================================================
|
|
218
|
+
// Extensibility Functions
|
|
219
|
+
// =============================================================================
|
|
220
|
+
/**
|
|
221
|
+
* Register a custom verb pair for forward/reverse derivation.
|
|
222
|
+
*
|
|
223
|
+
* This allows extending the verb derivation system with domain-specific
|
|
224
|
+
* verb mappings at runtime.
|
|
225
|
+
*
|
|
226
|
+
* @param forward - The forward (active) verb
|
|
227
|
+
* @param reverse - The reverse (passive) verb
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```ts
|
|
231
|
+
* registerVerbPair('sponsors', 'sponsoredBy')
|
|
232
|
+
* deriveReverseVerb('sponsors') // 'sponsoredBy'
|
|
233
|
+
* deriveReverseVerb('sponsoredBy') // 'sponsors'
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
export function registerVerbPair(forward, reverse) {
|
|
237
|
+
_forwardToReverse[forward] = reverse;
|
|
238
|
+
_reverseToForward[reverse] = forward;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Register a bidirectional verb pair.
|
|
242
|
+
*
|
|
243
|
+
* Bidirectional pairs are symmetric relationships where each verb
|
|
244
|
+
* maps to the other. For self-referential relationships, both
|
|
245
|
+
* arguments can be the same verb.
|
|
246
|
+
*
|
|
247
|
+
* @param verbA - The first verb
|
|
248
|
+
* @param verbB - The second verb (can be same as verbA for symmetric)
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```ts
|
|
252
|
+
* // Asymmetric bidirectional
|
|
253
|
+
* registerBidirectionalPair('mentor_of', 'mentee_of')
|
|
254
|
+
* deriveReverseVerb('mentor_of') // 'mentee_of'
|
|
255
|
+
* deriveReverseVerb('mentee_of') // 'mentor_of'
|
|
256
|
+
*
|
|
257
|
+
* // Symmetric (self-referential)
|
|
258
|
+
* registerBidirectionalPair('relatedTo', 'relatedTo')
|
|
259
|
+
* deriveReverseVerb('relatedTo') // 'relatedTo'
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
export function registerBidirectionalPair(verbA, verbB) {
|
|
263
|
+
_bidirectionalPairs[verbA] = verbB;
|
|
264
|
+
_bidirectionalPairs[verbB] = verbA;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Register a field name to verb mapping.
|
|
268
|
+
*
|
|
269
|
+
* @param fieldName - The field name
|
|
270
|
+
* @param verb - The verb it derives to
|
|
271
|
+
*
|
|
272
|
+
* @example
|
|
273
|
+
* ```ts
|
|
274
|
+
* registerFieldVerb('coordinator', 'coordinates')
|
|
275
|
+
* fieldNameToVerb('coordinator') // 'coordinates'
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
export function registerFieldVerb(fieldName, verb) {
|
|
279
|
+
_fieldToVerb[fieldName] = verb;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=verb-derivation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verb-derivation.js","sourceRoot":"","sources":["../../src/schema/verb-derivation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Version Tracking
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for tracking schema versions, computing schema hashes,
|
|
5
|
+
* and storing/retrieving version metadata from the database.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { DatabaseSchema } from '../types.js';
|
|
10
|
+
import type { DBProvider } from './provider.js';
|
|
11
|
+
/**
|
|
12
|
+
* Schema version metadata stored in the database
|
|
13
|
+
*/
|
|
14
|
+
export interface SchemaVersionInfo {
|
|
15
|
+
/** The version number (incremented on each migration) */
|
|
16
|
+
version: number;
|
|
17
|
+
/** Hash of the schema structure for change detection */
|
|
18
|
+
schemaHash: string;
|
|
19
|
+
/** When this version was applied */
|
|
20
|
+
appliedAt?: string;
|
|
21
|
+
/** Description of the migration (if any) */
|
|
22
|
+
description?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Compute a deterministic hash of a database schema
|
|
26
|
+
*
|
|
27
|
+
* The hash is computed by:
|
|
28
|
+
* 1. Sorting entity names alphabetically
|
|
29
|
+
* 2. For each entity, sorting field names alphabetically
|
|
30
|
+
* 3. Creating a normalized JSON representation
|
|
31
|
+
* 4. Computing a hash of the JSON string
|
|
32
|
+
*
|
|
33
|
+
* This ensures the same schema always produces the same hash,
|
|
34
|
+
* regardless of property insertion order in the original object.
|
|
35
|
+
*
|
|
36
|
+
* @param schema - The database schema to hash
|
|
37
|
+
* @returns A hex string hash of the schema
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const hash = computeSchemaHash({
|
|
42
|
+
* User: { name: 'string', email: 'string' },
|
|
43
|
+
* Post: { title: 'string', author: 'User.posts' }
|
|
44
|
+
* })
|
|
45
|
+
* // => '8a7b3c9d...'
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function computeSchemaHash(schema: DatabaseSchema): string;
|
|
49
|
+
/**
|
|
50
|
+
* Get the current schema version from the database
|
|
51
|
+
*
|
|
52
|
+
* Reads the _schema_meta entity to retrieve the current schema version
|
|
53
|
+
* and hash. Returns null if no version has been set yet (first run).
|
|
54
|
+
*
|
|
55
|
+
* @param provider - The database provider
|
|
56
|
+
* @returns The current schema version info, or null if not set
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* const version = await getSchemaVersion(provider)
|
|
61
|
+
* if (version) {
|
|
62
|
+
* console.log(`Current version: ${version.version}`)
|
|
63
|
+
* console.log(`Schema hash: ${version.schemaHash}`)
|
|
64
|
+
* } else {
|
|
65
|
+
* console.log('No schema version set - first run')
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare function getSchemaVersion(provider: DBProvider): Promise<SchemaVersionInfo | null>;
|
|
70
|
+
/**
|
|
71
|
+
* Set the schema version in the database
|
|
72
|
+
*
|
|
73
|
+
* Stores the schema version and hash as a _schema_meta entity.
|
|
74
|
+
* Creates the entity if it doesn't exist, or updates it if it does.
|
|
75
|
+
*
|
|
76
|
+
* @param provider - The database provider
|
|
77
|
+
* @param version - The new version number
|
|
78
|
+
* @param schemaHash - The hash of the current schema
|
|
79
|
+
* @param description - Optional description of the migration
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* await setSchemaVersion(provider, 1, 'abc123', 'Initial schema')
|
|
84
|
+
* await setSchemaVersion(provider, 2, 'def456', 'Added email field to User')
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function setSchemaVersion(provider: DBProvider, version: number, schemaHash: string, description?: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Check if the schema has changed since the last recorded version
|
|
90
|
+
*
|
|
91
|
+
* Compares the current schema hash with the stored hash to detect changes.
|
|
92
|
+
*
|
|
93
|
+
* @param provider - The database provider
|
|
94
|
+
* @param schema - The current schema definition
|
|
95
|
+
* @returns Object with changed status and hashes
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* const { changed, currentHash, storedHash } = await hasSchemaChanged(provider, schema)
|
|
100
|
+
* if (changed) {
|
|
101
|
+
* console.log('Schema has changed, migration may be needed')
|
|
102
|
+
* }
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export declare function hasSchemaChanged(provider: DBProvider, schema: DatabaseSchema): Promise<{
|
|
106
|
+
changed: boolean;
|
|
107
|
+
currentHash: string;
|
|
108
|
+
storedHash: string | null;
|
|
109
|
+
storedVersion: number | null;
|
|
110
|
+
}>;
|
|
111
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/schema/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAM/C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAgBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuChE;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA6B9F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAC,CAUD"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Version Tracking
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for tracking schema versions, computing schema hashes,
|
|
5
|
+
* and storing/retrieving version metadata from the database.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// Constants
|
|
11
|
+
// =============================================================================
|
|
12
|
+
/** Entity type for storing schema metadata */
|
|
13
|
+
const SCHEMA_META_TYPE = 'SchemaMeta';
|
|
14
|
+
/** ID for the schema version record */
|
|
15
|
+
const SCHEMA_VERSION_ID = 'current';
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Hash Computation
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Compute a deterministic hash of a database schema
|
|
21
|
+
*
|
|
22
|
+
* The hash is computed by:
|
|
23
|
+
* 1. Sorting entity names alphabetically
|
|
24
|
+
* 2. For each entity, sorting field names alphabetically
|
|
25
|
+
* 3. Creating a normalized JSON representation
|
|
26
|
+
* 4. Computing a hash of the JSON string
|
|
27
|
+
*
|
|
28
|
+
* This ensures the same schema always produces the same hash,
|
|
29
|
+
* regardless of property insertion order in the original object.
|
|
30
|
+
*
|
|
31
|
+
* @param schema - The database schema to hash
|
|
32
|
+
* @returns A hex string hash of the schema
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const hash = computeSchemaHash({
|
|
37
|
+
* User: { name: 'string', email: 'string' },
|
|
38
|
+
* Post: { title: 'string', author: 'User.posts' }
|
|
39
|
+
* })
|
|
40
|
+
* // => '8a7b3c9d...'
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function computeSchemaHash(schema) {
|
|
44
|
+
// Create a normalized representation with sorted keys
|
|
45
|
+
const normalized = {};
|
|
46
|
+
// Sort entity names
|
|
47
|
+
const entityNames = Object.keys(schema).sort();
|
|
48
|
+
for (const entityName of entityNames) {
|
|
49
|
+
const entitySchema = schema[entityName];
|
|
50
|
+
const normalizedEntity = {};
|
|
51
|
+
// Sort field names within each entity
|
|
52
|
+
const fieldNames = Object.keys(entitySchema).sort();
|
|
53
|
+
for (const fieldName of fieldNames) {
|
|
54
|
+
const fieldDef = entitySchema[fieldName];
|
|
55
|
+
// Normalize array definitions to string representation
|
|
56
|
+
if (Array.isArray(fieldDef)) {
|
|
57
|
+
normalizedEntity[fieldName] = `[${fieldDef[0]}]`;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
normalizedEntity[fieldName] = fieldDef;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
normalized[entityName] = normalizedEntity;
|
|
64
|
+
}
|
|
65
|
+
// Create JSON string and compute hash
|
|
66
|
+
const jsonString = JSON.stringify(normalized);
|
|
67
|
+
// Simple hash function (djb2 algorithm)
|
|
68
|
+
let hash = 5381;
|
|
69
|
+
for (let i = 0; i < jsonString.length; i++) {
|
|
70
|
+
const char = jsonString.charCodeAt(i);
|
|
71
|
+
hash = ((hash << 5) + hash) ^ char;
|
|
72
|
+
}
|
|
73
|
+
// Convert to positive hex string
|
|
74
|
+
return Math.abs(hash).toString(16).padStart(8, '0');
|
|
75
|
+
}
|
|
76
|
+
// =============================================================================
|
|
77
|
+
// Version Storage
|
|
78
|
+
// =============================================================================
|
|
79
|
+
/**
|
|
80
|
+
* Get the current schema version from the database
|
|
81
|
+
*
|
|
82
|
+
* Reads the _schema_meta entity to retrieve the current schema version
|
|
83
|
+
* and hash. Returns null if no version has been set yet (first run).
|
|
84
|
+
*
|
|
85
|
+
* @param provider - The database provider
|
|
86
|
+
* @returns The current schema version info, or null if not set
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* const version = await getSchemaVersion(provider)
|
|
91
|
+
* if (version) {
|
|
92
|
+
* console.log(`Current version: ${version.version}`)
|
|
93
|
+
* console.log(`Schema hash: ${version.schemaHash}`)
|
|
94
|
+
* } else {
|
|
95
|
+
* console.log('No schema version set - first run')
|
|
96
|
+
* }
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export async function getSchemaVersion(provider) {
|
|
100
|
+
try {
|
|
101
|
+
const record = await provider.get(SCHEMA_META_TYPE, SCHEMA_VERSION_ID);
|
|
102
|
+
if (!record) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const result = {
|
|
106
|
+
version: record['version'],
|
|
107
|
+
schemaHash: record['schemaHash'],
|
|
108
|
+
};
|
|
109
|
+
if (record['appliedAt'] !== undefined) {
|
|
110
|
+
result.appliedAt = record['appliedAt'];
|
|
111
|
+
}
|
|
112
|
+
if (record['description'] !== undefined) {
|
|
113
|
+
result.description = record['description'];
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// If the entity type doesn't exist yet, that's fine - return null
|
|
119
|
+
if (error instanceof Error &&
|
|
120
|
+
(error.message.includes('not found') || error.message.includes('does not exist'))) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Set the schema version in the database
|
|
128
|
+
*
|
|
129
|
+
* Stores the schema version and hash as a _schema_meta entity.
|
|
130
|
+
* Creates the entity if it doesn't exist, or updates it if it does.
|
|
131
|
+
*
|
|
132
|
+
* @param provider - The database provider
|
|
133
|
+
* @param version - The new version number
|
|
134
|
+
* @param schemaHash - The hash of the current schema
|
|
135
|
+
* @param description - Optional description of the migration
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```ts
|
|
139
|
+
* await setSchemaVersion(provider, 1, 'abc123', 'Initial schema')
|
|
140
|
+
* await setSchemaVersion(provider, 2, 'def456', 'Added email field to User')
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
export async function setSchemaVersion(provider, version, schemaHash, description) {
|
|
144
|
+
const data = {
|
|
145
|
+
version,
|
|
146
|
+
schemaHash,
|
|
147
|
+
appliedAt: new Date().toISOString(),
|
|
148
|
+
};
|
|
149
|
+
if (description !== undefined) {
|
|
150
|
+
data['description'] = description;
|
|
151
|
+
}
|
|
152
|
+
// Try to get existing record
|
|
153
|
+
const existing = await provider.get(SCHEMA_META_TYPE, SCHEMA_VERSION_ID);
|
|
154
|
+
if (existing) {
|
|
155
|
+
// Update existing record
|
|
156
|
+
await provider.update(SCHEMA_META_TYPE, SCHEMA_VERSION_ID, data);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Create new record
|
|
160
|
+
await provider.create(SCHEMA_META_TYPE, SCHEMA_VERSION_ID, data);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if the schema has changed since the last recorded version
|
|
165
|
+
*
|
|
166
|
+
* Compares the current schema hash with the stored hash to detect changes.
|
|
167
|
+
*
|
|
168
|
+
* @param provider - The database provider
|
|
169
|
+
* @param schema - The current schema definition
|
|
170
|
+
* @returns Object with changed status and hashes
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```ts
|
|
174
|
+
* const { changed, currentHash, storedHash } = await hasSchemaChanged(provider, schema)
|
|
175
|
+
* if (changed) {
|
|
176
|
+
* console.log('Schema has changed, migration may be needed')
|
|
177
|
+
* }
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
export async function hasSchemaChanged(provider, schema) {
|
|
181
|
+
const currentHash = computeSchemaHash(schema);
|
|
182
|
+
const versionInfo = await getSchemaVersion(provider);
|
|
183
|
+
return {
|
|
184
|
+
changed: versionInfo === null || versionInfo.schemaHash !== currentHash,
|
|
185
|
+
currentHash,
|
|
186
|
+
storedHash: versionInfo?.schemaHash ?? null,
|
|
187
|
+
storedVersion: versionInfo?.version ?? null,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/schema/version.ts"],"names":[],"mappings":"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"}
|