ai-database 2.0.2 → 2.1.3
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 +48 -0
- package/LICENSE +21 -0
- package/README.md +667 -1
- package/dist/actions.d.ts +247 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +260 -0
- package/dist/actions.js.map +1 -0
- package/dist/ai-promise-db.d.ts +37 -2
- package/dist/ai-promise-db.d.ts.map +1 -1
- package/dist/ai-promise-db.js +530 -92
- package/dist/ai-promise-db.js.map +1 -1
- package/dist/constants.d.ts +16 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +16 -0
- package/dist/constants.js.map +1 -0
- package/dist/events.d.ts +153 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +154 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -2
- package/dist/index.js.map +1 -1
- package/dist/memory-provider.d.ts +145 -2
- package/dist/memory-provider.d.ts.map +1 -1
- package/dist/memory-provider.js +569 -13
- package/dist/memory-provider.js.map +1 -1
- package/dist/schema/cascade.d.ts +104 -0
- package/dist/schema/cascade.d.ts.map +1 -0
- package/dist/schema/cascade.js +547 -0
- package/dist/schema/cascade.js.map +1 -0
- package/dist/schema/dependency-graph.d.ts +133 -0
- package/dist/schema/dependency-graph.d.ts.map +1 -0
- package/dist/schema/dependency-graph.js +355 -0
- package/dist/schema/dependency-graph.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 +201 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +1221 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/parse.d.ts +225 -0
- package/dist/schema/parse.d.ts.map +1 -0
- package/dist/schema/parse.js +740 -0
- package/dist/schema/parse.js.map +1 -0
- package/dist/schema/provider.d.ts +177 -0
- package/dist/schema/provider.d.ts.map +1 -0
- package/dist/schema/provider.js +258 -0
- package/dist/schema/provider.js.map +1 -0
- package/dist/schema/resolve.d.ts +87 -0
- package/dist/schema/resolve.d.ts.map +1 -0
- package/dist/schema/resolve.js +549 -0
- package/dist/schema/resolve.js.map +1 -0
- package/dist/schema/semantic.d.ts +54 -0
- package/dist/schema/semantic.d.ts.map +1 -0
- package/dist/schema/semantic.js +335 -0
- package/dist/schema/semantic.js.map +1 -0
- package/dist/schema/types.d.ts +528 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +9 -0
- package/dist/schema/types.js.map +1 -0
- 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 +325 -0
- package/dist/schema/union-fallback.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.d.ts +25 -867
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +45 -1124
- package/dist/schema.js.map +1 -1
- package/dist/semantic.d.ts +175 -0
- package/dist/semantic.d.ts.map +1 -0
- package/dist/semantic.js +338 -0
- package/dist/semantic.js.map +1 -0
- package/dist/type-guards.d.ts +167 -0
- package/dist/type-guards.d.ts.map +1 -0
- package/dist/type-guards.js +247 -0
- package/dist/type-guards.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validation.d.ts +168 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +667 -0
- package/dist/validation.js.map +1 -0
- package/package.json +21 -12
- package/.turbo/turbo-build.log +0 -5
- package/TESTING.md +0 -410
- package/TEST_SUMMARY.md +0 -250
- package/TODO.md +0 -128
- package/src/ai-promise-db.ts +0 -1243
- package/src/authorization.ts +0 -1102
- package/src/durable-clickhouse.ts +0 -596
- package/src/durable-promise.ts +0 -582
- package/src/execution-queue.ts +0 -608
- package/src/index.test.ts +0 -868
- package/src/index.ts +0 -337
- package/src/linguistic.ts +0 -404
- package/src/memory-provider.test.ts +0 -1036
- package/src/memory-provider.ts +0 -1119
- package/src/schema.test.ts +0 -1254
- package/src/schema.ts +0 -2296
- package/src/tests.ts +0 -725
- package/src/types.ts +0 -1177
- package/test/README.md +0 -153
- package/test/edge-cases.test.ts +0 -646
- package/test/provider-resolution.test.ts +0 -402
- package/tsconfig.json +0 -9
- package/vitest.config.ts +0 -19
|
@@ -0,0 +1,167 @@
|
|
|
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 verbs to their reverse forms.
|
|
32
|
+
* Common active verbs mapped to their passive counterparts.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* FORWARD_TO_REVERSE.manages // 'managedBy'
|
|
37
|
+
* FORWARD_TO_REVERSE.owns // 'ownedBy'
|
|
38
|
+
* FORWARD_TO_REVERSE.creates // 'createdBy'
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare const FORWARD_TO_REVERSE: Readonly<Record<string, string>>;
|
|
42
|
+
/**
|
|
43
|
+
* Known verb pairs for bidirectional relationships.
|
|
44
|
+
* These are symmetric - each maps to the other.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* BIDIRECTIONAL_PAIRS.parent_of // 'child_of'
|
|
49
|
+
* BIDIRECTIONAL_PAIRS.child_of // 'parent_of'
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare const BIDIRECTIONAL_PAIRS: Readonly<Record<string, string>>;
|
|
53
|
+
/**
|
|
54
|
+
* Derives the reverse verb for a given forward verb.
|
|
55
|
+
*
|
|
56
|
+
* Resolution order:
|
|
57
|
+
* 1. Check bidirectional pairs first (parent_of <-> child_of)
|
|
58
|
+
* 2. Check known forward verbs (manages -> managedBy)
|
|
59
|
+
* 3. Check if already a reversed verb (managedBy -> manages)
|
|
60
|
+
* 4. Apply standard transformation for verbs ending in 's'
|
|
61
|
+
* 5. Add 'By' suffix for unknown verbs
|
|
62
|
+
*
|
|
63
|
+
* @param verb - The verb to derive the reverse of
|
|
64
|
+
* @returns The reverse verb
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* deriveReverseVerb('manages') // 'managedBy'
|
|
69
|
+
* deriveReverseVerb('owns') // 'ownedBy'
|
|
70
|
+
* deriveReverseVerb('parent_of') // 'child_of'
|
|
71
|
+
* deriveReverseVerb('managedBy') // 'manages' (already reversed)
|
|
72
|
+
* deriveReverseVerb('customAction') // 'customActionBy' (unknown verb)
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function deriveReverseVerb(verb: string): string;
|
|
76
|
+
/**
|
|
77
|
+
* Derives a verb from a field name.
|
|
78
|
+
*
|
|
79
|
+
* Common field names like "manager", "owner", "creator" are mapped
|
|
80
|
+
* to their corresponding verbs. Unknown field names are returned as-is.
|
|
81
|
+
*
|
|
82
|
+
* @param fieldName - The field name to derive a verb from
|
|
83
|
+
* @returns The derived verb or the field name if no mapping exists
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* fieldNameToVerb('manager') // 'manages'
|
|
88
|
+
* fieldNameToVerb('owner') // 'owns'
|
|
89
|
+
* fieldNameToVerb('creator') // 'creates'
|
|
90
|
+
* fieldNameToVerb('customField') // 'customField' (no mapping)
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare function fieldNameToVerb(fieldName: string): string;
|
|
94
|
+
/**
|
|
95
|
+
* Checks if a verb is in passive form.
|
|
96
|
+
*
|
|
97
|
+
* A verb is considered passive if it ends with:
|
|
98
|
+
* - 'By' (managedBy, ownedBy, createdBy)
|
|
99
|
+
* - 'To' (relatedTo, linkedTo, connectedTo)
|
|
100
|
+
* - 'Of' (parent_of, child_of, partOf)
|
|
101
|
+
*
|
|
102
|
+
* @param verb - The verb to check
|
|
103
|
+
* @returns True if the verb is passive, false otherwise
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* isPassiveVerb('managedBy') // true
|
|
108
|
+
* isPassiveVerb('relatedTo') // true
|
|
109
|
+
* isPassiveVerb('parent_of') // true
|
|
110
|
+
* isPassiveVerb('manages') // false
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare function isPassiveVerb(verb: string): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Register a custom verb pair for forward/reverse derivation.
|
|
116
|
+
*
|
|
117
|
+
* This allows extending the verb derivation system with domain-specific
|
|
118
|
+
* verb mappings at runtime.
|
|
119
|
+
*
|
|
120
|
+
* @param forward - The forward (active) verb
|
|
121
|
+
* @param reverse - The reverse (passive) verb
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```ts
|
|
125
|
+
* registerVerbPair('sponsors', 'sponsoredBy')
|
|
126
|
+
* deriveReverseVerb('sponsors') // 'sponsoredBy'
|
|
127
|
+
* deriveReverseVerb('sponsoredBy') // 'sponsors'
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export declare function registerVerbPair(forward: string, reverse: string): void;
|
|
131
|
+
/**
|
|
132
|
+
* Register a bidirectional verb pair.
|
|
133
|
+
*
|
|
134
|
+
* Bidirectional pairs are symmetric relationships where each verb
|
|
135
|
+
* maps to the other. For self-referential relationships, both
|
|
136
|
+
* arguments can be the same verb.
|
|
137
|
+
*
|
|
138
|
+
* @param verbA - The first verb
|
|
139
|
+
* @param verbB - The second verb (can be same as verbA for symmetric)
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```ts
|
|
143
|
+
* // Asymmetric bidirectional
|
|
144
|
+
* registerBidirectionalPair('mentor_of', 'mentee_of')
|
|
145
|
+
* deriveReverseVerb('mentor_of') // 'mentee_of'
|
|
146
|
+
* deriveReverseVerb('mentee_of') // 'mentor_of'
|
|
147
|
+
*
|
|
148
|
+
* // Symmetric (self-referential)
|
|
149
|
+
* registerBidirectionalPair('relatedTo', 'relatedTo')
|
|
150
|
+
* deriveReverseVerb('relatedTo') // 'relatedTo'
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export declare function registerBidirectionalPair(verbA: string, verbB: string): void;
|
|
154
|
+
/**
|
|
155
|
+
* Register a field name to verb mapping.
|
|
156
|
+
*
|
|
157
|
+
* @param fieldName - The field name
|
|
158
|
+
* @param verb - The verb it derives to
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```ts
|
|
162
|
+
* registerFieldVerb('coordinator', 'coordinates')
|
|
163
|
+
* fieldNameToVerb('coordinator') // 'coordinates'
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
export declare function registerFieldVerb(fieldName: string, verb: string): void;
|
|
167
|
+
//# sourceMappingURL=verb-derivation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verb-derivation.d.ts","sourceRoot":"","sources":["../../src/schema/verb-derivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAiCH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAqB,CAAA;AAcrF;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAuB,CAAA;AAwBxF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwCtD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYnD;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGvE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAG5E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvE"}
|
|
@@ -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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"}
|