forge-sql-orm 2.0.29 → 2.1.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/README.md +1090 -81
- package/dist/ForgeSQLORM.js +1090 -69
- package/dist/ForgeSQLORM.js.map +1 -1
- package/dist/ForgeSQLORM.mjs +1073 -69
- package/dist/ForgeSQLORM.mjs.map +1 -1
- package/dist/core/ForgeSQLAnalyseOperations.d.ts +1 -1
- package/dist/core/ForgeSQLAnalyseOperations.d.ts.map +1 -1
- package/dist/core/ForgeSQLCacheOperations.d.ts +119 -0
- package/dist/core/ForgeSQLCacheOperations.d.ts.map +1 -0
- package/dist/core/ForgeSQLCrudOperations.d.ts +38 -22
- package/dist/core/ForgeSQLCrudOperations.d.ts.map +1 -1
- package/dist/core/ForgeSQLORM.d.ts +104 -13
- package/dist/core/ForgeSQLORM.d.ts.map +1 -1
- package/dist/core/ForgeSQLQueryBuilder.d.ts +243 -15
- package/dist/core/ForgeSQLQueryBuilder.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/drizzle/extensions/additionalActions.d.ts +42 -0
- package/dist/lib/drizzle/extensions/additionalActions.d.ts.map +1 -0
- package/dist/utils/cacheContextUtils.d.ts +123 -0
- package/dist/utils/cacheContextUtils.d.ts.map +1 -0
- package/dist/utils/cacheUtils.d.ts +56 -0
- package/dist/utils/cacheUtils.d.ts.map +1 -0
- package/dist/utils/sqlUtils.d.ts +8 -0
- package/dist/utils/sqlUtils.d.ts.map +1 -1
- package/dist/webtriggers/clearCacheSchedulerTrigger.d.ts +46 -0
- package/dist/webtriggers/clearCacheSchedulerTrigger.d.ts.map +1 -0
- package/dist/webtriggers/index.d.ts +1 -0
- package/dist/webtriggers/index.d.ts.map +1 -1
- package/package.json +15 -12
- package/src/core/ForgeSQLAnalyseOperations.ts +1 -1
- package/src/core/ForgeSQLCacheOperations.ts +195 -0
- package/src/core/ForgeSQLCrudOperations.ts +49 -40
- package/src/core/ForgeSQLORM.ts +443 -34
- package/src/core/ForgeSQLQueryBuilder.ts +291 -20
- package/src/index.ts +1 -1
- package/src/lib/drizzle/extensions/additionalActions.ts +548 -0
- package/src/lib/drizzle/extensions/types.d.ts +68 -10
- package/src/utils/cacheContextUtils.ts +210 -0
- package/src/utils/cacheUtils.ts +403 -0
- package/src/utils/sqlUtils.ts +29 -12
- package/src/webtriggers/clearCacheSchedulerTrigger.ts +79 -0
- package/src/webtriggers/index.ts +1 -0
- package/dist/lib/drizzle/extensions/selectAliased.d.ts +0 -9
- package/dist/lib/drizzle/extensions/selectAliased.d.ts.map +0 -1
- package/src/lib/drizzle/extensions/selectAliased.ts +0 -72
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { clearExpiredCache } from "../utils/cacheUtils";
|
|
2
|
+
import { ForgeSqlOrmOptions } from "../core/ForgeSQLQueryBuilder";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Scheduler trigger for clearing expired cache entries.
|
|
6
|
+
*
|
|
7
|
+
* This trigger should be configured as a Forge scheduler to automatically
|
|
8
|
+
* clean up expired cache entries based on their TTL (Time To Live).
|
|
9
|
+
*
|
|
10
|
+
* @param options - Optional ForgeSQL ORM configuration. If not provided,
|
|
11
|
+
* uses default cache settings with cacheEntityName: "cache"
|
|
12
|
+
* @returns Promise that resolves to HTTP response object
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* // In your index.ts
|
|
17
|
+
* import { clearCacheSchedulerTrigger } from "forge-sql-orm";
|
|
18
|
+
*
|
|
19
|
+
* export const clearCache = () => {
|
|
20
|
+
* return clearCacheSchedulerTrigger({
|
|
21
|
+
* cacheEntityName: "cache",
|
|
22
|
+
* logRawSqlQuery: true
|
|
23
|
+
* });
|
|
24
|
+
* };
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```yaml
|
|
29
|
+
* # In manifest.yml
|
|
30
|
+
* scheduledTrigger:
|
|
31
|
+
* - key: clear-cache-trigger
|
|
32
|
+
* function: clearCache
|
|
33
|
+
* interval: fiveMinute
|
|
34
|
+
*
|
|
35
|
+
* function:
|
|
36
|
+
* - key: clearCache
|
|
37
|
+
* handler: index.clearCache
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export const clearCacheSchedulerTrigger = async (options?: ForgeSqlOrmOptions) => {
|
|
41
|
+
try {
|
|
42
|
+
const newOptions: ForgeSqlOrmOptions = options ?? {
|
|
43
|
+
logRawSqlQuery: false,
|
|
44
|
+
disableOptimisticLocking: false,
|
|
45
|
+
cacheTTL: 120,
|
|
46
|
+
cacheEntityName: "cache",
|
|
47
|
+
cacheEntityQueryName: "sql",
|
|
48
|
+
cacheEntityExpirationName: "expiration",
|
|
49
|
+
cacheEntityDataName: "data",
|
|
50
|
+
};
|
|
51
|
+
if (!newOptions.cacheEntityName) {
|
|
52
|
+
throw new Error("cacheEntityName is not configured");
|
|
53
|
+
}
|
|
54
|
+
await clearExpiredCache(newOptions);
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
headers: { "Content-Type": ["application/json"] },
|
|
58
|
+
statusCode: 200,
|
|
59
|
+
statusText: "OK",
|
|
60
|
+
body: JSON.stringify({
|
|
61
|
+
success: true,
|
|
62
|
+
message: "Cache cleanup completed successfully",
|
|
63
|
+
timestamp: new Date().toISOString(),
|
|
64
|
+
}),
|
|
65
|
+
};
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error("Error during cache cleanup: ", JSON.stringify(error));
|
|
68
|
+
return {
|
|
69
|
+
headers: { "Content-Type": ["application/json"] },
|
|
70
|
+
statusCode: 500,
|
|
71
|
+
statusText: "Internal Server Error",
|
|
72
|
+
body: JSON.stringify({
|
|
73
|
+
success: false,
|
|
74
|
+
error: error instanceof Error ? error.message : "Unknown error during cache cleanup",
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
}),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
};
|
package/src/webtriggers/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from "./dropMigrationWebTrigger";
|
|
|
2
2
|
export * from "./applyMigrationsWebTrigger";
|
|
3
3
|
export * from "./fetchSchemaWebTrigger";
|
|
4
4
|
export * from "./dropTablesMigrationWebTrigger";
|
|
5
|
+
export * from "./clearCacheSchedulerTrigger";
|
|
5
6
|
|
|
6
7
|
export interface TriggerResponse<BODY> {
|
|
7
8
|
body?: BODY;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { MySqlRemoteDatabase } from "drizzle-orm/mysql-proxy";
|
|
2
|
-
import type { SelectedFields } from "drizzle-orm/mysql-core/query-builders/select.types";
|
|
3
|
-
import { MySqlSelectBuilder } from "drizzle-orm/mysql-core";
|
|
4
|
-
import { MySqlRemotePreparedQueryHKT } from "drizzle-orm/mysql-proxy";
|
|
5
|
-
export declare function patchDbWithSelectAliased(db: MySqlRemoteDatabase<any>): MySqlRemoteDatabase<any> & {
|
|
6
|
-
selectAliased: <TSelection extends SelectedFields>(fields: TSelection) => MySqlSelectBuilder<TSelection, MySqlRemotePreparedQueryHKT>;
|
|
7
|
-
selectAliasedDistinct: <TSelection extends SelectedFields>(fields: TSelection) => MySqlSelectBuilder<TSelection, MySqlRemotePreparedQueryHKT>;
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=selectAliased.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selectAliased.d.ts","sourceRoot":"","sources":["../../../../src/lib/drizzle/extensions/selectAliased.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AAEzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAkDtE,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG;IACjG,aAAa,EAAE,CAAC,UAAU,SAAS,cAAc,EAC/C,MAAM,EAAE,UAAU,KACf,kBAAkB,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;IACjE,qBAAqB,EAAE,CAAC,UAAU,SAAS,cAAc,EACvD,MAAM,EAAE,UAAU,KACf,kBAAkB,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;CAClE,CAUA"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { MySqlRemoteDatabase } from "drizzle-orm/mysql-proxy";
|
|
2
|
-
import type { SelectedFields } from "drizzle-orm/mysql-core/query-builders/select.types";
|
|
3
|
-
import { applyFromDriverTransform, mapSelectFieldsWithAlias } from "../../..";
|
|
4
|
-
import { MySqlSelectBuilder } from "drizzle-orm/mysql-core";
|
|
5
|
-
import { MySqlRemotePreparedQueryHKT } from "drizzle-orm/mysql-proxy";
|
|
6
|
-
|
|
7
|
-
function createAliasedSelectBuilder<TSelection extends SelectedFields>(
|
|
8
|
-
db: MySqlRemoteDatabase<any>,
|
|
9
|
-
fields: TSelection,
|
|
10
|
-
selectFn: (selections: any) => MySqlSelectBuilder<TSelection, MySqlRemotePreparedQueryHKT>,
|
|
11
|
-
): MySqlSelectBuilder<TSelection, MySqlRemotePreparedQueryHKT> {
|
|
12
|
-
const { selections, aliasMap } = mapSelectFieldsWithAlias(fields);
|
|
13
|
-
const builder = selectFn(selections);
|
|
14
|
-
|
|
15
|
-
const wrapBuilder = (rawBuilder: any): any => {
|
|
16
|
-
return new Proxy(rawBuilder, {
|
|
17
|
-
get(target, prop, receiver) {
|
|
18
|
-
if (prop === "execute") {
|
|
19
|
-
return async (...args: any[]) => {
|
|
20
|
-
const rows = await target.execute(...args);
|
|
21
|
-
return applyFromDriverTransform(rows, selections, aliasMap);
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (prop === "then") {
|
|
26
|
-
return (onfulfilled: any, onrejected: any) =>
|
|
27
|
-
target.execute().then((rows: unknown[]) => {
|
|
28
|
-
const transformed = applyFromDriverTransform(rows, selections, aliasMap);
|
|
29
|
-
return onfulfilled?.(transformed);
|
|
30
|
-
}, onrejected);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const value = Reflect.get(target, prop, receiver);
|
|
34
|
-
|
|
35
|
-
if (typeof value === "function") {
|
|
36
|
-
return (...args: any[]) => {
|
|
37
|
-
const result = value.apply(target, args);
|
|
38
|
-
|
|
39
|
-
if (typeof result === "object" && result !== null && "execute" in result) {
|
|
40
|
-
return wrapBuilder(result);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return result;
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return value;
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
return wrapBuilder(builder);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function patchDbWithSelectAliased(db: MySqlRemoteDatabase<any>): MySqlRemoteDatabase<any> & {
|
|
56
|
-
selectAliased: <TSelection extends SelectedFields>(
|
|
57
|
-
fields: TSelection,
|
|
58
|
-
) => MySqlSelectBuilder<TSelection, MySqlRemotePreparedQueryHKT>;
|
|
59
|
-
selectAliasedDistinct: <TSelection extends SelectedFields>(
|
|
60
|
-
fields: TSelection,
|
|
61
|
-
) => MySqlSelectBuilder<TSelection, MySqlRemotePreparedQueryHKT>;
|
|
62
|
-
} {
|
|
63
|
-
db.selectAliased = function <TSelection extends SelectedFields>(fields: TSelection) {
|
|
64
|
-
return createAliasedSelectBuilder(db, fields, (selections) => db.select(selections));
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
db.selectAliasedDistinct = function <TSelection extends SelectedFields>(fields: TSelection) {
|
|
68
|
-
return createAliasedSelectBuilder(db, fields, (selections) => db.selectDistinct(selections));
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
return db;
|
|
72
|
-
}
|