@@ -67,6 +67,12 @@ import {
6767 introspectTable ,
6868} from "./utils/introspect" ;
6969
70+ export const TABLECRAFT_EXTENSIONS_KEY : unique symbol = Symbol . for ( "__tablecraft_ext" ) as any ;
71+
72+ export type TableConfigWithExtensions < T extends Table = Table > = TableConfig & {
73+ [ TABLECRAFT_EXTENSIONS_KEY ] ?: RuntimeExtensions < T > ;
74+ } ;
75+
7076type InferColumns < T > = T extends { _ : { columns : infer C } }
7177 ? keyof C & string
7278 : string ;
@@ -113,7 +119,7 @@ export interface RuntimeExtensions<T extends Table = Table> {
113119 } ;
114120}
115121
116- function emptyExtensions < T extends Table = Table > ( ) : RuntimeExtensions < T > {
122+ export function emptyExtensions < T extends Table = Table > ( ) : RuntimeExtensions < T > {
117123 return {
118124 computedExpressions : new Map ( ) ,
119125 transforms : new Map ( ) ,
@@ -124,6 +130,25 @@ function emptyExtensions<T extends Table = Table>(): RuntimeExtensions<T> {
124130 rawOrderBys : [ ] ,
125131 ctes : new Map ( ) ,
126132 sqlJoinConditions : new Map ( ) ,
133+ countMode : undefined ,
134+ } ;
135+ }
136+
137+ function cloneExtensions < T extends Table = Table > (
138+ ext : RuntimeExtensions < T > = emptyExtensions < T > ( ) ,
139+ ) : RuntimeExtensions < T > {
140+ return {
141+ ...ext ,
142+ computedExpressions : new Map ( ext . computedExpressions ) ,
143+ transforms : new Map ( ext . transforms ) ,
144+ rawSelects : new Map ( ext . rawSelects ) ,
145+ rawWheres : [ ...ext . rawWheres ] ,
146+ dynamicWheres : [ ...ext . dynamicWheres ] ,
147+ rawJoins : [ ...ext . rawJoins ] ,
148+ rawOrderBys : [ ...ext . rawOrderBys ] ,
149+ ctes : new Map ( ext . ctes ) ,
150+ sqlJoinConditions : new Map ( ext . sqlJoinConditions ) ,
151+ hooks : ext . hooks ? { ...ext . hooks } : undefined ,
127152 } ;
128153}
129154
@@ -134,10 +159,12 @@ export class TableDefinitionBuilder<T extends Table = Table> {
134159 _table : T ;
135160 _ext : RuntimeExtensions < T > ;
136161
137- constructor ( table : T , config : TableConfig ) {
162+ constructor ( table : T , config : TableConfigWithExtensions < T > ) {
138163 this . _table = table ;
139164 this . _config = config ;
140- this . _ext = emptyExtensions ( ) ;
165+ this . _ext = cloneExtensions (
166+ config [ TABLECRAFT_EXTENSIONS_KEY ] ?? emptyExtensions < T > ( ) ,
167+ ) ;
141168 }
142169
143170 // ──── Column Format / Metadata ────
@@ -1049,19 +1076,29 @@ export class TableDefinitionBuilder<T extends Table = Table> {
10491076
10501077 // ──── Output ────
10511078
1052- toConfig ( ) : TableConfig {
1053- return { ...this . _config } ;
1079+ toConfig ( ) : TableConfigWithExtensions < T > {
1080+ const config = { ...this . _config } as TableConfigWithExtensions < T > ;
1081+ Object . defineProperty ( config , TABLECRAFT_EXTENSIONS_KEY , {
1082+ value : cloneExtensions ( this . _ext ) ,
1083+ enumerable : true ,
1084+ configurable : true ,
1085+ writable : true ,
1086+ } ) ;
1087+ return config ;
10541088 }
10551089}
10561090
10571091// ── Main Entry ──
10581092
10591093export function defineTable < T extends Table > (
10601094 table : T ,
1061- options ?: QuickOptions < T > | TableConfig ,
1095+ options ?: QuickOptions < T > | TableConfigWithExtensions < T > ,
10621096) : TableDefinitionBuilder < T > {
10631097 if ( options && "columns" in options && Array . isArray ( options . columns ) ) {
1064- return new TableDefinitionBuilder ( table , options as TableConfig ) ;
1098+ return new TableDefinitionBuilder (
1099+ table ,
1100+ options as TableConfigWithExtensions < T > ,
1101+ ) ;
10651102 }
10661103
10671104 const config = introspectTable ( table ) ;
0 commit comments