@astro-live-cms/core 0.2.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/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/auth/session.d.ts +14 -0
- package/dist/runtime/auth/session.d.ts.map +1 -0
- package/dist/runtime/auth/session.js +77 -0
- package/dist/runtime/auth/session.js.map +1 -0
- package/dist/runtime/bind.d.ts +14 -0
- package/dist/runtime/bind.d.ts.map +1 -0
- package/dist/runtime/bind.js +11 -0
- package/dist/runtime/bind.js.map +1 -0
- package/dist/runtime/config.d.ts +6 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +18 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/content.d.ts +30 -0
- package/dist/runtime/content.d.ts.map +1 -0
- package/dist/runtime/content.js +48 -0
- package/dist/runtime/content.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +12 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/markers.d.ts +17 -0
- package/dist/runtime/markers.d.ts.map +1 -0
- package/dist/runtime/markers.js +17 -0
- package/dist/runtime/markers.js.map +1 -0
- package/dist/runtime/middleware.d.ts +12 -0
- package/dist/runtime/middleware.d.ts.map +1 -0
- package/dist/runtime/middleware.js +37 -0
- package/dist/runtime/middleware.js.map +1 -0
- package/dist/runtime/mutations/contracts.d.ts +57 -0
- package/dist/runtime/mutations/contracts.d.ts.map +1 -0
- package/dist/runtime/mutations/contracts.js +242 -0
- package/dist/runtime/mutations/contracts.js.map +1 -0
- package/dist/runtime/mutations/engine.d.ts +23 -0
- package/dist/runtime/mutations/engine.d.ts.map +1 -0
- package/dist/runtime/mutations/engine.js +161 -0
- package/dist/runtime/mutations/engine.js.map +1 -0
- package/dist/runtime/routes/_helpers.d.ts +6 -0
- package/dist/runtime/routes/_helpers.d.ts.map +1 -0
- package/dist/runtime/routes/_helpers.js +23 -0
- package/dist/runtime/routes/_helpers.js.map +1 -0
- package/dist/runtime/routes/admin.d.ts +3 -0
- package/dist/runtime/routes/admin.d.ts.map +1 -0
- package/dist/runtime/routes/admin.js +110 -0
- package/dist/runtime/routes/admin.js.map +1 -0
- package/dist/runtime/routes/auth-login.d.ts +4 -0
- package/dist/runtime/routes/auth-login.d.ts.map +1 -0
- package/dist/runtime/routes/auth-login.js +66 -0
- package/dist/runtime/routes/auth-login.js.map +1 -0
- package/dist/runtime/routes/auth-logout.d.ts +4 -0
- package/dist/runtime/routes/auth-logout.d.ts.map +1 -0
- package/dist/runtime/routes/auth-logout.js +51 -0
- package/dist/runtime/routes/auth-logout.js.map +1 -0
- package/dist/runtime/routes/editor-assets.d.ts +3 -0
- package/dist/runtime/routes/editor-assets.d.ts.map +1 -0
- package/dist/runtime/routes/editor-assets.js +47 -0
- package/dist/runtime/routes/editor-assets.js.map +1 -0
- package/dist/runtime/routes/entries.d.ts +3 -0
- package/dist/runtime/routes/entries.d.ts.map +1 -0
- package/dist/runtime/routes/entries.js +89 -0
- package/dist/runtime/routes/entries.js.map +1 -0
- package/dist/runtime/routes/history.d.ts +4 -0
- package/dist/runtime/routes/history.d.ts.map +1 -0
- package/dist/runtime/routes/history.js +56 -0
- package/dist/runtime/routes/history.js.map +1 -0
- package/dist/runtime/routes/mutate.d.ts +4 -0
- package/dist/runtime/routes/mutate.d.ts.map +1 -0
- package/dist/runtime/routes/mutate.js +35 -0
- package/dist/runtime/routes/mutate.js.map +1 -0
- package/dist/runtime/routes/schema.d.ts +3 -0
- package/dist/runtime/routes/schema.d.ts.map +1 -0
- package/dist/runtime/routes/schema.js +27 -0
- package/dist/runtime/routes/schema.js.map +1 -0
- package/dist/runtime/routes/studio-home.d.ts +3 -0
- package/dist/runtime/routes/studio-home.d.ts.map +1 -0
- package/dist/runtime/routes/studio-home.js +174 -0
- package/dist/runtime/routes/studio-home.js.map +1 -0
- package/dist/runtime/routes/theme-bootstrap.d.ts +4 -0
- package/dist/runtime/routes/theme-bootstrap.d.ts.map +1 -0
- package/dist/runtime/routes/theme-bootstrap.js +65 -0
- package/dist/runtime/routes/theme-bootstrap.js.map +1 -0
- package/dist/runtime/routes/theme-factory.d.ts +3 -0
- package/dist/runtime/routes/theme-factory.d.ts.map +1 -0
- package/dist/runtime/routes/theme-factory.js +142 -0
- package/dist/runtime/routes/theme-factory.js.map +1 -0
- package/dist/runtime/routes/upload.d.ts +3 -0
- package/dist/runtime/routes/upload.d.ts.map +1 -0
- package/dist/runtime/routes/upload.js +29 -0
- package/dist/runtime/routes/upload.js.map +1 -0
- package/dist/runtime/schema/infer-json-schema.d.ts +12 -0
- package/dist/runtime/schema/infer-json-schema.d.ts.map +1 -0
- package/dist/runtime/schema/infer-json-schema.js +75 -0
- package/dist/runtime/schema/infer-json-schema.js.map +1 -0
- package/dist/runtime/storage/filesystem-adapter.d.ts +29 -0
- package/dist/runtime/storage/filesystem-adapter.d.ts.map +1 -0
- package/dist/runtime/storage/filesystem-adapter.js +182 -0
- package/dist/runtime/storage/filesystem-adapter.js.map +1 -0
- package/dist/runtime/storage/filesystem-upload-handler.d.ts +11 -0
- package/dist/runtime/storage/filesystem-upload-handler.d.ts.map +1 -0
- package/dist/runtime/storage/filesystem-upload-handler.js +37 -0
- package/dist/runtime/storage/filesystem-upload-handler.js.map +1 -0
- package/dist/runtime/storage/in-memory-adapter.d.ts +24 -0
- package/dist/runtime/storage/in-memory-adapter.d.ts.map +1 -0
- package/dist/runtime/storage/in-memory-adapter.js +78 -0
- package/dist/runtime/storage/in-memory-adapter.js.map +1 -0
- package/dist/runtime/themes/preset-catalog.d.ts +9 -0
- package/dist/runtime/themes/preset-catalog.d.ts.map +1 -0
- package/dist/runtime/themes/preset-catalog.js +47 -0
- package/dist/runtime/themes/preset-catalog.js.map +1 -0
- package/dist/runtime/utils.d.ts +6 -0
- package/dist/runtime/utils.d.ts.map +1 -0
- package/dist/runtime/utils.js +29 -0
- package/dist/runtime/utils.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vite/virtual-config-plugin.d.ts +7 -0
- package/dist/vite/virtual-config-plugin.d.ts.map +1 -0
- package/dist/vite/virtual-config-plugin.js +25 -0
- package/dist/vite/virtual-config-plugin.js.map +1 -0
- package/package.json +35 -0
- package/static/cms/editor/config.js +6 -0
- package/static/cms/editor/guards.js +68 -0
- package/static/cms/editor/helpers.js +16 -0
- package/static/cms/editor/image-edit.js +148 -0
- package/static/cms/editor/image-utils.js +84 -0
- package/static/cms/editor/image.css +133 -0
- package/static/cms/editor/link-ui.css +143 -0
- package/static/cms/editor/linkify.js +55 -0
- package/static/cms/editor/panel.css +91 -0
- package/static/cms/editor/panel.js +64 -0
- package/static/cms/editor/save-queue.js +167 -0
- package/static/cms/editor/section-controls/activation.js +10 -0
- package/static/cms/editor/section-controls/api.js +88 -0
- package/static/cms/editor/section-controls/constants.js +24 -0
- package/static/cms/editor/section-controls/index.js +622 -0
- package/static/cms/editor/section-controls/model.js +76 -0
- package/static/cms/editor/section-controls/mutations.js +112 -0
- package/static/cms/editor/section-controls/page-context.js +34 -0
- package/static/cms/editor/section-controls/pickers.js +196 -0
- package/static/cms/editor/section-controls/reorder.js +92 -0
- package/static/cms/editor/section-controls/selection.js +54 -0
- package/static/cms/editor/section-controls/spacing-drag.js +83 -0
- package/static/cms/editor/section-controls/ui-elements.js +54 -0
- package/static/cms/editor/section-controls/utils.js +35 -0
- package/static/cms/editor/section-controls.css +349 -0
- package/static/cms/editor/section-controls.js +1 -0
- package/static/cms/editor/security.js +23 -0
- package/static/cms/editor/sync.js +64 -0
- package/static/cms/editor/text-edit.js +129 -0
- package/static/cms/editor/text-link-interactions.js +191 -0
- package/static/cms/editor/toast.css +50 -0
- package/static/cms/editor/toast.js +29 -0
- package/static/cms/editor/tokens-and-text.css +94 -0
- package/static/cms/editor/toolbar.css +261 -0
- package/static/cms/editor/toolbar.js +110 -0
- package/static/cms/editor.css +10 -0
- package/static/cms/editor.js +101 -0
- package/static/cms/studio.css +312 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
function isRecord(value) {
|
|
2
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
function asNonEmptyString(value) {
|
|
5
|
+
if (typeof value !== "string")
|
|
6
|
+
return null;
|
|
7
|
+
const trimmed = value.trim();
|
|
8
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
9
|
+
}
|
|
10
|
+
function asOptionalExpectedRevision(value) {
|
|
11
|
+
if (value === undefined)
|
|
12
|
+
return undefined;
|
|
13
|
+
if (typeof value === "number" && Number.isInteger(value) && value >= 0)
|
|
14
|
+
return value;
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
async function parseCollection(adapter, value) {
|
|
18
|
+
if (typeof value !== "string")
|
|
19
|
+
return null;
|
|
20
|
+
const normalized = value.trim().toLowerCase();
|
|
21
|
+
return (await adapter.isKnownCollection(normalized)) ? normalized : null;
|
|
22
|
+
}
|
|
23
|
+
function issue(path, code, message) {
|
|
24
|
+
return { path, code, message };
|
|
25
|
+
}
|
|
26
|
+
async function parseSaveFieldCommand(adapter, input) {
|
|
27
|
+
const issues = [];
|
|
28
|
+
const collection = await parseCollection(adapter, input.collection);
|
|
29
|
+
const id = asNonEmptyString(input.id);
|
|
30
|
+
const field = asNonEmptyString(input.field);
|
|
31
|
+
const value = input.value;
|
|
32
|
+
const expectedRevision = asOptionalExpectedRevision(input.expectedRevision);
|
|
33
|
+
if (!collection)
|
|
34
|
+
issues.push(issue("collection", "invalid_type", "Invalid collection"));
|
|
35
|
+
if (!id)
|
|
36
|
+
issues.push(issue("id", "invalid_type", "Invalid id"));
|
|
37
|
+
if (!field)
|
|
38
|
+
issues.push(issue("field", "invalid_type", "Invalid field path"));
|
|
39
|
+
if (typeof value !== "string")
|
|
40
|
+
issues.push(issue("value", "invalid_type", "Value must be a string"));
|
|
41
|
+
if (expectedRevision === null) {
|
|
42
|
+
issues.push(issue("expectedRevision", "invalid_type", "expectedRevision must be a non-negative integer"));
|
|
43
|
+
}
|
|
44
|
+
if (issues.length > 0 || !collection || !id || !field || typeof value !== "string") {
|
|
45
|
+
return { ok: false, issues };
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
ok: true,
|
|
49
|
+
command: {
|
|
50
|
+
type: "save_field",
|
|
51
|
+
collection,
|
|
52
|
+
id,
|
|
53
|
+
field,
|
|
54
|
+
value,
|
|
55
|
+
expectedRevision: expectedRevision ?? undefined,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function parsePutEntryCommand(adapter, input) {
|
|
60
|
+
const issues = [];
|
|
61
|
+
const collection = await parseCollection(adapter, input.collection);
|
|
62
|
+
const id = asNonEmptyString(input.id);
|
|
63
|
+
const data = input.data;
|
|
64
|
+
const expectedRevision = asOptionalExpectedRevision(input.expectedRevision);
|
|
65
|
+
if (!collection)
|
|
66
|
+
issues.push(issue("collection", "invalid_type", "Invalid collection"));
|
|
67
|
+
if (!id)
|
|
68
|
+
issues.push(issue("id", "invalid_type", "Invalid id"));
|
|
69
|
+
if (!isRecord(data))
|
|
70
|
+
issues.push(issue("data", "invalid_type", "data must be an object"));
|
|
71
|
+
if (expectedRevision === null) {
|
|
72
|
+
issues.push(issue("expectedRevision", "invalid_type", "expectedRevision must be a non-negative integer"));
|
|
73
|
+
}
|
|
74
|
+
if (issues.length > 0 || !collection || !id || !isRecord(data))
|
|
75
|
+
return { ok: false, issues };
|
|
76
|
+
return {
|
|
77
|
+
ok: true,
|
|
78
|
+
command: {
|
|
79
|
+
type: "put_entry",
|
|
80
|
+
collection,
|
|
81
|
+
id,
|
|
82
|
+
data,
|
|
83
|
+
expectedRevision: expectedRevision ?? undefined,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async function parseDeleteEntryCommand(adapter, input) {
|
|
88
|
+
const issues = [];
|
|
89
|
+
const collection = await parseCollection(adapter, input.collection);
|
|
90
|
+
const id = asNonEmptyString(input.id);
|
|
91
|
+
const expectedRevision = asOptionalExpectedRevision(input.expectedRevision);
|
|
92
|
+
if (!collection)
|
|
93
|
+
issues.push(issue("collection", "invalid_type", "Invalid collection"));
|
|
94
|
+
if (!id)
|
|
95
|
+
issues.push(issue("id", "invalid_type", "Invalid id"));
|
|
96
|
+
if (expectedRevision === null) {
|
|
97
|
+
issues.push(issue("expectedRevision", "invalid_type", "expectedRevision must be a non-negative integer"));
|
|
98
|
+
}
|
|
99
|
+
if (issues.length > 0 || !collection || !id)
|
|
100
|
+
return { ok: false, issues };
|
|
101
|
+
return {
|
|
102
|
+
ok: true,
|
|
103
|
+
command: {
|
|
104
|
+
type: "delete_entry",
|
|
105
|
+
collection,
|
|
106
|
+
id,
|
|
107
|
+
expectedRevision: expectedRevision ?? undefined,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async function parseReorderEntriesCommand(adapter, input) {
|
|
112
|
+
const issues = [];
|
|
113
|
+
const collection = await parseCollection(adapter, input.collection);
|
|
114
|
+
if (!collection) {
|
|
115
|
+
issues.push(issue("collection", "invalid_type", "Invalid collection"));
|
|
116
|
+
}
|
|
117
|
+
const rawItems = input.items;
|
|
118
|
+
if (!Array.isArray(rawItems) || rawItems.length === 0) {
|
|
119
|
+
issues.push(issue("items", "invalid_type", "Items must be a non-empty array"));
|
|
120
|
+
return { ok: false, issues };
|
|
121
|
+
}
|
|
122
|
+
const items = [];
|
|
123
|
+
rawItems.forEach((item, index) => {
|
|
124
|
+
if (!isRecord(item)) {
|
|
125
|
+
issues.push(issue(`items.${index}`, "invalid_type", "Item must be an object"));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const id = asNonEmptyString(item.id);
|
|
129
|
+
const order = item.order;
|
|
130
|
+
const expectedRevision = asOptionalExpectedRevision(item.expectedRevision);
|
|
131
|
+
if (!id)
|
|
132
|
+
issues.push(issue(`items.${index}.id`, "invalid_type", "Invalid id"));
|
|
133
|
+
if (!(typeof order === "number" && Number.isInteger(order) && order >= 0)) {
|
|
134
|
+
issues.push(issue(`items.${index}.order`, "invalid_type", "order must be a non-negative integer"));
|
|
135
|
+
}
|
|
136
|
+
if (expectedRevision === null) {
|
|
137
|
+
issues.push(issue(`items.${index}.expectedRevision`, "invalid_type", "expectedRevision must be a non-negative integer"));
|
|
138
|
+
}
|
|
139
|
+
if (id && typeof order === "number" && Number.isInteger(order) && order >= 0) {
|
|
140
|
+
items.push({
|
|
141
|
+
id,
|
|
142
|
+
order,
|
|
143
|
+
expectedRevision: expectedRevision ?? undefined,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
if (issues.length > 0 || !collection)
|
|
148
|
+
return { ok: false, issues };
|
|
149
|
+
return { ok: true, command: { type: "reorder_entries", collection, items } };
|
|
150
|
+
}
|
|
151
|
+
async function parseUpdatePageLayoutCommand(adapter, input) {
|
|
152
|
+
const issues = [];
|
|
153
|
+
const collection = await parseCollection(adapter, input.collection ?? "pages");
|
|
154
|
+
const id = asNonEmptyString(input.id);
|
|
155
|
+
const expectedRevision = asOptionalExpectedRevision(input.expectedRevision);
|
|
156
|
+
const rawSections = input.sections;
|
|
157
|
+
if (!collection)
|
|
158
|
+
issues.push(issue("collection", "invalid_type", "Invalid collection"));
|
|
159
|
+
if (!id)
|
|
160
|
+
issues.push(issue("id", "invalid_type", "Invalid id"));
|
|
161
|
+
if (expectedRevision === null) {
|
|
162
|
+
issues.push(issue("expectedRevision", "invalid_type", "expectedRevision must be a non-negative integer"));
|
|
163
|
+
}
|
|
164
|
+
if (!Array.isArray(rawSections) || rawSections.length === 0) {
|
|
165
|
+
issues.push(issue("sections", "invalid_type", "Sections must be a non-empty array"));
|
|
166
|
+
return { ok: false, issues };
|
|
167
|
+
}
|
|
168
|
+
const sections = [];
|
|
169
|
+
rawSections.forEach((section, index) => {
|
|
170
|
+
if (!isRecord(section)) {
|
|
171
|
+
issues.push(issue(`sections.${index}`, "invalid_type", "Section must be an object"));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const sectionId = asNonEmptyString(section.id);
|
|
175
|
+
const key = asNonEmptyString(section.key);
|
|
176
|
+
const enabled = section.enabled;
|
|
177
|
+
const spacing = section.spacing_y;
|
|
178
|
+
if (!sectionId)
|
|
179
|
+
issues.push(issue(`sections.${index}.id`, "invalid_type", "Invalid section id"));
|
|
180
|
+
if (!key)
|
|
181
|
+
issues.push(issue(`sections.${index}.key`, "invalid_type", "Invalid section key"));
|
|
182
|
+
if (!(enabled === undefined || typeof enabled === "boolean")) {
|
|
183
|
+
issues.push(issue(`sections.${index}.enabled`, "invalid_type", "enabled must be boolean"));
|
|
184
|
+
}
|
|
185
|
+
if (!(spacing === undefined || typeof spacing === "string")) {
|
|
186
|
+
issues.push(issue(`sections.${index}.spacing_y`, "invalid_type", "spacing_y must be a string"));
|
|
187
|
+
}
|
|
188
|
+
if (sectionId && key) {
|
|
189
|
+
sections.push({
|
|
190
|
+
id: sectionId,
|
|
191
|
+
key,
|
|
192
|
+
enabled: typeof enabled === "boolean" ? enabled : true,
|
|
193
|
+
spacing_y: typeof spacing === "string" ? spacing : undefined,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
if (issues.length > 0 || !id || !collection)
|
|
198
|
+
return { ok: false, issues };
|
|
199
|
+
return {
|
|
200
|
+
ok: true,
|
|
201
|
+
command: {
|
|
202
|
+
type: "update_page_layout",
|
|
203
|
+
collection,
|
|
204
|
+
id,
|
|
205
|
+
sections,
|
|
206
|
+
expectedRevision: expectedRevision ?? undefined,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
export async function parseMutationCommand(adapter, input) {
|
|
211
|
+
if (!isRecord(input)) {
|
|
212
|
+
return {
|
|
213
|
+
ok: false,
|
|
214
|
+
issues: [issue("", "invalid_type", "Mutation payload must be an object")],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const type = asNonEmptyString(input.type);
|
|
218
|
+
if (!type) {
|
|
219
|
+
return {
|
|
220
|
+
ok: false,
|
|
221
|
+
issues: [issue("type", "invalid_type", "Missing mutation type")],
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
switch (type) {
|
|
225
|
+
case "save_field":
|
|
226
|
+
return parseSaveFieldCommand(adapter, input);
|
|
227
|
+
case "put_entry":
|
|
228
|
+
return parsePutEntryCommand(adapter, input);
|
|
229
|
+
case "delete_entry":
|
|
230
|
+
return parseDeleteEntryCommand(adapter, input);
|
|
231
|
+
case "reorder_entries":
|
|
232
|
+
return parseReorderEntriesCommand(adapter, input);
|
|
233
|
+
case "update_page_layout":
|
|
234
|
+
return parseUpdatePageLayoutCommand(adapter, input);
|
|
235
|
+
default:
|
|
236
|
+
return {
|
|
237
|
+
ok: false,
|
|
238
|
+
issues: [issue("type", "invalid_enum_value", `Unsupported mutation type "${type}"`)],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/runtime/mutations/contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { StorageAdapter } from "../../types.js";
|
|
2
|
+
import { type MutationIssue } from "./contracts.js";
|
|
3
|
+
type MutationErrorBody = {
|
|
4
|
+
error: string;
|
|
5
|
+
issues?: MutationIssue[];
|
|
6
|
+
currentRevision?: number;
|
|
7
|
+
conflictId?: string;
|
|
8
|
+
};
|
|
9
|
+
type MutationResult = {
|
|
10
|
+
ok: true;
|
|
11
|
+
body: {
|
|
12
|
+
ok: true;
|
|
13
|
+
revision?: number;
|
|
14
|
+
revisions?: Record<string, number>;
|
|
15
|
+
};
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
status: number;
|
|
19
|
+
body: MutationErrorBody;
|
|
20
|
+
};
|
|
21
|
+
export declare function executeMutation(adapter: StorageAdapter, input: unknown): Promise<MutationResult>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/runtime/mutations/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AAExB,KAAK,iBAAiB,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,cAAc,GACf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;CAAE,GACvF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAkL3D,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAqBtG"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { setNestedValue } from "../utils.js";
|
|
2
|
+
import { parseMutationCommand, } from "./contracts.js";
|
|
3
|
+
function fail(status, error, extra) {
|
|
4
|
+
return {
|
|
5
|
+
ok: false,
|
|
6
|
+
status,
|
|
7
|
+
body: {
|
|
8
|
+
error,
|
|
9
|
+
...extra,
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function isRecord(value) {
|
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
async function ensureExpectedRevisionMatches(adapter, collection, id, expectedRevision) {
|
|
17
|
+
const currentRevision = await adapter.getRevision(collection, id);
|
|
18
|
+
if (expectedRevision !== undefined && expectedRevision !== currentRevision) {
|
|
19
|
+
return {
|
|
20
|
+
ok: false,
|
|
21
|
+
result: fail(409, "Revision conflict", { currentRevision }),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return { ok: true, currentRevision };
|
|
25
|
+
}
|
|
26
|
+
async function applySaveField(adapter, command) {
|
|
27
|
+
const { collection, id, field, value, expectedRevision } = command;
|
|
28
|
+
const revision = await ensureExpectedRevisionMatches(adapter, collection, id, expectedRevision);
|
|
29
|
+
if (!revision.ok)
|
|
30
|
+
return revision.result;
|
|
31
|
+
const before = (await adapter.getEntry(collection, id))?.data ?? {};
|
|
32
|
+
const current = { ...before };
|
|
33
|
+
await adapter.appendHistory(collection, id, {
|
|
34
|
+
ts: Date.now(),
|
|
35
|
+
action: "save",
|
|
36
|
+
data: before,
|
|
37
|
+
});
|
|
38
|
+
try {
|
|
39
|
+
setNestedValue(current, field, value);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const message = error instanceof Error ? error.message : "Set failed";
|
|
43
|
+
return fail(400, message);
|
|
44
|
+
}
|
|
45
|
+
await adapter.writeEntry(collection, id, current);
|
|
46
|
+
const nextRevision = await adapter.bumpRevision(collection, id);
|
|
47
|
+
return { ok: true, body: { ok: true, revision: nextRevision } };
|
|
48
|
+
}
|
|
49
|
+
async function applyPutEntry(adapter, command) {
|
|
50
|
+
const { collection, id, data, expectedRevision } = command;
|
|
51
|
+
const revision = await ensureExpectedRevisionMatches(adapter, collection, id, expectedRevision);
|
|
52
|
+
if (!revision.ok)
|
|
53
|
+
return revision.result;
|
|
54
|
+
const before = (await adapter.getEntry(collection, id))?.data ?? null;
|
|
55
|
+
if (before !== null) {
|
|
56
|
+
await adapter.appendHistory(collection, id, {
|
|
57
|
+
ts: Date.now(),
|
|
58
|
+
action: "put",
|
|
59
|
+
data: before,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
await adapter.writeEntry(collection, id, data);
|
|
63
|
+
const nextRevision = await adapter.bumpRevision(collection, id);
|
|
64
|
+
return { ok: true, body: { ok: true, revision: nextRevision } };
|
|
65
|
+
}
|
|
66
|
+
async function applyDeleteEntry(adapter, command) {
|
|
67
|
+
const { collection, id, expectedRevision } = command;
|
|
68
|
+
const revision = await ensureExpectedRevisionMatches(adapter, collection, id, expectedRevision);
|
|
69
|
+
if (!revision.ok)
|
|
70
|
+
return revision.result;
|
|
71
|
+
const before = (await adapter.getEntry(collection, id))?.data ?? null;
|
|
72
|
+
if (before !== null) {
|
|
73
|
+
await adapter.appendHistory(collection, id, {
|
|
74
|
+
ts: Date.now(),
|
|
75
|
+
action: "delete",
|
|
76
|
+
data: before,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
await adapter.deleteEntry(collection, id);
|
|
80
|
+
const nextRevision = await adapter.bumpRevision(collection, id);
|
|
81
|
+
return { ok: true, body: { ok: true, revision: nextRevision } };
|
|
82
|
+
}
|
|
83
|
+
async function applyReorderEntries(adapter, command) {
|
|
84
|
+
const { collection, items } = command;
|
|
85
|
+
const currentById = new Map();
|
|
86
|
+
for (const item of items) {
|
|
87
|
+
const entry = await adapter.getEntry(collection, item.id);
|
|
88
|
+
if (!entry)
|
|
89
|
+
return fail(404, "Entry not found", { conflictId: item.id });
|
|
90
|
+
const revision = await adapter.getRevision(collection, item.id);
|
|
91
|
+
if (item.expectedRevision !== undefined && item.expectedRevision !== revision) {
|
|
92
|
+
return fail(409, "Revision conflict", {
|
|
93
|
+
conflictId: item.id,
|
|
94
|
+
currentRevision: revision,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
currentById.set(item.id, { data: entry.data, revision });
|
|
98
|
+
}
|
|
99
|
+
const revisions = {};
|
|
100
|
+
for (const item of items) {
|
|
101
|
+
const current = currentById.get(item.id);
|
|
102
|
+
if (!current)
|
|
103
|
+
return fail(500, "Failed to load reorder item");
|
|
104
|
+
await adapter.appendHistory(collection, item.id, {
|
|
105
|
+
ts: Date.now(),
|
|
106
|
+
action: "reorder",
|
|
107
|
+
data: current.data,
|
|
108
|
+
});
|
|
109
|
+
const nextData = { ...current.data, order: item.order };
|
|
110
|
+
await adapter.writeEntry(collection, item.id, nextData);
|
|
111
|
+
revisions[item.id] = await adapter.bumpRevision(collection, item.id);
|
|
112
|
+
}
|
|
113
|
+
return { ok: true, body: { ok: true, revisions } };
|
|
114
|
+
}
|
|
115
|
+
async function applyUpdatePageLayout(adapter, command) {
|
|
116
|
+
const { collection, id, sections, expectedRevision } = command;
|
|
117
|
+
const revision = await ensureExpectedRevisionMatches(adapter, collection, id, expectedRevision);
|
|
118
|
+
if (!revision.ok)
|
|
119
|
+
return revision.result;
|
|
120
|
+
const current = (await adapter.getEntry(collection, id))?.data ?? {};
|
|
121
|
+
await adapter.appendHistory(collection, id, {
|
|
122
|
+
ts: Date.now(),
|
|
123
|
+
action: "put",
|
|
124
|
+
data: current,
|
|
125
|
+
});
|
|
126
|
+
const layout = current.layout && isRecord(current.layout)
|
|
127
|
+
? { ...current.layout }
|
|
128
|
+
: {};
|
|
129
|
+
layout.sections = sections.map((section) => ({
|
|
130
|
+
id: section.id,
|
|
131
|
+
key: section.key,
|
|
132
|
+
enabled: section.enabled,
|
|
133
|
+
spacing_y: section.spacing_y,
|
|
134
|
+
}));
|
|
135
|
+
current.layout = layout;
|
|
136
|
+
await adapter.writeEntry(collection, id, current);
|
|
137
|
+
const nextRevision = await adapter.bumpRevision(collection, id);
|
|
138
|
+
return { ok: true, body: { ok: true, revision: nextRevision } };
|
|
139
|
+
}
|
|
140
|
+
export async function executeMutation(adapter, input) {
|
|
141
|
+
const parsed = await parseMutationCommand(adapter, input);
|
|
142
|
+
if (!parsed.ok) {
|
|
143
|
+
return fail(400, "Invalid mutation command", { issues: parsed.issues });
|
|
144
|
+
}
|
|
145
|
+
const command = parsed.command;
|
|
146
|
+
switch (command.type) {
|
|
147
|
+
case "save_field":
|
|
148
|
+
return applySaveField(adapter, command);
|
|
149
|
+
case "put_entry":
|
|
150
|
+
return applyPutEntry(adapter, command);
|
|
151
|
+
case "delete_entry":
|
|
152
|
+
return applyDeleteEntry(adapter, command);
|
|
153
|
+
case "reorder_entries":
|
|
154
|
+
return applyReorderEntries(adapter, command);
|
|
155
|
+
case "update_page_layout":
|
|
156
|
+
return applyUpdatePageLayout(adapter, command);
|
|
157
|
+
default:
|
|
158
|
+
return fail(400, "Unsupported mutation type");
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/runtime/mutations/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { APIContext } from "astro";
|
|
2
|
+
import type { StorageAdapter, UploadHandler } from "../../types.js";
|
|
3
|
+
export declare function json(body: Record<string, unknown>, status?: number): Response;
|
|
4
|
+
export declare function getAdapter(context: APIContext): StorageAdapter;
|
|
5
|
+
export declare function getUploadHandler(context: APIContext): UploadHandler;
|
|
6
|
+
//# sourceMappingURL=_helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../../src/runtime/routes/_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpE,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,SAAM,GAAG,QAAQ,CAK1E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,CAW9D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa,CAWnE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function json(body, status = 200) {
|
|
2
|
+
return new Response(JSON.stringify(body), {
|
|
3
|
+
status,
|
|
4
|
+
headers: { "Content-Type": "application/json; charset=utf-8" },
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
export function getAdapter(context) {
|
|
8
|
+
const adapter = context.locals.cmsAdapter;
|
|
9
|
+
if (!adapter) {
|
|
10
|
+
throw new Error("[astro-live-cms] No StorageAdapter found on context.locals.cmsAdapter. " +
|
|
11
|
+
"Ensure the CMS middleware is registered.");
|
|
12
|
+
}
|
|
13
|
+
return adapter;
|
|
14
|
+
}
|
|
15
|
+
export function getUploadHandler(context) {
|
|
16
|
+
const handler = context.locals.cmsUploadHandler;
|
|
17
|
+
if (!handler) {
|
|
18
|
+
throw new Error("[astro-live-cms] No UploadHandler found on context.locals.cmsUploadHandler. " +
|
|
19
|
+
"Ensure the CMS middleware is registered.");
|
|
20
|
+
}
|
|
21
|
+
return handler;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=_helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../../src/runtime/routes/_helpers.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,IAAI,CAAC,IAA6B,EAAE,MAAM,GAAG,GAAG;IAC9D,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAmB;IAC5C,MAAM,OAAO,GAAI,OAAO,CAAC,MAAkC,CAAC,UAE/C,CAAC;IACd,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,yEAAyE;YACvE,0CAA0C,CAC7C,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAmB;IAClD,MAAM,OAAO,GAAI,OAAO,CAAC,MAAkC,CAAC,gBAE/C,CAAC;IACd,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8EAA8E;YAC5E,0CAA0C,CAC7C,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/runtime/routes/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAmHxC,wBAAsB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqBhE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { hasConfiguredEditorPassword, isEditorAuthenticated, } from "../auth/session.js";
|
|
2
|
+
import { getRuntimeConfig } from "../config.js";
|
|
3
|
+
function sanitizeRedirect(value, fallback) {
|
|
4
|
+
if (!value)
|
|
5
|
+
return fallback;
|
|
6
|
+
return value.startsWith("/") && !value.startsWith("//") ? value : fallback;
|
|
7
|
+
}
|
|
8
|
+
function renderLogin(errorMessage, hasPassword, apiBasePath, redirectTo) {
|
|
9
|
+
const statusNote = hasPassword
|
|
10
|
+
? "Sign in with your editor password."
|
|
11
|
+
: "No editor password configured. Set LIVE_CMS_EDIT_PASSWORD (or EDIT_PASSWORD).";
|
|
12
|
+
return `<!doctype html>
|
|
13
|
+
<html lang="en">
|
|
14
|
+
<head>
|
|
15
|
+
<meta charset="utf-8" />
|
|
16
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
17
|
+
<title>Astro Live CMS Login</title>
|
|
18
|
+
<style>
|
|
19
|
+
:root { color-scheme: light; }
|
|
20
|
+
body { margin: 0; font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: #f5f7fb; color: #1f2430; }
|
|
21
|
+
main { max-width: 760px; margin: 3rem auto; padding: 0 1rem; }
|
|
22
|
+
.card { background: #fff; border: 1px solid #dbe3f0; border-radius: 12px; padding: 1.25rem; box-shadow: 0 1px 3px rgba(12, 24, 40, 0.05); }
|
|
23
|
+
h1 { margin: 0 0 0.5rem; font-size: 1.5rem; }
|
|
24
|
+
p { margin: 0.5rem 0; line-height: 1.45; color: #4c5566; }
|
|
25
|
+
form { margin-top: 1rem; display: grid; gap: 0.75rem; max-width: 24rem; }
|
|
26
|
+
input { border: 1px solid #c8d2e7; border-radius: 8px; padding: 0.65rem 0.75rem; font-size: 0.95rem; }
|
|
27
|
+
button { border: 0; border-radius: 8px; background: #0f2f66; color: #fff; padding: 0.65rem 0.9rem; font-size: 0.95rem; cursor: pointer; }
|
|
28
|
+
.error { color: #b42318; font-size: 0.9rem; margin-top: 0.25rem; }
|
|
29
|
+
code { background: #eef2fa; border-radius: 6px; padding: 0.1rem 0.35rem; }
|
|
30
|
+
</style>
|
|
31
|
+
</head>
|
|
32
|
+
<body>
|
|
33
|
+
<main>
|
|
34
|
+
<div class="card">
|
|
35
|
+
<h1>Astro Live CMS</h1>
|
|
36
|
+
<p>${statusNote}</p>
|
|
37
|
+
${errorMessage
|
|
38
|
+
? `<p class="error">${errorMessage}</p>`
|
|
39
|
+
: ""}
|
|
40
|
+
<form method="post" action="${apiBasePath}/auth/login">
|
|
41
|
+
<input name="password" type="password" placeholder="Editor password" autocomplete="current-password" required ${hasPassword ? "" : "disabled"} />
|
|
42
|
+
<input type="hidden" name="redirect" value="${redirectTo}" />
|
|
43
|
+
<button type="submit" ${hasPassword ? "" : "disabled"}>Sign In</button>
|
|
44
|
+
</form>
|
|
45
|
+
</div>
|
|
46
|
+
</main>
|
|
47
|
+
</body>
|
|
48
|
+
</html>`;
|
|
49
|
+
}
|
|
50
|
+
function renderAdmin(mountPath, apiBasePath) {
|
|
51
|
+
const studioPath = `${mountPath}/cms`;
|
|
52
|
+
const themesPath = `${mountPath}/themes`;
|
|
53
|
+
const entriesPath = `${apiBasePath}/entries?collection=pages&page=1&pageSize=10`;
|
|
54
|
+
const mutatePath = `${apiBasePath}/mutate`;
|
|
55
|
+
const logoutPath = `${apiBasePath}/auth/logout`;
|
|
56
|
+
return `<!doctype html>
|
|
57
|
+
<html lang="en">
|
|
58
|
+
<head>
|
|
59
|
+
<meta charset="utf-8" />
|
|
60
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
61
|
+
<title>Astro Live CMS Admin</title>
|
|
62
|
+
<style>
|
|
63
|
+
:root { color-scheme: light; }
|
|
64
|
+
body { margin: 0; font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: #f5f7fb; color: #1f2430; }
|
|
65
|
+
main { max-width: 760px; margin: 3rem auto; padding: 0 1rem; }
|
|
66
|
+
.card { background: #fff; border: 1px solid #dbe3f0; border-radius: 12px; padding: 1.25rem; box-shadow: 0 1px 3px rgba(12, 24, 40, 0.05); }
|
|
67
|
+
h1 { margin: 0 0 0.5rem; font-size: 1.5rem; }
|
|
68
|
+
p { margin: 0.5rem 0; line-height: 1.45; color: #4c5566; }
|
|
69
|
+
code { background: #eef2fa; border-radius: 6px; padding: 0.1rem 0.35rem; }
|
|
70
|
+
button { margin-top: 1rem; border: 0; border-radius: 8px; background: #3f4b62; color: #fff; padding: 0.55rem 0.8rem; font-size: 0.9rem; cursor: pointer; }
|
|
71
|
+
</style>
|
|
72
|
+
</head>
|
|
73
|
+
<body>
|
|
74
|
+
<main>
|
|
75
|
+
<div class="card">
|
|
76
|
+
<h1>Astro Live CMS</h1>
|
|
77
|
+
<p>Authenticated admin session is active.</p>
|
|
78
|
+
<p><a href="${studioPath}">Open Content Studio</a></p>
|
|
79
|
+
<p><a href="${themesPath}">Open Theme Factory</a></p>
|
|
80
|
+
<p>Try: <code>${entriesPath}</code></p>
|
|
81
|
+
<p>Mutations are available at <code>${mutatePath}</code>.</p>
|
|
82
|
+
<form method="post" action="${logoutPath}">
|
|
83
|
+
<input type="hidden" name="redirect" value="${mountPath}" />
|
|
84
|
+
<button type="submit">Sign Out</button>
|
|
85
|
+
</form>
|
|
86
|
+
</div>
|
|
87
|
+
</main>
|
|
88
|
+
</body>
|
|
89
|
+
</html>`;
|
|
90
|
+
}
|
|
91
|
+
function html(content, status = 200, setCookie) {
|
|
92
|
+
const headers = {
|
|
93
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
94
|
+
};
|
|
95
|
+
if (setCookie)
|
|
96
|
+
headers["Set-Cookie"] = setCookie;
|
|
97
|
+
return new Response(content, { status, headers });
|
|
98
|
+
}
|
|
99
|
+
export async function GET(context) {
|
|
100
|
+
const runtime = getRuntimeConfig();
|
|
101
|
+
const redirectTarget = sanitizeRedirect(context.url.searchParams.get("redirect"), "/");
|
|
102
|
+
if (isEditorAuthenticated(context)) {
|
|
103
|
+
return new Response(null, {
|
|
104
|
+
status: 302,
|
|
105
|
+
headers: { Location: redirectTarget },
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return html(renderLogin(null, hasConfiguredEditorPassword(), runtime.apiBasePath, redirectTarget));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/runtime/routes/admin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,SAAS,gBAAgB,CAAC,KAAgC,EAAE,QAAgB;IAC1E,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7E,CAAC;AAED,SAAS,WAAW,CAClB,YAA2B,EAC3B,WAAoB,EACpB,WAAmB,EACnB,UAAkB;IAElB,MAAM,UAAU,GAAG,WAAW;QAC5B,CAAC,CAAC,oCAAoC;QACtC,CAAC,CAAC,+EAA+E,CAAC;IAEpF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;aAwBI,UAAU;UAEb,YAAY;QACV,CAAC,CAAC,oBAAoB,YAAY,MAAM;QACxC,CAAC,CAAC,EACN;sCAC8B,WAAW;0HACyE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;wDAC/F,UAAU;kCAChC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;;;;;QAKvD,CAAC;AACT,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB,EAAE,WAAmB;IACzD,MAAM,UAAU,GAAG,GAAG,SAAS,MAAM,CAAC;IACtC,MAAM,UAAU,GAAG,GAAG,SAAS,SAAS,CAAC;IACzC,MAAM,WAAW,GAAG,GAAG,WAAW,8CAA8C,CAAC;IACjF,MAAM,UAAU,GAAG,GAAG,WAAW,SAAS,CAAC;IAC3C,MAAM,UAAU,GAAG,GAAG,WAAW,cAAc,CAAC;IAEhD,OAAO;;;;;;;;;;;;;;;;;;;;;;sBAsBa,UAAU;sBACV,UAAU;wBACR,WAAW;8CACW,UAAU;sCAClB,UAAU;wDACQ,SAAS;;;;;;QAMzD,CAAC;AACT,CAAC;AAED,SAAS,IAAI,CAAC,OAAe,EAAE,MAAM,GAAG,GAAG,EAAE,SAAkB;IAC7D,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,0BAA0B;KAC3C,CAAC;IACF,IAAI,SAAS;QAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IAEjD,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAmB;IAC3C,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,gBAAgB,CACrC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EACxC,GAAG,CACJ,CAAC;IAEF,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;YACxB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;SACtC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CACT,WAAW,CACT,IAAI,EACJ,2BAA2B,EAAE,EAC7B,OAAO,CAAC,WAAW,EACnB,cAAc,CACf,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-login.d.ts","sourceRoot":"","sources":["../../../src/runtime/routes/auth-login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAkCxC,wBAAsB,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6CjE;AAED,wBAAsB,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAQ7C"}
|