@paroicms/server-text-cache-system 0.11.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 (39) hide show
  1. package/README.md +3 -0
  2. package/ddl/text-cache.ddl.sql +25 -0
  3. package/dist/api.d.ts +2 -0
  4. package/dist/api.js +19 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/cache-system.d.ts +25 -0
  7. package/dist/cache-system.js +71 -0
  8. package/dist/cache-system.js.map +1 -0
  9. package/dist/constants.d.ts +1 -0
  10. package/dist/constants.js +6 -0
  11. package/dist/constants.js.map +1 -0
  12. package/dist/db-init/db-init.d.ts +10 -0
  13. package/dist/db-init/db-init.js +35 -0
  14. package/dist/db-init/db-init.js.map +1 -0
  15. package/dist/db-init/ddl-migration.d.ts +12 -0
  16. package/dist/db-init/ddl-migration.js +28 -0
  17. package/dist/db-init/ddl-migration.js.map +1 -0
  18. package/dist/entities/PaCache.entity.d.ts +7 -0
  19. package/dist/entities/PaCache.entity.js +45 -0
  20. package/dist/entities/PaCache.entity.js.map +1 -0
  21. package/dist/entities/PaCacheDependency.entity.d.ts +4 -0
  22. package/dist/entities/PaCacheDependency.entity.js +30 -0
  23. package/dist/entities/PaCacheDependency.entity.js.map +1 -0
  24. package/dist/internal/cache-system-context.d.ts +14 -0
  25. package/dist/internal/cache-system-context.js +22 -0
  26. package/dist/internal/cache-system-context.js.map +1 -0
  27. package/dist/internal/helpers.d.ts +2 -0
  28. package/dist/internal/helpers.js +18 -0
  29. package/dist/internal/helpers.js.map +1 -0
  30. package/dist/internal/helpers.spec.d.ts +1 -0
  31. package/dist/internal/helpers.spec.js +39 -0
  32. package/dist/internal/helpers.spec.js.map +1 -0
  33. package/dist/internal/queries.d.ts +18 -0
  34. package/dist/internal/queries.js +144 -0
  35. package/dist/internal/queries.js.map +1 -0
  36. package/dist/public-types.d.ts +16 -0
  37. package/dist/public-types.js +3 -0
  38. package/dist/public-types.js.map +1 -0
  39. package/package.json +36 -0
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @paroicms/server-text-cache-system
2
+
3
+ This package is part of ParoiCMS.
@@ -0,0 +1,25 @@
1
+ PRAGMA journal_mode = TRUNCATE;
2
+ PRAGMA foreign_keys = 1;
3
+
4
+ create table PaDbMetadata (
5
+ dbSchema varchar(100) not null primary key,
6
+ dbVersion integer not null
7
+ );
8
+
9
+ insert into PaDbMetadata (dbSchema, dbVersion) values ('text-cache', 1);
10
+
11
+ create table PaCache (
12
+ id integer not null primary key autoincrement,
13
+ ts timestamp not null default current_timestamp,
14
+ lastUseTs timestamp not null default current_timestamp,
15
+ k varchar(250) not null unique,
16
+ val text not null
17
+ );
18
+
19
+ create table PaCacheDependency (
20
+ cacheId integer not null references PaCache (id) on delete cascade,
21
+ depKey varchar(250) not null,
22
+ primary key (cacheId, depKey)
23
+ );
24
+
25
+ create index PaCacheDependency_depKey_index on PaCacheDependency (depKey);
package/dist/api.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./cache-system";
2
+ export * from "./public-types";
package/dist/api.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cache-system"), exports);
18
+ __exportStar(require("./public-types"), exports);
19
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,iDAA+B"}
@@ -0,0 +1,25 @@
1
+ import { AppLog, Tracker } from "@paroicms/server-lib";
2
+ import { CacheSetData, CacheValue, TextCacheSystemStorage } from "./public-types";
3
+ export interface CreateTextCacheSystemOptions {
4
+ siteName: string;
5
+ storage: TextCacheSystemStorage;
6
+ appLog: AppLog;
7
+ /**
8
+ * For example: `"14d"`. Leave `undefined` to keep cache data undefinitely.
9
+ */
10
+ timeToIdle?: string;
11
+ }
12
+ export interface TextCacheSystem {
13
+ setCacheValue(data: CacheSetData, tracker: Tracker): Promise<CacheValue>;
14
+ getCacheValue(cacheKey: string, tracker: Tracker): Promise<CacheValue | undefined>;
15
+ getDependencyKeys(cacheKey: string, tracker: Tracker): Promise<string[]>;
16
+ /**
17
+ * @returns the list of cache cacheKeys that were deleted
18
+ */
19
+ invalidate(dependencyKeys: string[]): Promise<string[]>;
20
+ cleanUnusedValues(): Promise<void>;
21
+ clearCache(): Promise<void>;
22
+ close(): Promise<void>;
23
+ }
24
+ export declare function createTextCacheSystem(options: CreateTextCacheSystemOptions): Promise<TextCacheSystem>;
25
+ export declare function createNoTextCacheSystem(): TextCacheSystem;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNoTextCacheSystem = exports.createTextCacheSystem = void 0;
4
+ const cache_system_context_1 = require("./internal/cache-system-context");
5
+ const queries_1 = require("./internal/queries");
6
+ async function createTextCacheSystem(options) {
7
+ const context = await (0, cache_system_context_1.createTextCacheSystemContext)(options);
8
+ function checkStatus() {
9
+ if (context.status !== "ready") {
10
+ throw new Error(`TextCache is ${context.status}`);
11
+ }
12
+ }
13
+ return {
14
+ async setCacheValue(data, tracker) {
15
+ checkStatus();
16
+ return await (0, queries_1.insertOrUpdateCacheValue)(context.cn, data, tracker);
17
+ },
18
+ async getCacheValue(cacheKey, tracker) {
19
+ checkStatus();
20
+ const value = await (0, queries_1.getCacheValue)(context, cacheKey, tracker);
21
+ if (value !== undefined) {
22
+ context.appLog.debug(`[${context.siteName}] found cache: ${cacheKey}`);
23
+ }
24
+ return value;
25
+ },
26
+ async getDependencyKeys(cacheKey, tracker) {
27
+ checkStatus();
28
+ return await (0, queries_1.getDependencyKeys)(context, cacheKey, tracker);
29
+ },
30
+ async invalidate(dependencyKeys) {
31
+ checkStatus();
32
+ const cacheKeys = await (0, queries_1.deleteCacheValues)(context.cn, { dependencyKeys });
33
+ if (cacheKeys.length > 0) {
34
+ context.appLog.debug(`[${context.siteName}] ${cacheKeys.length} invalidated cache: ${cacheKeys.join(", ")}`);
35
+ }
36
+ return cacheKeys;
37
+ },
38
+ async cleanUnusedValues() {
39
+ checkStatus();
40
+ const count = await (0, queries_1.deleteUnusedCacheValues)(context);
41
+ if (count !== undefined && count > 0) {
42
+ context.appLog.debug(`[${context.siteName}] ${count} unused cache values were deleted`);
43
+ }
44
+ },
45
+ async clearCache() {
46
+ checkStatus();
47
+ await (0, queries_1.clearCacheValues)(context);
48
+ context.appLog.debug(`[${context.siteName}] cache is cleared`);
49
+ },
50
+ async close() {
51
+ if (context.status === "destroyed")
52
+ return;
53
+ context.status = "destroyed";
54
+ await context.mainCn.destroy();
55
+ },
56
+ };
57
+ }
58
+ exports.createTextCacheSystem = createTextCacheSystem;
59
+ function createNoTextCacheSystem() {
60
+ return {
61
+ setCacheValue: (data) => Promise.resolve({ value: data.value, lastModified: new Date().toISOString() }),
62
+ getCacheValue: () => Promise.resolve(undefined),
63
+ getDependencyKeys: () => Promise.resolve([]),
64
+ invalidate: () => Promise.resolve([]),
65
+ cleanUnusedValues: () => Promise.resolve(),
66
+ clearCache: () => Promise.resolve(),
67
+ close: () => Promise.resolve(),
68
+ };
69
+ }
70
+ exports.createNoTextCacheSystem = createNoTextCacheSystem;
71
+ //# sourceMappingURL=cache-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-system.js","sourceRoot":"","sources":["../src/cache-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const packageDir: string;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.packageDir = void 0;
4
+ const path_1 = require("path");
5
+ exports.packageDir = (0, path_1.dirname)(__dirname);
6
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,+BAA+B;AAElB,QAAA,UAAU,GAAG,IAAA,cAAO,EAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { AppLog } from "@paroicms/server-lib";
2
+ import { DataSource } from "typeorm";
3
+ export declare function createOrOpenMainCn({ sqliteFile, siteName, appLog, }: {
4
+ sqliteFile: string;
5
+ siteName: string;
6
+ appLog: AppLog;
7
+ }): Promise<{
8
+ mainCn: DataSource;
9
+ logNextQuery: (count?: number | undefined) => void;
10
+ }>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOrOpenMainCn = void 0;
4
+ const server_lib_1 = require("@paroicms/server-lib");
5
+ const path_1 = require("path");
6
+ const constants_1 = require("../constants");
7
+ const PaCache_entity_1 = require("../entities/PaCache.entity");
8
+ const PaCacheDependency_entity_1 = require("../entities/PaCacheDependency.entity");
9
+ const ddl_migration_1 = require("./ddl-migration");
10
+ async function createOrOpenMainCn({ sqliteFile, siteName, appLog, }) {
11
+ const { logNextQuery, typeOrmLogger } = (0, server_lib_1.createSqlLogger)({ appLog, siteName, dbSchemaName: ddl_migration_1.dbSchemaName });
12
+ const { mainCn } = await (0, server_lib_1.createOrOpenSqliteConnection)({
13
+ siteName: siteName,
14
+ canCreate: true,
15
+ dbSchemaName: ddl_migration_1.dbSchemaName,
16
+ sqliteFile,
17
+ ddlFile: (0, path_1.join)(constants_1.packageDir, "ddl", "text-cache.ddl.sql"),
18
+ migrateDb,
19
+ entities: [PaCache_entity_1.PaCacheEntity, PaCacheDependency_entity_1.PaCacheDependencyEntity],
20
+ logger: typeOrmLogger,
21
+ });
22
+ async function migrateDb(cn) {
23
+ const dbVersion = await (0, ddl_migration_1.getDbVersion)(cn, { siteName });
24
+ if (dbVersion !== ddl_migration_1.currentVariantsDbSchemaVersion) {
25
+ await (0, ddl_migration_1.migrateMediasDb)(cn, {
26
+ fromVersion: dbVersion,
27
+ siteName,
28
+ appLog,
29
+ });
30
+ }
31
+ }
32
+ return { mainCn, logNextQuery };
33
+ }
34
+ exports.createOrOpenMainCn = createOrOpenMainCn;
35
+ //# sourceMappingURL=db-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-init.js","sourceRoot":"","sources":["../../src/db-init/db-init.ts"],"names":[],"mappings":";;;AAAA,qDAA6F;AAC7F,+BAA4B;AAE5B,4CAA0C;AAC1C,+DAA2D;AAC3D,mFAA+E;AAC/E,mDAKyB;AAElB,KAAK,UAAU,kBAAkB,CAAC,EACvC,UAAU,EACV,QAAQ,EACR,MAAM,GACmD;IACzD,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,IAAA,4BAAe,EAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAZ,4BAAY,EAAE,CAAC,CAAC;IAE5F,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,yCAA4B,EAAC;QACpD,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,IAAI;QACf,YAAY,EAAZ,4BAAY;QACZ,UAAU;QACV,OAAO,EAAE,IAAA,WAAI,EAAC,sBAAU,EAAE,KAAK,EAAE,oBAAoB,CAAC;QACtD,SAAS;QACT,QAAQ,EAAE,CAAC,8BAAa,EAAE,kDAAuB,CAAC;QAClD,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC;IAEH,KAAK,UAAU,SAAS,CAAC,EAAc;QACrC,MAAM,SAAS,GAAG,MAAM,IAAA,4BAAY,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,IAAI,SAAS,KAAK,8CAA8B,EAAE,CAAC;YACjD,MAAM,IAAA,+BAAe,EAAC,EAAE,EAAE;gBACxB,WAAW,EAAE,SAAS;gBACtB,QAAQ;gBACR,MAAM;aACP,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC;AA9BD,gDA8BC"}
@@ -0,0 +1,12 @@
1
+ import { AppLog } from "@paroicms/server-lib";
2
+ import { DataSource } from "typeorm";
3
+ export declare const dbSchemaName = "text-cache";
4
+ export declare const currentVariantsDbSchemaVersion = 1;
5
+ export declare function getDbVersion(cn: DataSource, { siteName }: {
6
+ siteName: string;
7
+ }): Promise<number>;
8
+ export declare function migrateMediasDb(cn: DataSource, { fromVersion, siteName, appLog }: {
9
+ fromVersion: number;
10
+ siteName: string;
11
+ appLog: AppLog;
12
+ }): Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.migrateMediasDb = exports.getDbVersion = exports.currentVariantsDbSchemaVersion = exports.dbSchemaName = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ exports.dbSchemaName = "text-cache";
6
+ exports.currentVariantsDbSchemaVersion = 1;
7
+ async function getDbVersion(cn, { siteName }) {
8
+ const [row] = await cn.query(`select dbVersion from PaDbMetadata where dbSchema = '${exports.dbSchemaName}'`);
9
+ if (!row)
10
+ throw new Error(`[${siteName}] missing dbSchema '${exports.dbSchemaName}' in database`);
11
+ return (0, data_formatters_lib_1.nbVal)(row.dbVersion, { varName: "dbVersion" });
12
+ }
13
+ exports.getDbVersion = getDbVersion;
14
+ async function migrateMediasDb(cn, { fromVersion, siteName, appLog }) {
15
+ const toVersion = exports.currentVariantsDbSchemaVersion;
16
+ let currentVersion = fromVersion;
17
+ if (currentVersion === 1) {
18
+ // await cn.query("alter table ...");
19
+ // await cn.query(`update PaDbMetadata set dbVersion = 2 where dbSchema = '${dbSchemaName}'`);
20
+ currentVersion = 2;
21
+ }
22
+ if (currentVersion !== toVersion) {
23
+ throw new Error(`[${siteName}] version of ${exports.dbSchemaName} database should be '${toVersion}', but is '${currentVersion}'`);
24
+ }
25
+ appLog.info(`[${siteName}] ${exports.dbSchemaName} database was migrated from ${fromVersion} to ${currentVersion}`);
26
+ }
27
+ exports.migrateMediasDb = migrateMediasDb;
28
+ //# sourceMappingURL=ddl-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl-migration.js","sourceRoot":"","sources":["../../src/db-init/ddl-migration.ts"],"names":[],"mappings":";;;AAAA,oEAAmD;AAKtC,QAAA,YAAY,GAAG,YAAY,CAAC;AAC5B,QAAA,8BAA8B,GAAG,CAAC,CAAC;AAEzC,KAAK,UAAU,YAAY,CAAC,EAAc,EAAE,EAAE,QAAQ,EAAwB;IACnF,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAC1B,wDAAwD,oBAAY,GAAG,CACxE,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,QAAQ,uBAAuB,oBAAY,eAAe,CAAC,CAAC;IAC1F,OAAO,IAAA,2BAAK,EAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;AACxD,CAAC;AAND,oCAMC;AAEM,KAAK,UAAU,eAAe,CACnC,EAAc,EACd,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAA6D;IAE5F,MAAM,SAAS,GAAG,sCAA8B,CAAC;IACjD,IAAI,cAAc,GAAG,WAAW,CAAC;IAEjC,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,qCAAqC;QACrC,8FAA8F;QAC9F,cAAc,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,IAAI,QAAQ,gBAAgB,oBAAY,wBAAwB,SAAS,cAAc,cAAc,GAAG,CACzG,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,IAAI,CACT,IAAI,QAAQ,KAAK,oBAAY,+BAA+B,WAAW,OAAO,cAAc,EAAE,CAC/F,CAAC;AACJ,CAAC;AArBD,0CAqBC"}
@@ -0,0 +1,7 @@
1
+ export declare class PaCacheEntity {
2
+ id: string;
3
+ ts: Date;
4
+ lastUseTs: Date;
5
+ k: string;
6
+ val: string;
7
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PaCacheEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ let PaCacheEntity = class PaCacheEntity {
15
+ id;
16
+ ts;
17
+ lastUseTs;
18
+ k;
19
+ val;
20
+ };
21
+ exports.PaCacheEntity = PaCacheEntity;
22
+ __decorate([
23
+ (0, typeorm_1.PrimaryGeneratedColumn)(),
24
+ __metadata("design:type", String)
25
+ ], PaCacheEntity.prototype, "id", void 0);
26
+ __decorate([
27
+ (0, typeorm_1.Column)({ type: "datetime", default: () => "current_timestamp" }),
28
+ __metadata("design:type", Date)
29
+ ], PaCacheEntity.prototype, "ts", void 0);
30
+ __decorate([
31
+ (0, typeorm_1.Column)({ type: "datetime", default: () => "current_timestamp" }),
32
+ __metadata("design:type", Date)
33
+ ], PaCacheEntity.prototype, "lastUseTs", void 0);
34
+ __decorate([
35
+ (0, typeorm_1.Column)(),
36
+ __metadata("design:type", String)
37
+ ], PaCacheEntity.prototype, "k", void 0);
38
+ __decorate([
39
+ (0, typeorm_1.Column)({ type: "text" }),
40
+ __metadata("design:type", String)
41
+ ], PaCacheEntity.prototype, "val", void 0);
42
+ exports.PaCacheEntity = PaCacheEntity = __decorate([
43
+ (0, typeorm_1.Entity)("PaCache")
44
+ ], PaCacheEntity);
45
+ //# sourceMappingURL=PaCache.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaCache.entity.js","sourceRoot":"","sources":["../../src/entities/PaCache.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAiE;AAG1D,IAAM,aAAa,GAAnB,MAAM,aAAa;IAExB,EAAE,CAAU;IAGZ,EAAE,CAAQ;IAGV,SAAS,CAAQ;IAGjB,CAAC,CAAU;IAGX,GAAG,CAAU;CACd,CAAA;AAfY,sCAAa;AAExB;IADC,IAAA,gCAAsB,GAAE;;yCACb;AAGZ;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC;8BAC5D,IAAI;yCAAC;AAGV;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC;8BACrD,IAAI;gDAAC;AAGjB;IADC,IAAA,gBAAM,GAAE;;wCACE;AAGX;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0CACZ;wBAdF,aAAa;IADzB,IAAA,gBAAM,EAAC,SAAS,CAAC;GACL,aAAa,CAezB"}
@@ -0,0 +1,4 @@
1
+ export declare class PaCacheDependencyEntity {
2
+ cacheId: string;
3
+ depKey: string;
4
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PaCacheDependencyEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ let PaCacheDependencyEntity = class PaCacheDependencyEntity {
15
+ cacheId;
16
+ depKey;
17
+ };
18
+ exports.PaCacheDependencyEntity = PaCacheDependencyEntity;
19
+ __decorate([
20
+ (0, typeorm_1.Column)({ type: "integer", primary: true }),
21
+ __metadata("design:type", String)
22
+ ], PaCacheDependencyEntity.prototype, "cacheId", void 0);
23
+ __decorate([
24
+ (0, typeorm_1.Column)({ primary: true }),
25
+ __metadata("design:type", String)
26
+ ], PaCacheDependencyEntity.prototype, "depKey", void 0);
27
+ exports.PaCacheDependencyEntity = PaCacheDependencyEntity = __decorate([
28
+ (0, typeorm_1.Entity)("PaCacheDependency")
29
+ ], PaCacheDependencyEntity);
30
+ //# sourceMappingURL=PaCacheDependency.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaCacheDependency.entity.js","sourceRoot":"","sources":["../../src/entities/PaCacheDependency.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAyC;AAGlC,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAElC,OAAO,CAAU;IAGjB,MAAM,CAAU;CACjB,CAAA;AANY,0DAAuB;AAElC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;wDAC1B;AAGjB;IADC,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;uDACV;kCALL,uBAAuB;IADnC,IAAA,gBAAM,EAAC,mBAAmB,CAAC;GACf,uBAAuB,CAMnC"}
@@ -0,0 +1,14 @@
1
+ import { AppLog } from "@paroicms/server-lib";
2
+ import type { DataSource, EntityManager } from "typeorm";
3
+ import { CreateTextCacheSystemOptions } from "../cache-system";
4
+ import { TextCacheSystemStorage } from "../public-types";
5
+ export interface TextCacheSystemContext extends CreateTextCacheSystemOptions {
6
+ status: "ready" | "destroyed";
7
+ appLog: AppLog;
8
+ mainCn: DataSource;
9
+ cn: EntityManager;
10
+ storage: TextCacheSystemStorage;
11
+ logNextQuery: (count?: number) => void;
12
+ timeToIdleDays?: number;
13
+ }
14
+ export declare function createTextCacheSystemContext(options: CreateTextCacheSystemOptions): Promise<TextCacheSystemContext>;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTextCacheSystemContext = void 0;
4
+ const anywhere_lib_1 = require("@paroicms/anywhere-lib");
5
+ const db_init_1 = require("../db-init/db-init");
6
+ async function createTextCacheSystemContext(options) {
7
+ const { mainCn, logNextQuery } = await (0, db_init_1.createOrOpenMainCn)({
8
+ siteName: options.siteName,
9
+ sqliteFile: options.storage.file,
10
+ appLog: options.appLog,
11
+ });
12
+ return {
13
+ ...options,
14
+ status: "ready",
15
+ mainCn,
16
+ cn: mainCn.manager,
17
+ logNextQuery,
18
+ timeToIdleDays: options.timeToIdle === undefined ? undefined : (0, anywhere_lib_1.parseTimeWithUnit)(options.timeToIdle).delay,
19
+ };
20
+ }
21
+ exports.createTextCacheSystemContext = createTextCacheSystemContext;
22
+ //# sourceMappingURL=cache-system-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-system-context.js","sourceRoot":"","sources":["../../src/internal/cache-system-context.ts"],"names":[],"mappings":";;;AAAA,yDAA2D;AAI3D,gDAAwD;AAajD,KAAK,UAAU,4BAA4B,CAChD,OAAqC;IAErC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,4BAAkB,EAAC;QACxD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,OAAO;QACV,MAAM,EAAE,OAAO;QACf,MAAM;QACN,EAAE,EAAE,MAAM,CAAC,OAAO;QAClB,YAAY;QACZ,cAAc,EACZ,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,gCAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK;KAC7F,CAAC;AACJ,CAAC;AAlBD,oEAkBC"}
@@ -0,0 +1,2 @@
1
+ export declare function isSameTimeUnit(dt: Date, timeUnit: "day"): boolean;
2
+ export declare function parseCacheTtl(cacheTtl: string | undefined): number | undefined;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseCacheTtl = exports.isSameTimeUnit = void 0;
4
+ function isSameTimeUnit(dt, timeUnit) {
5
+ const nowDay = new Date().toISOString().substring(0, 10);
6
+ const dtDay = dt.toISOString().substring(0, 10);
7
+ return nowDay === dtDay;
8
+ }
9
+ exports.isSameTimeUnit = isSameTimeUnit;
10
+ function parseCacheTtl(cacheTtl) {
11
+ if (!cacheTtl)
12
+ return;
13
+ if (!cacheTtl.endsWith("d"))
14
+ throw new Error(`invalid textCacheTtl: '${cacheTtl}'`);
15
+ return Number(cacheTtl.slice(0, -1));
16
+ }
17
+ exports.parseCacheTtl = parseCacheTtl;
18
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/internal/helpers.ts"],"names":[],"mappings":";;;AAAA,SAAgB,cAAc,CAAC,EAAQ,EAAE,QAAe;IACtD,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,KAAK,KAAK,CAAC;AAC1B,CAAC;AAJD,wCAIC;AAED,SAAgB,aAAa,CAAC,QAA4B;IACxD,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,GAAG,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAJD,sCAIC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const helpers_1 = require("./helpers");
5
+ (0, vitest_1.describe)("parseCacheTtl", () => {
6
+ (0, vitest_1.it)("should return undefined when textCacheTtl is undefined", () => {
7
+ const textCacheTtl = undefined;
8
+ const result = (0, helpers_1.parseCacheTtl)(textCacheTtl);
9
+ (0, vitest_1.expect)(result).toBeUndefined();
10
+ });
11
+ (0, vitest_1.it)("should throw an error when textCacheTtl does not end with 'd'", () => {
12
+ const textCacheTtl = "10h";
13
+ (0, vitest_1.expect)(() => (0, helpers_1.parseCacheTtl)(textCacheTtl)).toThrowError("invalid textCacheTtl: '10h'");
14
+ });
15
+ (0, vitest_1.it)("should return the parsed number when textCacheTtl is valid", () => {
16
+ const textCacheTtl = "7d";
17
+ const result = (0, helpers_1.parseCacheTtl)(textCacheTtl);
18
+ (0, vitest_1.expect)(result).toBe(7);
19
+ });
20
+ (0, vitest_1.it)("should return the parsed number when textCacheTtl is 0", () => {
21
+ const textCacheTtl = "0d";
22
+ const result = (0, helpers_1.parseCacheTtl)(textCacheTtl);
23
+ (0, vitest_1.expect)(result).toBe(0);
24
+ });
25
+ });
26
+ (0, vitest_1.describe)("isSameTimeUnit", () => {
27
+ (0, vitest_1.it)("should return true when dt is the same day as now", () => {
28
+ const now = new Date();
29
+ const result = (0, helpers_1.isSameTimeUnit)(now, "day");
30
+ (0, vitest_1.expect)(result).toBe(true);
31
+ });
32
+ (0, vitest_1.it)("should return false when dt is not the same day as now", () => {
33
+ const yesterday = new Date();
34
+ yesterday.setDate(yesterday.getDate() - 1);
35
+ const result = (0, helpers_1.isSameTimeUnit)(yesterday, "day");
36
+ (0, vitest_1.expect)(result).toBe(false);
37
+ });
38
+ });
39
+ //# sourceMappingURL=helpers.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../../src/internal/helpers.spec.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,uCAA0D;AAE1D,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,YAAY,GAAG,SAAS,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,YAAY,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,YAAY,GAAG,KAAK,CAAC;QAC3B,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,IAAA,uBAAa,EAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,YAAY,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,YAAY,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAA,wBAAc,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,wBAAc,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Tracker } from "@paroicms/server-lib";
2
+ import { EntityManager } from "typeorm";
3
+ import { CacheSetData, CacheValue } from "../public-types";
4
+ import { TextCacheSystemContext } from "./cache-system-context";
5
+ export declare function insertOrUpdateCacheValue(cn: EntityManager, data: CacheSetData, tracker: Tracker): Promise<CacheValue>;
6
+ export declare function getCacheValue({ cn, timeToIdleDays, appLog, siteName }: TextCacheSystemContext, cacheKey: string, tracker: Tracker): Promise<CacheValue | undefined>;
7
+ export declare function getDependencyKeys({ cn }: TextCacheSystemContext, cacheKey: string, tracker: Tracker): Promise<string[]>;
8
+ /**
9
+ * @returns the list of cache cacheKeys that were deleted
10
+ */
11
+ export declare function deleteCacheValues(cn: EntityManager, options: {
12
+ dependencyKeys: string[];
13
+ }): Promise<string[]>;
14
+ /**
15
+ * @returns the number of cache identifiers that were deleted
16
+ */
17
+ export declare function deleteUnusedCacheValues({ cn, timeToIdleDays, }: TextCacheSystemContext): Promise<number | undefined>;
18
+ export declare function clearCacheValues({ cn }: TextCacheSystemContext): Promise<void>;
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clearCacheValues = exports.deleteUnusedCacheValues = exports.deleteCacheValues = exports.getDependencyKeys = exports.getCacheValue = exports.insertOrUpdateCacheValue = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ const anywhere_lib_1 = require("@paroicms/anywhere-lib");
6
+ const ddl_migration_1 = require("../db-init/ddl-migration");
7
+ async function insertOrUpdateCacheValue(cn, data, tracker) {
8
+ const result = await cn
9
+ .createQueryBuilder()
10
+ .insert()
11
+ .into("PaCache")
12
+ .values({
13
+ k: data.cacheKey,
14
+ val: data.value,
15
+ ts: () => "current_timestamp",
16
+ lastUseTs: () => "current_timestamp",
17
+ })
18
+ .orUpdate(["val", "ts", "lastUseTs"], ["k"])
19
+ .execute();
20
+ tracker.trackAccess(ddl_migration_1.dbSchemaName, "PaCache", "write");
21
+ let newId = (0, data_formatters_lib_1.strValOrUndef)(result.identifiers[0].id, { varName: "PaCache.id" });
22
+ if (newId === undefined) {
23
+ const row = await cn
24
+ .createQueryBuilder()
25
+ .select("c.id", "id")
26
+ .from("PaCache", "c")
27
+ .where("c.k = :cacheKey", { cacheKey: data.cacheKey })
28
+ .getRawOne();
29
+ if (!row)
30
+ throw new Error(`unable to find cache row '${data.cacheKey}'`);
31
+ tracker.trackAccess(ddl_migration_1.dbSchemaName, "PaCache", "read");
32
+ newId = (0, data_formatters_lib_1.strVal)(row.id);
33
+ }
34
+ await cn
35
+ .createQueryBuilder()
36
+ .insert()
37
+ .into("PaCacheDependency")
38
+ .values(data.dependencyKeys.map((depKey) => ({
39
+ cacheId: newId,
40
+ depKey,
41
+ })))
42
+ .execute();
43
+ tracker.trackAccess(ddl_migration_1.dbSchemaName, "PaCacheDependency", "write");
44
+ const row = await cn
45
+ .createQueryBuilder()
46
+ .select("c.ts", "ts")
47
+ .from("PaCache", "c")
48
+ .where("c.id = :id", { id: newId })
49
+ .getRawOne();
50
+ tracker.trackAccess(ddl_migration_1.dbSchemaName, "PaCacheDependency", "read");
51
+ if (!row)
52
+ throw new Error(`missing cache row: ${newId}`);
53
+ const lastModified = (0, data_formatters_lib_1.dateVal)(row.ts).toISOString();
54
+ return {
55
+ lastModified,
56
+ value: data.value,
57
+ };
58
+ }
59
+ exports.insertOrUpdateCacheValue = insertOrUpdateCacheValue;
60
+ async function getCacheValue({ cn, timeToIdleDays, appLog, siteName }, cacheKey, tracker) {
61
+ const row = await cn
62
+ .createQueryBuilder()
63
+ .select("c.val", "val")
64
+ .addSelect("c.ts", "ts")
65
+ .addSelect("c.lastUseTs", "lastUseTs")
66
+ .from("PaCache", "c")
67
+ .where("c.k = :cacheKey", { cacheKey })
68
+ .getRawOne();
69
+ tracker.trackAccess(ddl_migration_1.dbSchemaName, "PaCache", "read");
70
+ if (!row)
71
+ return;
72
+ const lastUseTs = (0, data_formatters_lib_1.dateVal)(row.lastUseTs);
73
+ if (timeToIdleDays !== undefined && !(0, anywhere_lib_1.isSameTimeUnit)(lastUseTs, "day")) {
74
+ appLog.debug(`[${siteName}] updating lastUseTs of cache: ${cacheKey}`);
75
+ await cn
76
+ .createQueryBuilder()
77
+ .update("PaCache")
78
+ .set({
79
+ lastUseTs: () => "current_timestamp",
80
+ })
81
+ .where("k = :cacheKey", { cacheKey })
82
+ .execute();
83
+ tracker.trackAccess(ddl_migration_1.dbSchemaName, "PaCache", "write");
84
+ }
85
+ return {
86
+ value: (0, data_formatters_lib_1.strVal)(row.val),
87
+ lastModified: (0, data_formatters_lib_1.dateVal)(row.ts).toISOString(),
88
+ };
89
+ }
90
+ exports.getCacheValue = getCacheValue;
91
+ async function getDependencyKeys({ cn }, cacheKey, tracker) {
92
+ const rows = await cn
93
+ .createQueryBuilder()
94
+ .select("d.depKey", "depKey")
95
+ .from("PaCacheDependency", "d")
96
+ .innerJoin("PaCache", "c", "c.id = d.cacheId")
97
+ .where("c.k = :cacheKey", { cacheKey })
98
+ .getRawMany();
99
+ tracker.trackAccess(ddl_migration_1.dbSchemaName, "PaCacheDependency", "read");
100
+ return rows.map((row) => (0, data_formatters_lib_1.strVal)(row.depKey));
101
+ }
102
+ exports.getDependencyKeys = getDependencyKeys;
103
+ /**
104
+ * @returns the list of cache cacheKeys that were deleted
105
+ */
106
+ async function deleteCacheValues(cn, options) {
107
+ const rows = await cn
108
+ .createQueryBuilder()
109
+ .select("c.id", "id")
110
+ .addSelect("c.k", "k")
111
+ .from("PaCache", "c")
112
+ .innerJoin("PaCacheDependency", "d", "d.cacheId = c.id")
113
+ .where("d.depKey in (:...dependencyKeys)", { dependencyKeys: options.dependencyKeys })
114
+ .getRawMany();
115
+ const cacheKeys = rows.map((row) => (0, data_formatters_lib_1.strVal)(row.k));
116
+ const cacheIds = rows.map((row) => (0, data_formatters_lib_1.strVal)(row.id));
117
+ await cn
118
+ .createQueryBuilder()
119
+ .delete()
120
+ .from("PaCache")
121
+ .where("id in (:...cacheIds)", { cacheIds: cacheIds })
122
+ .execute();
123
+ return cacheKeys;
124
+ }
125
+ exports.deleteCacheValues = deleteCacheValues;
126
+ /**
127
+ * @returns the number of cache identifiers that were deleted
128
+ */
129
+ async function deleteUnusedCacheValues({ cn, timeToIdleDays, }) {
130
+ const result = await cn
131
+ .createQueryBuilder()
132
+ .delete()
133
+ .from("PaCache")
134
+ .where(`date(lastUseTs) < date(current_timestamp, '-${timeToIdleDays} day')`)
135
+ .execute();
136
+ return result.affected ?? undefined;
137
+ }
138
+ exports.deleteUnusedCacheValues = deleteUnusedCacheValues;
139
+ async function clearCacheValues({ cn }) {
140
+ await cn.createQueryBuilder().delete().from("PaCacheDependency").execute();
141
+ await cn.createQueryBuilder().delete().from("PaCache").execute();
142
+ }
143
+ exports.clearCacheValues = clearCacheValues;
144
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/internal/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface TextCacheSystemStorage {
2
+ type: "sqlite";
3
+ file: string;
4
+ }
5
+ export interface CacheValue {
6
+ value: string;
7
+ /**
8
+ * Timestamp as ISO string.
9
+ */
10
+ lastModified: string;
11
+ }
12
+ export interface CacheSetData {
13
+ cacheKey: string;
14
+ value: string;
15
+ dependencyKeys: string[];
16
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=public-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-types.js","sourceRoot":"","sources":["../src/public-types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@paroicms/server-text-cache-system",
3
+ "version": "0.11.0",
4
+ "description": "Cache system.",
5
+ "author": "Paroi Team",
6
+ "license": "MIT",
7
+ "main": "dist/api.js",
8
+ "typings": "dist/api.d.ts",
9
+ "type": "commonjs",
10
+ "files": [
11
+ "ddl",
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "clear": "rimraf dist/*",
17
+ "dev": "tsc --watch --preserveWatchOutput",
18
+ "eslint": "eslint .",
19
+ "test": "vitest"
20
+ },
21
+ "dependencies": {
22
+ "@paroi/async-lib": "^0.1.2",
23
+ "@paroi/data-formatters-lib": "^0.1.2",
24
+ "@paroicms/server-lib": "^0.14.0",
25
+ "@paroicms/anywhere-lib": "^0.53.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^20.10.5",
29
+ "rimraf": "^5.0.5",
30
+ "typescript": "^5.3.3",
31
+ "vitest": "^1.1.1"
32
+ },
33
+ "peerDependencies": {
34
+ "typeorm": "0.3"
35
+ }
36
+ }