ai-database 2.1.3 → 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.
Files changed (260) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/README.md +880 -669
  3. package/dist/actions.d.ts +2 -2
  4. package/dist/actions.d.ts.map +1 -1
  5. package/dist/actions.js +1 -1
  6. package/dist/actions.js.map +1 -1
  7. package/dist/ai-promise-db.d.ts +49 -23
  8. package/dist/ai-promise-db.d.ts.map +1 -1
  9. package/dist/ai-promise-db.js +91 -63
  10. package/dist/ai-promise-db.js.map +1 -1
  11. package/dist/authorization.d.ts.map +1 -1
  12. package/dist/authorization.js +38 -30
  13. package/dist/authorization.js.map +1 -1
  14. package/dist/cascade-orchestrator.d.ts +404 -0
  15. package/dist/cascade-orchestrator.d.ts.map +1 -0
  16. package/dist/cascade-orchestrator.js +828 -0
  17. package/dist/cascade-orchestrator.js.map +1 -0
  18. package/dist/cascade-write-strategy.d.ts +584 -0
  19. package/dist/cascade-write-strategy.d.ts.map +1 -0
  20. package/dist/cascade-write-strategy.js +590 -0
  21. package/dist/cascade-write-strategy.js.map +1 -0
  22. package/dist/ch-adapter.d.ts +358 -0
  23. package/dist/ch-adapter.d.ts.map +1 -0
  24. package/dist/ch-adapter.js +929 -0
  25. package/dist/ch-adapter.js.map +1 -0
  26. package/dist/client/index.d.ts +42 -0
  27. package/dist/client/index.d.ts.map +1 -0
  28. package/dist/client/index.js +43 -0
  29. package/dist/client/index.js.map +1 -0
  30. package/dist/client.d.ts +266 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +81 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/constants.d.ts +64 -1
  35. package/dist/constants.d.ts.map +1 -1
  36. package/dist/constants.js +52 -2
  37. package/dist/constants.js.map +1 -1
  38. package/dist/dataloader.d.ts +99 -0
  39. package/dist/dataloader.d.ts.map +1 -0
  40. package/dist/dataloader.js +225 -0
  41. package/dist/dataloader.js.map +1 -0
  42. package/dist/db-provider-port.d.ts +501 -0
  43. package/dist/db-provider-port.d.ts.map +1 -0
  44. package/dist/db-provider-port.js +113 -0
  45. package/dist/db-provider-port.js.map +1 -0
  46. package/dist/digital-objects-provider.d.ts +49 -0
  47. package/dist/digital-objects-provider.d.ts.map +1 -0
  48. package/dist/digital-objects-provider.js +55 -0
  49. package/dist/digital-objects-provider.js.map +1 -0
  50. package/dist/do-sqlite-adapter.d.ts +402 -0
  51. package/dist/do-sqlite-adapter.d.ts.map +1 -0
  52. package/dist/do-sqlite-adapter.js +745 -0
  53. package/dist/do-sqlite-adapter.js.map +1 -0
  54. package/dist/docs-rels/custom-types.d.ts +134 -0
  55. package/dist/docs-rels/custom-types.d.ts.map +1 -0
  56. package/dist/docs-rels/custom-types.js +70 -0
  57. package/dist/docs-rels/custom-types.js.map +1 -0
  58. package/dist/docs-rels/index.d.ts +16 -0
  59. package/dist/docs-rels/index.d.ts.map +1 -0
  60. package/dist/docs-rels/index.js +16 -0
  61. package/dist/docs-rels/index.js.map +1 -0
  62. package/dist/docs-rels/migrations/index.d.ts +30 -0
  63. package/dist/docs-rels/migrations/index.d.ts.map +1 -0
  64. package/dist/docs-rels/migrations/index.js +128 -0
  65. package/dist/docs-rels/migrations/index.js.map +1 -0
  66. package/dist/docs-rels/schema.d.ts +2961 -0
  67. package/dist/docs-rels/schema.d.ts.map +1 -0
  68. package/dist/docs-rels/schema.js +244 -0
  69. package/dist/docs-rels/schema.js.map +1 -0
  70. package/dist/durable-clickhouse.d.ts.map +1 -1
  71. package/dist/durable-clickhouse.js +16 -13
  72. package/dist/durable-clickhouse.js.map +1 -1
  73. package/dist/durable-promise.d.ts.map +1 -1
  74. package/dist/durable-promise.js +34 -15
  75. package/dist/durable-promise.js.map +1 -1
  76. package/dist/errors.d.ts +127 -0
  77. package/dist/errors.d.ts.map +1 -0
  78. package/dist/errors.js +210 -0
  79. package/dist/errors.js.map +1 -0
  80. package/dist/eventbridge.d.ts +117 -0
  81. package/dist/eventbridge.d.ts.map +1 -0
  82. package/dist/eventbridge.js +238 -0
  83. package/dist/eventbridge.js.map +1 -0
  84. package/dist/events.d.ts +2 -2
  85. package/dist/events.d.ts.map +1 -1
  86. package/dist/events.js +1 -1
  87. package/dist/events.js.map +1 -1
  88. package/dist/execution-queue.d.ts.map +1 -1
  89. package/dist/execution-queue.js +4 -5
  90. package/dist/execution-queue.js.map +1 -1
  91. package/dist/index.d.ts +35 -8
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +106 -6
  94. package/dist/index.js.map +1 -1
  95. package/dist/linguistic.d.ts +3 -108
  96. package/dist/linguistic.d.ts.map +1 -1
  97. package/dist/linguistic.js +3 -372
  98. package/dist/linguistic.js.map +1 -1
  99. package/dist/logger.d.ts +132 -0
  100. package/dist/logger.d.ts.map +1 -0
  101. package/dist/logger.js +137 -0
  102. package/dist/logger.js.map +1 -0
  103. package/dist/memory-provider.d.ts +128 -0
  104. package/dist/memory-provider.d.ts.map +1 -1
  105. package/dist/memory-provider.js +592 -257
  106. package/dist/memory-provider.js.map +1 -1
  107. package/dist/pg-adapter.d.ts +424 -0
  108. package/dist/pg-adapter.d.ts.map +1 -0
  109. package/dist/pg-adapter.js +921 -0
  110. package/dist/pg-adapter.js.map +1 -0
  111. package/dist/pipelines-iceberg-emitter.d.ts +327 -0
  112. package/dist/pipelines-iceberg-emitter.d.ts.map +1 -0
  113. package/dist/pipelines-iceberg-emitter.js +351 -0
  114. package/dist/pipelines-iceberg-emitter.js.map +1 -0
  115. package/dist/provider-capabilities.d.ts +146 -0
  116. package/dist/provider-capabilities.d.ts.map +1 -0
  117. package/dist/provider-capabilities.js +214 -0
  118. package/dist/provider-capabilities.js.map +1 -0
  119. package/dist/rdb-provider-adapter.d.ts +195 -0
  120. package/dist/rdb-provider-adapter.d.ts.map +1 -0
  121. package/dist/rdb-provider-adapter.js +291 -0
  122. package/dist/rdb-provider-adapter.js.map +1 -0
  123. package/dist/schema/cascade.d.ts +48 -17
  124. package/dist/schema/cascade.d.ts.map +1 -1
  125. package/dist/schema/cascade.js +477 -278
  126. package/dist/schema/cascade.js.map +1 -1
  127. package/dist/schema/definition-caches.d.ts +24 -0
  128. package/dist/schema/definition-caches.d.ts.map +1 -0
  129. package/dist/schema/definition-caches.js +26 -0
  130. package/dist/schema/definition-caches.js.map +1 -0
  131. package/dist/schema/dependency-graph.d.ts +21 -109
  132. package/dist/schema/dependency-graph.d.ts.map +1 -1
  133. package/dist/schema/dependency-graph.js +25 -333
  134. package/dist/schema/dependency-graph.js.map +1 -1
  135. package/dist/schema/diff.d.ts +103 -0
  136. package/dist/schema/diff.d.ts.map +1 -0
  137. package/dist/schema/diff.js +329 -0
  138. package/dist/schema/diff.js.map +1 -0
  139. package/dist/schema/entity-operations.d.ts +99 -0
  140. package/dist/schema/entity-operations.d.ts.map +1 -0
  141. package/dist/schema/entity-operations.js +818 -0
  142. package/dist/schema/entity-operations.js.map +1 -0
  143. package/dist/schema/index.d.ts +28 -34
  144. package/dist/schema/index.d.ts.map +1 -1
  145. package/dist/schema/index.js +454 -521
  146. package/dist/schema/index.js.map +1 -1
  147. package/dist/schema/migration.d.ts +205 -0
  148. package/dist/schema/migration.d.ts.map +1 -0
  149. package/dist/schema/migration.js +327 -0
  150. package/dist/schema/migration.js.map +1 -0
  151. package/dist/schema/nl-query-generator.d.ts +68 -0
  152. package/dist/schema/nl-query-generator.d.ts.map +1 -0
  153. package/dist/schema/nl-query-generator.js +362 -0
  154. package/dist/schema/nl-query-generator.js.map +1 -0
  155. package/dist/schema/nl-query.d.ts +65 -0
  156. package/dist/schema/nl-query.d.ts.map +1 -0
  157. package/dist/schema/nl-query.js +178 -0
  158. package/dist/schema/nl-query.js.map +1 -0
  159. package/dist/schema/parse.d.ts.map +1 -1
  160. package/dist/schema/parse.js +144 -89
  161. package/dist/schema/parse.js.map +1 -1
  162. package/dist/schema/provider.d.ts +37 -0
  163. package/dist/schema/provider.d.ts.map +1 -1
  164. package/dist/schema/provider.js +15 -7
  165. package/dist/schema/provider.js.map +1 -1
  166. package/dist/schema/resolve.d.ts +46 -5
  167. package/dist/schema/resolve.d.ts.map +1 -1
  168. package/dist/schema/resolve.js +237 -95
  169. package/dist/schema/resolve.js.map +1 -1
  170. package/dist/schema/search-utils.d.ts +76 -0
  171. package/dist/schema/search-utils.d.ts.map +1 -0
  172. package/dist/schema/search-utils.js +86 -0
  173. package/dist/schema/search-utils.js.map +1 -0
  174. package/dist/schema/seed.d.ts +53 -0
  175. package/dist/schema/seed.d.ts.map +1 -0
  176. package/dist/schema/seed.js +94 -0
  177. package/dist/schema/seed.js.map +1 -0
  178. package/dist/schema/semantic.d.ts +10 -0
  179. package/dist/schema/semantic.d.ts.map +1 -1
  180. package/dist/schema/semantic.js +192 -86
  181. package/dist/schema/semantic.js.map +1 -1
  182. package/dist/schema/sub-apis.d.ts +52 -0
  183. package/dist/schema/sub-apis.d.ts.map +1 -0
  184. package/dist/schema/sub-apis.js +216 -0
  185. package/dist/schema/sub-apis.js.map +1 -0
  186. package/dist/schema/system-entities.d.ts +42 -0
  187. package/dist/schema/system-entities.d.ts.map +1 -0
  188. package/dist/schema/system-entities.js +101 -0
  189. package/dist/schema/system-entities.js.map +1 -0
  190. package/dist/schema/types.d.ts +91 -9
  191. package/dist/schema/types.d.ts.map +1 -1
  192. package/dist/schema/union-fallback.d.ts.map +1 -1
  193. package/dist/schema/union-fallback.js +21 -15
  194. package/dist/schema/union-fallback.js.map +1 -1
  195. package/dist/schema/value-generators/ai.d.ts +54 -0
  196. package/dist/schema/value-generators/ai.d.ts.map +1 -0
  197. package/dist/schema/value-generators/ai.js +136 -0
  198. package/dist/schema/value-generators/ai.js.map +1 -0
  199. package/dist/schema/value-generators/index.d.ts +126 -0
  200. package/dist/schema/value-generators/index.d.ts.map +1 -0
  201. package/dist/schema/value-generators/index.js +219 -0
  202. package/dist/schema/value-generators/index.js.map +1 -0
  203. package/dist/schema/value-generators/placeholder.d.ts +52 -0
  204. package/dist/schema/value-generators/placeholder.d.ts.map +1 -0
  205. package/dist/schema/value-generators/placeholder.js +328 -0
  206. package/dist/schema/value-generators/placeholder.js.map +1 -0
  207. package/dist/schema/value-generators/types.d.ts +116 -0
  208. package/dist/schema/value-generators/types.d.ts.map +1 -0
  209. package/dist/schema/value-generators/types.js +11 -0
  210. package/dist/schema/value-generators/types.js.map +1 -0
  211. package/dist/schema/version.d.ts +111 -0
  212. package/dist/schema/version.d.ts.map +1 -0
  213. package/dist/schema/version.js +190 -0
  214. package/dist/schema/version.js.map +1 -0
  215. package/dist/schema.d.ts +1095 -24
  216. package/dist/schema.d.ts.map +1 -1
  217. package/dist/schema.js +2852 -40
  218. package/dist/schema.js.map +1 -1
  219. package/dist/semantic-vectors.d.ts +39 -0
  220. package/dist/semantic-vectors.d.ts.map +1 -0
  221. package/dist/semantic-vectors.js +334 -0
  222. package/dist/semantic-vectors.js.map +1 -0
  223. package/dist/semantic.d.ts +29 -1
  224. package/dist/semantic.d.ts.map +1 -1
  225. package/dist/semantic.js +26 -16
  226. package/dist/semantic.js.map +1 -1
  227. package/dist/telemetry.d.ts +128 -0
  228. package/dist/telemetry.d.ts.map +1 -0
  229. package/dist/telemetry.js +305 -0
  230. package/dist/telemetry.js.map +1 -0
  231. package/dist/tests.d.ts.map +1 -1
  232. package/dist/tests.js +30 -22
  233. package/dist/tests.js.map +1 -1
  234. package/dist/type-guards.d.ts +50 -5
  235. package/dist/type-guards.d.ts.map +1 -1
  236. package/dist/type-guards.js +87 -16
  237. package/dist/type-guards.js.map +1 -1
  238. package/dist/types.d.ts +33 -245
  239. package/dist/types.d.ts.map +1 -1
  240. package/dist/types.js +62 -72
  241. package/dist/types.js.map +1 -1
  242. package/dist/validation.d.ts +2 -5
  243. package/dist/validation.d.ts.map +1 -1
  244. package/dist/validation.js +65 -93
  245. package/dist/validation.js.map +1 -1
  246. package/dist/worker/db-provider.d.ts +168 -0
  247. package/dist/worker/db-provider.d.ts.map +1 -0
  248. package/dist/worker/db-provider.js +277 -0
  249. package/dist/worker/db-provider.js.map +1 -0
  250. package/dist/worker/index.d.ts +35 -0
  251. package/dist/worker/index.d.ts.map +1 -0
  252. package/dist/worker/index.js +37 -0
  253. package/dist/worker/index.js.map +1 -0
  254. package/dist/worker.d.ts +779 -0
  255. package/dist/worker.d.ts.map +1 -0
  256. package/dist/worker.js +2786 -0
  257. package/dist/worker.js.map +1 -0
  258. package/package.json +46 -16
  259. package/src/docs-rels/migrations/0001-init.sql +125 -0
  260. package/LICENSE +0 -21
package/dist/index.js CHANGED
@@ -38,7 +38,9 @@ export {
38
38
  // Thing conversion utilities
39
39
  toExpanded, toFlat,
40
40
  // Configuration
41
- setProvider, setNLQueryGenerator,
41
+ setProvider, setNLQueryGenerator, getNLQueryGenerator,
42
+ // AI Generation configuration
43
+ configureAIGeneration, getAIGenerationConfig,
42
44
  // Schema parsing
43
45
  parseSchema,
44
46
  // Schema Definition
@@ -48,13 +50,29 @@ conjugate, pluralize, singularize, inferNoun, Type,
48
50
  // URL utilities
49
51
  resolveUrl, resolveShortUrl, parseUrl,
50
52
  // Verb derivation
51
- FORWARD_TO_REVERSE, BIDIRECTIONAL_PAIRS, deriveReverseVerb, fieldNameToVerb, isPassiveVerb, registerVerbPair, registerBidirectionalPair, registerFieldVerb, } from './schema.js';
52
- export { MemoryProvider, createMemoryProvider, Semaphore, } from './memory-provider.js';
53
+ FORWARD_TO_REVERSE, BIDIRECTIONAL_PAIRS, deriveReverseVerb, fieldNameToVerb, isPassiveVerb, registerVerbPair, registerBidirectionalPair, registerFieldVerb,
54
+ // Entity operations
55
+ createEntityOperations, createEdgeEntityOperations,
56
+ // NL Query execution
57
+ buildNLQueryContext, executeNLQuery, createNLQueryFn,
58
+ // Schema versioning
59
+ computeSchemaHash, getSchemaVersion, setSchemaVersion,
60
+ // Schema diff
61
+ diffSchemas,
62
+ // Migrations
63
+ defineMigration, runMigrations, } from './schema.js';
64
+ export { MemoryProvider, MemoryTransaction, createMemoryProvider, Semaphore, } from './memory-provider.js';
65
+ export { DataLoader, createRequestLoader, getRequestLoader, clearRequestLoader, withDataLoader, loadEntity, } from './dataloader.js';
66
+ export { createDigitalObjectsProvider } from './digital-objects-provider.js';
53
67
  // =============================================================================
54
68
  // Events API - Public event subscription and emission
55
69
  // =============================================================================
56
70
  // Export event utilities and constants
57
- export { StandardEventTypes, entityEvent, typePattern, actionPattern, } from './events.js';
71
+ export { StandardEventTypes, entityEvent, typePattern, actionPattern } from './events.js';
72
+ // =============================================================================
73
+ // EventBridge - Cloudflare Queues integration
74
+ // =============================================================================
75
+ export { createEventBridge, createEventBridgeAPI } from './eventbridge.js';
58
76
  // =============================================================================
59
77
  // Actions API - Durable execution for long-running operations
60
78
  // =============================================================================
@@ -63,7 +81,11 @@ export { ActionStatuses, isTerminal, isInProgress, canRetry, canCancel, getProgr
63
81
  // Promise pipelining exports
64
82
  export { DBPromise, isDBPromise, getRawDBPromise, createListPromise, createEntityPromise, createSearchPromise, wrapEntityOperations, setProviderResolver, setSchemaRelationInfo, DB_PROMISE_SYMBOL, RAW_DB_PROMISE_SYMBOL, } from './ai-promise-db.js';
65
83
  // Semantic Search exports
66
- export { cosineSimilarity, computeRRF, extractEmbeddableText, generateContentHash, createMockSemanticProvider, } from './semantic.js';
84
+ export { cosineSimilarity, computeRRF, extractEmbeddableText, generateContentHash,
85
+ // NOTE: createMockSemanticProvider has been moved to test utilities.
86
+ // Import from '../test/utils/mock-semantic.js' for testing.
87
+ // The export is kept here temporarily for backward compatibility but is deprecated.
88
+ createMockSemanticProvider, } from './semantic.js';
67
89
  export {
68
90
  // Standard definitions
69
91
  StandardHierarchies, StandardPermissions, CRUDPermissions, createStandardRoles,
@@ -89,9 +111,87 @@ getBatchScheduler, setBatchScheduler, } from './durable-promise.js';
89
111
  // Execution queue for priority-based scheduling
90
112
  export { ExecutionQueue, createExecutionQueue, getDefaultQueue, setDefaultQueue, } from './execution-queue.js';
91
113
  // ClickHouse-backed durable provider
92
- export { ClickHouseDurableProvider, createClickHouseDurableProvider, } from './durable-clickhouse.js';
114
+ export { ClickHouseDurableProvider, createClickHouseDurableProvider } from './durable-clickhouse.js';
93
115
  // =============================================================================
94
116
  // Generation Context - Context accumulation across cascading generations
95
117
  // =============================================================================
96
118
  export { GenerationContext, createGenerationContext, ContextOverflowError, } from './schema/generation-context.js';
119
+ // =============================================================================
120
+ // Error Handling - Custom error classes with context
121
+ // =============================================================================
122
+ export {
123
+ // Utility functions
124
+ isNotFoundError, isEntityExistsError, isExpectedError, wrapDatabaseError,
125
+ // Base error class
126
+ DatabaseError,
127
+ // Custom error classes
128
+ EntityNotFoundError, EntityAlreadyExistsError, ValidationError, AIGenerationError, SemanticSearchError, VectorSearchUnavailableError,
129
+ // Capability errors (re-exported from provider-capabilities)
130
+ CapabilityNotSupportedError, isCapabilityNotSupportedError, } from './errors.js';
131
+ // =============================================================================
132
+ // Provider Capabilities - Runtime feature detection
133
+ // =============================================================================
134
+ export { detectCapabilities, requireCapability, warnIfUnavailable, clearCapabilityCache, clearWarningHistory, PROVIDER_CAPABILITY_MATRIX, } from './provider-capabilities.js';
135
+ export { createMemoryProvider as createDigitalObjectsMemoryProvider } from 'digital-objects';
136
+ // =============================================================================
137
+ // Shared Constants
138
+ // =============================================================================
139
+ export { RelationOperator, DEFAULT_EMBEDDING_DIMENSIONS, EMBEDDING_DIMENSIONS, } from './constants.js';
140
+ // =============================================================================
141
+ // RDB Provider Adapter - Bridges RDB and ai-database DBProvider interfaces
142
+ // =============================================================================
143
+ export { RDBProviderAdapter, createRDBAdapter } from './rdb-provider-adapter.js';
144
+ // =============================================================================
145
+ // DO SQLite Adapter — Stack B transactional DBProvider
146
+ // =============================================================================
147
+ // Per ADR-0003: per-cascade DO isolation gives parallel write paths each at
148
+ // full single-DO throughput, the enabling pattern for cascade-heavy workloads.
149
+ export { DOSqliteAdapter, createDOSqliteAdapter, ShardingStrategies } from './do-sqlite-adapter.js';
150
+ // =============================================================================
151
+ // Postgres + pgvector Adapter — Stack A transactional DBProvider
152
+ // =============================================================================
153
+ // Per ADR-0003: Stack A's transactional layer. Bulk-VALUES CTE write path
154
+ // (91ms p50 for 500 docs+499 rels via Neon HTTP per substrate-write-probes).
155
+ export { PostgresProvider, createPostgresProvider, createNeonHttpExecutor, createPgClientExecutor, bootstrapSchema as bootstrapPostgresSchema, } from './pg-adapter.js';
156
+ // =============================================================================
157
+ // ClickHouse Adapter — Stack A analytics DBProvider
158
+ // =============================================================================
159
+ // Per ADR-0003: Tier 3 first-class on ClickHouse. Native vector functions for
160
+ // Tier 4 (up to 64,000 dims; cosine/L2/dot). Bulk JSONEachRow write path.
161
+ export { ClickHouseProvider, createClickHouseProvider, createClickHouseHttpFetcher, bootstrapClickHouseSchema, } from './ch-adapter.js';
162
+ // =============================================================================
163
+ // Cascade Write Strategy — sharded parallel writes (Phase 2 entry; aip-g1i9)
164
+ // =============================================================================
165
+ // Per ADR-0003: cascade orchestrator must write through a partition-aware
166
+ // adapter. This module is the *primitive* the orchestrator (`aip-8yal`) calls.
167
+ // PG path uses the CTE jsonb-bulk shape proven by the substrate-write-probes
168
+ // (91ms p50 / 500 docs+499 rels on Neon HTTP); DO SQLite path routes through
169
+ // the per-cascade DO via the adapter's `withContext` binding.
170
+ export { CascadeWriteStrategy, CascadeShardingStrategies, createCascadeWriteStrategy, buildPgCommitBatchSql, resolveDOIdName, chunkBatch, } from './cascade-write-strategy.js';
171
+ // =============================================================================
172
+ // Pipelines → Iceberg analytical fan-out emitter (aip-0ypt)
173
+ // =============================================================================
174
+ // Per ADR-0003: Stack B's dual-write pattern. DO SQLite is the transactional
175
+ // source of truth; Cloudflare Pipelines fans out into R2 Iceberg as the
176
+ // analytical SOR. The emitter is fire-and-forget on the cascade hot path —
177
+ // failures are logged and swallowed so analytical fan-out can never break
178
+ // cascade correctness.
179
+ export { createPipelinesIcebergEmitter, createHttpPipelinesIcebergEmitter, } from './pipelines-iceberg-emitter.js';
180
+ // =============================================================================
181
+ // Cascade Orchestrator — the moat work (aip-8yal)
182
+ // =============================================================================
183
+ // Real LLM-driven cascade generation built on the canonical SVO foundation:
184
+ // AIPromise-style generate() from ai-functions, ModelPolicy from
185
+ // language-models for retry/fallback, BatchProvider-shaped sibling-parallel
186
+ // fan-out, CascadeWriteStrategy for sharded writes, embed-on-write, and
187
+ // rubric-style $validate with four verdict policies. Replaces the
188
+ // PlaceholderValueGenerator path for the SVO surface.
189
+ export { generateCascade, buildEmbedText, CascadeValidationEscalation, } from './cascade-orchestrator.js';
190
+ // =============================================================================
191
+ // DBProvider Port — SVO-shaped contract with declared capability tiers
192
+ // =============================================================================
193
+ // Per ADR-0003: Tier 1+2 are universal (shape unchanged from `schema/provider`);
194
+ // Tier 3 (analytics) and Tier 4 (vector search) are declared per-adapter.
195
+ // Sharding model is declared so cascade write strategy can pick the right adapter.
196
+ export { DEFAULT_TIER_CAPABILITIES, getProviderCapabilities, hasActionRecording, hasVerbRegistry, hasVectorSearch, hasAnalytics, } from './db-provider-port.js';
97
197
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AA8EhC,OAAO;AACL,6BAA6B;AAC7B,UAAU,EACV,MAAM;AACN,gBAAgB;AAChB,WAAW,EACX,mBAAmB;AACnB,iBAAiB;AACjB,WAAW;AACX,oBAAoB;AACpB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,KAAK;AACL,eAAe;AACf,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,EACT,IAAI;AACJ,gBAAgB;AAChB,UAAU,EACV,eAAe,EACf,QAAQ;AACR,kBAAkB;AAClB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,SAAS,GACV,MAAM,sBAAsB,CAAA;AAc7B,gFAAgF;AAChF,sDAAsD;AACtD,gFAAgF;AAEhF,uCAAuC;AACvC,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,aAAa,CAAA;AAIpB,gFAAgF;AAChF,8DAA8D;AAC9D,gFAAgF;AAEhF,wCAAwC;AACxC,OAAO,EACL,cAAc,EACd,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAIrB,6BAA6B;AAC7B,OAAO,EACL,SAAS,EACT,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAU3B,0BAA0B;AAC1B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,eAAe,CAAA;AA4DtB,OAAO;AACL,uBAAuB;AACvB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,mBAAmB;AAEnB,0BAA0B;AAC1B,cAAc,EACd,eAAe,EACf,iBAAiB;AAEjB,mBAAmB;AACnB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe;AAEf,qBAAqB;AACrB,aAAa,EACb,gBAAgB;AAEhB,mBAAmB;AACnB,2BAA2B;AAE3B,QAAQ;AACR,QAAQ,EACR,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAmC3B,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAEhF,+BAA+B;AAC/B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,sBAAsB;AACtB,qBAAqB;AACrB,iBAAiB,EACjB,WAAW,EACX,iBAAiB;AACjB,kBAAkB;AAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,sBAAsB,CAAA;AAS7B,gDAAgD;AAChD,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,eAAe,GAChB,MAAM,sBAAsB,CAAA;AAY7B,qCAAqC;AACrC,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,yBAAyB,CAAA;AAOhC,gFAAgF;AAChF,yEAAyE;AACzE,gFAAgF;AAEhF,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,gCAAgC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,115 +1,10 @@
1
1
  /**
2
- * Linguistic Helpers
2
+ * Linguistic utilities - re-exported from @graphdl/core
3
3
  *
4
- * Utilities for verb conjugation, noun pluralization, and linguistic inference.
4
+ * Provides verb conjugation, noun pluralization, and linguistic inference.
5
5
  * Used for auto-generating forms, events, and semantic metadata.
6
6
  *
7
7
  * @packageDocumentation
8
8
  */
9
- import { Verbs, type Noun, type Verb, type TypeMeta } from './types.js';
10
- /**
11
- * Auto-conjugate a verb from just the base form
12
- *
13
- * Given just "publish", generates all forms:
14
- * - actor: publisher
15
- * - act: publishes
16
- * - activity: publishing
17
- * - result: publication
18
- * - reverse: { at: publishedAt, by: publishedBy, ... }
19
- *
20
- * @example
21
- * ```ts
22
- * conjugate('publish')
23
- * // => { action: 'publish', actor: 'publisher', act: 'publishes', activity: 'publishing', ... }
24
- *
25
- * conjugate('create')
26
- * // => { action: 'create', actor: 'creator', act: 'creates', activity: 'creating', ... }
27
- * ```
28
- */
29
- export declare function conjugate(action: string): Verb;
30
- /**
31
- * Auto-pluralize a noun
32
- *
33
- * @example
34
- * ```ts
35
- * pluralize('post') // => 'posts'
36
- * pluralize('category') // => 'categories'
37
- * pluralize('person') // => 'people'
38
- * pluralize('child') // => 'children'
39
- * ```
40
- */
41
- export declare function pluralize(singular: string): string;
42
- /**
43
- * Auto-singularize a noun (reverse of pluralize)
44
- *
45
- * @example
46
- * ```ts
47
- * singularize('posts') // => 'post'
48
- * singularize('categories') // => 'category'
49
- * singularize('people') // => 'person'
50
- * ```
51
- */
52
- export declare function singularize(plural: string): string;
53
- /**
54
- * Infer a complete Noun from just a type name
55
- *
56
- * @example
57
- * ```ts
58
- * inferNoun('BlogPost')
59
- * // => { singular: 'blog post', plural: 'blog posts', ... }
60
- *
61
- * inferNoun('Category')
62
- * // => { singular: 'category', plural: 'categories', ... }
63
- * ```
64
- */
65
- export declare function inferNoun(typeName: string): Noun;
66
- /**
67
- * Create TypeMeta from a type name - all linguistic forms auto-inferred
68
- *
69
- * @example
70
- * ```ts
71
- * const meta = createTypeMeta('BlogPost')
72
- * meta.singular // 'blog post'
73
- * meta.plural // 'blog posts'
74
- * meta.slug // 'blog-post'
75
- * meta.created // 'BlogPost.created'
76
- * meta.createdAt // 'createdAt'
77
- * meta.creator // 'creator'
78
- * ```
79
- */
80
- export declare function createTypeMeta(typeName: string): TypeMeta;
81
- /**
82
- * Get or create TypeMeta for a type name (cached)
83
- */
84
- export declare function getTypeMeta(typeName: string): TypeMeta;
85
- /**
86
- * Type proxy - provides dynamic access to type metadata
87
- *
88
- * @example
89
- * ```ts
90
- * const Post = Type('Post')
91
- * Post.singular // 'post'
92
- * Post.plural // 'posts'
93
- * Post.created // 'Post.created'
94
- *
95
- * // In event handlers:
96
- * on.create(thing => {
97
- * console.log(thing.$type.plural) // 'posts'
98
- * })
99
- * ```
100
- */
101
- export declare function Type(name: string): TypeMeta;
102
- /**
103
- * Get reverse property names for a verb action
104
- *
105
- * @example
106
- * ```ts
107
- * getVerbFields('create')
108
- * // => { at: 'createdAt', by: 'createdBy', in: 'createdIn', for: 'createdFor' }
109
- *
110
- * getVerbFields('publish')
111
- * // => { at: 'publishedAt', by: 'publishedBy' }
112
- * ```
113
- */
114
- export declare function getVerbFields(action: keyof typeof Verbs): Record<string, string>;
9
+ export { conjugate, pluralize, singularize, inferNoun, createTypeMeta, getTypeMeta, Type, getVerbFields, capitalize, preserveCase, isVowel, splitCamelCase, toKebabCase, toPastParticiple, toActor, toPresent, toGerund, toResult, clearTypeMetaCache, } from '@graphdl/core';
115
10
  //# sourceMappingURL=linguistic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"linguistic.d.ts","sourceRoot":"","sources":["../src/linguistic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AA0GvE;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAsB9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAsDlD;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoDlD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAWhD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAwBzD;AAKD;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAOtD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAE3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,OAAO,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEhF"}
1
+ {"version":3,"file":"linguistic.d.ts","sourceRoot":"","sources":["../src/linguistic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,EACT,cAAc,EACd,WAAW,EACX,IAAI,EACJ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,OAAO,EACP,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,kBAAkB,GACnB,MAAM,eAAe,CAAA"}
@@ -1,379 +1,10 @@
1
1
  /**
2
- * Linguistic Helpers
2
+ * Linguistic utilities - re-exported from @graphdl/core
3
3
  *
4
- * Utilities for verb conjugation, noun pluralization, and linguistic inference.
4
+ * Provides verb conjugation, noun pluralization, and linguistic inference.
5
5
  * Used for auto-generating forms, events, and semantic metadata.
6
6
  *
7
7
  * @packageDocumentation
8
8
  */
9
- import { Verbs } from './types.js';
10
- // =============================================================================
11
- // Internal Helpers
12
- // =============================================================================
13
- function capitalize(s) {
14
- return s.charAt(0).toUpperCase() + s.slice(1);
15
- }
16
- function preserveCase(original, replacement) {
17
- if (original[0] === original[0]?.toUpperCase()) {
18
- return capitalize(replacement);
19
- }
20
- return replacement;
21
- }
22
- function isVowel(char) {
23
- return char ? 'aeiou'.includes(char.toLowerCase()) : false;
24
- }
25
- function splitCamelCase(s) {
26
- return s.replace(/([a-z])([A-Z])/g, '$1 $2').split(' ');
27
- }
28
- /** Check if we should double the final consonant (CVC pattern) */
29
- function shouldDoubleConsonant(verb) {
30
- if (verb.length < 2)
31
- return false;
32
- const last = verb[verb.length - 1];
33
- const secondLast = verb[verb.length - 2];
34
- // Don't double w, x, y
35
- if ('wxy'.includes(last))
36
- return false;
37
- // Must end in consonant preceded by vowel
38
- if (isVowel(last) || !isVowel(secondLast))
39
- return false;
40
- // Common verbs that double the final consonant
41
- const doublingVerbs = ['submit', 'commit', 'permit', 'omit', 'admit', 'emit', 'transmit', 'refer', 'prefer', 'defer', 'occur', 'recur', 'begin', 'stop', 'drop', 'shop', 'plan', 'scan', 'ban', 'run', 'gun', 'stun', 'cut', 'shut', 'hit', 'sit', 'fit', 'spit', 'quit', 'knit', 'get', 'set', 'pet', 'wet', 'bet', 'let', 'put', 'drag', 'brag', 'flag', 'tag', 'bag', 'nag', 'wag', 'hug', 'bug', 'mug', 'tug', 'rub', 'scrub', 'grab', 'stab', 'rob', 'sob', 'throb', 'nod', 'prod', 'plod', 'plot', 'rot', 'blot', 'spot', 'knot', 'trot', 'chat', 'pat', 'bat', 'mat', 'rat', 'slap', 'clap', 'flap', 'tap', 'wrap', 'snap', 'trap', 'cap', 'map', 'nap', 'zap', 'tip', 'sip', 'dip', 'rip', 'zip', 'slip', 'trip', 'drip', 'chip', 'clip', 'flip', 'grip', 'ship', 'skip', 'whip', 'strip', 'equip', 'hop', 'pop', 'mop', 'cop', 'chop', 'crop', 'prop', 'flop', 'swim', 'trim', 'slim', 'skim', 'dim', 'rim', 'brim', 'grim', 'hem', 'stem', 'jam', 'cram', 'ram', 'slam', 'dam', 'ham', 'scam', 'spam', 'tram', 'hum', 'drum', 'strum', 'sum', 'gum', 'chum', 'plum'];
42
- // Short words (3 letters) almost always double
43
- if (verb.length <= 3)
44
- return true;
45
- // Check if verb matches any known doubling pattern
46
- return doublingVerbs.some(v => verb === v || verb.endsWith(v));
47
- }
48
- /** Convert verb to past participle (create → created, publish → published) */
49
- function toPastParticiple(verb) {
50
- if (verb.endsWith('e'))
51
- return verb + 'd';
52
- if (verb.endsWith('y') && !isVowel(verb[verb.length - 2])) {
53
- return verb.slice(0, -1) + 'ied';
54
- }
55
- if (shouldDoubleConsonant(verb)) {
56
- return verb + verb[verb.length - 1] + 'ed';
57
- }
58
- return verb + 'ed';
59
- }
60
- /** Convert verb to actor noun (create → creator, publish → publisher) */
61
- function toActor(verb) {
62
- if (verb.endsWith('e'))
63
- return verb + 'r';
64
- if (verb.endsWith('y') && !isVowel(verb[verb.length - 2])) {
65
- return verb.slice(0, -1) + 'ier';
66
- }
67
- if (shouldDoubleConsonant(verb)) {
68
- return verb + verb[verb.length - 1] + 'er';
69
- }
70
- return verb + 'er';
71
- }
72
- /** Convert verb to present 3rd person (create → creates, publish → publishes) */
73
- function toPresent(verb) {
74
- if (verb.endsWith('y') && !isVowel(verb[verb.length - 2])) {
75
- return verb.slice(0, -1) + 'ies';
76
- }
77
- if (verb.endsWith('s') || verb.endsWith('x') || verb.endsWith('z') ||
78
- verb.endsWith('ch') || verb.endsWith('sh')) {
79
- return verb + 'es';
80
- }
81
- return verb + 's';
82
- }
83
- /** Convert verb to gerund (create → creating, publish → publishing) */
84
- function toGerund(verb) {
85
- if (verb.endsWith('ie'))
86
- return verb.slice(0, -2) + 'ying';
87
- if (verb.endsWith('e') && !verb.endsWith('ee'))
88
- return verb.slice(0, -1) + 'ing';
89
- if (shouldDoubleConsonant(verb)) {
90
- return verb + verb[verb.length - 1] + 'ing';
91
- }
92
- return verb + 'ing';
93
- }
94
- /** Convert verb to result noun (create → creation, publish → publication) */
95
- function toResult(verb) {
96
- // Common -ate → -ation
97
- if (verb.endsWith('ate'))
98
- return verb.slice(0, -1) + 'ion';
99
- // Common -ify → -ification
100
- if (verb.endsWith('ify'))
101
- return verb.slice(0, -1) + 'ication';
102
- // Common -ize → -ization
103
- if (verb.endsWith('ize'))
104
- return verb.slice(0, -1) + 'ation';
105
- // Common -e → -ion (but not always correct)
106
- if (verb.endsWith('e'))
107
- return verb.slice(0, -1) + 'ion';
108
- // Default: just add -ion
109
- return verb + 'ion';
110
- }
111
- // =============================================================================
112
- // Public API
113
- // =============================================================================
114
- /**
115
- * Auto-conjugate a verb from just the base form
116
- *
117
- * Given just "publish", generates all forms:
118
- * - actor: publisher
119
- * - act: publishes
120
- * - activity: publishing
121
- * - result: publication
122
- * - reverse: { at: publishedAt, by: publishedBy, ... }
123
- *
124
- * @example
125
- * ```ts
126
- * conjugate('publish')
127
- * // => { action: 'publish', actor: 'publisher', act: 'publishes', activity: 'publishing', ... }
128
- *
129
- * conjugate('create')
130
- * // => { action: 'create', actor: 'creator', act: 'creates', activity: 'creating', ... }
131
- * ```
132
- */
133
- export function conjugate(action) {
134
- // Check if it's a known verb first
135
- if (action in Verbs) {
136
- return Verbs[action];
137
- }
138
- const base = action.toLowerCase();
139
- const pastParticiple = toPastParticiple(base);
140
- return {
141
- action: base,
142
- actor: toActor(base),
143
- act: toPresent(base),
144
- activity: toGerund(base),
145
- result: toResult(base),
146
- reverse: {
147
- at: `${pastParticiple}At`,
148
- by: `${pastParticiple}By`,
149
- in: `${pastParticiple}In`,
150
- for: `${pastParticiple}For`,
151
- },
152
- };
153
- }
154
- /**
155
- * Auto-pluralize a noun
156
- *
157
- * @example
158
- * ```ts
159
- * pluralize('post') // => 'posts'
160
- * pluralize('category') // => 'categories'
161
- * pluralize('person') // => 'people'
162
- * pluralize('child') // => 'children'
163
- * ```
164
- */
165
- export function pluralize(singular) {
166
- const lower = singular.toLowerCase();
167
- // Irregular plurals
168
- const irregulars = {
169
- person: 'people',
170
- child: 'children',
171
- man: 'men',
172
- woman: 'women',
173
- foot: 'feet',
174
- tooth: 'teeth',
175
- goose: 'geese',
176
- mouse: 'mice',
177
- ox: 'oxen',
178
- leaf: 'leaves',
179
- life: 'lives',
180
- knife: 'knives',
181
- wife: 'wives',
182
- half: 'halves',
183
- self: 'selves',
184
- calf: 'calves',
185
- analysis: 'analyses',
186
- crisis: 'crises',
187
- thesis: 'theses',
188
- datum: 'data',
189
- medium: 'media',
190
- criterion: 'criteria',
191
- phenomenon: 'phenomena',
192
- };
193
- if (irregulars[lower]) {
194
- return preserveCase(singular, irregulars[lower]);
195
- }
196
- // Rules for regular plurals
197
- if (lower.endsWith('y') && !isVowel(lower[lower.length - 2])) {
198
- return singular.slice(0, -1) + 'ies';
199
- }
200
- // Words ending in z that double: quiz → quizzes, fez → fezzes
201
- if (lower.endsWith('z') && !lower.endsWith('zz')) {
202
- return singular + 'zes';
203
- }
204
- if (lower.endsWith('s') || lower.endsWith('x') || lower.endsWith('zz') ||
205
- lower.endsWith('ch') || lower.endsWith('sh')) {
206
- return singular + 'es';
207
- }
208
- if (lower.endsWith('f')) {
209
- return singular.slice(0, -1) + 'ves';
210
- }
211
- if (lower.endsWith('fe')) {
212
- return singular.slice(0, -2) + 'ves';
213
- }
214
- return singular + 's';
215
- }
216
- /**
217
- * Auto-singularize a noun (reverse of pluralize)
218
- *
219
- * @example
220
- * ```ts
221
- * singularize('posts') // => 'post'
222
- * singularize('categories') // => 'category'
223
- * singularize('people') // => 'person'
224
- * ```
225
- */
226
- export function singularize(plural) {
227
- const lower = plural.toLowerCase();
228
- // Irregular singulars
229
- const irregulars = {
230
- people: 'person',
231
- children: 'child',
232
- men: 'man',
233
- women: 'woman',
234
- feet: 'foot',
235
- teeth: 'tooth',
236
- geese: 'goose',
237
- mice: 'mouse',
238
- oxen: 'ox',
239
- leaves: 'leaf',
240
- lives: 'life',
241
- knives: 'knife',
242
- wives: 'wife',
243
- halves: 'half',
244
- selves: 'self',
245
- calves: 'calf',
246
- analyses: 'analysis',
247
- crises: 'crisis',
248
- theses: 'thesis',
249
- data: 'datum',
250
- media: 'medium',
251
- criteria: 'criterion',
252
- phenomena: 'phenomenon',
253
- };
254
- if (irregulars[lower]) {
255
- return preserveCase(plural, irregulars[lower]);
256
- }
257
- // Rules for regular singulars
258
- if (lower.endsWith('ies')) {
259
- return plural.slice(0, -3) + 'y';
260
- }
261
- if (lower.endsWith('ves')) {
262
- return plural.slice(0, -3) + 'f';
263
- }
264
- if (lower.endsWith('es') && (lower.endsWith('sses') || lower.endsWith('xes') || lower.endsWith('zes') ||
265
- lower.endsWith('ches') || lower.endsWith('shes'))) {
266
- return plural.slice(0, -2);
267
- }
268
- if (lower.endsWith('s') && !lower.endsWith('ss')) {
269
- return plural.slice(0, -1);
270
- }
271
- return plural;
272
- }
273
- /**
274
- * Infer a complete Noun from just a type name
275
- *
276
- * @example
277
- * ```ts
278
- * inferNoun('BlogPost')
279
- * // => { singular: 'blog post', plural: 'blog posts', ... }
280
- *
281
- * inferNoun('Category')
282
- * // => { singular: 'category', plural: 'categories', ... }
283
- * ```
284
- */
285
- export function inferNoun(typeName) {
286
- const words = splitCamelCase(typeName);
287
- const singular = words.join(' ').toLowerCase();
288
- const plural = words.slice(0, -1).concat(pluralize(words[words.length - 1])).join(' ').toLowerCase();
289
- return {
290
- singular,
291
- plural,
292
- actions: ['create', 'update', 'delete'],
293
- events: ['created', 'updated', 'deleted'],
294
- };
295
- }
296
- /**
297
- * Create TypeMeta from a type name - all linguistic forms auto-inferred
298
- *
299
- * @example
300
- * ```ts
301
- * const meta = createTypeMeta('BlogPost')
302
- * meta.singular // 'blog post'
303
- * meta.plural // 'blog posts'
304
- * meta.slug // 'blog-post'
305
- * meta.created // 'BlogPost.created'
306
- * meta.createdAt // 'createdAt'
307
- * meta.creator // 'creator'
308
- * ```
309
- */
310
- export function createTypeMeta(typeName) {
311
- const noun = inferNoun(typeName);
312
- const slug = noun.singular.replace(/\s+/g, '-');
313
- const slugPlural = noun.plural.replace(/\s+/g, '-');
314
- return {
315
- name: typeName,
316
- singular: noun.singular,
317
- plural: noun.plural,
318
- slug,
319
- slugPlural,
320
- // From Verbs.create
321
- creator: 'creator',
322
- createdAt: 'createdAt',
323
- createdBy: 'createdBy',
324
- updatedAt: 'updatedAt',
325
- updatedBy: 'updatedBy',
326
- // Event types
327
- created: `${typeName}.created`,
328
- updated: `${typeName}.updated`,
329
- deleted: `${typeName}.deleted`,
330
- };
331
- }
332
- /** Cache of TypeMeta by type name */
333
- const typeMetaCache = new Map();
334
- /**
335
- * Get or create TypeMeta for a type name (cached)
336
- */
337
- export function getTypeMeta(typeName) {
338
- let meta = typeMetaCache.get(typeName);
339
- if (!meta) {
340
- meta = createTypeMeta(typeName);
341
- typeMetaCache.set(typeName, meta);
342
- }
343
- return meta;
344
- }
345
- /**
346
- * Type proxy - provides dynamic access to type metadata
347
- *
348
- * @example
349
- * ```ts
350
- * const Post = Type('Post')
351
- * Post.singular // 'post'
352
- * Post.plural // 'posts'
353
- * Post.created // 'Post.created'
354
- *
355
- * // In event handlers:
356
- * on.create(thing => {
357
- * console.log(thing.$type.plural) // 'posts'
358
- * })
359
- * ```
360
- */
361
- export function Type(name) {
362
- return getTypeMeta(name);
363
- }
364
- /**
365
- * Get reverse property names for a verb action
366
- *
367
- * @example
368
- * ```ts
369
- * getVerbFields('create')
370
- * // => { at: 'createdAt', by: 'createdBy', in: 'createdIn', for: 'createdFor' }
371
- *
372
- * getVerbFields('publish')
373
- * // => { at: 'publishedAt', by: 'publishedBy' }
374
- * ```
375
- */
376
- export function getVerbFields(action) {
377
- return Verbs[action]?.reverse ?? {};
378
- }
9
+ export { conjugate, pluralize, singularize, inferNoun, createTypeMeta, getTypeMeta, Type, getVerbFields, capitalize, preserveCase, isVowel, splitCamelCase, toKebabCase, toPastParticiple, toActor, toPresent, toGerund, toResult, clearTypeMetaCache, } from '@graphdl/core';
379
10
  //# sourceMappingURL=linguistic.js.map