@actuate-media/cms-core 0.57.0 → 0.58.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/__tests__/api/stats-seo-cache.test.js +1 -1
- package/dist/__tests__/api/stats-seo-cache.test.js.map +1 -1
- package/dist/__tests__/auth/oauth.test.js +3 -1
- package/dist/__tests__/auth/oauth.test.js.map +1 -1
- package/dist/__tests__/auth/reset.test.js +1 -0
- package/dist/__tests__/auth/reset.test.js.map +1 -1
- package/dist/__tests__/auth/user-admin.test.js +14 -12
- package/dist/__tests__/auth/user-admin.test.js.map +1 -1
- package/dist/__tests__/db/model-types-freshness.test.d.ts +2 -0
- package/dist/__tests__/db/model-types-freshness.test.d.ts.map +1 -0
- package/dist/__tests__/db/model-types-freshness.test.js +46 -0
- package/dist/__tests__/db/model-types-freshness.test.js.map +1 -0
- package/dist/__tests__/scheduling/scheduling.test.js +8 -6
- package/dist/__tests__/scheduling/scheduling.test.js.map +1 -1
- package/dist/__tests__/server-site.test.js +3 -1
- package/dist/__tests__/server-site.test.js.map +1 -1
- package/dist/__tests__/setup/index.test.js +21 -10
- package/dist/__tests__/setup/index.test.js.map +1 -1
- package/dist/actions.d.ts +2 -1
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +15 -8
- package/dist/actions.js.map +1 -1
- package/dist/api/guarded-db.d.ts +14 -0
- package/dist/api/guarded-db.d.ts.map +1 -0
- package/dist/api/guarded-db.js +58 -0
- package/dist/api/guarded-db.js.map +1 -0
- package/dist/api/handler-factory.d.ts.map +1 -1
- package/dist/api/handler-factory.js +2 -1
- package/dist/api/handler-factory.js.map +1 -1
- package/dist/api/handlers.d.ts +5 -3
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +54 -13068
- package/dist/api/handlers.js.map +1 -1
- package/dist/api/route-helpers.d.ts +321 -0
- package/dist/api/route-helpers.d.ts.map +1 -0
- package/dist/api/route-helpers.js +1307 -0
- package/dist/api/route-helpers.js.map +1 -0
- package/dist/api/routes/ai-seo.d.ts +3 -0
- package/dist/api/routes/ai-seo.d.ts.map +1 -0
- package/dist/api/routes/ai-seo.js +377 -0
- package/dist/api/routes/ai-seo.js.map +1 -0
- package/dist/api/routes/ai-settings.d.ts +3 -0
- package/dist/api/routes/ai-settings.d.ts.map +1 -0
- package/dist/api/routes/ai-settings.js +764 -0
- package/dist/api/routes/ai-settings.js.map +1 -0
- package/dist/api/routes/auth.d.ts +3 -0
- package/dist/api/routes/auth.d.ts.map +1 -0
- package/dist/api/routes/auth.js +787 -0
- package/dist/api/routes/auth.js.map +1 -0
- package/dist/api/routes/collab.d.ts +3 -0
- package/dist/api/routes/collab.d.ts.map +1 -0
- package/dist/api/routes/collab.js +426 -0
- package/dist/api/routes/collab.js.map +1 -0
- package/dist/api/routes/dashboard.d.ts +7 -0
- package/dist/api/routes/dashboard.d.ts.map +1 -0
- package/dist/api/routes/dashboard.js +540 -0
- package/dist/api/routes/dashboard.js.map +1 -0
- package/dist/api/routes/documents.d.ts +3 -0
- package/dist/api/routes/documents.d.ts.map +1 -0
- package/dist/api/routes/documents.js +180 -0
- package/dist/api/routes/documents.js.map +1 -0
- package/dist/api/routes/folders.d.ts +3 -0
- package/dist/api/routes/folders.d.ts.map +1 -0
- package/dist/api/routes/folders.js +195 -0
- package/dist/api/routes/folders.js.map +1 -0
- package/dist/api/routes/forms.d.ts +3 -0
- package/dist/api/routes/forms.d.ts.map +1 -0
- package/dist/api/routes/forms.js +661 -0
- package/dist/api/routes/forms.js.map +1 -0
- package/dist/api/routes/globals.d.ts +3 -0
- package/dist/api/routes/globals.d.ts.map +1 -0
- package/dist/api/routes/globals.js +133 -0
- package/dist/api/routes/globals.js.map +1 -0
- package/dist/api/routes/media.d.ts +3 -0
- package/dist/api/routes/media.d.ts.map +1 -0
- package/dist/api/routes/media.js +521 -0
- package/dist/api/routes/media.js.map +1 -0
- package/dist/api/routes/meta.d.ts +3 -0
- package/dist/api/routes/meta.d.ts.map +1 -0
- package/dist/api/routes/meta.js +96 -0
- package/dist/api/routes/meta.js.map +1 -0
- package/dist/api/routes/page-templates.d.ts +3 -0
- package/dist/api/routes/page-templates.d.ts.map +1 -0
- package/dist/api/routes/page-templates.js +265 -0
- package/dist/api/routes/page-templates.js.map +1 -0
- package/dist/api/routes/presence.d.ts +3 -0
- package/dist/api/routes/presence.d.ts.map +1 -0
- package/dist/api/routes/presence.js +35 -0
- package/dist/api/routes/presence.js.map +1 -0
- package/dist/api/routes/preview.d.ts +3 -0
- package/dist/api/routes/preview.d.ts.map +1 -0
- package/dist/api/routes/preview.js +111 -0
- package/dist/api/routes/preview.js.map +1 -0
- package/dist/api/routes/redirects.d.ts +3 -0
- package/dist/api/routes/redirects.d.ts.map +1 -0
- package/dist/api/routes/redirects.js +790 -0
- package/dist/api/routes/redirects.js.map +1 -0
- package/dist/api/routes/saved-sections.d.ts +3 -0
- package/dist/api/routes/saved-sections.d.ts.map +1 -0
- package/dist/api/routes/saved-sections.js +1036 -0
- package/dist/api/routes/saved-sections.js.map +1 -0
- package/dist/api/routes/scheduling.d.ts +3 -0
- package/dist/api/routes/scheduling.d.ts.map +1 -0
- package/dist/api/routes/scheduling.js +373 -0
- package/dist/api/routes/scheduling.js.map +1 -0
- package/dist/api/routes/sections.d.ts +3 -0
- package/dist/api/routes/sections.d.ts.map +1 -0
- package/dist/api/routes/sections.js +500 -0
- package/dist/api/routes/sections.js.map +1 -0
- package/dist/api/routes/security-center.d.ts +3 -0
- package/dist/api/routes/security-center.d.ts.map +1 -0
- package/dist/api/routes/security-center.js +71 -0
- package/dist/api/routes/security-center.js.map +1 -0
- package/dist/api/routes/seo-public.d.ts +14 -0
- package/dist/api/routes/seo-public.d.ts.map +1 -0
- package/dist/api/routes/seo-public.js +930 -0
- package/dist/api/routes/seo-public.js.map +1 -0
- package/dist/api/routes/seo.d.ts +8 -0
- package/dist/api/routes/seo.d.ts.map +1 -0
- package/dist/api/routes/seo.js +848 -0
- package/dist/api/routes/seo.js.map +1 -0
- package/dist/api/routes/system.d.ts +3 -0
- package/dist/api/routes/system.d.ts.map +1 -0
- package/dist/api/routes/system.js +340 -0
- package/dist/api/routes/system.js.map +1 -0
- package/dist/api/routes/url-resolution.d.ts +3 -0
- package/dist/api/routes/url-resolution.d.ts.map +1 -0
- package/dist/api/routes/url-resolution.js +457 -0
- package/dist/api/routes/url-resolution.js.map +1 -0
- package/dist/api/routes/users.d.ts +3 -0
- package/dist/api/routes/users.d.ts.map +1 -0
- package/dist/api/routes/users.js +1162 -0
- package/dist/api/routes/users.js.map +1 -0
- package/dist/api/routes/webhooks.d.ts +3 -0
- package/dist/api/routes/webhooks.d.ts.map +1 -0
- package/dist/api/routes/webhooks.js +338 -0
- package/dist/api/routes/webhooks.js.map +1 -0
- package/dist/auth/invites.d.ts +9 -8
- package/dist/auth/invites.d.ts.map +1 -1
- package/dist/auth/invites.js.map +1 -1
- package/dist/auth/oauth.d.ts +2 -1
- package/dist/auth/oauth.d.ts.map +1 -1
- package/dist/auth/oauth.js.map +1 -1
- package/dist/auth/reset.d.ts +3 -2
- package/dist/auth/reset.d.ts.map +1 -1
- package/dist/auth/reset.js +5 -2
- package/dist/auth/reset.js.map +1 -1
- package/dist/auth/session.d.ts +3 -2
- package/dist/auth/session.d.ts.map +1 -1
- package/dist/auth/session.js.map +1 -1
- package/dist/auth/team.d.ts +4 -3
- package/dist/auth/team.d.ts.map +1 -1
- package/dist/auth/team.js.map +1 -1
- package/dist/auth/user-admin.d.ts +6 -5
- package/dist/auth/user-admin.d.ts.map +1 -1
- package/dist/auth/user-admin.js.map +1 -1
- package/dist/content-health/cron.d.ts +2 -1
- package/dist/content-health/cron.d.ts.map +1 -1
- package/dist/content-health/cron.js.map +1 -1
- package/dist/cron/index.d.ts +2 -1
- package/dist/cron/index.d.ts.map +1 -1
- package/dist/cron/index.js +2 -0
- package/dist/cron/index.js.map +1 -1
- package/dist/db/client-types.d.ts +75 -0
- package/dist/db/client-types.d.ts.map +1 -0
- package/dist/db/client-types.js +2 -0
- package/dist/db/client-types.js.map +1 -0
- package/dist/db/model-types.d.ts +564 -0
- package/dist/db/model-types.d.ts.map +1 -0
- package/dist/db/model-types.js +14 -0
- package/dist/db/model-types.js.map +1 -0
- package/dist/diagnostics/api-metrics.d.ts.map +1 -1
- package/dist/diagnostics/api-metrics.js.map +1 -1
- package/dist/forms/entries.d.ts.map +1 -1
- package/dist/forms/entries.js.map +1 -1
- package/dist/forms/files.d.ts.map +1 -1
- package/dist/forms/files.js.map +1 -1
- package/dist/forms/service.d.ts.map +1 -1
- package/dist/forms/service.js.map +1 -1
- package/dist/forms/submission.d.ts.map +1 -1
- package/dist/forms/submission.js.map +1 -1
- package/dist/forms/webhooks.d.ts.map +1 -1
- package/dist/forms/webhooks.js.map +1 -1
- package/dist/graphql/index.d.ts.map +1 -1
- package/dist/graphql/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/scheduling/index.d.ts +2 -1
- package/dist/scheduling/index.d.ts.map +1 -1
- package/dist/scheduling/index.js.map +1 -1
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js.map +1 -1
- package/dist/security/audit.d.ts.map +1 -1
- package/dist/security/audit.js.map +1 -1
- package/dist/security/reauth.d.ts +2 -1
- package/dist/security/reauth.d.ts.map +1 -1
- package/dist/security/reauth.js.map +1 -1
- package/dist/seo/audit-runner.d.ts +3 -2
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/server-site.d.ts +2 -1
- package/dist/server-site.d.ts.map +1 -1
- package/dist/server-site.js.map +1 -1
- package/dist/setup/index.d.ts +4 -3
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js.map +1 -1
- package/dist/webhooks/index.d.ts +5 -5
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/index.js +8 -1
- package/dist/webhooks/index.js.map +1 -1
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { buildRelationLookup } from '../../actions.js';
|
|
2
|
+
import { populateRelations, parsePopulateParam } from '../../fields/relations.js';
|
|
3
|
+
import { ACTUATE_TAG_ROOT, actuateTag, cachedRead } from '../../cache/http.js';
|
|
4
|
+
import { createPreviewAdapter } from '../../preview/index.js';
|
|
5
|
+
import { coercePostHeader, layoutTreeToSections, collectSectionImageUrls, applyMediaMeta, defaultPostHeader, } from '../../sections/index.js';
|
|
6
|
+
import { getActuateConfig } from '../../config/runtime.js';
|
|
7
|
+
import { guardedDb } from '../guarded-db.js';
|
|
8
|
+
import { loadEffectiveConfig, siteUrlFromRequest } from './seo-public.js';
|
|
9
|
+
import { json, jsonWithCache, errorResponse, internalError, getSessionSecret, } from '../route-helpers.js';
|
|
10
|
+
export function registerUrlResolutionRoutes(router) {
|
|
11
|
+
const db = guardedDb;
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// URL Resolution — maps a public URL path to its document
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
const MAX_RESOLVE_DEPTH = 10;
|
|
16
|
+
async function resolveLayout(path, docData, matchedCollection) {
|
|
17
|
+
const config = getActuateConfig();
|
|
18
|
+
const layoutConfig = config?.layout;
|
|
19
|
+
if (!layoutConfig?.regions)
|
|
20
|
+
return {};
|
|
21
|
+
const regionNames = Object.keys(layoutConfig.regions);
|
|
22
|
+
if (regionNames.length === 0)
|
|
23
|
+
return {};
|
|
24
|
+
const allowedCollections = new Set();
|
|
25
|
+
for (const region of regionNames) {
|
|
26
|
+
const col = layoutConfig.regions[region]?.collection;
|
|
27
|
+
if (col)
|
|
28
|
+
allowedCollections.add(col);
|
|
29
|
+
}
|
|
30
|
+
const resolved = {};
|
|
31
|
+
const unresolved = new Set(regionNames);
|
|
32
|
+
const docLayout = (docData?._layout ?? {});
|
|
33
|
+
for (const region of regionNames) {
|
|
34
|
+
if (docLayout[region] && typeof docLayout[region] === 'string') {
|
|
35
|
+
resolved[region] = docLayout[region];
|
|
36
|
+
unresolved.delete(region);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (unresolved.size > 0 && layoutConfig.inherit !== false) {
|
|
40
|
+
const segments = path
|
|
41
|
+
.replace(/^\/|\/$/g, '')
|
|
42
|
+
.split('/')
|
|
43
|
+
.filter(Boolean);
|
|
44
|
+
const walkDepth = Math.min(segments.length - 1, MAX_RESOLVE_DEPTH);
|
|
45
|
+
for (let i = walkDepth; i > 0 && unresolved.size > 0; i--) {
|
|
46
|
+
const parentSlug = segments.slice(0, i).join('/');
|
|
47
|
+
const parentDoc = await db().document.findFirst({
|
|
48
|
+
where: {
|
|
49
|
+
collection: matchedCollection,
|
|
50
|
+
deletedAt: null,
|
|
51
|
+
status: 'PUBLISHED',
|
|
52
|
+
OR: [{ data: { path: ['slug'], equals: parentSlug } }, { slug: parentSlug }],
|
|
53
|
+
},
|
|
54
|
+
select: { data: true },
|
|
55
|
+
});
|
|
56
|
+
if (!parentDoc)
|
|
57
|
+
continue;
|
|
58
|
+
const parentLayout = (parentDoc.data?._layout ?? {});
|
|
59
|
+
for (const region of [...unresolved]) {
|
|
60
|
+
if (parentLayout[region] && typeof parentLayout[region] === 'string') {
|
|
61
|
+
resolved[region] = parentLayout[region];
|
|
62
|
+
unresolved.delete(region);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const settingsGlobal = await db().document.findFirst({
|
|
68
|
+
where: { collection: 'settings', deletedAt: null },
|
|
69
|
+
select: { data: true },
|
|
70
|
+
});
|
|
71
|
+
const settingsDefaults = (settingsGlobal?.data?.defaultLayout ?? {});
|
|
72
|
+
for (const region of [...unresolved]) {
|
|
73
|
+
const fallback = layoutConfig.defaults?.[region] ?? settingsDefaults[region];
|
|
74
|
+
if (fallback && typeof fallback === 'string') {
|
|
75
|
+
resolved[region] = fallback;
|
|
76
|
+
unresolved.delete(region);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (Object.keys(resolved).length === 0)
|
|
80
|
+
return {};
|
|
81
|
+
const variantIds = [...new Set(Object.values(resolved))];
|
|
82
|
+
const allowedCollectionList = [...allowedCollections];
|
|
83
|
+
const variants = await db().document.findMany({
|
|
84
|
+
where: {
|
|
85
|
+
id: { in: variantIds },
|
|
86
|
+
collection: { in: allowedCollectionList },
|
|
87
|
+
status: 'PUBLISHED',
|
|
88
|
+
deletedAt: null,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
const variantMap = new Map(variants.map((v) => [v.id, v]));
|
|
92
|
+
const result = {};
|
|
93
|
+
for (const [region, docId] of Object.entries(resolved)) {
|
|
94
|
+
const expectedCollection = layoutConfig.regions[region]?.collection;
|
|
95
|
+
const variant = variantMap.get(docId);
|
|
96
|
+
if (variant && variant.collection === expectedCollection) {
|
|
97
|
+
result[region] = { id: variant.id, collection: variant.collection, data: variant.data };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
router.get('/resolve', async (request) => {
|
|
103
|
+
try {
|
|
104
|
+
const url = new URL(request.url);
|
|
105
|
+
const pathParam = url.searchParams.get('path');
|
|
106
|
+
if (!pathParam) {
|
|
107
|
+
return errorResponse('Missing required "path" query parameter', 400);
|
|
108
|
+
}
|
|
109
|
+
const segments = pathParam
|
|
110
|
+
.replace(/^\/|\/$/g, '')
|
|
111
|
+
.split('/')
|
|
112
|
+
.filter(Boolean);
|
|
113
|
+
const configCollections = getActuateConfig()?.collections ?? {};
|
|
114
|
+
const collectionDefs = Object.values(configCollections);
|
|
115
|
+
let matchedCollection = null;
|
|
116
|
+
let docSlug = null;
|
|
117
|
+
if (segments.length === 0) {
|
|
118
|
+
// Root path — find a page-type collection and look for "home" or "index"
|
|
119
|
+
const pageCol = collectionDefs.find((c) => c.type === 'page' && !(c.urlPrefix ?? '').replace(/^\/|\/$/g, ''));
|
|
120
|
+
matchedCollection = pageCol?.slug ?? 'pages';
|
|
121
|
+
docSlug = 'home';
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
for (const col of collectionDefs) {
|
|
125
|
+
const prefix = (col.urlPrefix ?? col.slug ?? '').replace(/^\/|\/$/g, '');
|
|
126
|
+
if (prefix && segments.length >= 2) {
|
|
127
|
+
const prefixParts = prefix.split('/');
|
|
128
|
+
const pathPrefix = segments.slice(0, prefixParts.length).join('/');
|
|
129
|
+
if (pathPrefix === prefix) {
|
|
130
|
+
matchedCollection = col.slug;
|
|
131
|
+
docSlug = segments.slice(prefixParts.length).join('/');
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else if (!prefix && col.type === 'page') {
|
|
136
|
+
matchedCollection = col.slug;
|
|
137
|
+
docSlug = segments.join('/');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!matchedCollection && segments.length === 1) {
|
|
141
|
+
matchedCollection = 'pages';
|
|
142
|
+
docSlug = segments[0];
|
|
143
|
+
}
|
|
144
|
+
if (!matchedCollection && segments.length >= 2) {
|
|
145
|
+
matchedCollection = segments[0];
|
|
146
|
+
docSlug = segments.slice(1).join('/');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (!matchedCollection || !docSlug) {
|
|
150
|
+
return errorResponse('Could not resolve path', 404);
|
|
151
|
+
}
|
|
152
|
+
// ?preview=<token> — when a valid preview token is presented we drop
|
|
153
|
+
// the `status: PUBLISHED` filter so admins (and clients with a signed
|
|
154
|
+
// share link) can render an unpublished draft at the document's real
|
|
155
|
+
// URL. The token is tied to a (collection, documentId) pair so we
|
|
156
|
+
// verify the URL actually points at the document the token was
|
|
157
|
+
// minted for; this prevents using one token to peek at unrelated
|
|
158
|
+
// drafts in the same collection.
|
|
159
|
+
//
|
|
160
|
+
// Validation happens BEFORE the runtime-cache lookup so a preview
|
|
161
|
+
// session can never read from (or write to) the shared cache. The
|
|
162
|
+
// small price is that every `/resolve?preview=` call runs a JWT
|
|
163
|
+
// verification even on what would otherwise be a cache hit —
|
|
164
|
+
// worth it; the alternative is a cache poisoned with draft data.
|
|
165
|
+
const previewToken = url.searchParams.get('preview');
|
|
166
|
+
let previewSession = null;
|
|
167
|
+
if (previewToken) {
|
|
168
|
+
try {
|
|
169
|
+
const preview = createPreviewAdapter(getSessionSecret(), db());
|
|
170
|
+
const session = await preview.validatePreviewToken(previewToken);
|
|
171
|
+
if (session) {
|
|
172
|
+
previewSession = {
|
|
173
|
+
collection: session.collection,
|
|
174
|
+
documentId: session.documentId,
|
|
175
|
+
expiresAt: session.expiresAt,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
console.error('[actuate][api] resolve preview token validation failed:', err);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const isRootPath = segments.length === 0;
|
|
184
|
+
// Heavy compute (doc lookup → populate → meta composition) lives in
|
|
185
|
+
// a closure so the optional runtime-cache layer can short-circuit
|
|
186
|
+
// it on a hit. The cache layer is bypassed entirely when a preview
|
|
187
|
+
// session is active — a draft must never enter the shared cache.
|
|
188
|
+
const buildResolveBody = async () => {
|
|
189
|
+
const slugFilter = {
|
|
190
|
+
OR: isRootPath
|
|
191
|
+
? [
|
|
192
|
+
{ data: { path: ['slug'], equals: 'home' } },
|
|
193
|
+
{ data: { path: ['slug'], equals: 'index' } },
|
|
194
|
+
{ slug: 'home' },
|
|
195
|
+
{ slug: 'index' },
|
|
196
|
+
]
|
|
197
|
+
: [{ data: { path: ['slug'], equals: docSlug } }, { slug: docSlug }],
|
|
198
|
+
};
|
|
199
|
+
const doc = previewSession
|
|
200
|
+
? await db().document.findFirst({
|
|
201
|
+
where: {
|
|
202
|
+
collection: matchedCollection,
|
|
203
|
+
deletedAt: null,
|
|
204
|
+
...slugFilter,
|
|
205
|
+
},
|
|
206
|
+
})
|
|
207
|
+
: await db().document.findFirst({
|
|
208
|
+
where: {
|
|
209
|
+
collection: matchedCollection,
|
|
210
|
+
deletedAt: null,
|
|
211
|
+
status: 'PUBLISHED',
|
|
212
|
+
...slugFilter,
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
if (!doc) {
|
|
216
|
+
return errorResponse('Document not found', 404);
|
|
217
|
+
}
|
|
218
|
+
// Enforce the token ↔ document binding. A leaked or copied token can
|
|
219
|
+
// only unlock the exact document it was issued for.
|
|
220
|
+
if (previewSession &&
|
|
221
|
+
(previewSession.documentId !== doc.id || previewSession.collection !== matchedCollection)) {
|
|
222
|
+
return errorResponse('Preview token does not match this URL', 403);
|
|
223
|
+
}
|
|
224
|
+
let docData = doc.data && typeof doc.data === 'object' ? doc.data : {};
|
|
225
|
+
// Opt-in: ?populate=author,relatedPosts (or *) — expand relation IDs
|
|
226
|
+
// into `{ id, title, slug, status, collection }` summaries so the
|
|
227
|
+
// frontend renders authors / related case studies without a second
|
|
228
|
+
// request per reference. `resolve` is the highest-leverage place to
|
|
229
|
+
// do this because it's what marketing pages call from SSR.
|
|
230
|
+
const populateOpts = parsePopulateParam(new URL(request.url).searchParams.get('populate'));
|
|
231
|
+
if (populateOpts) {
|
|
232
|
+
const fields = getActuateConfig()?.collections?.[matchedCollection]?.fields;
|
|
233
|
+
if (fields) {
|
|
234
|
+
try {
|
|
235
|
+
docData = await populateRelations(fields, docData, buildRelationLookup(db()), populateOpts);
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
console.error('[actuate][api] resolve populate failed:', err);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const layout = await resolveLayout(pathParam, docData, matchedCollection);
|
|
243
|
+
const { _layout: layoutTree, ...cleanData } = docData;
|
|
244
|
+
// LEGACY fallback (ADR 0002): builder pages now compile `_layout` to
|
|
245
|
+
// canonical `data.sections` on save, so this branch is a no-op for any
|
|
246
|
+
// document written after that change. It still fires for LEGACY pages
|
|
247
|
+
// authored in the tree before compile-on-save (and not yet migrated via
|
|
248
|
+
// `migratePageBuilderSections`): when such a doc has no flat `sections`,
|
|
249
|
+
// derive a best-effort PageSection[] at read time so page-builder content
|
|
250
|
+
// is never stranded. Non-destructive — only the response is enriched.
|
|
251
|
+
if ((!Array.isArray(cleanData.sections) || cleanData.sections.length === 0) &&
|
|
252
|
+
layoutTree &&
|
|
253
|
+
typeof layoutTree === 'object') {
|
|
254
|
+
const bridged = layoutTreeToSections(layoutTree);
|
|
255
|
+
if (bridged.length > 0)
|
|
256
|
+
cleanData.sections = bridged;
|
|
257
|
+
}
|
|
258
|
+
// WS-E E3: enrich section images with intrinsic width/height + library
|
|
259
|
+
// alt text from `actuate_media`, matched by the stored URL. Additive
|
|
260
|
+
// and best-effort — a media-lookup failure must never break resolve.
|
|
261
|
+
if (Array.isArray(cleanData.sections) && cleanData.sections.length > 0) {
|
|
262
|
+
try {
|
|
263
|
+
const urls = collectSectionImageUrls(cleanData.sections);
|
|
264
|
+
if (urls.length > 0) {
|
|
265
|
+
const records = await db().media.findMany({
|
|
266
|
+
where: {
|
|
267
|
+
deletedAt: null,
|
|
268
|
+
OR: [{ storageKey: { in: urls } }, { publicUrl: { in: urls } }],
|
|
269
|
+
},
|
|
270
|
+
select: {
|
|
271
|
+
storageKey: true,
|
|
272
|
+
publicUrl: true,
|
|
273
|
+
width: true,
|
|
274
|
+
height: true,
|
|
275
|
+
altText: true,
|
|
276
|
+
title: true,
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
const lookup = new Map();
|
|
280
|
+
for (const r of records) {
|
|
281
|
+
const meta = {
|
|
282
|
+
width: r.width,
|
|
283
|
+
height: r.height,
|
|
284
|
+
alt: r.altText,
|
|
285
|
+
title: r.title,
|
|
286
|
+
};
|
|
287
|
+
if (r.storageKey)
|
|
288
|
+
lookup.set(r.storageKey, meta);
|
|
289
|
+
if (r.publicUrl)
|
|
290
|
+
lookup.set(r.publicUrl, meta);
|
|
291
|
+
}
|
|
292
|
+
if (lookup.size > 0) {
|
|
293
|
+
cleanData.sections = applyMediaMeta(cleanData.sections, lookup);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
console.error('[actuate][api] resolve media enrichment failed:', err);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Compose page meta + JSON-LD up front so client renderers (Next.js
|
|
302
|
+
// generateMetadata, plain SSR, MCP agents) don't have to re-derive
|
|
303
|
+
// schema, OG tags, and canonical URLs from raw doc data. Reads the
|
|
304
|
+
// collection's SEO config and the site-wide SEO defaults — with
|
|
305
|
+
// DB overrides from /seo/config applied on top of the static config.
|
|
306
|
+
const cfg = await loadEffectiveConfig();
|
|
307
|
+
const collectionDef = cfg?.collections?.[matchedCollection] ?? null;
|
|
308
|
+
// Post-type documents render a header composed from the post type's
|
|
309
|
+
// template (`post-templates` doc, matched by slug == the post-type
|
|
310
|
+
// slug). The template is the single source of truth for header design
|
|
311
|
+
// — editing it restyles every post of that type — so we resolve it
|
|
312
|
+
// here at read time rather than denormalizing onto each post. Read it
|
|
313
|
+
// directly (no ActionContext): the header is non-sensitive design
|
|
314
|
+
// metadata and resolve is a public endpoint. Falls back to the default
|
|
315
|
+
// header when the type has no saved template yet.
|
|
316
|
+
let templateHeader = null;
|
|
317
|
+
// Author profile (from the document's creator) + related posts (recent
|
|
318
|
+
// published siblings in the same collection) so the Author Bio and
|
|
319
|
+
// Related Posts sections render real data instead of placeholders.
|
|
320
|
+
// Posts have no author/relatedPosts relationship fields, so these are
|
|
321
|
+
// derived here rather than via ?populate.
|
|
322
|
+
let postAuthor = null;
|
|
323
|
+
let relatedPosts = [];
|
|
324
|
+
if (collectionDef?.type === 'post') {
|
|
325
|
+
try {
|
|
326
|
+
const tplDoc = await db().document.findFirst({
|
|
327
|
+
where: {
|
|
328
|
+
collection: 'post-templates',
|
|
329
|
+
deletedAt: null,
|
|
330
|
+
OR: [
|
|
331
|
+
{ slug: matchedCollection },
|
|
332
|
+
{ data: { path: ['slug'], equals: matchedCollection } },
|
|
333
|
+
],
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
const tplData = tplDoc?.data && typeof tplDoc.data === 'object'
|
|
337
|
+
? tplDoc.data
|
|
338
|
+
: undefined;
|
|
339
|
+
templateHeader = coercePostHeader(tplData?.header);
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
console.error('[actuate][api] resolve post-template lookup failed:', err);
|
|
343
|
+
templateHeader = defaultPostHeader();
|
|
344
|
+
}
|
|
345
|
+
try {
|
|
346
|
+
if (doc.createdById) {
|
|
347
|
+
const author = await db().user.findUnique({
|
|
348
|
+
where: { id: doc.createdById },
|
|
349
|
+
select: { name: true, avatarUrl: true },
|
|
350
|
+
});
|
|
351
|
+
if (author) {
|
|
352
|
+
postAuthor = { name: author.name, avatarUrl: author.avatarUrl ?? undefined };
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch (err) {
|
|
357
|
+
console.error('[actuate][api] resolve post author lookup failed:', err);
|
|
358
|
+
}
|
|
359
|
+
try {
|
|
360
|
+
const prefix = (collectionDef.urlPrefix ?? matchedCollection ?? '').replace(/^\/|\/$/g, '');
|
|
361
|
+
const siblings = await db().document.findMany({
|
|
362
|
+
where: {
|
|
363
|
+
collection: matchedCollection,
|
|
364
|
+
status: 'PUBLISHED',
|
|
365
|
+
deletedAt: null,
|
|
366
|
+
id: { not: doc.id },
|
|
367
|
+
},
|
|
368
|
+
orderBy: { publishedAt: 'desc' },
|
|
369
|
+
take: 3,
|
|
370
|
+
});
|
|
371
|
+
relatedPosts = siblings.map((s) => {
|
|
372
|
+
const sd = s.data && typeof s.data === 'object' ? s.data : {};
|
|
373
|
+
const slug = s.slug ?? (typeof sd.slug === 'string' ? sd.slug : '') ?? '';
|
|
374
|
+
const title = (typeof sd.title === 'string' && sd.title) || s.title || 'Untitled post';
|
|
375
|
+
const excerpt = typeof sd.excerpt === 'string' ? sd.excerpt : undefined;
|
|
376
|
+
return { title, excerpt, url: slug ? `/${prefix}/${slug}` : undefined };
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
catch (err) {
|
|
380
|
+
console.error('[actuate][api] resolve related posts lookup failed:', err);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
const { composePageMeta } = await import('../../seo/page-meta.js');
|
|
384
|
+
const composed = composePageMeta({
|
|
385
|
+
doc: {
|
|
386
|
+
id: doc.id,
|
|
387
|
+
collection: doc.collection,
|
|
388
|
+
slug: doc.slug ?? cleanData.slug ?? null,
|
|
389
|
+
data: cleanData,
|
|
390
|
+
publishedAt: doc.publishedAt,
|
|
391
|
+
updatedAt: doc.updatedAt,
|
|
392
|
+
structuredData: doc.structuredData ?? null,
|
|
393
|
+
pageSettings: cleanData.pageSettings ?? null,
|
|
394
|
+
},
|
|
395
|
+
collection: collectionDef,
|
|
396
|
+
config: cfg ?? null,
|
|
397
|
+
siteUrl: siteUrlFromRequest(request, cfg),
|
|
398
|
+
});
|
|
399
|
+
return {
|
|
400
|
+
data: {
|
|
401
|
+
id: doc.id,
|
|
402
|
+
collection: doc.collection,
|
|
403
|
+
data: cleanData,
|
|
404
|
+
status: doc.status,
|
|
405
|
+
publishedAt: doc.publishedAt,
|
|
406
|
+
structuredData: composed.jsonLd ?? doc.structuredData,
|
|
407
|
+
},
|
|
408
|
+
meta: {
|
|
409
|
+
title: composed.title,
|
|
410
|
+
description: composed.description,
|
|
411
|
+
canonical: composed.canonical,
|
|
412
|
+
url: composed.url,
|
|
413
|
+
tags: composed.meta,
|
|
414
|
+
html: composed.metaHtml,
|
|
415
|
+
},
|
|
416
|
+
// Next.js `generateMetadata()`-compatible object so the public site
|
|
417
|
+
// can spread it directly without re-deriving OG/Twitter/robots tags.
|
|
418
|
+
metadata: composed.metadata,
|
|
419
|
+
jsonLd: composed.jsonLd,
|
|
420
|
+
jsonLdHtml: composed.jsonLdHtml,
|
|
421
|
+
...(templateHeader ? { template: { header: templateHeader } } : {}),
|
|
422
|
+
...(collectionDef?.type === 'post' ? { post: { author: postAuthor, relatedPosts } } : {}),
|
|
423
|
+
...(Object.keys(layout).length > 0 ? { layout } : {}),
|
|
424
|
+
...(previewSession
|
|
425
|
+
? {
|
|
426
|
+
preview: {
|
|
427
|
+
active: true,
|
|
428
|
+
expiresAt: previewSession.expiresAt.toISOString(),
|
|
429
|
+
},
|
|
430
|
+
}
|
|
431
|
+
: {}),
|
|
432
|
+
};
|
|
433
|
+
};
|
|
434
|
+
// Preview-token requests bypass the cache (CDN + Runtime) so a
|
|
435
|
+
// leaked cached preview can never show up for anonymous traffic.
|
|
436
|
+
// Anonymous reads flow through cachedRead — coarse tags (the
|
|
437
|
+
// wholesale `actuate` tag + a path tag) so every write drains
|
|
438
|
+
// every cached resolve entry. Per-doc tagging would require
|
|
439
|
+
// resolving the doc id BEFORE the cache lookup, which defeats
|
|
440
|
+
// the purpose of caching at all.
|
|
441
|
+
if (previewSession) {
|
|
442
|
+
const body = await buildResolveBody();
|
|
443
|
+
return body instanceof Response ? body : json(body);
|
|
444
|
+
}
|
|
445
|
+
return cachedRead(request, {
|
|
446
|
+
cache: getActuateConfig()?.cache,
|
|
447
|
+
tags: [ACTUATE_TAG_ROOT, actuateTag('path', pathParam)],
|
|
448
|
+
wrap: jsonWithCache,
|
|
449
|
+
build: buildResolveBody,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
catch (err) {
|
|
453
|
+
return internalError(err);
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=url-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-resolution.js","sourceRoot":"","sources":["../../../src/api/routes/url-resolution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AACjF,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACd,iBAAiB,GAClB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EACL,IAAI,EACJ,aAAa,EACb,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,EAAE,GAAG,SAAS,CAAA;IACpB,8EAA8E;IAC9E,0DAA0D;IAC1D,8EAA8E;IAE9E,MAAM,iBAAiB,GAAG,EAAE,CAAA;IAE5B,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,OAAgC,EAChC,iBAAyB;QAEzB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;QACjC,MAAM,YAAY,GAAG,MAAM,EAAE,MAAM,CAAA;QACnC,IAAI,CAAC,YAAY,EAAE,OAAO;YAAE,OAAO,EAAE,CAAA;QAErC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QACrD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAEvC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAA;QAC5C,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,CAAA;YACpD,IAAI,GAAG;gBAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,CAAC;QAED,MAAM,QAAQ,GAA2B,EAAE,CAAA;QAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;QAEvC,MAAM,SAAS,GAAG,CAAE,OAAe,EAAE,OAAO,IAAI,EAAE,CAA2B,CAAA;QAC7E,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC/D,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;gBACpC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI;iBAClB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;iBACvB,KAAK,CAAC,GAAG,CAAC;iBACV,MAAM,CAAC,OAAO,CAAC,CAAA;YAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAA;YAClE,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACjD,MAAM,SAAS,GAAG,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAC9C,KAAK,EAAE;wBACL,UAAU,EAAE,iBAAiB;wBAC7B,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,WAAW;wBACnB,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;qBAC7E;oBACD,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;iBACvB,CAAC,CAAA;gBACF,IAAI,CAAC,SAAS;oBAAE,SAAQ;gBACxB,MAAM,YAAY,GAAG,CAAE,SAAS,CAAC,IAAY,EAAE,OAAO,IAAI,EAAE,CAA2B,CAAA;gBACvF,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;oBACrC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,OAAO,YAAY,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;wBACrE,QAAQ,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;wBACvC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;YACnD,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE;YAClD,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;SACvB,CAAC,CAAA;QACF,MAAM,gBAAgB,GAAG,CAAE,cAAc,EAAE,IAAY,EAAE,aAAa,IAAI,EAAE,CAG3E,CAAA;QAED,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;YAC5E,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC7C,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAA;gBAC3B,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QAEjD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACxD,MAAM,qBAAqB,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAA;QACrD,MAAM,QAAQ,GAAG,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC5C,KAAK,EAAE;gBACL,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE;gBACtB,UAAU,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE;gBACzC,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,IAAI;aAChB;SACF,CAAC,CAAA;QACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAc,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAE5E,MAAM,MAAM,GAA4B,EAAE,CAAA;QAC1C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,MAAM,kBAAkB,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,CAAA;YACnE,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACrC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,kBAAkB,EAAE,CAAC;gBACzD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAA;YACzF,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAChC,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAE9C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,aAAa,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAA;YACtE,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS;iBACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;iBACvB,KAAK,CAAC,GAAG,CAAC;iBACV,MAAM,CAAC,OAAO,CAAC,CAAA;YAElB,MAAM,iBAAiB,GAAwB,gBAAgB,EAAE,EAAE,WAAW,IAAI,EAAE,CAAA;YACpF,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;YAEvD,IAAI,iBAAiB,GAAkB,IAAI,CAAA;YAC3C,IAAI,OAAO,GAAkB,IAAI,CAAA;YAEjC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,yEAAyE;gBACzE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CACjC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAC9E,CAAA;gBACD,iBAAiB,GAAG,OAAO,EAAE,IAAI,IAAI,OAAO,CAAA;gBAC5C,OAAO,GAAG,MAAM,CAAA;YAClB,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;oBACjC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;oBACxE,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBACnC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;wBACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;wBAClE,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;4BAC1B,iBAAiB,GAAG,GAAG,CAAC,IAAI,CAAA;4BAC5B,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;4BACtD,MAAK;wBACP,CAAC;oBACH,CAAC;yBAAM,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC1C,iBAAiB,GAAG,GAAG,CAAC,IAAI,CAAA;wBAC5B,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAC9B,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,iBAAiB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChD,iBAAiB,GAAG,OAAO,CAAA;oBAC3B,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;gBACxB,CAAC;gBACD,IAAI,CAAC,iBAAiB,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBAC/C,iBAAiB,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;oBAChC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACvC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACnC,OAAO,aAAa,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAA;YACrD,CAAC;YAED,qEAAqE;YACrE,sEAAsE;YACtE,qEAAqE;YACrE,kEAAkE;YAClE,+DAA+D;YAC/D,iEAAiE;YACjE,iCAAiC;YACjC,EAAE;YACF,kEAAkE;YAClE,kEAAkE;YAClE,gEAAgE;YAChE,6DAA6D;YAC7D,iEAAiE;YACjE,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACpD,IAAI,cAAc,GAAuE,IAAI,CAAA;YAC7F,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,gBAAgB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;oBAC9D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAA;oBAChE,IAAI,OAAO,EAAE,CAAC;wBACZ,cAAc,GAAG;4BACf,UAAU,EAAE,OAAO,CAAC,UAAU;4BAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;4BAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;yBAC7B,CAAA;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,GAAG,CAAC,CAAA;gBAC/E,CAAC;YACH,CAAC;YAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;YAExC,oEAAoE;YACpE,kEAAkE;YAClE,mEAAmE;YACnE,iEAAiE;YACjE,MAAM,gBAAgB,GAAG,KAAK,IAAiD,EAAE;gBAC/E,MAAM,UAAU,GAAG;oBACjB,EAAE,EAAE,UAAU;wBACZ,CAAC,CAAC;4BACE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;4BAC5C,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;4BAC7C,EAAE,IAAI,EAAE,MAAM,EAAE;4BAChB,EAAE,IAAI,EAAE,OAAO,EAAE;yBAClB;wBACH,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;iBACvE,CAAA;gBACD,MAAM,GAAG,GAAG,cAAc;oBACxB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAC5B,KAAK,EAAE;4BACL,UAAU,EAAE,iBAAiB;4BAC7B,SAAS,EAAE,IAAI;4BACf,GAAG,UAAU;yBACd;qBACF,CAAC;oBACJ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAC5B,KAAK,EAAE;4BACL,UAAU,EAAE,iBAAiB;4BAC7B,SAAS,EAAE,IAAI;4BACf,MAAM,EAAE,WAAW;4BACnB,GAAG,UAAU;yBACd;qBACF,CAAC,CAAA;gBAEN,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,aAAa,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAA;gBACjD,CAAC;gBAED,qEAAqE;gBACrE,oDAAoD;gBACpD,IACE,cAAc;oBACd,CAAC,cAAc,CAAC,UAAU,KAAK,GAAG,CAAC,EAAE,IAAI,cAAc,CAAC,UAAU,KAAK,iBAAiB,CAAC,EACzF,CAAC;oBACD,OAAO,aAAa,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAA;gBACpE,CAAC;gBAED,IAAI,OAAO,GACT,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAA;gBAEvF,qEAAqE;gBACrE,kEAAkE;gBAClE,mEAAmE;gBACnE,oEAAoE;gBACpE,2DAA2D;gBAC3D,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAA;gBAC1F,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,gBAAgB,EAAE,EAAE,WAAW,EAAE,CAAC,iBAAkB,CAAC,EAAE,MAAM,CAAA;oBAC5E,IAAI,MAAM,EAAE,CAAC;wBACX,IAAI,CAAC;4BACH,OAAO,GAAG,MAAM,iBAAiB,CAC/B,MAAM,EACN,OAAO,EACP,mBAAmB,CAAC,EAAE,EAAE,CAAC,EACzB,YAAY,CACb,CAAA;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAA;wBAC/D,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAkB,CAAC,CAAA;gBAE1E,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAA;gBAErD,qEAAqE;gBACrE,uEAAuE;gBACvE,sEAAsE;gBACtE,wEAAwE;gBACxE,yEAAyE;gBACzE,0EAA0E;gBAC1E,sEAAsE;gBACtE,IACE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;oBACvE,UAAU;oBACV,OAAO,UAAU,KAAK,QAAQ,EAC9B,CAAC;oBACD,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAA;oBAChD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;wBAAE,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAA;gBACtD,CAAC;gBAED,uEAAuE;gBACvE,qEAAqE;gBACrE,qEAAqE;gBACrE,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvE,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;wBACxD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACpB,MAAM,OAAO,GAAG,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;gCACxC,KAAK,EAAE;oCACL,SAAS,EAAE,IAAI;oCACf,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;iCAChE;gCACD,MAAM,EAAE;oCACN,UAAU,EAAE,IAAI;oCAChB,SAAS,EAAE,IAAI;oCACf,KAAK,EAAE,IAAI;oCACX,MAAM,EAAE,IAAI;oCACZ,OAAO,EAAE,IAAI;oCACb,KAAK,EAAE,IAAI;iCACZ;6BACF,CAAC,CAAA;4BACF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAA;4BAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gCACxB,MAAM,IAAI,GAAc;oCACtB,KAAK,EAAE,CAAC,CAAC,KAAK;oCACd,MAAM,EAAE,CAAC,CAAC,MAAM;oCAChB,GAAG,EAAE,CAAC,CAAC,OAAO;oCACd,KAAK,EAAE,CAAC,CAAC,KAAK;iCACf,CAAA;gCACD,IAAI,CAAC,CAAC,UAAU;oCAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;gCAChD,IAAI,CAAC,CAAC,SAAS;oCAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;4BAChD,CAAC;4BACD,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gCACpB,SAAS,CAAC,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;4BACjE,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,GAAG,CAAC,CAAA;oBACvE,CAAC;gBACH,CAAC;gBAED,oEAAoE;gBACpE,mEAAmE;gBACnE,mEAAmE;gBACnE,gEAAgE;gBAChE,qEAAqE;gBACrE,MAAM,GAAG,GAAG,MAAM,mBAAmB,EAAE,CAAA;gBACvC,MAAM,aAAa,GAAG,GAAG,EAAE,WAAW,EAAE,CAAC,iBAAkB,CAAC,IAAI,IAAI,CAAA;gBAEpE,oEAAoE;gBACpE,mEAAmE;gBACnE,sEAAsE;gBACtE,mEAAmE;gBACnE,sEAAsE;gBACtE,kEAAkE;gBAClE,uEAAuE;gBACvE,kDAAkD;gBAClD,IAAI,cAAc,GAA4B,IAAI,CAAA;gBAClD,uEAAuE;gBACvE,mEAAmE;gBACnE,mEAAmE;gBACnE,sEAAsE;gBACtE,0CAA0C;gBAC1C,IAAI,UAAU,GAAiD,IAAI,CAAA;gBACnE,IAAI,YAAY,GAA6D,EAAE,CAAA;gBAC/E,IAAI,aAAa,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;oBACnC,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;4BAC3C,KAAK,EAAE;gCACL,UAAU,EAAE,gBAAgB;gCAC5B,SAAS,EAAE,IAAI;gCACf,EAAE,EAAE;oCACF,EAAE,IAAI,EAAE,iBAAkB,EAAE;oCAC5B,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,iBAAkB,EAAE,EAAE;iCACzD;6BACF;yBACF,CAAC,CAAA;wBACF,MAAM,OAAO,GACX,MAAM,EAAE,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;4BAC7C,CAAC,CAAE,MAAM,CAAC,IAAgC;4BAC1C,CAAC,CAAC,SAAS,CAAA;wBACf,cAAc,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;oBACpD,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAA;wBACzE,cAAc,GAAG,iBAAiB,EAAE,CAAA;oBACtC,CAAC;oBAED,IAAI,CAAC;wBACH,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;4BACpB,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;gCACxC,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE;gCAC9B,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;6BACxC,CAAC,CAAA;4BACF,IAAI,MAAM,EAAE,CAAC;gCACX,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS,EAAE,CAAA;4BAC9E,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,GAAG,CAAC,CAAA;oBACzE,CAAC;oBAED,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,CAAC,aAAa,CAAC,SAAS,IAAI,iBAAiB,IAAI,EAAE,CAAC,CAAC,OAAO,CACzE,UAAU,EACV,EAAE,CACH,CAAA;wBACD,MAAM,QAAQ,GAAG,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;4BAC5C,KAAK,EAAE;gCACL,UAAU,EAAE,iBAAkB;gCAC9B,MAAM,EAAE,WAAW;gCACnB,SAAS,EAAE,IAAI;gCACf,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;6BACpB;4BACD,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;4BAChC,IAAI,EAAE,CAAC;yBACR,CAAC,CAAA;wBACF,YAAY,GAAG,QAAQ,CAAC,GAAG,CACzB,CAAC,CAA+D,EAAE,EAAE;4BAClE,MAAM,EAAE,GACN,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,IAAgC,CAAC,CAAC,CAAC,EAAE,CAAA;4BACjF,MAAM,IAAI,GACR,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC,IAAe,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;4BAC1E,MAAM,KAAK,GACT,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,eAAe,CAAA;4BAC1E,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC,OAAkB,CAAC,CAAC,CAAC,SAAS,CAAA;4BACnF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;wBACzE,CAAC,CACF,CAAA;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAA;oBAC3E,CAAC;gBACH,CAAC;gBAED,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAA;gBAClE,MAAM,QAAQ,GAAG,eAAe,CAAC;oBAC/B,GAAG,EAAE;wBACH,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,UAAU,EAAE,GAAG,CAAC,UAAU;wBAC1B,IAAI,EAAE,GAAG,CAAC,IAAI,IAAK,SAAS,CAAC,IAA2B,IAAI,IAAI;wBAChE,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,GAAG,CAAC,WAAW;wBAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,cAAc,EACX,GAAG,CAAC,cAA6D,IAAI,IAAI;wBAC5E,YAAY,EACT,SAAS,CAAC,YAA2D,IAAI,IAAI;qBACjF;oBACD,UAAU,EAAE,aAAa;oBACzB,MAAM,EAAE,GAAG,IAAI,IAAI;oBACnB,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC;iBAC1C,CAAC,CAAA;gBAEF,OAAO;oBACL,IAAI,EAAE;wBACJ,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,UAAU,EAAE,GAAG,CAAC,UAAU;wBAC1B,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,WAAW,EAAE,GAAG,CAAC,WAAW;wBAC5B,cAAc,EAAE,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,cAAc;qBACtD;oBACD,IAAI,EAAE;wBACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;wBACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,GAAG,EAAE,QAAQ,CAAC,GAAG;wBACjB,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,IAAI,EAAE,QAAQ,CAAC,QAAQ;qBACxB;oBACD,oEAAoE;oBACpE,qEAAqE;oBACrE,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnE,GAAG,CAAC,aAAa,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,GAAG,CAAC,cAAc;wBAChB,CAAC,CAAC;4BACE,OAAO,EAAE;gCACP,MAAM,EAAE,IAAI;gCACZ,SAAS,EAAE,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE;6BAClD;yBACF;wBACH,CAAC,CAAC,EAAE,CAAC;iBACR,CAAA;YACH,CAAC,CAAA;YAED,+DAA+D;YAC/D,iEAAiE;YACjE,6DAA6D;YAC7D,8DAA8D;YAC9D,4DAA4D;YAC5D,8DAA8D;YAC9D,iCAAiC;YACjC,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAA;gBACrC,OAAO,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;YAED,OAAO,UAAU,CAAC,OAAO,EAAE;gBACzB,KAAK,EAAE,gBAAgB,EAAE,EAAE,KAAK;gBAChC,IAAI,EAAE,CAAC,gBAAgB,EAAE,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACvD,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,gBAAgB;aACxB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/api/routes/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AA0C7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqrC1D"}
|