@forge-cms/runtime 0.5.0 → 0.6.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/auth-managed.d.ts +19 -0
- package/dist/auth-managed.d.ts.map +1 -0
- package/dist/auth-managed.js +24 -0
- package/dist/auth-managed.js.map +1 -0
- package/dist/concurrency.d.ts +8 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +15 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/context.d.ts +5 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/errors.d.ts +29 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +38 -0
- package/dist/errors.js.map +1 -1
- package/dist/files.d.ts +15 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +55 -14
- package/dist/files.js.map +1 -1
- package/dist/globals.d.ts +21 -3
- package/dist/globals.d.ts.map +1 -1
- package/dist/globals.js +216 -28
- package/dist/globals.js.map +1 -1
- package/dist/handlers.d.ts +3 -2
- package/dist/handlers.d.ts.map +1 -1
- package/dist/handlers.js +36 -47
- package/dist/handlers.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/localization.d.ts +17 -0
- package/dist/localization.d.ts.map +1 -1
- package/dist/localization.js +56 -0
- package/dist/localization.js.map +1 -1
- package/dist/operations.d.ts +51 -12
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +728 -125
- package/dist/operations.js.map +1 -1
- package/dist/relation-integrity.d.ts +31 -13
- package/dist/relation-integrity.d.ts.map +1 -1
- package/dist/relation-integrity.js +62 -6
- package/dist/relation-integrity.js.map +1 -1
- package/dist/relation-lifecycle.d.ts +95 -0
- package/dist/relation-lifecycle.d.ts.map +1 -0
- package/dist/relation-lifecycle.js +424 -0
- package/dist/relation-lifecycle.js.map +1 -0
- package/dist/runtime.d.ts +21 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +112 -20
- package/dist/runtime.js.map +1 -1
- package/dist/storage-intents.d.ts +96 -0
- package/dist/storage-intents.d.ts.map +1 -0
- package/dist/storage-intents.js +217 -0
- package/dist/storage-intents.js.map +1 -0
- package/dist/system-fields.d.ts +27 -0
- package/dist/system-fields.d.ts.map +1 -0
- package/dist/system-fields.js +74 -0
- package/dist/system-fields.js.map +1 -0
- package/dist/versions.d.ts +73 -1
- package/dist/versions.d.ts.map +1 -1
- package/dist/versions.js +204 -17
- package/dist/versions.js.map +1 -1
- package/package.json +9 -7
package/dist/globals.js
CHANGED
|
@@ -1,12 +1,55 @@
|
|
|
1
1
|
import { validateCollection } from '@forge-cms/core';
|
|
2
|
-
import {
|
|
2
|
+
import { isAtomicWriteConditionError, isUniqueConstraintError as isDbUniqueConstraintError } from '@forge-cms/db';
|
|
3
|
+
import { AccessDeniedError, ConcurrentModificationError, ForgeError, InvalidInputError, NotFoundError, ValidationFailedError } from './errors.js';
|
|
3
4
|
import { documentMatches, resolveAccess } from './access.js';
|
|
4
|
-
import {
|
|
5
|
+
import { afterStamp } from './concurrency.js';
|
|
6
|
+
import { applyAutoSlugs, applyFieldDefaults } from './defaults.js';
|
|
5
7
|
import { statusConstraint } from './read-policy.js';
|
|
6
8
|
import { populateRecord } from './populate.js';
|
|
7
9
|
import { runAfterChangeHooks, runAfterOperationHooks, runAfterReadHooks, runBeforeChangeHooks, runBeforeOperationHooks, runBeforeValidateHooks, runFieldHooks } from './hooks.js';
|
|
8
10
|
import { assertWritableFields, filterReadableFields, FieldAccessError } from './field-access.js';
|
|
11
|
+
import { screenHookOutput, screenUpdateInput } from './system-fields.js';
|
|
12
|
+
import { isLocalizedField, resolveLocalizedDocument, storeLocalizedDocument } from './localization.js';
|
|
13
|
+
import { collectWrittenTargets, targetAssertions, verifyTargetsExist } from './relation-lifecycle.js';
|
|
9
14
|
const GLOBAL_ID = 'global';
|
|
15
|
+
/**
|
|
16
|
+
* The global options that exist on the shared collection types but can never apply to a singleton that
|
|
17
|
+
* is never created through `create` nor deleted (spec 066): delete hooks, and `create`/`delete` access
|
|
18
|
+
* rules. Refused at startup instead of being accepted and silently ignored. One message per problem.
|
|
19
|
+
* (Localized fields of globals are checked with collections', by `validateLocalizationSchema`.)
|
|
20
|
+
*/
|
|
21
|
+
export function validateGlobalSchema(globals) {
|
|
22
|
+
const errors = [];
|
|
23
|
+
for (const global of globals) {
|
|
24
|
+
const label = `Global '${global.slug}'`;
|
|
25
|
+
for (const hook of ['beforeDelete', 'afterDelete']) {
|
|
26
|
+
if ((global.hooks?.[hook]?.length ?? 0) > 0) {
|
|
27
|
+
errors.push(`${label} declares ${hook} hooks, but a global is never deleted, so they could never run (spec 066). Remove them.`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (const rule of ['create', 'delete']) {
|
|
31
|
+
if (global.access?.[rule] !== undefined) {
|
|
32
|
+
errors.push(`${label} declares access.${rule}, but a global only has read and update: its first write is ` +
|
|
33
|
+
`an update and it is never deleted, so this rule could never apply (spec 066). Gate the ` +
|
|
34
|
+
`first write with access.update.`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return errors;
|
|
39
|
+
}
|
|
40
|
+
/** The collection-shaped view of a global the shared pipeline stages (hooks, validation, locales) take. */
|
|
41
|
+
function proxyOf(global) {
|
|
42
|
+
return { ...global, upload: false };
|
|
43
|
+
}
|
|
44
|
+
function assertKnownLocale(global, locale) {
|
|
45
|
+
if (locale === undefined)
|
|
46
|
+
return;
|
|
47
|
+
if (!global.locales?.includes(locale)) {
|
|
48
|
+
throw new InvalidInputError(global.locales && global.locales.length > 0
|
|
49
|
+
? `Unknown locale '${locale}' for global '${global.slug}'; expected one of ${global.locales.map((l) => `'${l}'`).join(', ')}`
|
|
50
|
+
: `Global '${global.slug}' is not localized; locale '${locale}' cannot be written`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
10
53
|
function getGlobalOrThrow(ctx, slug) {
|
|
11
54
|
const global = ctx.getGlobal(slug);
|
|
12
55
|
if (!global)
|
|
@@ -44,7 +87,7 @@ async function prepareGlobalForRead(ctx, global, record, args) {
|
|
|
44
87
|
return null;
|
|
45
88
|
const user = args.user ?? null;
|
|
46
89
|
const overrideAccess = args.overrideAccess !== false;
|
|
47
|
-
const collectionProxy =
|
|
90
|
+
const collectionProxy = proxyOf(global);
|
|
48
91
|
let doc = record;
|
|
49
92
|
if (args.depth === 1) {
|
|
50
93
|
doc = await populateRecord(doc, collectionProxy, ctx, {
|
|
@@ -55,6 +98,9 @@ async function prepareGlobalForRead(ctx, global, record, args) {
|
|
|
55
98
|
if (args.overrideAccess === false) {
|
|
56
99
|
doc = await filterReadableFields(doc, collectionProxy, user);
|
|
57
100
|
}
|
|
101
|
+
if (args.locale !== undefined) {
|
|
102
|
+
doc = resolveLocalizedDocument(doc, collectionProxy, args.locale);
|
|
103
|
+
}
|
|
58
104
|
const withFieldHooks = await runFieldHooks(collectionProxy, 'afterRead', {
|
|
59
105
|
data: doc,
|
|
60
106
|
operation: 'read',
|
|
@@ -71,8 +117,19 @@ export async function getGlobal(ctx, args) {
|
|
|
71
117
|
const user = args.user ?? null;
|
|
72
118
|
const overrideAccess = args.overrideAccess !== false;
|
|
73
119
|
await runBeforeOperationHooks({ ...global, upload: false }, { operation: 'read', user, overrideAccess });
|
|
74
|
-
await checkGlobalAccess(global, 'read', args);
|
|
120
|
+
const decision = await checkGlobalAccess(global, 'read', args);
|
|
75
121
|
const record = await ctx.adapters.database.findById(`_global_${global.slug}`, GLOBAL_ID);
|
|
122
|
+
// Spec 066: a query-returning read rule is a row-level grant, as on a collection read. A global row
|
|
123
|
+
// it does not match reads as `null` — the same answer as "never configured", confirming nothing.
|
|
124
|
+
if (record && decision.where && !documentMatches(record, decision.where)) {
|
|
125
|
+
await runAfterOperationHooks(proxyOf(global), {
|
|
126
|
+
operation: 'read',
|
|
127
|
+
user,
|
|
128
|
+
overrideAccess,
|
|
129
|
+
result: null
|
|
130
|
+
});
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
76
133
|
// Draft visibility (spec 058 §8): a global was previously written but never gated its own
|
|
77
134
|
// `_status` on read, so an anonymous caller could read a global's unpublished draft content the
|
|
78
135
|
// exact same way an anonymous single-document read of a `drafts: true` collection cannot. Mirrors
|
|
@@ -94,23 +151,39 @@ export async function getGlobal(ctx, args) {
|
|
|
94
151
|
return doc;
|
|
95
152
|
}
|
|
96
153
|
/**
|
|
97
|
-
* Creates or updates the singleton global document. Unlike collections, globals always have
|
|
98
|
-
*
|
|
154
|
+
* Creates or updates the singleton global document. Unlike collections, globals always have exactly one
|
|
155
|
+
* document — the first write creates it, later writes update it.
|
|
156
|
+
*
|
|
157
|
+
* Later writes are **partial**, exactly like a collection `update()` (spec 066): omitted fields keep
|
|
158
|
+
* their stored values (defaults and the draft status apply to the first write only), validation runs on
|
|
159
|
+
* the merged document, and a `locale` write changes that locale of each `localized` field and keeps the
|
|
160
|
+
* others. A query-returning `access.update` rule must match the stored row, and cannot authorize the
|
|
161
|
+
* first write (there is no row to match). Two simultaneous first writes: one commits, the other gets
|
|
162
|
+
* `409 CONCURRENT_MODIFICATION` with nothing written.
|
|
99
163
|
*/
|
|
100
164
|
export async function updateGlobal(ctx, args) {
|
|
101
165
|
const global = getGlobalOrThrow(ctx, args.global);
|
|
102
166
|
const user = args.user ?? null;
|
|
103
167
|
const overrideAccess = args.overrideAccess !== false;
|
|
104
|
-
const collectionProxy =
|
|
168
|
+
const collectionProxy = proxyOf(global);
|
|
169
|
+
assertKnownLocale(global, args.locale);
|
|
105
170
|
await runBeforeOperationHooks(collectionProxy, { operation: 'update', user, overrideAccess });
|
|
106
171
|
const existing = await ctx.adapters.database.findById(`_global_${global.slug}`, GLOBAL_ID);
|
|
107
|
-
|
|
172
|
+
const operation = existing ? 'update' : 'create';
|
|
173
|
+
const decision = await checkGlobalAccess(global, 'update', {
|
|
108
174
|
...args,
|
|
109
175
|
...(existing !== null && { doc: existing })
|
|
110
176
|
});
|
|
177
|
+
if (decision.where && !(existing && documentMatches(existing, decision.where))) {
|
|
178
|
+
throw new AccessDeniedError();
|
|
179
|
+
}
|
|
180
|
+
// Spec 063: a global row's `id`/timestamps/`_storageKey` belong to Forge. Echoes of the stored row
|
|
181
|
+
// are dropped; before the first write there is nothing to echo, so any of them is refused.
|
|
182
|
+
const stored = existing ?? {};
|
|
183
|
+
const input = screenUpdateInput(args.data, stored);
|
|
111
184
|
if (args.overrideAccess === false) {
|
|
112
185
|
try {
|
|
113
|
-
await assertWritableFields(
|
|
186
|
+
await assertWritableFields(input, collectionProxy, user, operation);
|
|
114
187
|
}
|
|
115
188
|
catch (err) {
|
|
116
189
|
if (err instanceof FieldAccessError)
|
|
@@ -118,33 +191,61 @@ export async function updateGlobal(ctx, args) {
|
|
|
118
191
|
throw err;
|
|
119
192
|
}
|
|
120
193
|
}
|
|
121
|
-
|
|
194
|
+
// A locale write merges into the stored per-locale maps, so it is derived from `existing` and must
|
|
195
|
+
// commit only while the row is still the one it was merged from (compare-and-set below).
|
|
196
|
+
const localized = storeLocalizedDocument(input, collectionProxy, args.locale, existing ?? undefined);
|
|
197
|
+
const mergesLocales = existing !== null &&
|
|
198
|
+
args.locale !== undefined &&
|
|
199
|
+
Object.keys(input).some((name) => {
|
|
200
|
+
const field = global.fields[name];
|
|
201
|
+
return field !== undefined && isLocalizedField(field);
|
|
202
|
+
});
|
|
203
|
+
const seeded = existing
|
|
204
|
+
? applyAutoSlugs(collectionProxy, localized, existing)
|
|
205
|
+
: applyAutoSlugs(collectionProxy, applyFieldDefaults(collectionProxy, localized));
|
|
122
206
|
let data = await runRejectableStage(async () => runBeforeValidateHooks(collectionProxy, {
|
|
123
|
-
operation
|
|
207
|
+
operation,
|
|
124
208
|
data: await runFieldHooks(collectionProxy, 'beforeValidate', {
|
|
125
209
|
data: seeded,
|
|
126
|
-
|
|
210
|
+
...(existing !== null && { previousData: existing }),
|
|
211
|
+
operation,
|
|
127
212
|
user,
|
|
128
213
|
overrideAccess
|
|
129
214
|
}),
|
|
215
|
+
...(existing !== null && { previousData: existing }),
|
|
130
216
|
user,
|
|
131
217
|
overrideAccess
|
|
132
218
|
}), 'beforeValidate hook');
|
|
133
|
-
|
|
219
|
+
data = screenHookOutput(data, stored, 'beforeValidate', `global '${global.slug}'`);
|
|
220
|
+
if (global.drafts === true && !existing && data._status === undefined) {
|
|
134
221
|
data = { ...data, _status: 'draft' };
|
|
135
222
|
}
|
|
136
223
|
if (data._status !== undefined && data._status !== 'draft' && data._status !== 'published') {
|
|
137
224
|
throw new InvalidInputError(`Invalid status '${String(data._status)}', expected 'draft' or 'published'`);
|
|
138
225
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
226
|
+
if (existing) {
|
|
227
|
+
// As a collection update: validate the merged document, report only what the caller can act on.
|
|
228
|
+
const validation = validateCollection(collectionProxy, { ...existing, ...data });
|
|
229
|
+
if (!validation.valid) {
|
|
230
|
+
const relevant = validation.errors.filter((e) => {
|
|
231
|
+
const top = e.field.split('.')[0] ?? e.field;
|
|
232
|
+
return data[top] !== undefined || existing[top] === undefined;
|
|
233
|
+
});
|
|
234
|
+
if (relevant.length > 0)
|
|
235
|
+
throw new ValidationFailedError(relevant);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
const validation = validateCollection(collectionProxy, data);
|
|
240
|
+
if (!validation.valid)
|
|
241
|
+
throw new ValidationFailedError(validation.errors);
|
|
242
|
+
}
|
|
142
243
|
data = await runRejectableStage(async () => runBeforeChangeHooks(collectionProxy, {
|
|
143
|
-
operation
|
|
244
|
+
operation,
|
|
144
245
|
data: await runFieldHooks(collectionProxy, 'beforeChange', {
|
|
145
246
|
data,
|
|
146
247
|
...(existing !== null && { previousData: existing }),
|
|
147
|
-
operation
|
|
248
|
+
operation,
|
|
148
249
|
user,
|
|
149
250
|
overrideAccess
|
|
150
251
|
}),
|
|
@@ -152,16 +253,22 @@ export async function updateGlobal(ctx, args) {
|
|
|
152
253
|
user,
|
|
153
254
|
overrideAccess
|
|
154
255
|
}), 'beforeChange hook');
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
256
|
+
data = screenHookOutput(data, stored, 'beforeChange', `global '${global.slug}'`);
|
|
257
|
+
// A global's relation/upload targets must exist, now and when it commits (spec 064 §4) — a global
|
|
258
|
+
// reference restricts deletion of its target, so it must never be written pointing at nothing.
|
|
259
|
+
const targets = collectWrittenTargets(global.fields, data, existing ?? undefined);
|
|
260
|
+
if (targets.size > 0)
|
|
261
|
+
await verifyTargetsExist(ctx, targets);
|
|
262
|
+
const record = await writeGlobal(ctx, {
|
|
263
|
+
global,
|
|
264
|
+
data,
|
|
265
|
+
existing,
|
|
266
|
+
compareAndSet: mergesLocales,
|
|
267
|
+
accessWhere: decision.where,
|
|
268
|
+
assertions: targets.size > 0 ? targetAssertions(targets) : []
|
|
269
|
+
});
|
|
163
270
|
await runAfterChangeHooks(collectionProxy, {
|
|
164
|
-
operation
|
|
271
|
+
operation,
|
|
165
272
|
data,
|
|
166
273
|
...(existing !== null && { previousData: existing }),
|
|
167
274
|
result: record,
|
|
@@ -169,7 +276,9 @@ export async function updateGlobal(ctx, args) {
|
|
|
169
276
|
user,
|
|
170
277
|
overrideAccess
|
|
171
278
|
});
|
|
172
|
-
|
|
279
|
+
// Being allowed to write the global is not permission to read it back (spec 068).
|
|
280
|
+
const readable = args.overrideAccess !== false || (await canReadGlobal(global, record, user));
|
|
281
|
+
const doc = readable ? await prepareGlobalForRead(ctx, global, record, args) : { id: GLOBAL_ID };
|
|
173
282
|
const result = doc ?? record;
|
|
174
283
|
await runAfterOperationHooks(collectionProxy, {
|
|
175
284
|
operation: 'update',
|
|
@@ -179,4 +288,83 @@ export async function updateGlobal(ctx, args) {
|
|
|
179
288
|
});
|
|
180
289
|
return result;
|
|
181
290
|
}
|
|
291
|
+
/** The read gate `getGlobal` applies, as a yes/no for the row just written. */
|
|
292
|
+
async function canReadGlobal(global, record, user) {
|
|
293
|
+
let decision;
|
|
294
|
+
try {
|
|
295
|
+
decision = await checkGlobalAccess(global, 'read', { user, overrideAccess: false });
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
if (err instanceof AccessDeniedError)
|
|
299
|
+
return false;
|
|
300
|
+
throw err;
|
|
301
|
+
}
|
|
302
|
+
if (decision.where && !documentMatches(record, decision.where))
|
|
303
|
+
return false;
|
|
304
|
+
const status = statusConstraint(proxyOf(global), undefined, user, false, 'all');
|
|
305
|
+
return !status || documentMatches(record, status);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Persists a prepared global write. The first write is a `create` of the fixed `global` row: of two
|
|
309
|
+
* simultaneous first writers, the row's primary key lets exactly one commit, and the other becomes a
|
|
310
|
+
* `409` instead of leaking the internal table's unique-constraint error (spec 066). A write carrying
|
|
311
|
+
* relation-target assertions (spec 064 §4), or a locale merge that must not overwrite a concurrent one
|
|
312
|
+
* (`compareAndSet`, on `updated_at`), is one `atomicWrite`; a failed condition is a `409`, nothing written.
|
|
313
|
+
*/
|
|
314
|
+
async function writeGlobal(ctx, input) {
|
|
315
|
+
const { global, data, existing, assertions } = input;
|
|
316
|
+
const table = `_global_${global.slug}`;
|
|
317
|
+
const database = ctx.adapters.database;
|
|
318
|
+
const concurrent = (message) => new ConcurrentModificationError(global.slug, GLOBAL_ID, message);
|
|
319
|
+
const conditions = [
|
|
320
|
+
...(input.compareAndSet && existing ? [{ updated_at: existing.updated_at }] : []),
|
|
321
|
+
...(input.accessWhere !== undefined ? [input.accessWhere] : [])
|
|
322
|
+
];
|
|
323
|
+
const condition = conditions.length === 0
|
|
324
|
+
? undefined
|
|
325
|
+
: conditions.length === 1
|
|
326
|
+
? conditions[0]
|
|
327
|
+
: { and: conditions };
|
|
328
|
+
const write = !existing
|
|
329
|
+
? { type: 'create', collection: table, data: { ...data, id: GLOBAL_ID } }
|
|
330
|
+
: condition !== undefined
|
|
331
|
+
? {
|
|
332
|
+
type: 'updateIf',
|
|
333
|
+
collection: table,
|
|
334
|
+
id: GLOBAL_ID,
|
|
335
|
+
data,
|
|
336
|
+
condition: { targetMatches: condition },
|
|
337
|
+
requireApplied: true
|
|
338
|
+
}
|
|
339
|
+
: { type: 'update', collection: table, id: GLOBAL_ID, data };
|
|
340
|
+
if (input.compareAndSet && existing)
|
|
341
|
+
await afterStamp(existing.updated_at);
|
|
342
|
+
try {
|
|
343
|
+
if (assertions.length === 0 && write.type === 'create') {
|
|
344
|
+
return await database.create(table, write.data);
|
|
345
|
+
}
|
|
346
|
+
if (assertions.length === 0 && write.type === 'update') {
|
|
347
|
+
return await database.update(table, GLOBAL_ID, write.data);
|
|
348
|
+
}
|
|
349
|
+
const results = await database.atomicWrite([...assertions, write]);
|
|
350
|
+
const written = results[assertions.length];
|
|
351
|
+
if (written?.type === 'create' || written?.type === 'update')
|
|
352
|
+
return written.record;
|
|
353
|
+
if (written?.type === 'updateIf' && written.applied)
|
|
354
|
+
return written.record;
|
|
355
|
+
throw new Error('atomicWrite returned no global record');
|
|
356
|
+
}
|
|
357
|
+
catch (err) {
|
|
358
|
+
if (!existing && isDbUniqueConstraintError(err) && err.collection === table) {
|
|
359
|
+
throw concurrent(`Global '${global.slug}' was first written by another request at the same time; nothing was ` +
|
|
360
|
+
`written. Reload and try again.`);
|
|
361
|
+
}
|
|
362
|
+
if (isAtomicWriteConditionError(err)) {
|
|
363
|
+
throw concurrent(`Global '${global.slug}' was changed by another request while this write was in progress (another ` +
|
|
364
|
+
`locale was edited, it no longer matches the caller's update access, or a document it references ` +
|
|
365
|
+
`was deleted); nothing was written. Reload and try again.`);
|
|
366
|
+
}
|
|
367
|
+
throw err;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
182
370
|
//# sourceMappingURL=globals.js.map
|
package/dist/globals.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,IAAI,yBAAyB,EACrD,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,SAAS,GAAG,QAAQ,CAAC;AAoB3B;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAoC;IACvE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,WAAW,MAAM,CAAC,IAAI,GAAG,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,aAAa,CAAU,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CACT,GAAG,KAAK,aAAa,IAAI,yFAAyF,CACnH,CAAC;YACJ,CAAC;QACH,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAU,EAAE,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CACT,GAAG,KAAK,oBAAoB,IAAI,8DAA8D;oBAC5F,yFAAyF;oBACzF,iCAAiC,CACpC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2GAA2G;AAC3G,SAAS,OAAO,CAAC,MAAwB;IACvC,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAwB,EAAE,MAA0B;IAC7E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IACjC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,iBAAiB,CACzB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC,CAAC,mBAAmB,MAAM,iBAAiB,MAAM,CAAC,IAAI,sBAAsB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7H,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,+BAA+B,MAAM,qBAAqB,CACrF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAqB,EAAE,IAAY;IAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,aAAa,CAAC,WAAW,IAAI,aAAa,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAwB,EACxB,SAA4B,EAC5B,IAKC;IAED,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAE5D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;QAC/D,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,SAAS;QACT,UAAU,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE;QACxC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACnD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;KACjD,CAAC,CAAC;IAEH,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,MAAM,IAAI,iBAAiB,EAAE,CAAC;IACrD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAI,KAAuB,EAAE,KAAa;IACzE,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,MAAM,GAAG,CAAC;QACzC,MAAM,IAAI,iBAAiB,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,GAAqB,EACrB,MAAwB,EACxB,MAA6B,EAC7B,IAAyF;IAEzF,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC;IACrD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAExC,IAAI,GAAG,GAAG,MAAM,CAAC;IAEjB,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACrB,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE;YACpD,IAAI;YACJ,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;SAClF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QAClC,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,GAAG,GAAG,wBAAwB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC,MAAM,CAAmB,CAAC;IACtF,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,eAAe,EAAE,WAAW,EAAE;QACvE,IAAI,EAAE,GAAG;QACT,SAAS,EAAE,MAAM;QACjB,IAAI;QACJ,cAAc;KACf,CAAC,CAAC;IAEH,OAAO,iBAAiB,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAqB,EACrB,IAAmB;IAEnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC;IAErD,MAAM,uBAAuB,CAC3B,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAC5B,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAC5C,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAEzF,oGAAoG;IACpG,iGAAiG;IACjG,IAAI,MAAM,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,MAAM,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC5C,SAAS,EAAE,MAAM;YACjB,IAAI;YACJ,cAAc;YACd,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0FAA0F;IAC1F,gGAAgG;IAChG,kGAAkG;IAClG,mGAAmG;IACnG,oGAAoG;IACpG,mGAAmG;IACnG,2DAA2D;IAC3D,MAAM,WAAW,GAAG,gBAAgB,CAClC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAC5B,SAAS,EACT,IAAI,EACJ,cAAc,EACd,KAAK,CACN,CAAC;IACF,IAAI,MAAM,IAAI,WAAW,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;QACnE,MAAM,sBAAsB,CAC1B,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAC5B,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,CAC1D,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,sBAAsB,CAC1B,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAC5B,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,CAC1D,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAElE,MAAM,sBAAsB,CAC1B,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAC5B,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CACzD,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAqB,EACrB,IAAsB;IAEtB,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC;IACrD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,uBAAuB,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAE9F,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE;QACzD,GAAG,IAAI;QACP,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;KAC5C,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAChC,CAAC;IAED,mGAAmG;IACnG,2FAA2F;IAC3F,MAAM,MAAM,GAAG,QAAQ,IAAI,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,oBAAoB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,gBAAgB;gBAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9E,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,mGAAmG;IACnG,yFAAyF;IACzF,MAAM,SAAS,GAAG,sBAAsB,CACtC,KAAK,EACL,eAAe,EACf,IAAI,CAAC,MAAM,EACX,QAAQ,IAAI,SAAS,CACtB,CAAC;IACF,MAAM,aAAa,GACjB,QAAQ,KAAK,IAAI;QACjB,IAAI,CAAC,MAAM,KAAK,SAAS;QACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,KAAK,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IAEL,MAAM,MAAM,GAAG,QAAQ;QACrB,CAAC,CAAC,cAAc,CAAC,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;QACtD,CAAC,CAAC,cAAc,CAAC,eAAe,EAAE,kBAAkB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;IAEpF,IAAI,IAAI,GAAG,MAAM,kBAAkB,CACjC,KAAK,IAAI,EAAE,CACT,sBAAsB,CAAC,eAAe,EAAE;QACtC,SAAS;QACT,IAAI,EAAE,MAAM,aAAa,CAAC,eAAe,EAAE,gBAAgB,EAAE;YAC3D,IAAI,EAAE,MAAM;YACZ,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;YACpD,SAAS;YACT,IAAI;YACJ,cAAc;SACf,CAAC;QACF,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;QACpD,IAAI;QACJ,cAAc;KACf,CAAC,EACJ,qBAAqB,CACtB,CAAC;IACF,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAEnF,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACtE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QAC3F,MAAM,IAAI,iBAAiB,CACzB,mBAAmB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAC5E,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,gGAAgG;QAChG,MAAM,UAAU,GAAG,kBAAkB,CAAC,eAAe,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9C,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;gBAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;YAChE,CAAC,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,kBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,KAAK;YAAE,MAAM,IAAI,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,GAAG,MAAM,kBAAkB,CAC7B,KAAK,IAAI,EAAE,CACT,oBAAoB,CAAC,eAAe,EAAE;QACpC,SAAS;QACT,IAAI,EAAE,MAAM,aAAa,CAAC,eAAe,EAAE,cAAc,EAAE;YACzD,IAAI;YACJ,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;YACpD,SAAS;YACT,IAAI;YACJ,cAAc;SACf,CAAC;QACF,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;QACpD,IAAI;QACJ,cAAc;KACf,CAAC,EACJ,mBAAmB,CACpB,CAAC;IACF,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAEjF,kGAAkG;IAClG,+FAA+F;IAC/F,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC;QAAE,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM;QACN,IAAI;QACJ,QAAQ;QACR,aAAa,EAAE,aAAa;QAC5B,WAAW,EAAE,QAAQ,CAAC,KAAK;QAC3B,UAAU,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;KAC9D,CAAC,CAAC;IAEH,MAAM,mBAAmB,CAAC,eAAe,EAAE;QACzC,SAAS;QACT,IAAI;QACJ,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;QACpD,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,MAAM;QACX,IAAI;QACJ,cAAc;KACf,CAAC,CAAC;IAEH,kFAAkF;IAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,KAAK,KAAK,IAAI,CAAC,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9F,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;IACjG,MAAM,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC;IAE7B,MAAM,sBAAsB,CAAC,eAAe,EAAE;QAC5C,SAAS,EAAE,QAAQ;QACnB,IAAI;QACJ,cAAc;QACd,MAAM;KACP,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,aAAa,CAC1B,MAAwB,EACxB,MAAsB,EACtB,IAAoB;IAEpB,IAAI,QAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,iBAAiB;YAAE,OAAO,KAAK,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChF,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,WAAW,CACxB,GAAqB,EACrB,KAQC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IACrD,MAAM,KAAK,GAAG,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACvC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE,CACrC,IAAI,2BAA2B,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAEnE,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;IACF,MAAM,SAAS,GACb,UAAU,CAAC,MAAM,KAAK,CAAC;QACrB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YACf,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;IAE5B,MAAM,KAAK,GAAyB,CAAC,QAAQ;QAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;QACzE,CAAC,CAAC,SAAS,KAAK,SAAS;YACvB,CAAC,CAAC;gBACE,IAAI,EAAE,UAAU;gBAChB,UAAU,EAAE,KAAK;gBACjB,EAAE,EAAE,SAAS;gBACb,IAAI;gBACJ,SAAS,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE;gBACvC,cAAc,EAAE,IAAI;aACrB;YACH,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAEjE,IAAI,KAAK,CAAC,aAAa,IAAI,QAAQ;QAAE,MAAM,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE3E,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC;QACpF,IAAI,OAAO,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,IAAI,yBAAyB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5E,MAAM,UAAU,CACd,WAAW,MAAM,CAAC,IAAI,uEAAuE;gBAC3F,gCAAgC,CACnC,CAAC;QACJ,CAAC;QACD,IAAI,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,UAAU,CACd,WAAW,MAAM,CAAC,IAAI,6EAA6E;gBACjG,kGAAkG;gBAClG,0DAA0D,CAC7D,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/handlers.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ApiContext } from '@forge-cms/api';
|
|
2
|
-
import type { AnyForgeCmsRuntime } from './runtime.js';
|
|
3
|
-
import type { UserRole } from '@forge-cms/auth';
|
|
2
|
+
import type { AnyForgeCmsRuntime, ForgeCmsRuntime } from './runtime.js';
|
|
3
|
+
import type { AuthUser, UserRole } from '@forge-cms/auth';
|
|
4
4
|
import * as operations from './operations.js';
|
|
5
5
|
declare const DEFAULT_LIMIT = 50;
|
|
6
6
|
declare const MAX_LIMIT = 500;
|
|
@@ -13,6 +13,7 @@ export interface HandlerOptions<TEnv = unknown> {
|
|
|
13
13
|
mimeTypes?: string[];
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
|
+
export declare function resolveOptionalUser<TEnv>(context: ApiContext<TEnv>, runtime: ForgeCmsRuntime<TEnv>): Promise<AuthUser | null>;
|
|
16
17
|
export declare function handleList<TEnv = unknown>(context: ApiContext<TEnv>, options: HandlerOptions<TEnv>): Promise<Response>;
|
|
17
18
|
export declare function handleRead<TEnv = unknown>(context: ApiContext<TEnv>, options: HandlerOptions<TEnv>): Promise<Response>;
|
|
18
19
|
export declare function handleCreate<TEnv = unknown>(context: ApiContext<TEnv>, options: HandlerOptions<TEnv>): Promise<Response>;
|
package/dist/handlers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIxE,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AA2C9C,QAAA,MAAM,aAAa,KAAK,CAAC;AACzB,QAAA,MAAM,SAAS,MAAM,CAAC;AAEtB,MAAM,WAAW,cAAc,CAAC,IAAI,GAAG,OAAO;IAC5C,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACH;AA4PD,wBAAsB,mBAAmB,CAAC,IAAI,EAC5C,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,GAC7B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAS1B;AA0DD,wBAAsB,UAAU,CAAC,IAAI,GAAG,OAAO,EAC7C,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CA4CnB;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAG,OAAO,EAC7C,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAwBnB;AAiDD,wBAAsB,YAAY,CAAC,IAAI,GAAG,OAAO,EAC/C,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAmCnB;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAG,OAAO,EAC/C,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAoBnB;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAG,OAAO,EAC/C,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAmBnB;AA4CD,wBAAsB,gBAAgB,CAAC,IAAI,GAAG,OAAO,EACnD,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAG,OAAO,EACrD,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAmBnB;AAID,wBAAsB,kBAAkB,CAAC,IAAI,GAAG,OAAO,EACrD,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAuBnB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAG,OAAO,EACnD,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAsB,oBAAoB,CAAC,IAAI,GAAG,OAAO,EACvD,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAG,OAAO,EAChD,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EACzB,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAuBnB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/handlers.js
CHANGED
|
@@ -3,6 +3,7 @@ import { ForgeAuthError, hasAnyRole } from '@forge-cms/auth';
|
|
|
3
3
|
import * as operations from './operations.js';
|
|
4
4
|
import { AccessDeniedError, InvalidInputError, InvalidQueryError, isForgeError, toApiErrorBody } from './errors.js';
|
|
5
5
|
import { assertCsrfSafe } from './csrf.js';
|
|
6
|
+
import { assertNotAuthManaged } from './auth-managed.js';
|
|
6
7
|
const WHERE_OPERATORS = new Set([
|
|
7
8
|
'eq',
|
|
8
9
|
'ne',
|
|
@@ -240,7 +241,7 @@ async function authorize(context, runtime, allowedRoles) {
|
|
|
240
241
|
}
|
|
241
242
|
return { success: true, user };
|
|
242
243
|
}
|
|
243
|
-
async function resolveOptionalUser(context, runtime) {
|
|
244
|
+
export async function resolveOptionalUser(context, runtime) {
|
|
244
245
|
try {
|
|
245
246
|
return await runtime.adapters.auth.requireAuth(context.request);
|
|
246
247
|
}
|
|
@@ -361,7 +362,12 @@ export async function handleRead(context, options) {
|
|
|
361
362
|
return toErrorResponse(err, user);
|
|
362
363
|
}
|
|
363
364
|
}
|
|
364
|
-
|
|
365
|
+
/**
|
|
366
|
+
* Parses a multipart create: the `file` part (checked against the handler's size/type limits) and every
|
|
367
|
+
* other string part that names a declared field. Storing the object is the Local API's job
|
|
368
|
+
* (`operations.uploadFile`), so its durable lifecycle lives in one place (spec 067).
|
|
369
|
+
*/
|
|
370
|
+
async function parseMultipartBody(context, collection, uploadConfig) {
|
|
365
371
|
const formData = await context.request.formData();
|
|
366
372
|
const file = formData.get('file');
|
|
367
373
|
if (!(file instanceof File)) {
|
|
@@ -375,26 +381,13 @@ async function buildMultipartBody(context, runtime, collection, uploadConfig) {
|
|
|
375
381
|
throw new InvalidInputError(`File type '${file.type}' is not allowed. Allowed types: ${uploadConfig.mimeTypes.join(', ')}`);
|
|
376
382
|
}
|
|
377
383
|
}
|
|
378
|
-
const
|
|
379
|
-
await runtime.adapters.storage.put({ key, body: file, contentType: file.type });
|
|
380
|
-
const url = await runtime.adapters.storage.getPublicUrl(key);
|
|
381
|
-
const data = { _storageKey: key };
|
|
382
|
-
const derived = {
|
|
383
|
-
filename: file.name,
|
|
384
|
-
url,
|
|
385
|
-
contentType: file.type,
|
|
386
|
-
filesize: file.size
|
|
387
|
-
};
|
|
388
|
-
for (const [name, value] of Object.entries(derived)) {
|
|
389
|
-
if (collection.fields[name])
|
|
390
|
-
data[name] = value;
|
|
391
|
-
}
|
|
384
|
+
const fields = {};
|
|
392
385
|
formData.forEach((value, name) => {
|
|
393
386
|
if (name !== 'file' && typeof value === 'string' && collection.fields[name]) {
|
|
394
|
-
|
|
387
|
+
fields[name] = value;
|
|
395
388
|
}
|
|
396
389
|
});
|
|
397
|
-
return {
|
|
390
|
+
return { file, fields };
|
|
398
391
|
}
|
|
399
392
|
async function readJsonBody(request) {
|
|
400
393
|
try {
|
|
@@ -410,39 +403,31 @@ export async function handleCreate(context, options) {
|
|
|
410
403
|
return resolved;
|
|
411
404
|
const { collection, collectionSlug, user } = resolved;
|
|
412
405
|
try {
|
|
406
|
+
// Checked before any multipart parsing so a create on an auth-managed upload-enabled collection
|
|
407
|
+
// (`operations.create` would refuse it anyway) never uploads an object to storage first — spec 061,
|
|
408
|
+
// reviewed finding: refusing only inside `runtime.create` left a real, if compensated, storage
|
|
409
|
+
// write on the happy path, and an orphaned object if the compensating delete itself failed.
|
|
410
|
+
assertNotAuthManaged(options.runtime, collectionSlug);
|
|
413
411
|
const contentType = context.request.headers.get('content-type') ?? '';
|
|
414
|
-
|
|
415
|
-
|
|
412
|
+
const locale = parseLocale(new URL(context.request.url));
|
|
413
|
+
const createArgs = {
|
|
414
|
+
collection: collectionSlug,
|
|
415
|
+
user,
|
|
416
|
+
overrideAccess: false,
|
|
417
|
+
...(locale !== undefined && { locale })
|
|
418
|
+
};
|
|
419
|
+
let doc;
|
|
416
420
|
if (collection.upload === true && contentType.includes('multipart/form-data')) {
|
|
417
|
-
const
|
|
418
|
-
|
|
419
|
-
storageKey = result.storageKey;
|
|
421
|
+
const { file, fields } = await parseMultipartBody(context, collection, options.upload);
|
|
422
|
+
doc = await operations.uploadFile(options.runtime, { ...createArgs, data: fields }, file);
|
|
420
423
|
}
|
|
421
424
|
else {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
const locale = parseLocale(new URL(context.request.url));
|
|
426
|
-
const doc = await options.runtime.create({
|
|
427
|
-
collection: collectionSlug,
|
|
428
|
-
data,
|
|
429
|
-
user,
|
|
430
|
-
overrideAccess: false,
|
|
431
|
-
...(locale !== undefined && { locale })
|
|
425
|
+
doc = await options.runtime.create({
|
|
426
|
+
...createArgs,
|
|
427
|
+
data: await readJsonBody(context.request)
|
|
432
428
|
});
|
|
433
|
-
return jsonResponse({ data: doc }, 201);
|
|
434
|
-
}
|
|
435
|
-
catch (createErr) {
|
|
436
|
-
if (storageKey) {
|
|
437
|
-
try {
|
|
438
|
-
await options.runtime.adapters.storage.delete(storageKey);
|
|
439
|
-
}
|
|
440
|
-
catch (cleanupErr) {
|
|
441
|
-
getLogger().error(`Failed to clean up storage object '${storageKey}' after document creation failure`, cleanupErr);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
throw createErr;
|
|
445
429
|
}
|
|
430
|
+
return jsonResponse({ data: doc }, 201);
|
|
446
431
|
}
|
|
447
432
|
catch (err) {
|
|
448
433
|
return toErrorResponse(err, user);
|
|
@@ -524,10 +509,12 @@ export async function handleGlobalRead(context, options) {
|
|
|
524
509
|
return resolved;
|
|
525
510
|
const { globalSlug, user } = resolved;
|
|
526
511
|
try {
|
|
512
|
+
const locale = parseLocale(new URL(context.request.url));
|
|
527
513
|
const doc = await options.runtime.getGlobalDocument({
|
|
528
514
|
global: globalSlug,
|
|
529
515
|
user,
|
|
530
|
-
overrideAccess: false
|
|
516
|
+
overrideAccess: false,
|
|
517
|
+
...(locale !== undefined && { locale })
|
|
531
518
|
});
|
|
532
519
|
if (!doc) {
|
|
533
520
|
return errorResponse('NOT_FOUND', `Global '${globalSlug}' has not been configured yet`, 404);
|
|
@@ -544,11 +531,13 @@ export async function handleGlobalUpdate(context, options) {
|
|
|
544
531
|
return resolved;
|
|
545
532
|
const { globalSlug, user } = resolved;
|
|
546
533
|
try {
|
|
534
|
+
const locale = parseLocale(new URL(context.request.url));
|
|
547
535
|
const doc = await options.runtime.updateGlobalDocument({
|
|
548
536
|
global: globalSlug,
|
|
549
537
|
data: await readJsonBody(context.request),
|
|
550
538
|
user,
|
|
551
|
-
overrideAccess: false
|
|
539
|
+
overrideAccess: false,
|
|
540
|
+
...(locale !== undefined && { locale })
|
|
552
541
|
});
|
|
553
542
|
return jsonResponse({ data: doc });
|
|
554
543
|
}
|