@prenta/core 5.5.0 → 5.7.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/CHANGELOG.md +31 -0
- package/dist/ai/governance.d.ts +6 -0
- package/dist/ai/governance.d.ts.map +1 -1
- package/dist/ai/governance.js +19 -0
- package/dist/ai/governance.js.map +1 -1
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +2 -0
- package/dist/api/handlers.js.map +1 -1
- package/dist/api/routes/redirects.d.ts.map +1 -1
- package/dist/api/routes/redirects.js +89 -93
- package/dist/api/routes/redirects.js.map +1 -1
- package/dist/api/routes/seo-autopilot.d.ts +12 -0
- package/dist/api/routes/seo-autopilot.d.ts.map +1 -0
- package/dist/api/routes/seo-autopilot.js +257 -0
- package/dist/api/routes/seo-autopilot.js.map +1 -0
- package/dist/api/routes/seo.d.ts.map +1 -1
- package/dist/api/routes/seo.js +195 -360
- package/dist/api/routes/seo.js.map +1 -1
- package/dist/db/model-types.d.ts +26 -0
- package/dist/db/model-types.d.ts.map +1 -1
- package/dist/generated/browser.d.ts +8 -0
- package/dist/generated/client.d.ts +8 -0
- package/dist/generated/internal/class.d.ts +11 -0
- package/dist/generated/internal/class.js +4 -4
- package/dist/generated/internal/prismaNamespace.d.ts +120 -1
- package/dist/generated/internal/prismaNamespace.js +42 -0
- package/dist/generated/internal/prismaNamespaceBrowser.d.ts +44 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +42 -0
- package/dist/generated/models/SeoAutoApply.d.ts +1495 -0
- package/dist/generated/models/SeoAutoApply.js +1 -0
- package/dist/generated/models.d.ts +1 -0
- package/dist/redirects/recovery.d.ts +15 -9
- package/dist/redirects/recovery.d.ts.map +1 -1
- package/dist/redirects/recovery.js +15 -61
- package/dist/redirects/recovery.js.map +1 -1
- package/dist/redirects/suggestion-accept.d.ts +29 -0
- package/dist/redirects/suggestion-accept.d.ts.map +1 -0
- package/dist/redirects/suggestion-accept.js +108 -0
- package/dist/redirects/suggestion-accept.js.map +1 -0
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +0 -2
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/seo/autopilot-gate.d.ts +101 -0
- package/dist/seo/autopilot-gate.d.ts.map +1 -0
- package/dist/seo/autopilot-gate.js +272 -0
- package/dist/seo/autopilot-gate.js.map +1 -0
- package/dist/seo/autopilot-ledger.d.ts +74 -0
- package/dist/seo/autopilot-ledger.d.ts.map +1 -0
- package/dist/seo/autopilot-ledger.js +118 -0
- package/dist/seo/autopilot-ledger.js.map +1 -0
- package/dist/seo/autopilot-outcome.d.ts +93 -0
- package/dist/seo/autopilot-outcome.d.ts.map +1 -0
- package/dist/seo/autopilot-outcome.js +206 -0
- package/dist/seo/autopilot-outcome.js.map +1 -0
- package/dist/seo/autopilot-policy.d.ts +169 -0
- package/dist/seo/autopilot-policy.d.ts.map +1 -0
- package/dist/seo/autopilot-policy.js +267 -0
- package/dist/seo/autopilot-policy.js.map +1 -0
- package/dist/seo/autopilot-revert.d.ts +40 -0
- package/dist/seo/autopilot-revert.d.ts.map +1 -0
- package/dist/seo/autopilot-revert.js +155 -0
- package/dist/seo/autopilot-revert.js.map +1 -0
- package/dist/seo/autopilot.d.ts +91 -0
- package/dist/seo/autopilot.d.ts.map +1 -0
- package/dist/seo/autopilot.js +1060 -0
- package/dist/seo/autopilot.js.map +1 -0
- package/dist/seo/config-store.d.ts +35 -2
- package/dist/seo/config-store.d.ts.map +1 -1
- package/dist/seo/config-store.js +58 -1
- package/dist/seo/config-store.js.map +1 -1
- package/dist/seo/deep-equal.d.ts +12 -0
- package/dist/seo/deep-equal.d.ts.map +1 -0
- package/dist/seo/deep-equal.js +42 -0
- package/dist/seo/deep-equal.js.map +1 -0
- package/dist/seo/digest.d.ts +27 -0
- package/dist/seo/digest.d.ts.map +1 -1
- package/dist/seo/digest.js +77 -1
- package/dist/seo/digest.js.map +1 -1
- package/dist/seo/index.d.ts +20 -2
- package/dist/seo/index.d.ts.map +1 -1
- package/dist/seo/index.js +12 -1
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/issue-fix-ai.d.ts +40 -1
- package/dist/seo/issue-fix-ai.d.ts.map +1 -1
- package/dist/seo/issue-fix-ai.js +53 -1
- package/dist/seo/issue-fix-ai.js.map +1 -1
- package/dist/seo/issue-fix-apply.d.ts +104 -0
- package/dist/seo/issue-fix-apply.d.ts.map +1 -0
- package/dist/seo/issue-fix-apply.js +406 -0
- package/dist/seo/issue-fix-apply.js.map +1 -0
- package/dist/seo/issue-fix.d.ts +9 -0
- package/dist/seo/issue-fix.d.ts.map +1 -1
- package/dist/seo/issue-fix.js +1 -0
- package/dist/seo/issue-fix.js.map +1 -1
- package/dist/seo/proposals-bulk-apply.d.ts +52 -0
- package/dist/seo/proposals-bulk-apply.d.ts.map +1 -0
- package/dist/seo/proposals-bulk-apply.js +183 -0
- package/dist/seo/proposals-bulk-apply.js.map +1 -0
- package/dist/seo/proposals-generate.d.ts +45 -0
- package/dist/seo/proposals-generate.d.ts.map +1 -0
- package/dist/seo/proposals-generate.js +144 -0
- package/dist/seo/proposals-generate.js.map +1 -0
- package/dist/seo/proposals.d.ts +125 -0
- package/dist/seo/proposals.d.ts.map +1 -0
- package/dist/seo/proposals.js +270 -0
- package/dist/seo/proposals.js.map +1 -0
- package/package.json +1 -1
- package/prisma/migrations/0017_seo_auto_applies/migration.sql +35 -0
- package/prisma/schema.prisma +43 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { isAuthorizedCronRequest } from '../../cron/index.js';
|
|
2
|
+
import { logEvent } from '../../security/audit.js';
|
|
3
|
+
import { getFeatureGovernance } from '../../ai/governance.js';
|
|
4
|
+
import { guardedDb } from '../guarded-db.js';
|
|
5
|
+
import { ADMIN_ROLES, clampPage, clampPageSize, errorResponse, hasModel, internalError, json, modelNotAvailable, requireAuth, requireRole, } from '../route-helpers.js';
|
|
6
|
+
import { getSeoOverrides, patchAutopilotPolicy, resolveSeoModuleSettings, } from '../../seo/config-store.js';
|
|
7
|
+
import { parseAutopilotPolicyPatch, } from '../../seo/autopilot-policy.js';
|
|
8
|
+
import { listSeoAutoApplies, } from '../../seo/autopilot-ledger.js';
|
|
9
|
+
import { revertSeoAutoApply } from '../../seo/autopilot-revert.js';
|
|
10
|
+
import { runSeoAutopilot } from '../../seo/autopilot.js';
|
|
11
|
+
import { ISSUE_FIX_FEATURE_KEY, REDIRECT_FEATURE_KEY } from '../../seo/proposals.js';
|
|
12
|
+
const STATUSES = new Set([
|
|
13
|
+
'applied',
|
|
14
|
+
'verify_failed',
|
|
15
|
+
'reverted',
|
|
16
|
+
'outcome_reverted',
|
|
17
|
+
]);
|
|
18
|
+
const OUTCOMES = new Set([
|
|
19
|
+
'pending',
|
|
20
|
+
'held',
|
|
21
|
+
'regressed',
|
|
22
|
+
'insufficient_data',
|
|
23
|
+
'skipped',
|
|
24
|
+
]);
|
|
25
|
+
function isLedgerStatus(v) {
|
|
26
|
+
return STATUSES.has(v);
|
|
27
|
+
}
|
|
28
|
+
function isLedgerOutcome(v) {
|
|
29
|
+
return OUTCOMES.has(v);
|
|
30
|
+
}
|
|
31
|
+
const APPLIED_PAGE_SIZE_MAX = 100;
|
|
32
|
+
const APPLIED_PAGE_SIZE_DEFAULT = 20;
|
|
33
|
+
async function settingsPayload(db, s) {
|
|
34
|
+
const [issueGov, redirectGov] = await Promise.all([
|
|
35
|
+
getFeatureGovernance(db, ISSUE_FIX_FEATURE_KEY),
|
|
36
|
+
getFeatureGovernance(db, REDIRECT_FEATURE_KEY),
|
|
37
|
+
]);
|
|
38
|
+
return {
|
|
39
|
+
...s.autopilot,
|
|
40
|
+
lastRunAt: s.autopilotLastRunAt,
|
|
41
|
+
lastRun: s.autopilotLastRun,
|
|
42
|
+
// Surfaced so the card can warn when an enabled type is vetoed by Settings → AI.
|
|
43
|
+
governance: {
|
|
44
|
+
issueFixApprovalRequired: issueGov.approvalRequired,
|
|
45
|
+
redirectApprovalRequired: redirectGov.approvalRequired,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Resolved before/after diff for the audit trail (never used for storage). */
|
|
50
|
+
function diffPolicy(before, after) {
|
|
51
|
+
const out = {};
|
|
52
|
+
for (const key of Object.keys(after)) {
|
|
53
|
+
if (JSON.stringify(before[key]) !== JSON.stringify(after[key])) {
|
|
54
|
+
out[key] = { from: before[key], to: after[key] };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
export function registerSeoAutopilotRoutes(router) {
|
|
60
|
+
const db = guardedDb;
|
|
61
|
+
router.get('/seo/autopilot/settings', async (request) => {
|
|
62
|
+
try {
|
|
63
|
+
const auth = await requireAuth(request);
|
|
64
|
+
if (auth.error)
|
|
65
|
+
return auth.error;
|
|
66
|
+
const s = resolveSeoModuleSettings(await getSeoOverrides(db()));
|
|
67
|
+
return json({ data: await settingsPayload(db(), s) });
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
return internalError(err, 'seo/autopilot/settings GET');
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
router.put('/seo/autopilot/settings', async (request) => {
|
|
74
|
+
try {
|
|
75
|
+
const auth = await requireAuth(request);
|
|
76
|
+
if (auth.error)
|
|
77
|
+
return auth.error;
|
|
78
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
79
|
+
if (roleErr)
|
|
80
|
+
return roleErr;
|
|
81
|
+
const body = await request.json().catch(() => null);
|
|
82
|
+
const parsed = parseAutopilotPolicyPatch(body);
|
|
83
|
+
if (!parsed.ok)
|
|
84
|
+
return errorResponse(parsed.error, 400);
|
|
85
|
+
const current = resolveSeoModuleSettings(await getSeoOverrides(db()));
|
|
86
|
+
const before = current.autopilot;
|
|
87
|
+
// Sparse write: only the validated keys the client sent. `types` /
|
|
88
|
+
// `outcomeWatch` stay partial — `patchAutopilotPolicy` merges them one
|
|
89
|
+
// level deep onto the stored block.
|
|
90
|
+
const write = { ...parsed.patch };
|
|
91
|
+
if (parsed.resume) {
|
|
92
|
+
write.pausedAt = null;
|
|
93
|
+
write.pausedReason = null;
|
|
94
|
+
}
|
|
95
|
+
if (parsed.resumeTypes.length > 0) {
|
|
96
|
+
// `null` removes the entry from the stored `pausedTypes`.
|
|
97
|
+
const cleared = {};
|
|
98
|
+
for (const t of parsed.resumeTypes)
|
|
99
|
+
cleared[t] = null;
|
|
100
|
+
write.pausedTypes = cleared;
|
|
101
|
+
}
|
|
102
|
+
// Owner = the admin who authorised the current policy: any edit or
|
|
103
|
+
// resume while the engine is (or becomes) enabled transfers ownership.
|
|
104
|
+
// Turning the engine off never rewrites the owner (spec §1 Settings API).
|
|
105
|
+
const touched = Object.keys(write).length > 0;
|
|
106
|
+
if (touched && (write.enabled ?? before.enabled)) {
|
|
107
|
+
write.enabledById = auth.session.userId;
|
|
108
|
+
}
|
|
109
|
+
if (!touched)
|
|
110
|
+
return json({ data: await settingsPayload(db(), current) });
|
|
111
|
+
const saved = await patchAutopilotPolicy(db(), write, auth.session.userId);
|
|
112
|
+
try {
|
|
113
|
+
await logEvent({
|
|
114
|
+
event: 'update_seo_autopilot_settings',
|
|
115
|
+
userId: auth.session.userId,
|
|
116
|
+
details: {
|
|
117
|
+
source: 'autopilot-settings',
|
|
118
|
+
changed: diffPolicy(before, saved.autopilot),
|
|
119
|
+
resume: parsed.resume,
|
|
120
|
+
resumeTypes: parsed.resumeTypes,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
/* audit-log failures never block */
|
|
126
|
+
}
|
|
127
|
+
return json({ data: await settingsPayload(db(), saved) });
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return internalError(err, 'seo/autopilot/settings PUT');
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
router.post('/seo/autopilot/run', async (request) => {
|
|
134
|
+
try {
|
|
135
|
+
const auth = await requireAuth(request);
|
|
136
|
+
if (auth.error)
|
|
137
|
+
return auth.error;
|
|
138
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
139
|
+
if (roleErr)
|
|
140
|
+
return roleErr;
|
|
141
|
+
if (!hasModel(db(), 'seoAutoApply'))
|
|
142
|
+
return modelNotAvailable('SeoAutoApply');
|
|
143
|
+
// The run itself acts (and audits `seo_autopilot_run`) as the policy owner,
|
|
144
|
+
// so record who asked for it — before the run, so a hung engine still leaves a trace.
|
|
145
|
+
try {
|
|
146
|
+
await logEvent({
|
|
147
|
+
event: 'seo_autopilot_run_requested',
|
|
148
|
+
userId: auth.session.userId,
|
|
149
|
+
details: { source: 'manual' },
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
/* audit-log failures never block */
|
|
154
|
+
}
|
|
155
|
+
// The summary is passed through untouched — the engine owns its shape.
|
|
156
|
+
return json({ data: await runSeoAutopilot(db()) });
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
return internalError(err, 'seo/autopilot/run');
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
router.get('/seo/autopilot/applied', async (request) => {
|
|
163
|
+
try {
|
|
164
|
+
const auth = await requireAuth(request);
|
|
165
|
+
if (auth.error)
|
|
166
|
+
return auth.error;
|
|
167
|
+
if (!hasModel(db(), 'seoAutoApply'))
|
|
168
|
+
return modelNotAvailable('SeoAutoApply');
|
|
169
|
+
const url = new URL(request.url);
|
|
170
|
+
const status = url.searchParams.get('status');
|
|
171
|
+
const outcome = url.searchParams.get('outcome');
|
|
172
|
+
if (status !== null && !isLedgerStatus(status)) {
|
|
173
|
+
return errorResponse('Invalid status filter', 400);
|
|
174
|
+
}
|
|
175
|
+
if (outcome !== null && !isLedgerOutcome(outcome)) {
|
|
176
|
+
return errorResponse('Invalid outcome filter', 400);
|
|
177
|
+
}
|
|
178
|
+
const result = await listSeoAutoApplies(db(), {
|
|
179
|
+
status: status ?? undefined,
|
|
180
|
+
outcome: outcome ?? undefined,
|
|
181
|
+
page: clampPage(url.searchParams.get('page')),
|
|
182
|
+
pageSize: clampPageSize(url.searchParams.get('pageSize'), APPLIED_PAGE_SIZE_MAX, APPLIED_PAGE_SIZE_DEFAULT),
|
|
183
|
+
});
|
|
184
|
+
return json({ data: { ...result, canRevert: ADMIN_ROLES.has(auth.session.role) } });
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
return internalError(err, 'seo/autopilot/applied');
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
router.post('/seo/autopilot/applied/:id/revert', async (request, params) => {
|
|
191
|
+
try {
|
|
192
|
+
const auth = await requireAuth(request);
|
|
193
|
+
if (auth.error)
|
|
194
|
+
return auth.error;
|
|
195
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
196
|
+
if (roleErr)
|
|
197
|
+
return roleErr;
|
|
198
|
+
if (!hasModel(db(), 'seoAutoApply'))
|
|
199
|
+
return modelNotAvailable('SeoAutoApply');
|
|
200
|
+
const id = params.id;
|
|
201
|
+
if (!id)
|
|
202
|
+
return errorResponse('Autopilot change not found', 404);
|
|
203
|
+
const body = await request.json().catch(() => null);
|
|
204
|
+
const force = typeof body === 'object' &&
|
|
205
|
+
body !== null &&
|
|
206
|
+
body.force === true;
|
|
207
|
+
// Throws on write failures (doc write / redirect delete / ledger update)
|
|
208
|
+
// — caught below and reported as a 500; the row stays `applied` for retry.
|
|
209
|
+
const result = await revertSeoAutoApply(db(), id, {
|
|
210
|
+
actor: { userId: auth.session.userId, role: auth.session.role },
|
|
211
|
+
reason: 'manual',
|
|
212
|
+
force,
|
|
213
|
+
});
|
|
214
|
+
switch (result.status) {
|
|
215
|
+
case 'reverted':
|
|
216
|
+
return json({ data: result.row });
|
|
217
|
+
case 'not-found':
|
|
218
|
+
return errorResponse('Autopilot change not found', 404);
|
|
219
|
+
case 'conflict':
|
|
220
|
+
return json({
|
|
221
|
+
error: `Fields changed since autopilot applied them: ${result.fields.join(', ')}`,
|
|
222
|
+
code: 'conflict',
|
|
223
|
+
fields: result.fields,
|
|
224
|
+
}, 409);
|
|
225
|
+
case 'not-revertible':
|
|
226
|
+
return errorResponse(`This change cannot be reverted (${result.current})`, 422);
|
|
227
|
+
default: {
|
|
228
|
+
const exhaustive = result;
|
|
229
|
+
return exhaustive;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
return internalError(err, 'seo/autopilot/applied revert');
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
// Cron tick. CSRF-exempt (`/cron/` in CSRF_EXEMPT_PATHS); auth is the
|
|
238
|
+
// CRON_SECRET bearer. Registered for GET (Vercel Cron) and POST (self-hosted).
|
|
239
|
+
const cronAutopilot = async (request) => {
|
|
240
|
+
try {
|
|
241
|
+
if (!isAuthorizedCronRequest(request.headers.get('authorization'))) {
|
|
242
|
+
return errorResponse('Unauthorized', 401);
|
|
243
|
+
}
|
|
244
|
+
// Same self-describing 501 as `/run` so an un-migrated tenant's cron log
|
|
245
|
+
// says "missing model", not a generic 500 from deep inside the engine.
|
|
246
|
+
if (!hasModel(db(), 'seoAutoApply'))
|
|
247
|
+
return modelNotAvailable('SeoAutoApply');
|
|
248
|
+
return json({ data: await runSeoAutopilot(db()) });
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
return internalError(err, 'cron seo-autopilot');
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
router.get('/cron/seo-autopilot', cronAutopilot);
|
|
255
|
+
router.post('/cron/seo-autopilot', cronAutopilot);
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=seo-autopilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo-autopilot.js","sourceRoot":"","sources":["../../../src/api/routes/seo-autopilot.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,aAAa,EACb,QAAQ,EACR,aAAa,EACb,IAAI,EACJ,iBAAiB,EACjB,WAAW,EACX,WAAW,GACZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,wBAAwB,GAGzB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,yBAAyB,GAG1B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACL,kBAAkB,GAGnB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAEpF,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAqB;IAChE,SAAS;IACT,eAAe;IACf,UAAU;IACV,kBAAkB;CACnB,CAAC,CAAA;AACF,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAsB;IACjE,SAAS;IACT,MAAM;IACN,WAAW;IACX,mBAAmB;IACnB,SAAS;CACV,CAAC,CAAA;AAEF,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC;AACD,SAAS,eAAe,CAAC,CAAS;IAChC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,qBAAqB,GAAG,GAAG,CAAA;AACjC,MAAM,yBAAyB,GAAG,EAAE,CAAA;AAEpC,KAAK,UAAU,eAAe,CAAC,EAAY,EAAE,CAAoB;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChD,oBAAoB,CAAC,EAAE,EAAE,qBAAqB,CAAC;QAC/C,oBAAoB,CAAC,EAAE,EAAE,oBAAoB,CAAC;KAC/C,CAAC,CAAA;IACF,OAAO;QACL,GAAG,CAAC,CAAC,SAAS;QACd,SAAS,EAAE,CAAC,CAAC,kBAAkB;QAC/B,OAAO,EAAE,CAAC,CAAC,gBAAgB;QAC3B,iFAAiF;QACjF,UAAU,EAAE;YACV,wBAAwB,EAAE,QAAQ,CAAC,gBAAgB;YACnD,wBAAwB,EAAE,WAAW,CAAC,gBAAgB;SACvD;KACF,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAS,UAAU,CACjB,MAA0B,EAC1B,KAAyB;IAEzB,MAAM,GAAG,GAA8E,EAAE,CAAA;IACzF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAoC,EAAE,CAAC;QACxE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAA;QAClD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,EAAE,GAAG,SAAS,CAAA;IAEpB,MAAM,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAA;YACjC,MAAM,CAAC,GAAG,wBAAwB,CAAC,MAAM,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YAC/D,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAA;QACzD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAA;YACjC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;YAC3D,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAA;YAE3B,MAAM,IAAI,GAAY,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YAC5D,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAA;YAC9C,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAEvD,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACrE,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAA;YAEhC,mEAAmE;YACnE,uEAAuE;YACvE,oCAAoC;YACpC,MAAM,KAAK,GAAyB,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAA;YACvD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAA;gBACrB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAA;YAC3B,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,0DAA0D;gBAC1D,MAAM,OAAO,GAA8C,EAAE,CAAA;gBAC7D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW;oBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;gBACrD,KAAK,CAAC,WAAW,GAAG,OAAO,CAAA;YAC7B,CAAC;YACD,mEAAmE;YACnE,uEAAuE;YACvE,0EAA0E;YAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YAC7C,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;YACzC,CAAC;YACD,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;YAEzE,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAC1E,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC;oBACb,KAAK,EAAE,+BAA+B;oBACtC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;oBAC3B,OAAO,EAAE;wBACP,MAAM,EAAE,oBAAoB;wBAC5B,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;wBAC5C,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,WAAW,EAAE,MAAM,CAAC,WAAW;qBAChC;iBACF,CAAC,CAAA;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAA;QACzD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAA;YACjC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;YAC3D,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAA;YAC3B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC;gBAAE,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAA;YAC7E,4EAA4E;YAC5E,sFAAsF;YACtF,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC;oBACb,KAAK,EAAE,6BAA6B;oBACpC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;oBAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;iBAC9B,CAAC,CAAA;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;YACD,uEAAuE;YACvE,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAA;QAChD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAA;YACjC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC;gBAAE,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAA;YAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAChC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC/C,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/C,OAAO,aAAa,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAA;YACpD,CAAC;YACD,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,OAAO,aAAa,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAA;YACrD,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,EAAE;gBAC5C,MAAM,EAAE,MAAM,IAAI,SAAS;gBAC3B,OAAO,EAAE,OAAO,IAAI,SAAS;gBAC7B,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC7C,QAAQ,EAAE,aAAa,CACrB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAChC,qBAAqB,EACrB,yBAAyB,CAC1B;aACF,CAAC,CAAA;YACF,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAA;QACpD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QACzE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAA;YACvC,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAA;YACjC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;YAC3D,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAA;YAC3B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC;gBAAE,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAA;YAC7E,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAA;YACpB,IAAI,CAAC,EAAE;gBAAE,OAAO,aAAa,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAA;YAEhE,MAAM,IAAI,GAAY,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;YAC5D,MAAM,KAAK,GACT,OAAO,IAAI,KAAK,QAAQ;gBACxB,IAAI,KAAK,IAAI;gBACZ,IAAgC,CAAC,KAAK,KAAK,IAAI,CAAA;YAElD,yEAAyE;YACzE,2EAA2E;YAC3E,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;gBAChD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBAC/D,MAAM,EAAE,QAAQ;gBAChB,KAAK;aACN,CAAC,CAAA;YACF,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,KAAK,UAAU;oBACb,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;gBACnC,KAAK,WAAW;oBACd,OAAO,aAAa,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAA;gBACzD,KAAK,UAAU;oBACb,OAAO,IAAI,CACT;wBACE,KAAK,EAAE,gDAAgD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;wBACjF,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB,EACD,GAAG,CACJ,CAAA;gBACH,KAAK,gBAAgB;oBACnB,OAAO,aAAa,CAAC,mCAAmC,MAAM,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAA;gBACjF,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,UAAU,GAAU,MAAM,CAAA;oBAChC,OAAO,UAAU,CAAA;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,EAAE,8BAA8B,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,sEAAsE;IACtE,+EAA+E;IAC/E,MAAM,aAAa,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;gBACnE,OAAO,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;YAC3C,CAAC;YACD,yEAAyE;YACzE,uEAAuE;YACvE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC;gBAAE,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAA;YAC7E,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAA;IAChD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../../src/api/routes/seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAkG7C,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7F,MAAM,EAAE,CAAC,EAAE,GACV,CAAC,EAAE,CAQL;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../../src/api/routes/seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAkG7C,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7F,MAAM,EAAE,CAAC,EAAE,GACV,CAAC,EAAE,CAQL;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2vFzD"}
|