@caretcms/core 0.1.0 → 0.1.1
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/README.md +117 -6
- package/dist/browser-runtime.d.ts.map +1 -1
- package/dist/browser-runtime.js +34 -20
- package/dist/browser-runtime.js.map +1 -1
- package/dist/contracts.d.ts +14 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +14 -0
- package/dist/contracts.js.map +1 -0
- package/dist/editable.d.ts +28 -0
- package/dist/editable.d.ts.map +1 -0
- package/dist/editable.js +122 -0
- package/dist/editable.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +134 -2
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +45 -3
- package/dist/loader.js.map +1 -1
- package/dist/providers/storage/markdown.d.ts +7 -0
- package/dist/providers/storage/markdown.d.ts.map +1 -0
- package/dist/providers/storage/markdown.js +6 -0
- package/dist/providers/storage/markdown.js.map +1 -0
- package/dist/runtime/auth/cookie-utils.d.ts +1 -0
- package/dist/runtime/auth/cookie-utils.d.ts.map +1 -1
- package/dist/runtime/auth/cookie-utils.js +1 -1
- package/dist/runtime/auth/cookie-utils.js.map +1 -1
- package/dist/runtime/auth/rate-limiter.d.ts.map +1 -1
- package/dist/runtime/auth/rate-limiter.js +19 -13
- package/dist/runtime/auth/rate-limiter.js.map +1 -1
- package/dist/runtime/auth/session.d.ts +8 -0
- package/dist/runtime/auth/session.d.ts.map +1 -1
- package/dist/runtime/auth/session.js +72 -11
- package/dist/runtime/auth/session.js.map +1 -1
- package/dist/runtime/config.d.ts +1 -0
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +2 -1
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/git-journal.d.ts +19 -0
- package/dist/runtime/git-journal.d.ts.map +1 -0
- package/dist/runtime/git-journal.js +64 -0
- package/dist/runtime/git-journal.js.map +1 -0
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/middleware.d.ts.map +1 -1
- package/dist/runtime/middleware.js +125 -8
- package/dist/runtime/middleware.js.map +1 -1
- package/dist/runtime/mutations/contracts.d.ts.map +1 -1
- package/dist/runtime/mutations/contracts.js +7 -4
- package/dist/runtime/mutations/contracts.js.map +1 -1
- package/dist/runtime/mutations/engine.d.ts +7 -0
- package/dist/runtime/mutations/engine.d.ts.map +1 -1
- package/dist/runtime/mutations/engine.js +30 -17
- package/dist/runtime/mutations/engine.js.map +1 -1
- package/dist/runtime/providers.d.ts +7 -0
- package/dist/runtime/providers.d.ts.map +1 -1
- package/dist/runtime/providers.js +10 -0
- package/dist/runtime/providers.js.map +1 -1
- package/dist/runtime/publish.d.ts +38 -0
- package/dist/runtime/publish.d.ts.map +1 -0
- package/dist/runtime/publish.js +71 -0
- package/dist/runtime/publish.js.map +1 -0
- package/dist/runtime/request-context.d.ts +19 -0
- package/dist/runtime/request-context.d.ts.map +1 -1
- package/dist/runtime/request-context.js.map +1 -1
- package/dist/runtime/rewrite.d.ts +11 -1
- package/dist/runtime/rewrite.d.ts.map +1 -1
- package/dist/runtime/rewrite.js +21 -15
- package/dist/runtime/rewrite.js.map +1 -1
- package/dist/runtime/rich-allowlist.d.ts +28 -0
- package/dist/runtime/rich-allowlist.d.ts.map +1 -0
- package/dist/runtime/rich-allowlist.js +43 -0
- package/dist/runtime/rich-allowlist.js.map +1 -0
- package/dist/runtime/routes/_helpers.d.ts +26 -0
- package/dist/runtime/routes/_helpers.d.ts.map +1 -1
- package/dist/runtime/routes/_helpers.js +83 -0
- package/dist/runtime/routes/_helpers.js.map +1 -1
- package/dist/runtime/routes/admin.d.ts.map +1 -1
- package/dist/runtime/routes/admin.js +55 -6
- package/dist/runtime/routes/admin.js.map +1 -1
- package/dist/runtime/routes/auth-login.d.ts.map +1 -1
- package/dist/runtime/routes/auth-login.js +25 -8
- package/dist/runtime/routes/auth-login.js.map +1 -1
- package/dist/runtime/routes/auth-logout.d.ts.map +1 -1
- package/dist/runtime/routes/auth-logout.js +4 -0
- package/dist/runtime/routes/auth-logout.js.map +1 -1
- package/dist/runtime/routes/collections-metadata.d.ts.map +1 -1
- package/dist/runtime/routes/collections-metadata.js +4 -2
- package/dist/runtime/routes/collections-metadata.js.map +1 -1
- package/dist/runtime/routes/draft.d.ts +8 -0
- package/dist/runtime/routes/draft.d.ts.map +1 -0
- package/dist/runtime/routes/draft.js +38 -0
- package/dist/runtime/routes/draft.js.map +1 -0
- package/dist/runtime/routes/history.d.ts.map +1 -1
- package/dist/runtime/routes/history.js +21 -8
- package/dist/runtime/routes/history.js.map +1 -1
- package/dist/runtime/routes/mutate.d.ts.map +1 -1
- package/dist/runtime/routes/mutate.js +5 -9
- package/dist/runtime/routes/mutate.js.map +1 -1
- package/dist/runtime/routes/publish.d.ts +9 -0
- package/dist/runtime/routes/publish.d.ts.map +1 -0
- package/dist/runtime/routes/publish.js +66 -0
- package/dist/runtime/routes/publish.js.map +1 -0
- package/dist/runtime/routes/schema.d.ts.map +1 -1
- package/dist/runtime/routes/schema.js +4 -2
- package/dist/runtime/routes/schema.js.map +1 -1
- package/dist/runtime/routes/upload.d.ts.map +1 -1
- package/dist/runtime/routes/upload.js +16 -3
- package/dist/runtime/routes/upload.js.map +1 -1
- package/dist/runtime/sanitize-html.d.ts +8 -2
- package/dist/runtime/sanitize-html.d.ts.map +1 -1
- package/dist/runtime/sanitize-html.js +57 -38
- package/dist/runtime/sanitize-html.js.map +1 -1
- package/dist/runtime/stega.d.ts +38 -0
- package/dist/runtime/stega.d.ts.map +1 -0
- package/dist/runtime/stega.js +98 -0
- package/dist/runtime/stega.js.map +1 -0
- package/dist/runtime/storage/atomic-write.d.ts +22 -0
- package/dist/runtime/storage/atomic-write.d.ts.map +1 -0
- package/dist/runtime/storage/atomic-write.js +44 -0
- package/dist/runtime/storage/atomic-write.js.map +1 -0
- package/dist/runtime/storage/filesystem-adapter.d.ts +14 -11
- package/dist/runtime/storage/filesystem-adapter.d.ts.map +1 -1
- package/dist/runtime/storage/filesystem-adapter.js +71 -201
- package/dist/runtime/storage/filesystem-adapter.js.map +1 -1
- package/dist/runtime/storage/frontmatter-codec.d.ts +47 -0
- package/dist/runtime/storage/frontmatter-codec.d.ts.map +1 -0
- package/dist/runtime/storage/frontmatter-codec.js +515 -0
- package/dist/runtime/storage/frontmatter-codec.js.map +1 -0
- package/dist/runtime/storage/fs-runtime.d.ts +8 -0
- package/dist/runtime/storage/fs-runtime.d.ts.map +1 -0
- package/dist/runtime/storage/fs-runtime.js +40 -0
- package/dist/runtime/storage/fs-runtime.js.map +1 -0
- package/dist/runtime/storage/id-contracts.d.ts +22 -0
- package/dist/runtime/storage/id-contracts.d.ts.map +1 -0
- package/dist/runtime/storage/id-contracts.js +27 -0
- package/dist/runtime/storage/id-contracts.js.map +1 -0
- package/dist/runtime/storage/image-validation.d.ts +10 -0
- package/dist/runtime/storage/image-validation.d.ts.map +1 -1
- package/dist/runtime/storage/image-validation.js +17 -4
- package/dist/runtime/storage/image-validation.js.map +1 -1
- package/dist/runtime/storage/in-memory-adapter.d.ts +4 -0
- package/dist/runtime/storage/in-memory-adapter.d.ts.map +1 -1
- package/dist/runtime/storage/in-memory-adapter.js +11 -0
- package/dist/runtime/storage/in-memory-adapter.js.map +1 -1
- package/dist/runtime/storage/markdown-adapter.d.ts +63 -0
- package/dist/runtime/storage/markdown-adapter.d.ts.map +1 -0
- package/dist/runtime/storage/markdown-adapter.js +227 -0
- package/dist/runtime/storage/markdown-adapter.js.map +1 -0
- package/dist/runtime/storage/quota-upload-handler.d.ts +2 -0
- package/dist/runtime/storage/quota-upload-handler.d.ts.map +1 -1
- package/dist/runtime/storage/quota-upload-handler.js +34 -8
- package/dist/runtime/storage/quota-upload-handler.js.map +1 -1
- package/dist/runtime/storage/session-overlay-adapter.d.ts +3 -0
- package/dist/runtime/storage/session-overlay-adapter.d.ts.map +1 -1
- package/dist/runtime/storage/session-overlay-adapter.js +3 -1
- package/dist/runtime/storage/session-overlay-adapter.js.map +1 -1
- package/dist/runtime/storage/sidecar-meta-store.d.ts +51 -0
- package/dist/runtime/storage/sidecar-meta-store.d.ts.map +1 -0
- package/dist/runtime/storage/sidecar-meta-store.js +209 -0
- package/dist/runtime/storage/sidecar-meta-store.js.map +1 -0
- package/dist/runtime/themes/preset-tokens.d.ts +0 -1
- package/dist/runtime/themes/preset-tokens.d.ts.map +1 -1
- package/dist/runtime/themes/preset-tokens.js +1 -1
- package/dist/runtime/themes/preset-tokens.js.map +1 -1
- package/dist/runtime/utils.d.ts +9 -1
- package/dist/runtime/utils.d.ts.map +1 -1
- package/dist/runtime/utils.js +21 -1
- package/dist/runtime/utils.js.map +1 -1
- package/dist/schema-utils.d.ts.map +1 -1
- package/dist/schema-utils.js +1 -0
- package/dist/schema-utils.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -1
- package/static/cms/dev-toolbar/app.js +263 -0
- package/static/cms/editor/highlight.js +46 -0
- package/static/cms/editor/sanitize.js +48 -5
- package/static/cms/editor/stega-hydrate.js +80 -0
- package/static/cms/editor/text-edit.js +22 -0
- package/static/cms/editor/tokens-and-text.css +1 -1
- package/static/cms/editor/toolbar.css +42 -0
- package/static/cms/editor/toolbar.js +97 -15
- package/static/cms/editor.js +15 -0
- package/static/cms/signin-hint.css +74 -0
- package/dist/runtime/schema/template.d.ts +0 -15
- package/dist/runtime/schema/template.d.ts.map +0 -1
- package/dist/runtime/schema/template.js +0 -38
- package/dist/runtime/schema/template.js.map +0 -1
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zero-dependency YAML-frontmatter codec for the markdown StorageAdapter.
|
|
3
|
+
*
|
|
4
|
+
* Core ships no runtime dependencies, so this is a hand-rolled parser/serializer
|
|
5
|
+
* for the SUBSET of YAML that appears in Astro content-collection frontmatter:
|
|
6
|
+
* block mappings, block sequences (of scalars or mappings), and scalars
|
|
7
|
+
* (quoted/plain strings, integers, floats, booleans, null), plus empty/scalar
|
|
8
|
+
* flow collections (`[]`, `{}`, `[a, b]`, `{a: b}`).
|
|
9
|
+
*
|
|
10
|
+
* Design rules:
|
|
11
|
+
* - **Fail loud, never lossy.** `parseFrontmatter` returns `{ ok: false }` for
|
|
12
|
+
* any construct it cannot faithfully represent (anchors, aliases, tags, block
|
|
13
|
+
* scalars `|`/`>`, tab indentation). The adapter turns that into a thrown
|
|
14
|
+
* error so a later whole-entry `writeEntry` can never silently drop the
|
|
15
|
+
* frontmatter it failed to read.
|
|
16
|
+
* - **Round-trip safe by construction.** A value is emitted as a plain scalar
|
|
17
|
+
* only when re-parsing that exact text yields the identical string; anything
|
|
18
|
+
* else is double-quoted with JSON escapes (valid YAML double-quote escapes),
|
|
19
|
+
* so `parse(serialize(x))` deep-equals `x` for every supported value.
|
|
20
|
+
* - **Comments are not preserved** on write (preserving them needs a full CST).
|
|
21
|
+
* Documented and accepted for v1; the markdown BODY, by contrast, is never
|
|
22
|
+
* touched — the adapter splices it back verbatim using `bodyStart`.
|
|
23
|
+
*/
|
|
24
|
+
const MAX_DEPTH = 32;
|
|
25
|
+
class CodecError extends Error {
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Scalar interpretation
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
const INT_RE = /^[-+]?\d+$/;
|
|
31
|
+
const FLOAT_RE = /^[-+]?(?:\d+\.\d*|\.\d+)(?:[eE][-+]?\d+)?$/;
|
|
32
|
+
const EXP_INT_RE = /^[-+]?\d+[eE][-+]?\d+$/;
|
|
33
|
+
/** Interpret an unquoted plain scalar token as null/bool/number, else string. */
|
|
34
|
+
function parsePlainScalar(s) {
|
|
35
|
+
if (s === "")
|
|
36
|
+
return null;
|
|
37
|
+
const lower = s.toLowerCase();
|
|
38
|
+
if (s === "~" || lower === "null")
|
|
39
|
+
return null;
|
|
40
|
+
if (lower === "true" || lower === "yes" || lower === "on")
|
|
41
|
+
return true;
|
|
42
|
+
if (lower === "false" || lower === "no" || lower === "off")
|
|
43
|
+
return false;
|
|
44
|
+
if (INT_RE.test(s)) {
|
|
45
|
+
const n = Number(s);
|
|
46
|
+
if (Number.isSafeInteger(n))
|
|
47
|
+
return n;
|
|
48
|
+
return s; // out of safe-integer range → keep as string (no precision loss)
|
|
49
|
+
}
|
|
50
|
+
if (FLOAT_RE.test(s) || EXP_INT_RE.test(s)) {
|
|
51
|
+
const n = Number(s);
|
|
52
|
+
if (Number.isFinite(n))
|
|
53
|
+
return n;
|
|
54
|
+
}
|
|
55
|
+
return s;
|
|
56
|
+
}
|
|
57
|
+
function unescapeChar(c) {
|
|
58
|
+
switch (c) {
|
|
59
|
+
case "n": return "\n";
|
|
60
|
+
case "t": return "\t";
|
|
61
|
+
case "r": return "\r";
|
|
62
|
+
case "b": return "\b";
|
|
63
|
+
case "f": return "\f";
|
|
64
|
+
case "0": return "\0";
|
|
65
|
+
default: return c; // covers \" \\ \/ and any other escaped char
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Parse a double-quoted scalar — JSON-compatible first, tolerant fallback. */
|
|
69
|
+
function parseDoubleQuoted(text) {
|
|
70
|
+
try {
|
|
71
|
+
const v = JSON.parse(text);
|
|
72
|
+
if (typeof v === "string")
|
|
73
|
+
return v;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// fall through to tolerant unescape
|
|
77
|
+
}
|
|
78
|
+
if (!text.endsWith('"') || text.length < 2)
|
|
79
|
+
throw new CodecError(`unterminated string: ${text}`);
|
|
80
|
+
const inner = text.slice(1, -1);
|
|
81
|
+
let out = "";
|
|
82
|
+
for (let i = 0; i < inner.length; i++) {
|
|
83
|
+
if (inner[i] === "\\") {
|
|
84
|
+
out += unescapeChar(inner[i + 1] ?? "");
|
|
85
|
+
i++;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
out += inner[i];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
/** Parse a single-quoted scalar (`''` is an escaped quote). */
|
|
94
|
+
function parseSingleQuoted(text) {
|
|
95
|
+
if (!text.endsWith("'") || text.length < 2)
|
|
96
|
+
throw new CodecError(`unterminated string: ${text}`);
|
|
97
|
+
const inner = text.slice(1, -1);
|
|
98
|
+
return inner.replace(/''/g, "'");
|
|
99
|
+
}
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Flow collections (`[...]`, `{...}`)
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
function parseFlow(src, depth) {
|
|
104
|
+
if (depth > MAX_DEPTH)
|
|
105
|
+
throw new CodecError("frontmatter nested too deeply");
|
|
106
|
+
let i = 0;
|
|
107
|
+
const skipWs = () => {
|
|
108
|
+
while (i < src.length && /\s/.test(src[i]))
|
|
109
|
+
i++;
|
|
110
|
+
};
|
|
111
|
+
const parseQuoted = () => {
|
|
112
|
+
const q = src[i];
|
|
113
|
+
let out = "";
|
|
114
|
+
i++;
|
|
115
|
+
if (q === '"') {
|
|
116
|
+
while (i < src.length && src[i] !== '"') {
|
|
117
|
+
if (src[i] === "\\") {
|
|
118
|
+
out += unescapeChar(src[i + 1] ?? "");
|
|
119
|
+
i += 2;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
out += src[i++];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (src[i] !== '"')
|
|
126
|
+
throw new CodecError("unterminated flow string");
|
|
127
|
+
i++;
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
while (i < src.length) {
|
|
131
|
+
if (src[i] === "'") {
|
|
132
|
+
if (src[i + 1] === "'") {
|
|
133
|
+
out += "'";
|
|
134
|
+
i += 2;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
i++;
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
out += src[i++];
|
|
141
|
+
}
|
|
142
|
+
throw new CodecError("unterminated flow string");
|
|
143
|
+
};
|
|
144
|
+
const parseValue = () => {
|
|
145
|
+
skipWs();
|
|
146
|
+
const c = src[i];
|
|
147
|
+
if (c === "[")
|
|
148
|
+
return parseArray();
|
|
149
|
+
if (c === "{")
|
|
150
|
+
return parseObject();
|
|
151
|
+
if (c === '"' || c === "'")
|
|
152
|
+
return parseQuoted();
|
|
153
|
+
const start = i;
|
|
154
|
+
while (i < src.length && !"]},:".includes(src[i]))
|
|
155
|
+
i++;
|
|
156
|
+
return parsePlainScalar(src.slice(start, i).trim());
|
|
157
|
+
};
|
|
158
|
+
function parseArray() {
|
|
159
|
+
i++; // consume [
|
|
160
|
+
const arr = [];
|
|
161
|
+
skipWs();
|
|
162
|
+
if (src[i] === "]") {
|
|
163
|
+
i++;
|
|
164
|
+
return arr;
|
|
165
|
+
}
|
|
166
|
+
for (;;) {
|
|
167
|
+
arr.push(parseValue());
|
|
168
|
+
skipWs();
|
|
169
|
+
if (src[i] === ",") {
|
|
170
|
+
i++;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (src[i] === "]") {
|
|
174
|
+
i++;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
throw new CodecError("malformed flow sequence");
|
|
178
|
+
}
|
|
179
|
+
return arr;
|
|
180
|
+
}
|
|
181
|
+
function parseObject() {
|
|
182
|
+
i++; // consume {
|
|
183
|
+
const obj = {};
|
|
184
|
+
skipWs();
|
|
185
|
+
if (src[i] === "}") {
|
|
186
|
+
i++;
|
|
187
|
+
return obj;
|
|
188
|
+
}
|
|
189
|
+
for (;;) {
|
|
190
|
+
skipWs();
|
|
191
|
+
let key;
|
|
192
|
+
if (src[i] === '"' || src[i] === "'") {
|
|
193
|
+
key = parseQuoted();
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const start = i;
|
|
197
|
+
while (i < src.length && !":,}".includes(src[i]))
|
|
198
|
+
i++;
|
|
199
|
+
key = src.slice(start, i).trim();
|
|
200
|
+
}
|
|
201
|
+
skipWs();
|
|
202
|
+
if (src[i] !== ":")
|
|
203
|
+
throw new CodecError("expected ':' in flow mapping");
|
|
204
|
+
i++;
|
|
205
|
+
obj[key] = parseValue();
|
|
206
|
+
skipWs();
|
|
207
|
+
if (src[i] === ",") {
|
|
208
|
+
i++;
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (src[i] === "}") {
|
|
212
|
+
i++;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
throw new CodecError("malformed flow mapping");
|
|
216
|
+
}
|
|
217
|
+
return obj;
|
|
218
|
+
}
|
|
219
|
+
const value = parseValue();
|
|
220
|
+
skipWs();
|
|
221
|
+
if (i < src.length)
|
|
222
|
+
throw new CodecError("trailing characters after flow value");
|
|
223
|
+
return value;
|
|
224
|
+
}
|
|
225
|
+
/** Parse a value token that may be quoted, a flow collection, or a plain scalar. */
|
|
226
|
+
function parseValueToken(text, depth) {
|
|
227
|
+
const t = text.trim();
|
|
228
|
+
if (t.startsWith("[") || t.startsWith("{"))
|
|
229
|
+
return parseFlow(t, depth);
|
|
230
|
+
if (t.startsWith('"'))
|
|
231
|
+
return parseDoubleQuoted(t);
|
|
232
|
+
if (t.startsWith("'"))
|
|
233
|
+
return parseSingleQuoted(t);
|
|
234
|
+
if (t.startsWith("&") || t.startsWith("*") || t.startsWith("!")) {
|
|
235
|
+
throw new CodecError("anchors, aliases, and tags are not supported");
|
|
236
|
+
}
|
|
237
|
+
// Block scalar headers: `|`, `>`, with optional chomping (`+`/`-`) and/or an
|
|
238
|
+
// indentation indicator (`|2`, `>2-`). Must fail loud — silently reading the
|
|
239
|
+
// header as a plain string would drop the multi-line body on the next write.
|
|
240
|
+
if (/^[|>][0-9]*[+-]?$/.test(t)) {
|
|
241
|
+
throw new CodecError("block scalars (| and >) are not supported");
|
|
242
|
+
}
|
|
243
|
+
return parsePlainScalar(t);
|
|
244
|
+
}
|
|
245
|
+
/** Strip a trailing ` # comment`, respecting single/double quotes. */
|
|
246
|
+
function stripComment(line) {
|
|
247
|
+
let inSingle = false;
|
|
248
|
+
let inDouble = false;
|
|
249
|
+
for (let i = 0; i < line.length; i++) {
|
|
250
|
+
const c = line[i];
|
|
251
|
+
if (c === '"' && !inSingle)
|
|
252
|
+
inDouble = !inDouble;
|
|
253
|
+
else if (c === "'" && !inDouble)
|
|
254
|
+
inSingle = !inSingle;
|
|
255
|
+
else if (c === "#" && !inSingle && !inDouble && (i === 0 || /\s/.test(line[i - 1]))) {
|
|
256
|
+
return line.slice(0, i);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return line;
|
|
260
|
+
}
|
|
261
|
+
/** Turn the raw frontmatter block into indentation tokens, splitting `-` leads. */
|
|
262
|
+
function tokenize(yaml) {
|
|
263
|
+
const tokens = [];
|
|
264
|
+
for (const rawLine of yaml.split(/\r?\n/)) {
|
|
265
|
+
const lead = /^[ \t]*/.exec(rawLine)[0];
|
|
266
|
+
if (lead.includes("\t"))
|
|
267
|
+
throw new CodecError("tab indentation is not supported");
|
|
268
|
+
let indent = lead.length;
|
|
269
|
+
let text = stripComment(rawLine.slice(indent)).replace(/\s+$/, "");
|
|
270
|
+
if (text === "")
|
|
271
|
+
continue; // blank or comment-only line
|
|
272
|
+
// Peel leading dash markers: `- - x` → DASH(indent) DASH(indent+2) scalar(indent+4)
|
|
273
|
+
while (text === "-" || text.startsWith("- ")) {
|
|
274
|
+
tokens.push({ indent, dash: true, text: "" });
|
|
275
|
+
if (text === "-") {
|
|
276
|
+
text = "";
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
text = text.slice(2).replace(/\s+$/, "");
|
|
280
|
+
indent += 2;
|
|
281
|
+
}
|
|
282
|
+
if (text !== "")
|
|
283
|
+
tokens.push({ indent, dash: false, text });
|
|
284
|
+
}
|
|
285
|
+
return tokens;
|
|
286
|
+
}
|
|
287
|
+
/** Index of the key/value colon (`:` followed by space or end), respecting quotes. */
|
|
288
|
+
function findKeyColon(text) {
|
|
289
|
+
let inSingle = false;
|
|
290
|
+
let inDouble = false;
|
|
291
|
+
for (let i = 0; i < text.length; i++) {
|
|
292
|
+
const c = text[i];
|
|
293
|
+
if (c === '"' && !inSingle)
|
|
294
|
+
inDouble = !inDouble;
|
|
295
|
+
else if (c === "'" && !inDouble)
|
|
296
|
+
inSingle = !inSingle;
|
|
297
|
+
else if (c === ":" && !inSingle && !inDouble && (i + 1 >= text.length || text[i + 1] === " ")) {
|
|
298
|
+
return i;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return -1;
|
|
302
|
+
}
|
|
303
|
+
function parseKey(text) {
|
|
304
|
+
const t = text.trim();
|
|
305
|
+
if (t.startsWith('"'))
|
|
306
|
+
return parseDoubleQuoted(t);
|
|
307
|
+
if (t.startsWith("'"))
|
|
308
|
+
return parseSingleQuoted(t);
|
|
309
|
+
if (t === "")
|
|
310
|
+
throw new CodecError("empty mapping key");
|
|
311
|
+
return t;
|
|
312
|
+
}
|
|
313
|
+
class BlockParser {
|
|
314
|
+
tokens;
|
|
315
|
+
pos = 0;
|
|
316
|
+
constructor(tokens) {
|
|
317
|
+
this.tokens = tokens;
|
|
318
|
+
}
|
|
319
|
+
parse() {
|
|
320
|
+
if (this.tokens.length === 0)
|
|
321
|
+
return {};
|
|
322
|
+
const value = this.parseBlock(this.tokens[0].indent, 0);
|
|
323
|
+
if (this.pos < this.tokens.length) {
|
|
324
|
+
throw new CodecError("inconsistent indentation in frontmatter");
|
|
325
|
+
}
|
|
326
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
327
|
+
throw new CodecError("frontmatter must be a mapping");
|
|
328
|
+
}
|
|
329
|
+
return value;
|
|
330
|
+
}
|
|
331
|
+
parseBlock(indent, depth) {
|
|
332
|
+
if (depth > MAX_DEPTH)
|
|
333
|
+
throw new CodecError("frontmatter nested too deeply");
|
|
334
|
+
const tok = this.tokens[this.pos];
|
|
335
|
+
if (tok.dash)
|
|
336
|
+
return this.parseSequence(indent, depth);
|
|
337
|
+
if (findKeyColon(tok.text) !== -1)
|
|
338
|
+
return this.parseMapping(indent, depth);
|
|
339
|
+
// Lone scalar value (e.g. the content following a `-`).
|
|
340
|
+
this.pos++;
|
|
341
|
+
return parseValueToken(tok.text, depth);
|
|
342
|
+
}
|
|
343
|
+
parseMapping(indent, depth) {
|
|
344
|
+
const obj = {};
|
|
345
|
+
while (this.pos < this.tokens.length && this.tokens[this.pos].indent === indent) {
|
|
346
|
+
const tok = this.tokens[this.pos];
|
|
347
|
+
if (tok.dash)
|
|
348
|
+
throw new CodecError("unexpected sequence item in mapping");
|
|
349
|
+
const colon = findKeyColon(tok.text);
|
|
350
|
+
if (colon === -1)
|
|
351
|
+
throw new CodecError(`expected 'key: value', got: ${tok.text}`);
|
|
352
|
+
const key = parseKey(tok.text.slice(0, colon));
|
|
353
|
+
const rest = tok.text.slice(colon + 1).trim();
|
|
354
|
+
this.pos++;
|
|
355
|
+
if (rest === "") {
|
|
356
|
+
obj[key] =
|
|
357
|
+
this.pos < this.tokens.length && this.tokens[this.pos].indent > indent
|
|
358
|
+
? this.parseBlock(this.tokens[this.pos].indent, depth + 1)
|
|
359
|
+
: null;
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
obj[key] = parseValueToken(rest, depth);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return obj;
|
|
366
|
+
}
|
|
367
|
+
parseSequence(indent, depth) {
|
|
368
|
+
const arr = [];
|
|
369
|
+
while (this.pos < this.tokens.length &&
|
|
370
|
+
this.tokens[this.pos].indent === indent &&
|
|
371
|
+
this.tokens[this.pos].dash) {
|
|
372
|
+
this.pos++; // consume the dash marker
|
|
373
|
+
if (this.pos < this.tokens.length && this.tokens[this.pos].indent > indent) {
|
|
374
|
+
arr.push(this.parseBlock(this.tokens[this.pos].indent, depth + 1));
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
arr.push(null);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return arr;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// ---------------------------------------------------------------------------
|
|
384
|
+
// Public: parse
|
|
385
|
+
// ---------------------------------------------------------------------------
|
|
386
|
+
/** Locate the frontmatter fence; returns the YAML block and the body offset. */
|
|
387
|
+
function locateFrontmatter(source) {
|
|
388
|
+
if (!source.startsWith("---"))
|
|
389
|
+
return null;
|
|
390
|
+
const firstNL = source.indexOf("\n");
|
|
391
|
+
if (firstNL === -1)
|
|
392
|
+
return null;
|
|
393
|
+
if (source.slice(0, firstNL).replace(/\r$/, "").trim() !== "---")
|
|
394
|
+
return null;
|
|
395
|
+
const rest = source.slice(firstNL + 1);
|
|
396
|
+
const close = /^---[ \t]*\r?(?:\n|$)/m.exec(rest);
|
|
397
|
+
if (!close)
|
|
398
|
+
return null;
|
|
399
|
+
return {
|
|
400
|
+
yaml: rest.slice(0, close.index),
|
|
401
|
+
bodyStart: firstNL + 1 + close.index + close[0].length,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
export function parseFrontmatter(source) {
|
|
405
|
+
const located = locateFrontmatter(source);
|
|
406
|
+
if (!located)
|
|
407
|
+
return { ok: true, data: {}, bodyStart: 0 };
|
|
408
|
+
try {
|
|
409
|
+
const data = new BlockParser(tokenize(located.yaml)).parse();
|
|
410
|
+
return { ok: true, data, bodyStart: located.bodyStart };
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
const reason = error instanceof CodecError ? error.message : String(error);
|
|
414
|
+
return { ok: false, reason };
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// ---------------------------------------------------------------------------
|
|
418
|
+
// Public: serialize
|
|
419
|
+
// ---------------------------------------------------------------------------
|
|
420
|
+
const PLAIN_RE = /^[A-Za-z0-9][A-Za-z0-9 _\-./]*$/;
|
|
421
|
+
function isPlainObject(value) {
|
|
422
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
423
|
+
return false;
|
|
424
|
+
const proto = Object.getPrototypeOf(value);
|
|
425
|
+
return proto === Object.prototype || proto === null;
|
|
426
|
+
}
|
|
427
|
+
/** True when `s` can be emitted unquoted and re-parse to the identical string. */
|
|
428
|
+
function isPlainSafe(s) {
|
|
429
|
+
if (!PLAIN_RE.test(s) || s.endsWith(" "))
|
|
430
|
+
return false;
|
|
431
|
+
const parsed = parsePlainScalar(s);
|
|
432
|
+
return typeof parsed === "string" && parsed === s;
|
|
433
|
+
}
|
|
434
|
+
function quoteString(s) {
|
|
435
|
+
return isPlainSafe(s) ? s : JSON.stringify(s);
|
|
436
|
+
}
|
|
437
|
+
/** Inline scalar / empty-collection representation, or null if a block is needed. */
|
|
438
|
+
function inlineScalar(value) {
|
|
439
|
+
if (value === null)
|
|
440
|
+
return "null";
|
|
441
|
+
if (typeof value === "boolean")
|
|
442
|
+
return value ? "true" : "false";
|
|
443
|
+
if (typeof value === "number") {
|
|
444
|
+
if (!Number.isFinite(value))
|
|
445
|
+
throw new CodecError(`cannot serialize non-finite number: ${value}`);
|
|
446
|
+
return String(value);
|
|
447
|
+
}
|
|
448
|
+
if (typeof value === "string")
|
|
449
|
+
return quoteString(value);
|
|
450
|
+
if (Array.isArray(value))
|
|
451
|
+
return value.length === 0 ? "[]" : null;
|
|
452
|
+
if (isPlainObject(value))
|
|
453
|
+
return Object.keys(value).length === 0 ? "{}" : null;
|
|
454
|
+
throw new CodecError(`unsupported value type: ${Object.prototype.toString.call(value)}`);
|
|
455
|
+
}
|
|
456
|
+
function emitEntry(key, value, indent, depth) {
|
|
457
|
+
if (depth > MAX_DEPTH)
|
|
458
|
+
throw new CodecError("data nested too deeply to serialize");
|
|
459
|
+
const pad = " ".repeat(indent);
|
|
460
|
+
const ks = quoteString(key);
|
|
461
|
+
const inline = inlineScalar(value);
|
|
462
|
+
if (inline !== null)
|
|
463
|
+
return [`${pad}${ks}: ${inline}`];
|
|
464
|
+
const lines = [`${pad}${ks}:`];
|
|
465
|
+
if (Array.isArray(value)) {
|
|
466
|
+
for (const item of value)
|
|
467
|
+
lines.push(...emitSeqItem(item, indent + 2, depth + 1));
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
for (const [k, v] of Object.entries(value)) {
|
|
471
|
+
lines.push(...emitEntry(k, v, indent + 2, depth + 1));
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
return lines;
|
|
475
|
+
}
|
|
476
|
+
function emitSeqItem(value, indent, depth) {
|
|
477
|
+
if (depth > MAX_DEPTH)
|
|
478
|
+
throw new CodecError("data nested too deeply to serialize");
|
|
479
|
+
const pad = " ".repeat(indent);
|
|
480
|
+
const inline = inlineScalar(value);
|
|
481
|
+
if (inline !== null)
|
|
482
|
+
return [`${pad}- ${inline}`];
|
|
483
|
+
// Non-empty array/object item: a bare dash, then the nested block indented.
|
|
484
|
+
const lines = [`${pad}-`];
|
|
485
|
+
if (Array.isArray(value)) {
|
|
486
|
+
for (const item of value)
|
|
487
|
+
lines.push(...emitSeqItem(item, indent + 2, depth + 1));
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
for (const [k, v] of Object.entries(value)) {
|
|
491
|
+
lines.push(...emitEntry(k, v, indent + 2, depth + 1));
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return lines;
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Serialize a data record into a YAML frontmatter block (WITHOUT the `---`
|
|
498
|
+
* fences; the adapter composes those around it). Returns `{ ok: false }` if any
|
|
499
|
+
* value cannot be safely represented (non-finite number, Date, function, …) so
|
|
500
|
+
* the write is rejected before touching the file.
|
|
501
|
+
*/
|
|
502
|
+
export function serializeFrontmatter(data) {
|
|
503
|
+
try {
|
|
504
|
+
const lines = [];
|
|
505
|
+
for (const [key, value] of Object.entries(data)) {
|
|
506
|
+
lines.push(...emitEntry(key, value, 0, 0));
|
|
507
|
+
}
|
|
508
|
+
return { ok: true, content: lines.length === 0 ? "" : `${lines.join("\n")}\n` };
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
const reason = error instanceof CodecError ? error.message : String(error);
|
|
512
|
+
return { ok: false, reason };
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
//# sourceMappingURL=frontmatter-codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter-codec.js","sourceRoot":"","sources":["../../../src/runtime/storage/frontmatter-codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime guard shared by every filesystem-backed StorageAdapter. Filesystem
|
|
3
|
+
* storage cannot work on edge runtimes (no fs); failing fast in the adapter
|
|
4
|
+
* constructor turns silently-empty reads and cryptic write errors into one
|
|
5
|
+
* actionable message.
|
|
6
|
+
*/
|
|
7
|
+
export declare function assertFilesystemRuntime(): void;
|
|
8
|
+
//# sourceMappingURL=fs-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-runtime.d.ts","sourceRoot":"","sources":["../../../src/runtime/storage/fs-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH,wBAAgB,uBAAuB,IAAI,IAAI,CAW9C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime guard shared by every filesystem-backed StorageAdapter. Filesystem
|
|
3
|
+
* storage cannot work on edge runtimes (no fs); failing fast in the adapter
|
|
4
|
+
* constructor turns silently-empty reads and cryptic write errors into one
|
|
5
|
+
* actionable message.
|
|
6
|
+
*/
|
|
7
|
+
/** workerd (incl. Astro 6's dev server) sets navigator.userAgent to this. */
|
|
8
|
+
const WORKERD_USER_AGENT = "Cloudflare-Workers";
|
|
9
|
+
/**
|
|
10
|
+
* Return a human-readable runtime name if filesystem storage cannot work here,
|
|
11
|
+
* or null when a real Node filesystem is available.
|
|
12
|
+
*
|
|
13
|
+
* Astro 6's dev server runs on the same workerd runtime as production, so a
|
|
14
|
+
* Workers-targeted project has no filesystem in dev *or* prod.
|
|
15
|
+
*/
|
|
16
|
+
function detectUnsupportedRuntime() {
|
|
17
|
+
const g = globalThis;
|
|
18
|
+
// navigator.userAgent === "Cloudflare-Workers" only when the `global_navigator`
|
|
19
|
+
// compat flag is on, so also check WebSocketPair — a workerd global present
|
|
20
|
+
// regardless of compat flags — to detect Workers even on an old compat date.
|
|
21
|
+
if (g.navigator?.userAgent === WORKERD_USER_AGENT || typeof g.WebSocketPair === "function") {
|
|
22
|
+
return "Cloudflare Workers (workerd)";
|
|
23
|
+
}
|
|
24
|
+
if (typeof process === "undefined" || typeof process.cwd !== "function") {
|
|
25
|
+
return "a non-Node runtime";
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
export function assertFilesystemRuntime() {
|
|
30
|
+
const runtime = detectUnsupportedRuntime();
|
|
31
|
+
if (!runtime)
|
|
32
|
+
return;
|
|
33
|
+
throw new Error(`[caretcms] Filesystem storage is not available on ${runtime}.\n` +
|
|
34
|
+
`Astro 6's dev server also runs on workerd, so this fails in dev as well as production.\n\n` +
|
|
35
|
+
`Targeting Cloudflare Workers? Use the KV adapter from @caretcms/cloudflare in BOTH dev and prod:\n\n` +
|
|
36
|
+
` import { cloudflareStorage } from '@caretcms/cloudflare';\n` +
|
|
37
|
+
` // caret({ storage: cloudflareStorage(), ... })\n\n` +
|
|
38
|
+
`Targeting a Node host? Filesystem storage works there — make sure you are not building for an edge runtime.`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=fs-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-runtime.js","sourceRoot":"","sources":["../../../src/runtime/storage/fs-runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEhD;;;;;;GAMG;AACH,SAAS,wBAAwB;IAC/B,MAAM,CAAC,GAAG,UAA6E,CAAC;IACxF,gFAAgF;IAChF,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,KAAK,kBAAkB,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QAC3F,OAAO,8BAA8B,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QACxE,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,IAAI,KAAK,CACb,qDAAqD,OAAO,KAAK;QAC/D,4FAA4F;QAC5F,sGAAsG;QACtG,+DAA+D;QAC/D,uDAAuD;QACvD,6GAA6G,CAChH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifier grammar for collections and entry ids, shared across the storage
|
|
3
|
+
* layer so the adapters enforce exactly one definition. These MIRROR the
|
|
4
|
+
* mutation engine's command validation (`runtime/mutations/contracts.ts`): the
|
|
5
|
+
* engine validates ids before they reach an adapter, and the adapters re-check
|
|
6
|
+
* as defense in depth (the markdown adapter especially, since it writes into the
|
|
7
|
+
* project's source tree). Keep all copies byte-identical.
|
|
8
|
+
*/
|
|
9
|
+
/** A collection name. */
|
|
10
|
+
export declare const COLLECTION_NAME_RE: RegExp;
|
|
11
|
+
/** An entry id. */
|
|
12
|
+
export declare const ENTRY_ID_RE: RegExp;
|
|
13
|
+
/**
|
|
14
|
+
* A draft / overlay id (an editor's session UUID). Used as a filesystem path
|
|
15
|
+
* segment for disk-backed draft overlays, so it must not contain path
|
|
16
|
+
* separators or dots — guard against traversal even though ids are minted, not
|
|
17
|
+
* user-supplied.
|
|
18
|
+
*/
|
|
19
|
+
export declare const EDITOR_ID_RE: RegExp;
|
|
20
|
+
/** Throw on an editor/overlay id that isn't a safe path segment; else return it. */
|
|
21
|
+
export declare function assertSafeEditorId(editorId: string): string;
|
|
22
|
+
//# sourceMappingURL=id-contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-contracts.d.ts","sourceRoot":"","sources":["../../../src/runtime/storage/id-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yBAAyB;AACzB,eAAO,MAAM,kBAAkB,QAAuB,CAAC;AAEvD,mBAAmB;AACnB,eAAO,MAAM,WAAW,QAA0B,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,QAA0B,CAAC;AAEpD,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK3D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifier grammar for collections and entry ids, shared across the storage
|
|
3
|
+
* layer so the adapters enforce exactly one definition. These MIRROR the
|
|
4
|
+
* mutation engine's command validation (`runtime/mutations/contracts.ts`): the
|
|
5
|
+
* engine validates ids before they reach an adapter, and the adapters re-check
|
|
6
|
+
* as defense in depth (the markdown adapter especially, since it writes into the
|
|
7
|
+
* project's source tree). Keep all copies byte-identical.
|
|
8
|
+
*/
|
|
9
|
+
/** A collection name. */
|
|
10
|
+
export const COLLECTION_NAME_RE = /^[a-z][a-z0-9_-]*$/;
|
|
11
|
+
/** An entry id. */
|
|
12
|
+
export const ENTRY_ID_RE = /^[a-z0-9][a-z0-9_-]*$/;
|
|
13
|
+
/**
|
|
14
|
+
* A draft / overlay id (an editor's session UUID). Used as a filesystem path
|
|
15
|
+
* segment for disk-backed draft overlays, so it must not contain path
|
|
16
|
+
* separators or dots — guard against traversal even though ids are minted, not
|
|
17
|
+
* user-supplied.
|
|
18
|
+
*/
|
|
19
|
+
export const EDITOR_ID_RE = /^[A-Za-z0-9_-]{1,64}$/;
|
|
20
|
+
/** Throw on an editor/overlay id that isn't a safe path segment; else return it. */
|
|
21
|
+
export function assertSafeEditorId(editorId) {
|
|
22
|
+
if (!EDITOR_ID_RE.test(editorId)) {
|
|
23
|
+
throw new Error(`[caretcms] unsafe editor overlay id: ${JSON.stringify(editorId)}`);
|
|
24
|
+
}
|
|
25
|
+
return editorId;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=id-contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-contracts.js","sourceRoot":"","sources":["../../../src/runtime/storage/id-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD,mBAAmB;AACnB,MAAM,CAAC,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAEpD,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|