@carlonicora/nestjs-neo4jsonapi 6.7.0 → 6.8.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/dist/bootstrap/app.module.factory.d.ts.map +1 -1
- package/dist/bootstrap/app.module.factory.js +1 -0
- package/dist/bootstrap/app.module.factory.js.map +1 -1
- package/dist/bootstrap/bootstrap.options.d.ts +15 -0
- package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
- package/dist/common/constants/core-module.ids.d.ts +1 -0
- package/dist/common/constants/core-module.ids.d.ts.map +1 -1
- package/dist/common/constants/core-module.ids.js +1 -0
- package/dist/common/constants/core-module.ids.js.map +1 -1
- package/dist/config/enums/queue.id.d.ts +1 -0
- package/dist/config/enums/queue.id.d.ts.map +1 -1
- package/dist/config/enums/queue.id.js +1 -0
- package/dist/config/enums/queue.id.js.map +1 -1
- package/dist/core/blocknote/services/blocknote.service.d.ts +25 -0
- package/dist/core/blocknote/services/blocknote.service.d.ts.map +1 -1
- package/dist/core/blocknote/services/blocknote.service.js +84 -0
- package/dist/core/blocknote/services/blocknote.service.js.map +1 -1
- package/dist/foundations/blog/blog.constants.d.ts +17 -0
- package/dist/foundations/blog/blog.constants.d.ts.map +1 -0
- package/dist/foundations/blog/blog.constants.js +17 -0
- package/dist/foundations/blog/blog.constants.js.map +1 -0
- package/dist/foundations/blog/blog.module.d.ts +28 -0
- package/dist/foundations/blog/blog.module.d.ts.map +1 -0
- package/dist/foundations/blog/blog.module.js +143 -0
- package/dist/foundations/blog/blog.module.js.map +1 -0
- package/dist/foundations/blog/controllers/blog-category-translation.controller.d.ts +17 -0
- package/dist/foundations/blog/controllers/blog-category-translation.controller.d.ts.map +1 -0
- package/dist/foundations/blog/controllers/blog-category-translation.controller.js +81 -0
- package/dist/foundations/blog/controllers/blog-category-translation.controller.js.map +1 -0
- package/dist/foundations/blog/controllers/blog-category.controller.d.ts +24 -0
- package/dist/foundations/blog/controllers/blog-category.controller.d.ts.map +1 -0
- package/dist/foundations/blog/controllers/blog-category.controller.js +125 -0
- package/dist/foundations/blog/controllers/blog-category.controller.js.map +1 -0
- package/dist/foundations/blog/controllers/blog-post-translation.controller.d.ts +17 -0
- package/dist/foundations/blog/controllers/blog-post-translation.controller.d.ts.map +1 -0
- package/dist/foundations/blog/controllers/blog-post-translation.controller.js +81 -0
- package/dist/foundations/blog/controllers/blog-post-translation.controller.js.map +1 -0
- package/dist/foundations/blog/controllers/blog-post.controller.d.ts +28 -0
- package/dist/foundations/blog/controllers/blog-post.controller.d.ts.map +1 -0
- package/dist/foundations/blog/controllers/blog-post.controller.js +157 -0
- package/dist/foundations/blog/controllers/blog-post.controller.js.map +1 -0
- package/dist/foundations/blog/controllers/blog-settings.controller.d.ts +16 -0
- package/dist/foundations/blog/controllers/blog-settings.controller.d.ts.map +1 -0
- package/dist/foundations/blog/controllers/blog-settings.controller.js +73 -0
- package/dist/foundations/blog/controllers/blog-settings.controller.js.map +1 -0
- package/dist/foundations/blog/controllers/blog.public.controller.d.ts +26 -0
- package/dist/foundations/blog/controllers/blog.public.controller.d.ts.map +1 -0
- package/dist/foundations/blog/controllers/blog.public.controller.js +117 -0
- package/dist/foundations/blog/controllers/blog.public.controller.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-category-translation.put.dto.d.ts +16 -0
- package/dist/foundations/blog/dtos/blog-category-translation.put.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-category-translation.put.dto.js +62 -0
- package/dist/foundations/blog/dtos/blog-category-translation.put.dto.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-category.dto.d.ts +11 -0
- package/dist/foundations/blog/dtos/blog-category.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-category.dto.js +45 -0
- package/dist/foundations/blog/dtos/blog-category.dto.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-category.post.dto.d.ts +16 -0
- package/dist/foundations/blog/dtos/blog-category.post.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-category.post.dto.js +68 -0
- package/dist/foundations/blog/dtos/blog-category.post.dto.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-category.put.dto.d.ts +21 -0
- package/dist/foundations/blog/dtos/blog-category.put.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-category.put.dto.js +76 -0
- package/dist/foundations/blog/dtos/blog-category.put.dto.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-post-translation.put.dto.d.ts +19 -0
- package/dist/foundations/blog/dtos/blog-post-translation.put.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-post-translation.put.dto.js +73 -0
- package/dist/foundations/blog/dtos/blog-post-translation.put.dto.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-post.dto.d.ts +11 -0
- package/dist/foundations/blog/dtos/blog-post.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-post.dto.js +45 -0
- package/dist/foundations/blog/dtos/blog-post.dto.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-post.post.dto.d.ts +27 -0
- package/dist/foundations/blog/dtos/blog-post.post.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-post.post.dto.js +98 -0
- package/dist/foundations/blog/dtos/blog-post.post.dto.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-post.put.dto.d.ts +30 -0
- package/dist/foundations/blog/dtos/blog-post.put.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-post.put.dto.js +104 -0
- package/dist/foundations/blog/dtos/blog-post.put.dto.js.map +1 -0
- package/dist/foundations/blog/dtos/blog-settings.put.dto.d.ts +14 -0
- package/dist/foundations/blog/dtos/blog-settings.put.dto.d.ts.map +1 -0
- package/dist/foundations/blog/dtos/blog-settings.put.dto.js +52 -0
- package/dist/foundations/blog/dtos/blog-settings.put.dto.js.map +1 -0
- package/dist/foundations/blog/entities/blog-category-translation.d.ts +36 -0
- package/dist/foundations/blog/entities/blog-category-translation.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-category-translation.js +70 -0
- package/dist/foundations/blog/entities/blog-category-translation.js.map +1 -0
- package/dist/foundations/blog/entities/blog-category-translation.meta.d.ts +3 -0
- package/dist/foundations/blog/entities/blog-category-translation.meta.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-category-translation.meta.js +10 -0
- package/dist/foundations/blog/entities/blog-category-translation.meta.js.map +1 -0
- package/dist/foundations/blog/entities/blog-category.d.ts +35 -0
- package/dist/foundations/blog/entities/blog-category.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-category.js +78 -0
- package/dist/foundations/blog/entities/blog-category.js.map +1 -0
- package/dist/foundations/blog/entities/blog-category.meta.d.ts +3 -0
- package/dist/foundations/blog/entities/blog-category.meta.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-category.meta.js +10 -0
- package/dist/foundations/blog/entities/blog-category.meta.js.map +1 -0
- package/dist/foundations/blog/entities/blog-post-translation.d.ts +43 -0
- package/dist/foundations/blog/entities/blog-post-translation.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-post-translation.js +91 -0
- package/dist/foundations/blog/entities/blog-post-translation.js.map +1 -0
- package/dist/foundations/blog/entities/blog-post-translation.meta.d.ts +3 -0
- package/dist/foundations/blog/entities/blog-post-translation.meta.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-post-translation.meta.js +10 -0
- package/dist/foundations/blog/entities/blog-post-translation.meta.js.map +1 -0
- package/dist/foundations/blog/entities/blog-post.d.ts +63 -0
- package/dist/foundations/blog/entities/blog-post.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-post.js +149 -0
- package/dist/foundations/blog/entities/blog-post.js.map +1 -0
- package/dist/foundations/blog/entities/blog-post.meta.d.ts +3 -0
- package/dist/foundations/blog/entities/blog-post.meta.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-post.meta.js +10 -0
- package/dist/foundations/blog/entities/blog-post.meta.js.map +1 -0
- package/dist/foundations/blog/entities/blog-settings.d.ts +18 -0
- package/dist/foundations/blog/entities/blog-settings.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-settings.js +26 -0
- package/dist/foundations/blog/entities/blog-settings.js.map +1 -0
- package/dist/foundations/blog/entities/blog-settings.meta.d.ts +3 -0
- package/dist/foundations/blog/entities/blog-settings.meta.d.ts.map +1 -0
- package/dist/foundations/blog/entities/blog-settings.meta.js +10 -0
- package/dist/foundations/blog/entities/blog-settings.meta.js.map +1 -0
- package/dist/foundations/blog/index.d.ts +34 -0
- package/dist/foundations/blog/index.d.ts.map +1 -0
- package/dist/foundations/blog/index.js +50 -0
- package/dist/foundations/blog/index.js.map +1 -0
- package/dist/foundations/blog/interfaces/blog.config.interface.d.ts +22 -0
- package/dist/foundations/blog/interfaces/blog.config.interface.d.ts.map +1 -0
- package/dist/foundations/blog/interfaces/blog.config.interface.js +10 -0
- package/dist/foundations/blog/interfaces/blog.config.interface.js.map +1 -0
- package/dist/foundations/blog/processors/blog.processor.d.ts +77 -0
- package/dist/foundations/blog/processors/blog.processor.d.ts.map +1 -0
- package/dist/foundations/blog/processors/blog.processor.js +404 -0
- package/dist/foundations/blog/processors/blog.processor.js.map +1 -0
- package/dist/foundations/blog/prompts/blog-summary.prompt.d.ts +6 -0
- package/dist/foundations/blog/prompts/blog-summary.prompt.d.ts.map +1 -0
- package/dist/foundations/blog/prompts/blog-summary.prompt.js +19 -0
- package/dist/foundations/blog/prompts/blog-summary.prompt.js.map +1 -0
- package/dist/foundations/blog/prompts/blog-translate.prompt.d.ts +7 -0
- package/dist/foundations/blog/prompts/blog-translate.prompt.d.ts.map +1 -0
- package/dist/foundations/blog/prompts/blog-translate.prompt.js +24 -0
- package/dist/foundations/blog/prompts/blog-translate.prompt.js.map +1 -0
- package/dist/foundations/blog/repositories/blog-category-translation.repository.d.ts +78 -0
- package/dist/foundations/blog/repositories/blog-category-translation.repository.d.ts.map +1 -0
- package/dist/foundations/blog/repositories/blog-category-translation.repository.js +199 -0
- package/dist/foundations/blog/repositories/blog-category-translation.repository.js.map +1 -0
- package/dist/foundations/blog/repositories/blog-category.repository.d.ts +56 -0
- package/dist/foundations/blog/repositories/blog-category.repository.d.ts.map +1 -0
- package/dist/foundations/blog/repositories/blog-category.repository.js +166 -0
- package/dist/foundations/blog/repositories/blog-category.repository.js.map +1 -0
- package/dist/foundations/blog/repositories/blog-post-translation.repository.d.ts +88 -0
- package/dist/foundations/blog/repositories/blog-post-translation.repository.d.ts.map +1 -0
- package/dist/foundations/blog/repositories/blog-post-translation.repository.js +220 -0
- package/dist/foundations/blog/repositories/blog-post-translation.repository.js.map +1 -0
- package/dist/foundations/blog/repositories/blog-post.repository.d.ts +118 -0
- package/dist/foundations/blog/repositories/blog-post.repository.d.ts.map +1 -0
- package/dist/foundations/blog/repositories/blog-post.repository.js +350 -0
- package/dist/foundations/blog/repositories/blog-post.repository.js.map +1 -0
- package/dist/foundations/blog/repositories/blog-settings.repository.d.ts +21 -0
- package/dist/foundations/blog/repositories/blog-settings.repository.d.ts.map +1 -0
- package/dist/foundations/blog/repositories/blog-settings.repository.js +60 -0
- package/dist/foundations/blog/repositories/blog-settings.repository.js.map +1 -0
- package/dist/foundations/blog/services/blog-category-translation.service.d.ts +37 -0
- package/dist/foundations/blog/services/blog-category-translation.service.d.ts.map +1 -0
- package/dist/foundations/blog/services/blog-category-translation.service.js +97 -0
- package/dist/foundations/blog/services/blog-category-translation.service.js.map +1 -0
- package/dist/foundations/blog/services/blog-category.service.d.ts +56 -0
- package/dist/foundations/blog/services/blog-category.service.d.ts.map +1 -0
- package/dist/foundations/blog/services/blog-category.service.js +164 -0
- package/dist/foundations/blog/services/blog-category.service.js.map +1 -0
- package/dist/foundations/blog/services/blog-post-translation.service.d.ts +44 -0
- package/dist/foundations/blog/services/blog-post-translation.service.d.ts.map +1 -0
- package/dist/foundations/blog/services/blog-post-translation.service.js +115 -0
- package/dist/foundations/blog/services/blog-post-translation.service.js.map +1 -0
- package/dist/foundations/blog/services/blog-post.service.d.ts +109 -0
- package/dist/foundations/blog/services/blog-post.service.d.ts.map +1 -0
- package/dist/foundations/blog/services/blog-post.service.js +276 -0
- package/dist/foundations/blog/services/blog-post.service.js.map +1 -0
- package/dist/foundations/blog/services/blog-queue.service.d.ts +36 -0
- package/dist/foundations/blog/services/blog-queue.service.d.ts.map +1 -0
- package/dist/foundations/blog/services/blog-queue.service.js +79 -0
- package/dist/foundations/blog/services/blog-queue.service.js.map +1 -0
- package/dist/foundations/blog/services/blog-settings.service.d.ts +21 -0
- package/dist/foundations/blog/services/blog-settings.service.d.ts.map +1 -0
- package/dist/foundations/blog/services/blog-settings.service.js +49 -0
- package/dist/foundations/blog/services/blog-settings.service.js.map +1 -0
- package/dist/foundations/blog/utils/reading-time.d.ts +5 -0
- package/dist/foundations/blog/utils/reading-time.d.ts.map +1 -0
- package/dist/foundations/blog/utils/reading-time.js +12 -0
- package/dist/foundations/blog/utils/reading-time.js.map +1 -0
- package/dist/foundations/blog/utils/slug.d.ts +12 -0
- package/dist/foundations/blog/utils/slug.d.ts.map +1 -0
- package/dist/foundations/blog/utils/slug.js +36 -0
- package/dist/foundations/blog/utils/slug.js.map +1 -0
- package/dist/foundations/foundations.modules.d.ts +8 -0
- package/dist/foundations/foundations.modules.d.ts.map +1 -1
- package/dist/foundations/foundations.modules.js +4 -1
- package/dist/foundations/foundations.modules.js.map +1 -1
- package/dist/foundations/index.d.ts +1 -0
- package/dist/foundations/index.d.ts.map +1 -1
- package/dist/foundations/index.js +1 -0
- package/dist/foundations/index.js.map +1 -1
- package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts +3 -1
- package/dist/foundations/tokenusage/enums/tokenusage.type.d.ts.map +1 -1
- package/dist/foundations/tokenusage/enums/tokenusage.type.js +2 -0
- package/dist/foundations/tokenusage/enums/tokenusage.type.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ClsService } from "nestjs-cls";
|
|
2
|
+
import { AiStatus } from "../../../common/enums/ai.status";
|
|
3
|
+
import { AbstractRepository } from "../../../core/neo4j/abstracts/abstract.repository";
|
|
4
|
+
import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
|
|
5
|
+
import { SecurityService } from "../../../core/security/services/security.service";
|
|
6
|
+
import { BlogTranslationSource } from "../blog.constants";
|
|
7
|
+
import { BlogPostTranslation, BlogPostTranslationDescriptor } from "../entities/blog-post-translation";
|
|
8
|
+
export declare class BlogPostTranslationRepository extends AbstractRepository<BlogPostTranslation, typeof BlogPostTranslationDescriptor.relationships> {
|
|
9
|
+
protected readonly descriptor: import("../../..").EntityDescriptor<BlogPostTranslation, {
|
|
10
|
+
post: {
|
|
11
|
+
model: import("../../..").DataMeta;
|
|
12
|
+
direction: "in";
|
|
13
|
+
relationship: string;
|
|
14
|
+
cardinality: "one";
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
}>;
|
|
18
|
+
constructor(neo4j: Neo4jService, securityService: SecurityService, clsService: ClsService);
|
|
19
|
+
/**
|
|
20
|
+
* The original-language translation of a post.
|
|
21
|
+
*/
|
|
22
|
+
findOriginal(params: {
|
|
23
|
+
postId: string;
|
|
24
|
+
}): Promise<BlogPostTranslation | null>;
|
|
25
|
+
/**
|
|
26
|
+
* The translation of a post in one language (original, AI, manual or placeholder).
|
|
27
|
+
*/
|
|
28
|
+
findByPostAndLanguage(params: {
|
|
29
|
+
postId: string;
|
|
30
|
+
language: string;
|
|
31
|
+
}): Promise<BlogPostTranslation | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Every slug in one language (across all posts) starting with `prefix`, for the `-2`, `-3`
|
|
34
|
+
* collision suffix. `excludeTranslationId` leaves out the record being re-slugged.
|
|
35
|
+
*/
|
|
36
|
+
findSlugsWithPrefix(params: {
|
|
37
|
+
language: string;
|
|
38
|
+
prefix: string;
|
|
39
|
+
excludeTranslationId?: string;
|
|
40
|
+
}): Promise<string[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Creates (or keeps) one placeholder per non-original language and marks it pending, so the
|
|
43
|
+
* admin sees "Translating..." at once. Existing records keep their text until the job writes.
|
|
44
|
+
*/
|
|
45
|
+
ensurePending(params: {
|
|
46
|
+
postId: string;
|
|
47
|
+
languages: string[];
|
|
48
|
+
}): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Sets the AI status of the given non-original languages of a post.
|
|
51
|
+
*/
|
|
52
|
+
setAiStatus(params: {
|
|
53
|
+
postId: string;
|
|
54
|
+
languages: string[];
|
|
55
|
+
aiStatus: AiStatus;
|
|
56
|
+
}): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Rewrites the text of one translation and bumps the post's updatedAt. A `manual` source also
|
|
59
|
+
* marks the record completed, so a hand-edited language is served even if its job had failed.
|
|
60
|
+
*/
|
|
61
|
+
updateText(params: {
|
|
62
|
+
id: string;
|
|
63
|
+
title: string;
|
|
64
|
+
slug: string;
|
|
65
|
+
summary?: string;
|
|
66
|
+
body: string;
|
|
67
|
+
bodyText: string;
|
|
68
|
+
coverImageAlt?: string;
|
|
69
|
+
readingMinutes: number;
|
|
70
|
+
source?: BlogTranslationSource;
|
|
71
|
+
}): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Upserts the AI translation of a post in one non-original language: source "ai", status
|
|
74
|
+
* completed, translatedAt now. Overwrites any manual edit, by design.
|
|
75
|
+
*/
|
|
76
|
+
writeAiTranslation(params: {
|
|
77
|
+
postId: string;
|
|
78
|
+
language: string;
|
|
79
|
+
title: string;
|
|
80
|
+
slug: string;
|
|
81
|
+
summary?: string;
|
|
82
|
+
body: string;
|
|
83
|
+
bodyText: string;
|
|
84
|
+
coverImageAlt?: string;
|
|
85
|
+
readingMinutes: number;
|
|
86
|
+
}): Promise<void>;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=blog-post-translation.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blog-post-translation.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/repositories/blog-post-translation.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAOvG,qBACa,6BAA8B,SAAQ,kBAAkB,CACnE,mBAAmB,EACnB,OAAO,6BAA6B,CAAC,aAAa,CACnD;IACC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;OAAiC;gBAElD,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAiBnF;;OAEG;IACG,qBAAqB,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAiB9G;;;OAGG;IACG,mBAAmB,CAAC,MAAM,EAAE;QAChC,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBrB;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BnF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrG;;;OAGG;IACG,UAAU,CAAC,MAAM,EAAE;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,qBAAqB,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjB;;;OAGG;IACG,kBAAkB,CAAC,MAAM,EAAE;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuClB"}
|
|
@@ -0,0 +1,220 @@
|
|
|
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.BlogPostTranslationRepository = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const nestjs_cls_1 = require("nestjs-cls");
|
|
15
|
+
const ai_status_1 = require("../../../common/enums/ai.status");
|
|
16
|
+
const abstract_repository_1 = require("../../../core/neo4j/abstracts/abstract.repository");
|
|
17
|
+
const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
|
|
18
|
+
const security_service_1 = require("../../../core/security/services/security.service");
|
|
19
|
+
const blog_post_meta_1 = require("../entities/blog-post.meta");
|
|
20
|
+
const blog_post_translation_1 = require("../entities/blog-post-translation");
|
|
21
|
+
const blog_post_translation_meta_1 = require("../entities/blog-post-translation.meta");
|
|
22
|
+
const translation = blog_post_translation_meta_1.blogPostTranslationMeta.nodeName;
|
|
23
|
+
const translationLabel = blog_post_translation_meta_1.blogPostTranslationMeta.labelName;
|
|
24
|
+
const postLabel = blog_post_meta_1.blogPostMeta.labelName;
|
|
25
|
+
let BlogPostTranslationRepository = class BlogPostTranslationRepository extends abstract_repository_1.AbstractRepository {
|
|
26
|
+
constructor(neo4j, securityService, clsService) {
|
|
27
|
+
super(neo4j, securityService, clsService);
|
|
28
|
+
this.descriptor = blog_post_translation_1.BlogPostTranslationDescriptor;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The original-language translation of a post.
|
|
32
|
+
*/
|
|
33
|
+
async findOriginal(params) {
|
|
34
|
+
const query = this.neo4j.initQuery({ serialiser: blog_post_translation_1.BlogPostTranslationDescriptor.model });
|
|
35
|
+
query.queryParams = { ...query.queryParams, postId: params.postId };
|
|
36
|
+
query.query += `
|
|
37
|
+
${this.buildDefaultMatch()}
|
|
38
|
+
WHERE ${translation}.isOriginal = true
|
|
39
|
+
AND EXISTS {
|
|
40
|
+
MATCH (${translation})<-[:HAS_TRANSLATION]-(:${postLabel} {id: $postId})
|
|
41
|
+
}
|
|
42
|
+
${this.buildReturnStatement()}
|
|
43
|
+
`;
|
|
44
|
+
return this.neo4j.readOne(query);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The translation of a post in one language (original, AI, manual or placeholder).
|
|
48
|
+
*/
|
|
49
|
+
async findByPostAndLanguage(params) {
|
|
50
|
+
const query = this.neo4j.initQuery({ serialiser: blog_post_translation_1.BlogPostTranslationDescriptor.model });
|
|
51
|
+
query.queryParams = { ...query.queryParams, postId: params.postId, language: params.language };
|
|
52
|
+
query.query += `
|
|
53
|
+
${this.buildDefaultMatch()}
|
|
54
|
+
WHERE ${translation}.language = $language
|
|
55
|
+
AND EXISTS {
|
|
56
|
+
MATCH (${translation})<-[:HAS_TRANSLATION]-(:${postLabel} {id: $postId})
|
|
57
|
+
}
|
|
58
|
+
${this.buildReturnStatement()}
|
|
59
|
+
`;
|
|
60
|
+
return this.neo4j.readOne(query);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Every slug in one language (across all posts) starting with `prefix`, for the `-2`, `-3`
|
|
64
|
+
* collision suffix. `excludeTranslationId` leaves out the record being re-slugged.
|
|
65
|
+
*/
|
|
66
|
+
async findSlugsWithPrefix(params) {
|
|
67
|
+
const query = this.neo4j.initQuery({ serialiser: blog_post_translation_1.BlogPostTranslationDescriptor.model });
|
|
68
|
+
query.queryParams = {
|
|
69
|
+
...query.queryParams,
|
|
70
|
+
language: params.language,
|
|
71
|
+
prefix: params.prefix,
|
|
72
|
+
excludeTranslationId: params.excludeTranslationId ?? null,
|
|
73
|
+
};
|
|
74
|
+
query.query += `
|
|
75
|
+
${this.buildDefaultMatch()}
|
|
76
|
+
WHERE ${translation}.language = $language
|
|
77
|
+
AND ${translation}.slug STARTS WITH $prefix
|
|
78
|
+
AND ($excludeTranslationId IS NULL OR ${translation}.id <> $excludeTranslationId)
|
|
79
|
+
RETURN ${translation}
|
|
80
|
+
`;
|
|
81
|
+
const translations = await this.neo4j.readMany(query);
|
|
82
|
+
return translations.map((item) => item.slug).filter((slug) => !!slug);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Creates (or keeps) one placeholder per non-original language and marks it pending, so the
|
|
86
|
+
* admin sees "Translating..." at once. Existing records keep their text until the job writes.
|
|
87
|
+
*/
|
|
88
|
+
async ensurePending(params) {
|
|
89
|
+
if (params.languages.length === 0)
|
|
90
|
+
return;
|
|
91
|
+
await this.neo4j.executeInTransaction([
|
|
92
|
+
{
|
|
93
|
+
query: `
|
|
94
|
+
MATCH (post:${postLabel} {id: $postId})
|
|
95
|
+
UNWIND $languages AS language
|
|
96
|
+
WITH post, language
|
|
97
|
+
WHERE language <> post.originalLanguage
|
|
98
|
+
MERGE (post)-[:HAS_TRANSLATION]->(${translation}:${translationLabel} {language: language})
|
|
99
|
+
ON CREATE SET
|
|
100
|
+
${translation}.id = randomUUID(),
|
|
101
|
+
${translation}.isOriginal = false,
|
|
102
|
+
${translation}.source = $source,
|
|
103
|
+
${translation}.createdAt = datetime()
|
|
104
|
+
SET ${translation}.aiStatus = $aiStatus, ${translation}.updatedAt = datetime()
|
|
105
|
+
`,
|
|
106
|
+
params: {
|
|
107
|
+
postId: params.postId,
|
|
108
|
+
languages: params.languages,
|
|
109
|
+
source: "ai",
|
|
110
|
+
aiStatus: ai_status_1.AiStatus.Pending,
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Sets the AI status of the given non-original languages of a post.
|
|
117
|
+
*/
|
|
118
|
+
async setAiStatus(params) {
|
|
119
|
+
if (params.languages.length === 0)
|
|
120
|
+
return;
|
|
121
|
+
await this.neo4j.executeInTransaction([
|
|
122
|
+
{
|
|
123
|
+
query: `
|
|
124
|
+
MATCH (:${postLabel} {id: $postId})-[:HAS_TRANSLATION]->(${translation}:${translationLabel})
|
|
125
|
+
WHERE ${translation}.language IN $languages
|
|
126
|
+
AND ${translation}.isOriginal = false
|
|
127
|
+
SET ${translation}.aiStatus = $aiStatus, ${translation}.updatedAt = datetime()
|
|
128
|
+
`,
|
|
129
|
+
params: { postId: params.postId, languages: params.languages, aiStatus: params.aiStatus },
|
|
130
|
+
},
|
|
131
|
+
]);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Rewrites the text of one translation and bumps the post's updatedAt. A `manual` source also
|
|
135
|
+
* marks the record completed, so a hand-edited language is served even if its job had failed.
|
|
136
|
+
*/
|
|
137
|
+
async updateText(params) {
|
|
138
|
+
await this.neo4j.executeInTransaction([
|
|
139
|
+
{
|
|
140
|
+
query: `
|
|
141
|
+
MATCH (${translation}:${translationLabel} {id: $id})
|
|
142
|
+
SET ${translation}.title = $title,
|
|
143
|
+
${translation}.slug = $slug,
|
|
144
|
+
${translation}.summary = $summary,
|
|
145
|
+
${translation}.body = $body,
|
|
146
|
+
${translation}.bodyText = $bodyText,
|
|
147
|
+
${translation}.coverImageAlt = $coverImageAlt,
|
|
148
|
+
${translation}.readingMinutes = $readingMinutes,
|
|
149
|
+
${translation}.updatedAt = datetime()
|
|
150
|
+
${params.source ? `SET ${translation}.source = $source` : ""}
|
|
151
|
+
${params.source === "manual" ? `SET ${translation}.aiStatus = $completedStatus` : ""}
|
|
152
|
+
WITH ${translation}
|
|
153
|
+
OPTIONAL MATCH (post:${postLabel})-[:HAS_TRANSLATION]->(${translation})
|
|
154
|
+
FOREACH (item IN CASE WHEN post IS NULL THEN [] ELSE [post] END | SET item.updatedAt = datetime())
|
|
155
|
+
`,
|
|
156
|
+
params: {
|
|
157
|
+
id: params.id,
|
|
158
|
+
title: params.title,
|
|
159
|
+
slug: params.slug,
|
|
160
|
+
summary: params.summary ?? null,
|
|
161
|
+
body: params.body,
|
|
162
|
+
bodyText: params.bodyText,
|
|
163
|
+
coverImageAlt: params.coverImageAlt ?? null,
|
|
164
|
+
readingMinutes: params.readingMinutes,
|
|
165
|
+
source: params.source ?? null,
|
|
166
|
+
completedStatus: ai_status_1.AiStatus.Completed,
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
]);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Upserts the AI translation of a post in one non-original language: source "ai", status
|
|
173
|
+
* completed, translatedAt now. Overwrites any manual edit, by design.
|
|
174
|
+
*/
|
|
175
|
+
async writeAiTranslation(params) {
|
|
176
|
+
await this.neo4j.executeInTransaction([
|
|
177
|
+
{
|
|
178
|
+
query: `
|
|
179
|
+
MATCH (post:${postLabel} {id: $postId})
|
|
180
|
+
WHERE post.originalLanguage <> $language
|
|
181
|
+
MERGE (post)-[:HAS_TRANSLATION]->(${translation}:${translationLabel} {language: $language})
|
|
182
|
+
ON CREATE SET
|
|
183
|
+
${translation}.id = randomUUID(),
|
|
184
|
+
${translation}.isOriginal = false,
|
|
185
|
+
${translation}.createdAt = datetime()
|
|
186
|
+
SET ${translation}.source = $source,
|
|
187
|
+
${translation}.aiStatus = $aiStatus,
|
|
188
|
+
${translation}.title = $title,
|
|
189
|
+
${translation}.slug = $slug,
|
|
190
|
+
${translation}.summary = $summary,
|
|
191
|
+
${translation}.body = $body,
|
|
192
|
+
${translation}.bodyText = $bodyText,
|
|
193
|
+
${translation}.coverImageAlt = $coverImageAlt,
|
|
194
|
+
${translation}.readingMinutes = $readingMinutes,
|
|
195
|
+
${translation}.translatedAt = datetime(),
|
|
196
|
+
${translation}.updatedAt = datetime()
|
|
197
|
+
`,
|
|
198
|
+
params: {
|
|
199
|
+
postId: params.postId,
|
|
200
|
+
language: params.language,
|
|
201
|
+
source: "ai",
|
|
202
|
+
aiStatus: ai_status_1.AiStatus.Completed,
|
|
203
|
+
title: params.title,
|
|
204
|
+
slug: params.slug,
|
|
205
|
+
summary: params.summary ?? null,
|
|
206
|
+
body: params.body,
|
|
207
|
+
bodyText: params.bodyText,
|
|
208
|
+
coverImageAlt: params.coverImageAlt ?? null,
|
|
209
|
+
readingMinutes: params.readingMinutes,
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
]);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
exports.BlogPostTranslationRepository = BlogPostTranslationRepository;
|
|
216
|
+
exports.BlogPostTranslationRepository = BlogPostTranslationRepository = __decorate([
|
|
217
|
+
(0, common_1.Injectable)(),
|
|
218
|
+
__metadata("design:paramtypes", [neo4j_service_1.Neo4jService, security_service_1.SecurityService, nestjs_cls_1.ClsService])
|
|
219
|
+
], BlogPostTranslationRepository);
|
|
220
|
+
//# sourceMappingURL=blog-post-translation.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blog-post-translation.repository.js","sourceRoot":"","sources":["../../../../src/foundations/blog/repositories/blog-post-translation.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { ClsService } from "nestjs-cls";
|
|
2
|
+
import { JsonApiCursorInterface } from "../../../core/jsonapi/interfaces/jsonapi.cursor.interface";
|
|
3
|
+
import { AbstractRepository } from "../../../core/neo4j/abstracts/abstract.repository";
|
|
4
|
+
import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
|
|
5
|
+
import { SecurityService } from "../../../core/security/services/security.service";
|
|
6
|
+
import { BlogPostStatus } from "../blog.constants";
|
|
7
|
+
import { BlogPost, BlogPostDescriptor } from "../entities/blog-post";
|
|
8
|
+
export declare class BlogPostRepository extends AbstractRepository<BlogPost, typeof BlogPostDescriptor.relationships> {
|
|
9
|
+
protected readonly descriptor: import("../../..").EntityDescriptor<BlogPost, {
|
|
10
|
+
author: {
|
|
11
|
+
model: import("../../..").DataMeta;
|
|
12
|
+
direction: "in";
|
|
13
|
+
relationship: string;
|
|
14
|
+
cardinality: "one";
|
|
15
|
+
description: string;
|
|
16
|
+
};
|
|
17
|
+
categories: {
|
|
18
|
+
model: import("../../..").DataMeta;
|
|
19
|
+
direction: "out";
|
|
20
|
+
relationship: string;
|
|
21
|
+
cardinality: "many";
|
|
22
|
+
required: false;
|
|
23
|
+
dtoKey: string;
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
translations: {
|
|
27
|
+
model: import("../../..").DataMeta;
|
|
28
|
+
direction: "out";
|
|
29
|
+
relationship: string;
|
|
30
|
+
cardinality: "many";
|
|
31
|
+
required: false;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
constructor(neo4j: Neo4jService, securityService: SecurityService, clsService: ClsService);
|
|
36
|
+
/**
|
|
37
|
+
* Admin list. A post has no text of its own (every string lives on its
|
|
38
|
+
* translations), so the inherited find would ignore `term`: a search matches
|
|
39
|
+
* any language version through the translation full-text index instead.
|
|
40
|
+
*/
|
|
41
|
+
find(params: Parameters<AbstractRepository<BlogPost, typeof BlogPostDescriptor.relationships>["find"]>[0]): Promise<any[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Resolves the translation a visitor reads into `t`: the translation in $language when its
|
|
44
|
+
* AI status is completed, otherwise the original. Pattern comprehensions, so the row count
|
|
45
|
+
* (and the ORDER BY applied later) never changes.
|
|
46
|
+
*/
|
|
47
|
+
private buildResolvedTranslation;
|
|
48
|
+
/**
|
|
49
|
+
* Public RETURN: the post node plus the resolved-language columns read by the descriptor's
|
|
50
|
+
* computed fields. Never returns the author User node (no email leak) nor translation nodes.
|
|
51
|
+
*/
|
|
52
|
+
private buildPublicReturn;
|
|
53
|
+
createWithOriginal(params: {
|
|
54
|
+
id: string;
|
|
55
|
+
authorId: string;
|
|
56
|
+
originalLanguage: string;
|
|
57
|
+
coverImage?: string;
|
|
58
|
+
categoryIds: string[];
|
|
59
|
+
translation: {
|
|
60
|
+
id: string;
|
|
61
|
+
title: string;
|
|
62
|
+
slug: string;
|
|
63
|
+
summary?: string;
|
|
64
|
+
body: string;
|
|
65
|
+
bodyText: string;
|
|
66
|
+
coverImageAlt?: string;
|
|
67
|
+
readingMinutes: number;
|
|
68
|
+
};
|
|
69
|
+
}): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Full update of the language-independent fields: a missing coverImage clears it, and the
|
|
72
|
+
* category edges become exactly `categoryIds`.
|
|
73
|
+
*/
|
|
74
|
+
updateShared(params: {
|
|
75
|
+
id: string;
|
|
76
|
+
coverImage?: string;
|
|
77
|
+
categoryIds: string[];
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Sets the status. Publishing stamps publishedAt only the first time, so unpublish and
|
|
81
|
+
* republish keep the original date.
|
|
82
|
+
*/
|
|
83
|
+
setStatus(params: {
|
|
84
|
+
id: string;
|
|
85
|
+
status: BlogPostStatus;
|
|
86
|
+
}): Promise<void>;
|
|
87
|
+
deleteWithTranslations(params: {
|
|
88
|
+
id: string;
|
|
89
|
+
}): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Published posts in the visitor's language (original as fallback), newest first, optionally
|
|
92
|
+
* filtered by a category slug in any language and searched through the translation full-text
|
|
93
|
+
* index (only the resolved translation of each post can match).
|
|
94
|
+
*/
|
|
95
|
+
findPublished(params: {
|
|
96
|
+
language: string;
|
|
97
|
+
categorySlug?: string;
|
|
98
|
+
term?: string;
|
|
99
|
+
cursor: JsonApiCursorInterface;
|
|
100
|
+
}): Promise<BlogPost[]>;
|
|
101
|
+
/**
|
|
102
|
+
* One published post by a slug of ANY of its languages, with the text resolved in $language.
|
|
103
|
+
* When two posts share the slug in different languages, the one owning it in $language wins.
|
|
104
|
+
*/
|
|
105
|
+
findPublishedBySlug(params: {
|
|
106
|
+
slug: string;
|
|
107
|
+
language: string;
|
|
108
|
+
}): Promise<BlogPost | null>;
|
|
109
|
+
/**
|
|
110
|
+
* Up to `limit` other published posts sharing a category with the given post, newest first.
|
|
111
|
+
*/
|
|
112
|
+
findPublishedRelated(params: {
|
|
113
|
+
postId: string;
|
|
114
|
+
language: string;
|
|
115
|
+
limit: number;
|
|
116
|
+
}): Promise<BlogPost[]>;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=blog-post.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blog-post.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/blog/repositories/blog-post.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2DAA2D,CAAC;AAEnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAWrE,qBACa,kBAAmB,SAAQ,kBAAkB,CAAC,QAAQ,EAAE,OAAO,kBAAkB,CAAC,aAAa,CAAC;IAC3G,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;OAAsB;gBAEvC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;;;OAIG;IACG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,kBAAkB,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IA2B/G;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAenB,kBAAkB,CAAC,MAAM,EAAE;QAC/B,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE;YACX,EAAE,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,cAAc,EAAE,MAAM,CAAC;SACxB,CAAC;KACH,GAAG,OAAO,CAAC,IAAI,CAAC;IAuEjB;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrG;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxE,sBAAsB,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAenE;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,sBAAsB,CAAC;KAChC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAyDvB;;;OAGG;IACG,mBAAmB,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA6B/F;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CA0B7G"}
|