meno-astro 0.1.11 → 0.1.13
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/chunks/{chunk-ZUFECXGE.js → chunk-4ICB3SZG.js} +2 -2
- package/dist/chunks/chunk-5BVKIPKS.js +9 -0
- package/dist/chunks/chunk-5HBRX7IZ.js +506 -0
- package/dist/chunks/chunk-5HBRX7IZ.js.map +7 -0
- package/dist/chunks/{chunk-FTAXQYZ6.js → chunk-ANGVNS5N.js} +22 -11
- package/dist/chunks/chunk-ANGVNS5N.js.map +7 -0
- package/dist/chunks/{chunk-V4SUAPTT.js → chunk-LEJMZHGE.js} +173 -2
- package/dist/chunks/chunk-LEJMZHGE.js.map +7 -0
- package/dist/chunks/{chunk-D5DHUDKR.js → chunk-YC3WSC6M.js} +6 -26
- package/dist/chunks/chunk-YC3WSC6M.js.map +7 -0
- package/dist/chunks/{chunk-RDEADJXD.js → chunk-YJMWK222.js} +129 -568
- package/dist/chunks/chunk-YJMWK222.js.map +7 -0
- package/dist/lib/components/BaseLayout.astro +28 -5
- package/dist/lib/components/LocaleList.astro +23 -26
- package/dist/lib/components/LocaleRoute.astro +55 -0
- package/dist/lib/components/index.js +1 -1
- package/dist/lib/dialect/index.js +4 -4
- package/dist/lib/index.js +208 -23
- package/dist/lib/index.js.map +4 -4
- package/dist/lib/integration/index.js +474 -37
- package/dist/lib/integration/index.js.map +4 -4
- package/dist/lib/runtime/localeMiddleware.js +4 -4
- package/package.json +7 -1
- package/dist/chunks/chunk-D5DHUDKR.js.map +0 -7
- package/dist/chunks/chunk-FTAXQYZ6.js.map +0 -7
- package/dist/chunks/chunk-RDEADJXD.js.map +0 -7
- package/dist/chunks/chunk-V4SUAPTT.js.map +0 -7
- package/dist/chunks/chunk-WKW2JJ35.js +0 -30
- package/dist/chunks/chunk-WKW2JJ35.js.map +0 -7
- package/dist/chunks/chunk-ZYQNHI3W.js +0 -16
- /package/dist/chunks/{chunk-ZUFECXGE.js.map → chunk-4ICB3SZG.js.map} +0 -0
- /package/dist/chunks/{chunk-ZYQNHI3W.js.map → chunk-5BVKIPKS.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DEFAULT_I18N_CONFIG,
|
|
3
3
|
migrateI18nConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LEJMZHGE.js";
|
|
5
5
|
|
|
6
6
|
// lib/server/loadI18nConfig.ts
|
|
7
7
|
import { existsSync, readFileSync } from "fs";
|
|
@@ -21,4 +21,4 @@ function loadI18nConfig(projectRoot) {
|
|
|
21
21
|
export {
|
|
22
22
|
loadI18nConfig
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=chunk-
|
|
24
|
+
//# sourceMappingURL=chunk-4ICB3SZG.js.map
|
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isSupportedTemplateExpression
|
|
3
|
+
} from "./chunk-LEJMZHGE.js";
|
|
4
|
+
|
|
5
|
+
// lib/dialect/parse/scan.ts
|
|
6
|
+
var CLOSERS = { "{": "}", "(": ")", "[": "]" };
|
|
7
|
+
function scanString(src, i) {
|
|
8
|
+
const q = src[i];
|
|
9
|
+
let j = i + 1;
|
|
10
|
+
while (j < src.length) {
|
|
11
|
+
if (src[j] === "\\") {
|
|
12
|
+
j += 2;
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (src[j] === q) return j + 1;
|
|
16
|
+
j++;
|
|
17
|
+
}
|
|
18
|
+
throw new Error(`scanString: unterminated string from ${i}`);
|
|
19
|
+
}
|
|
20
|
+
function scanTemplate(src, i) {
|
|
21
|
+
let j = i + 1;
|
|
22
|
+
while (j < src.length) {
|
|
23
|
+
if (src[j] === "\\") {
|
|
24
|
+
j += 2;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (src[j] === "`") return j + 1;
|
|
28
|
+
if (src[j] === "$" && src[j + 1] === "{") {
|
|
29
|
+
j = scanBalanced(src, j + 1);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
j++;
|
|
33
|
+
}
|
|
34
|
+
throw new Error(`scanTemplate: unterminated template from ${i}`);
|
|
35
|
+
}
|
|
36
|
+
function scanBalanced(src, i) {
|
|
37
|
+
if (!CLOSERS[src[i]]) throw new Error(`scanBalanced: no open delimiter at ${i} ("${src[i]}")`);
|
|
38
|
+
let depth = 0;
|
|
39
|
+
let j = i;
|
|
40
|
+
while (j < src.length) {
|
|
41
|
+
const c = src[j];
|
|
42
|
+
if (c === '"' || c === "'") {
|
|
43
|
+
j = scanString(src, j);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (c === "`") {
|
|
47
|
+
j = scanTemplate(src, j);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (c === "{" || c === "(" || c === "[") {
|
|
51
|
+
depth++;
|
|
52
|
+
j++;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (c === "}" || c === ")" || c === "]") {
|
|
56
|
+
depth--;
|
|
57
|
+
j++;
|
|
58
|
+
if (depth === 0) return j;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
j++;
|
|
62
|
+
}
|
|
63
|
+
throw new Error(`scanBalanced: unbalanced from ${i}`);
|
|
64
|
+
}
|
|
65
|
+
function findTrailingGroup(expr, openChar = "(") {
|
|
66
|
+
let j = 0;
|
|
67
|
+
while (j < expr.length) {
|
|
68
|
+
const c = expr[j];
|
|
69
|
+
if (c === '"' || c === "'") {
|
|
70
|
+
j = scanString(expr, j);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (c === "`") {
|
|
74
|
+
j = scanTemplate(expr, j);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (c === "{" || c === "(" || c === "[") {
|
|
78
|
+
const end = scanBalanced(expr, j);
|
|
79
|
+
if (c === openChar && end === expr.length) {
|
|
80
|
+
return { open: j, inner: expr.slice(j + 1, end - 1) };
|
|
81
|
+
}
|
|
82
|
+
j = end;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
j++;
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
function splitTopLevel(src, sep) {
|
|
90
|
+
const parts = [];
|
|
91
|
+
let start = 0;
|
|
92
|
+
let j = 0;
|
|
93
|
+
while (j < src.length) {
|
|
94
|
+
const c = src[j];
|
|
95
|
+
if (c === '"' || c === "'") {
|
|
96
|
+
j = scanString(src, j);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (c === "`") {
|
|
100
|
+
j = scanTemplate(src, j);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (c === "{" || c === "(" || c === "[") {
|
|
104
|
+
j = scanBalanced(src, j);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (c === sep) {
|
|
108
|
+
parts.push(src.slice(start, j));
|
|
109
|
+
start = j + 1;
|
|
110
|
+
j++;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
j++;
|
|
114
|
+
}
|
|
115
|
+
parts.push(src.slice(start));
|
|
116
|
+
return parts.map((s) => s.trim());
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// lib/dialect/parse/parseLiteral.ts
|
|
120
|
+
var WS = /* @__PURE__ */ new Set([" ", " ", "\r", "\n"]);
|
|
121
|
+
var IDENT_START = /[A-Za-z_$]/;
|
|
122
|
+
var IDENT_CHAR = /[A-Za-z0-9_$]/;
|
|
123
|
+
function skipWs(src, i) {
|
|
124
|
+
while (i < src.length && WS.has(src[i])) i++;
|
|
125
|
+
return i;
|
|
126
|
+
}
|
|
127
|
+
function fail(src, i, msg) {
|
|
128
|
+
const around = src.slice(Math.max(0, i - 20), i + 20);
|
|
129
|
+
throw new Error(`parseLiteral: ${msg} at index ${i} (\u2026${around}\u2026)`);
|
|
130
|
+
}
|
|
131
|
+
function parseString(src, i) {
|
|
132
|
+
let j = i + 1;
|
|
133
|
+
while (j < src.length) {
|
|
134
|
+
const c = src[j];
|
|
135
|
+
if (c === "\\") {
|
|
136
|
+
j += 2;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (c === '"') {
|
|
140
|
+
j++;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
j++;
|
|
144
|
+
}
|
|
145
|
+
const raw = src.slice(i, j);
|
|
146
|
+
return { value: JSON.parse(raw), end: j };
|
|
147
|
+
}
|
|
148
|
+
function parseNumber(src, i) {
|
|
149
|
+
let j = i;
|
|
150
|
+
while (j < src.length && /[-+0-9.eE]/.test(src[j])) j++;
|
|
151
|
+
const raw = src.slice(i, j);
|
|
152
|
+
const n = Number(raw);
|
|
153
|
+
if (Number.isNaN(n) && raw !== "NaN") fail(src, i, `invalid number "${raw}"`);
|
|
154
|
+
return { value: n, end: j };
|
|
155
|
+
}
|
|
156
|
+
function parseKey(src, i) {
|
|
157
|
+
if (src[i] === '"') return parseString(src, i);
|
|
158
|
+
if (!IDENT_START.test(src[i])) fail(src, i, "expected object key");
|
|
159
|
+
let j = i + 1;
|
|
160
|
+
while (j < src.length && IDENT_CHAR.test(src[j])) j++;
|
|
161
|
+
return { value: src.slice(i, j), end: j };
|
|
162
|
+
}
|
|
163
|
+
function parseObject(src, i) {
|
|
164
|
+
const obj = {};
|
|
165
|
+
let j = skipWs(src, i + 1);
|
|
166
|
+
if (src[j] === "}") return { value: obj, end: j + 1 };
|
|
167
|
+
for (; ; ) {
|
|
168
|
+
j = skipWs(src, j);
|
|
169
|
+
const key = parseKey(src, j);
|
|
170
|
+
j = skipWs(src, key.end);
|
|
171
|
+
if (src[j] !== ":") fail(src, j, 'expected ":"');
|
|
172
|
+
j = skipWs(src, j + 1);
|
|
173
|
+
const val = parseValueAt(src, j);
|
|
174
|
+
obj[key.value] = val.value;
|
|
175
|
+
j = skipWs(src, val.end);
|
|
176
|
+
if (src[j] === ",") {
|
|
177
|
+
j++;
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (src[j] === "}") return { value: obj, end: j + 1 };
|
|
181
|
+
fail(src, j, 'expected "," or "}"');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function parseArray(src, i) {
|
|
185
|
+
const arr = [];
|
|
186
|
+
let j = skipWs(src, i + 1);
|
|
187
|
+
if (src[j] === "]") return { value: arr, end: j + 1 };
|
|
188
|
+
for (; ; ) {
|
|
189
|
+
j = skipWs(src, j);
|
|
190
|
+
const val = parseValueAt(src, j);
|
|
191
|
+
arr.push(val.value);
|
|
192
|
+
j = skipWs(src, val.end);
|
|
193
|
+
if (src[j] === ",") {
|
|
194
|
+
j++;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (src[j] === "]") return { value: arr, end: j + 1 };
|
|
198
|
+
fail(src, j, 'expected "," or "]"');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function reverseBacktickBody(content) {
|
|
202
|
+
let out = "";
|
|
203
|
+
let i = 0;
|
|
204
|
+
while (i < content.length) {
|
|
205
|
+
const c = content[i];
|
|
206
|
+
if (c === "\\") {
|
|
207
|
+
const n = content[i + 1];
|
|
208
|
+
out += n === "\\" ? "\\" : n === "`" ? "`" : n === "$" ? "$" : n;
|
|
209
|
+
i += 2;
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (c === "$" && content[i + 1] === "{") {
|
|
213
|
+
const end = scanBalanced(content, i + 1);
|
|
214
|
+
out += "{{" + content.slice(i + 2, end - 1).trim() + "}}";
|
|
215
|
+
i = end;
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
out += c;
|
|
219
|
+
i++;
|
|
220
|
+
}
|
|
221
|
+
return out;
|
|
222
|
+
}
|
|
223
|
+
function parseBacktick(src, i) {
|
|
224
|
+
let j = i + 1;
|
|
225
|
+
while (j < src.length) {
|
|
226
|
+
const c = src[j];
|
|
227
|
+
if (c === "\\") {
|
|
228
|
+
j += 2;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if (c === "`") {
|
|
232
|
+
j++;
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
if (c === "$" && src[j + 1] === "{") {
|
|
236
|
+
j = scanBalanced(src, j + 1);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
j++;
|
|
240
|
+
}
|
|
241
|
+
return { value: reverseBacktickBody(src.slice(i + 1, j - 1)), end: j };
|
|
242
|
+
}
|
|
243
|
+
function parseExprToken(src, i) {
|
|
244
|
+
let j = i;
|
|
245
|
+
let depth = 0;
|
|
246
|
+
while (j < src.length) {
|
|
247
|
+
const c = src[j];
|
|
248
|
+
if (c === '"' || c === "'" || c === "`") {
|
|
249
|
+
const q = c;
|
|
250
|
+
j++;
|
|
251
|
+
while (j < src.length && src[j] !== q) {
|
|
252
|
+
if (src[j] === "\\") j++;
|
|
253
|
+
j++;
|
|
254
|
+
}
|
|
255
|
+
j++;
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (c === "(" || c === "[" || c === "{") {
|
|
259
|
+
depth++;
|
|
260
|
+
j++;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (c === ")" || c === "]" || c === "}") {
|
|
264
|
+
if (depth === 0) break;
|
|
265
|
+
depth--;
|
|
266
|
+
j++;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (depth === 0 && c === ",") break;
|
|
270
|
+
j++;
|
|
271
|
+
}
|
|
272
|
+
return { value: `{{${src.slice(i, j).trim()}}}`, end: j };
|
|
273
|
+
}
|
|
274
|
+
function parseValueAt(src, i) {
|
|
275
|
+
i = skipWs(src, i);
|
|
276
|
+
const c = src[i];
|
|
277
|
+
if (c === "{") return parseObject(src, i);
|
|
278
|
+
if (c === "[") return parseArray(src, i);
|
|
279
|
+
if (c === '"') return parseString(src, i);
|
|
280
|
+
if (c === "`") return parseBacktick(src, i);
|
|
281
|
+
if (src.startsWith("true", i) && !IDENT_CHAR.test(src[i + 4] ?? "")) return { value: true, end: i + 4 };
|
|
282
|
+
if (src.startsWith("false", i) && !IDENT_CHAR.test(src[i + 5] ?? "")) return { value: false, end: i + 5 };
|
|
283
|
+
if (src.startsWith("null", i) && !IDENT_CHAR.test(src[i + 4] ?? "")) return { value: null, end: i + 4 };
|
|
284
|
+
if (c === "-" || c === "+" || c >= "0" && c <= "9") return parseNumber(src, i);
|
|
285
|
+
if (c !== void 0 && IDENT_START.test(c)) return parseExprToken(src, i);
|
|
286
|
+
return fail(src, i, `unexpected character "${c ?? "<eof>"}"`);
|
|
287
|
+
}
|
|
288
|
+
function parseLiteral(src) {
|
|
289
|
+
const { value, end } = parseValueAt(src, 0);
|
|
290
|
+
const rest = skipWs(src, end);
|
|
291
|
+
if (rest !== src.length) fail(src, rest, "trailing content after literal");
|
|
292
|
+
return value;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// lib/dialect/parse/callArgs.ts
|
|
296
|
+
function callArgsOf(expr) {
|
|
297
|
+
const open = expr.indexOf("(");
|
|
298
|
+
const end = scanBalanced(expr, open);
|
|
299
|
+
return expr.slice(open + 1, end - 1);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// lib/dialect/richtext.ts
|
|
303
|
+
var RICH_TEXT_TAG_RE = /<\/?(?:strong|em|u|s|code|a|span|sub|sup|mark|b|i|p|br|ul|ol|li|blockquote|h[1-6]|pre|hr|small|figure|figcaption|table|thead|tbody|tr|th|td)\b/i;
|
|
304
|
+
function isRichTextHtml(s) {
|
|
305
|
+
return RICH_TEXT_TAG_RE.test(s);
|
|
306
|
+
}
|
|
307
|
+
function stripMenoSpanMarker(html) {
|
|
308
|
+
return html.replace(/<span\b[^>]*>/gi, (tag) => tag.replace(/\s+data-meno-span="[^"]*"/gi, ""));
|
|
309
|
+
}
|
|
310
|
+
function addMenoSpanMarker(html) {
|
|
311
|
+
return html.replace(/<span\b[^>]*>/gi, (tag) => {
|
|
312
|
+
if (/\bdata-meno-span=/i.test(tag)) return tag;
|
|
313
|
+
const m = tag.match(/\bclass="([^"]*)"/i);
|
|
314
|
+
if (!m) return tag;
|
|
315
|
+
return tag.replace(/(\bclass="[^"]*")/i, `$1 data-meno-span="${m[1]}"`);
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// lib/dialect/parse/parseValue.ts
|
|
320
|
+
function codeMarker(expr) {
|
|
321
|
+
return { _code: true, expr };
|
|
322
|
+
}
|
|
323
|
+
function reverseTemplate(content) {
|
|
324
|
+
let out = "";
|
|
325
|
+
let i = 0;
|
|
326
|
+
while (i < content.length) {
|
|
327
|
+
const c = content[i];
|
|
328
|
+
if (c === "\\") {
|
|
329
|
+
const n = content[i + 1];
|
|
330
|
+
out += n === "\\" ? "\\" : n === "`" ? "`" : n === "$" ? "$" : n;
|
|
331
|
+
i += 2;
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
if (c === "$" && content[i + 1] === "{") {
|
|
335
|
+
const end = scanBalanced(content, i + 1);
|
|
336
|
+
out += "{{" + content.slice(i + 2, end - 1).trim() + "}}";
|
|
337
|
+
i = end;
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
out += c;
|
|
341
|
+
i++;
|
|
342
|
+
}
|
|
343
|
+
return out;
|
|
344
|
+
}
|
|
345
|
+
function interpretExprValue(expr, ctx) {
|
|
346
|
+
const e = expr.trim();
|
|
347
|
+
if (ctx.embedConsts.has(e)) return ctx.embedConsts.get(e);
|
|
348
|
+
if (ctx.codeConsts.has(e)) return codeMarker(ctx.codeConsts.get(e));
|
|
349
|
+
if (e.startsWith("i18n(")) return parseLiteral(callArgsOf(e));
|
|
350
|
+
if (e.startsWith("href(")) return parseLiteral(splitTopLevel(callArgsOf(e), ",")[0]);
|
|
351
|
+
if (e.startsWith("embedHtml(")) return parseLiteral(splitTopLevel(callArgsOf(e), ",")[0]);
|
|
352
|
+
if (e[0] === "`") return addMenoSpanMarker(reverseTemplate(e.slice(1, -1)));
|
|
353
|
+
if (e[0] === "{" || e[0] === "[") return parseLiteral(e);
|
|
354
|
+
if (e[0] === '"') return parseLiteral(e);
|
|
355
|
+
if (e === "true") return true;
|
|
356
|
+
if (e === "false") return false;
|
|
357
|
+
if (e === "null") return null;
|
|
358
|
+
if (/^[-+]?(\d|\.\d)/.test(e) && !Number.isNaN(Number(e))) return Number(e);
|
|
359
|
+
const guard = e.match(/^(.+?)\s*\|\|\s*undefined$/);
|
|
360
|
+
if (guard && isSupportedTemplateExpression(guard[1].trim())) return `{{${guard[1].trim()}}}`;
|
|
361
|
+
if (isSupportedTemplateExpression(e)) return `{{${e}}}`;
|
|
362
|
+
return codeMarker(e);
|
|
363
|
+
}
|
|
364
|
+
function interpretStyleCall(expr) {
|
|
365
|
+
const args = callArgsOf(expr);
|
|
366
|
+
const parts = splitTopLevel(args, ",").filter((p) => p.length > 0);
|
|
367
|
+
const out = {};
|
|
368
|
+
if (parts[0]) out.style = parseLiteral(parts[0]);
|
|
369
|
+
const metaPart = parts.slice(1).find((p) => p.trimStart().startsWith("{"));
|
|
370
|
+
if (metaPart) {
|
|
371
|
+
const meta = parseLiteral(metaPart);
|
|
372
|
+
if (meta.interactive !== void 0) out.interactiveStyles = meta.interactive;
|
|
373
|
+
if (meta.label !== void 0) out.label = meta.label;
|
|
374
|
+
if (meta.genClass !== void 0) out.generateElementClass = meta.genClass;
|
|
375
|
+
}
|
|
376
|
+
return out;
|
|
377
|
+
}
|
|
378
|
+
function reverseCondition(cond) {
|
|
379
|
+
const c = cond.trim();
|
|
380
|
+
if (c === "false") return false;
|
|
381
|
+
if (c === "true") return true;
|
|
382
|
+
if (c.startsWith("when(")) return parseLiteral(splitTopLevel(callArgsOf(c), ",")[0]);
|
|
383
|
+
if (isSupportedTemplateExpression(c)) return `{{${c}}}`;
|
|
384
|
+
return codeMarker(c);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// lib/dialect/parse/parseContext.ts
|
|
388
|
+
function createParseContext() {
|
|
389
|
+
return {
|
|
390
|
+
collectionBindings: /* @__PURE__ */ new Map(),
|
|
391
|
+
embedConsts: /* @__PURE__ */ new Map(),
|
|
392
|
+
codeConsts: /* @__PURE__ */ new Map(),
|
|
393
|
+
tagConsts: /* @__PURE__ */ new Map()
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// lib/dialect/parse/parseFrontmatter.ts
|
|
398
|
+
function scanExprToSemicolon(code, i) {
|
|
399
|
+
let j = i;
|
|
400
|
+
while (j < code.length) {
|
|
401
|
+
const c = code[j];
|
|
402
|
+
if (c === '"' || c === "'") {
|
|
403
|
+
j = scanString(code, j);
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
if (c === "`") {
|
|
407
|
+
j = scanTemplate(code, j);
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
if (c === "(" || c === "[" || c === "{") {
|
|
411
|
+
j = scanBalanced(code, j);
|
|
412
|
+
continue;
|
|
413
|
+
}
|
|
414
|
+
if (c === ";") return j;
|
|
415
|
+
j++;
|
|
416
|
+
}
|
|
417
|
+
return code.length;
|
|
418
|
+
}
|
|
419
|
+
function literalAfter(code, anchor) {
|
|
420
|
+
const idx = code.indexOf(anchor);
|
|
421
|
+
if (idx < 0) return void 0;
|
|
422
|
+
return parseValueAt(code, idx + anchor.length).value;
|
|
423
|
+
}
|
|
424
|
+
function readComponentMeta(code) {
|
|
425
|
+
return literalAfter(code, "const __meno = ");
|
|
426
|
+
}
|
|
427
|
+
function readPageMeta(code) {
|
|
428
|
+
return literalAfter(code, "const meta = ");
|
|
429
|
+
}
|
|
430
|
+
function parseFrontmatter(code) {
|
|
431
|
+
const ctx = createParseContext();
|
|
432
|
+
for (const m of code.matchAll(/const\s+(__embed\d+)\s*=\s*/g)) {
|
|
433
|
+
const tickStart = code.indexOf("`", m.index + m[0].length);
|
|
434
|
+
if (tickStart < 0) continue;
|
|
435
|
+
const tickEnd = scanTemplate(code, tickStart);
|
|
436
|
+
ctx.embedConsts.set(m[1], reverseTemplate(code.slice(tickStart + 1, tickEnd - 1)));
|
|
437
|
+
}
|
|
438
|
+
for (const m of code.matchAll(/const\s+(__code\d+)\s*=\s*/g)) {
|
|
439
|
+
const start = m.index + m[0].length;
|
|
440
|
+
const end = scanExprToSemicolon(code, start);
|
|
441
|
+
ctx.codeConsts.set(m[1], code.slice(start, end).trim());
|
|
442
|
+
}
|
|
443
|
+
for (const m of code.matchAll(/const\s+(Tag_\d+)\s*=\s*/g)) {
|
|
444
|
+
const tickStart = code.indexOf("`", m.index + m[0].length);
|
|
445
|
+
if (tickStart < 0) continue;
|
|
446
|
+
const tickEnd = scanTemplate(code, tickStart);
|
|
447
|
+
ctx.tagConsts.set(m[1], reverseTemplate(code.slice(tickStart + 1, tickEnd - 1)));
|
|
448
|
+
}
|
|
449
|
+
for (const m of code.matchAll(/const\s+(\w+)\s*=\s*await\s+getCollectionList\(/g)) {
|
|
450
|
+
const open = m.index + m[0].length - 1;
|
|
451
|
+
const inner = code.slice(open + 1, scanBalanced(code, open) - 1);
|
|
452
|
+
const args = splitTopLevel(inner, ",").filter(Boolean);
|
|
453
|
+
const source = parseLiteral(args[0]);
|
|
454
|
+
const query = args[1]?.trim().startsWith("{") ? parseLiteral(args[1]) : void 0;
|
|
455
|
+
ctx.collectionBindings.set(m[1], { source, query });
|
|
456
|
+
}
|
|
457
|
+
const propsInterface = literalAfter(code, "resolveProps(Astro, ");
|
|
458
|
+
const componentMeta = readComponentMeta(code) ?? {};
|
|
459
|
+
const meta = readPageMeta(code);
|
|
460
|
+
const kind = code.includes("resolveProps(") ? "component" : "page";
|
|
461
|
+
return { kind, ctx, meta, propsInterface, componentMeta };
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// lib/dialect/libraryImports.ts
|
|
465
|
+
function isLocalLibraryUrl(url) {
|
|
466
|
+
return url.startsWith("/");
|
|
467
|
+
}
|
|
468
|
+
function isImportedCss(lib) {
|
|
469
|
+
return isLocalLibraryUrl(lib.url);
|
|
470
|
+
}
|
|
471
|
+
function isImportedJs(lib) {
|
|
472
|
+
return isLocalLibraryUrl(lib.url) && lib.type === "module";
|
|
473
|
+
}
|
|
474
|
+
function importedLibraryUrls(libs) {
|
|
475
|
+
if (!libs) return [];
|
|
476
|
+
const urls = [];
|
|
477
|
+
for (const css of libs.css || []) if (isImportedCss(css)) urls.push(css.url);
|
|
478
|
+
for (const js of libs.js || []) if (isImportedJs(js)) urls.push(js.url);
|
|
479
|
+
return urls;
|
|
480
|
+
}
|
|
481
|
+
function stripImportedLibraries(libs) {
|
|
482
|
+
return {
|
|
483
|
+
...libs,
|
|
484
|
+
css: (libs.css || []).filter((c) => !isImportedCss(c)),
|
|
485
|
+
js: (libs.js || []).filter((j) => !isImportedJs(j))
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
export {
|
|
490
|
+
scanBalanced,
|
|
491
|
+
findTrailingGroup,
|
|
492
|
+
splitTopLevel,
|
|
493
|
+
parseLiteral,
|
|
494
|
+
callArgsOf,
|
|
495
|
+
isRichTextHtml,
|
|
496
|
+
stripMenoSpanMarker,
|
|
497
|
+
interpretExprValue,
|
|
498
|
+
interpretStyleCall,
|
|
499
|
+
reverseCondition,
|
|
500
|
+
readComponentMeta,
|
|
501
|
+
readPageMeta,
|
|
502
|
+
parseFrontmatter,
|
|
503
|
+
importedLibraryUrls,
|
|
504
|
+
stripImportedLibraries
|
|
505
|
+
};
|
|
506
|
+
//# sourceMappingURL=chunk-5HBRX7IZ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../lib/dialect/parse/scan.ts", "../../lib/dialect/parse/parseLiteral.ts", "../../lib/dialect/parse/callArgs.ts", "../../lib/dialect/richtext.ts", "../../lib/dialect/parse/parseValue.ts", "../../lib/dialect/parse/parseContext.ts", "../../lib/dialect/parse/parseFrontmatter.ts", "../../lib/dialect/libraryImports.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Low-level scanners for the parser: skip strings / template literals and find\n * matching delimiters, so higher layers can treat `{ \u2026 }`, `( \u2026 )`, `[ \u2026 ]` as\n * opaque balanced spans without tripping over braces inside strings or `${\u2026}`.\n */\n\nconst CLOSERS: Record<string, string> = { '{': '}', '(': ')', '[': ']' };\n\n/** From a quote at `i`, return the index just past the matching closing quote. */\nexport function scanString(src: string, i: number): number {\n const q = src[i];\n let j = i + 1;\n while (j < src.length) {\n if (src[j] === '\\\\') { j += 2; continue; }\n if (src[j] === q) return j + 1;\n j++;\n }\n throw new Error(`scanString: unterminated string from ${i}`);\n}\n\n/** From a backtick at `i`, return the index just past the matching backtick (handles `${\u2026}`). */\nexport function scanTemplate(src: string, i: number): number {\n let j = i + 1;\n while (j < src.length) {\n if (src[j] === '\\\\') { j += 2; continue; }\n if (src[j] === '`') return j + 1;\n if (src[j] === '$' && src[j + 1] === '{') { j = scanBalanced(src, j + 1); continue; }\n j++;\n }\n throw new Error(`scanTemplate: unterminated template from ${i}`);\n}\n\n/** From an opening delimiter at `i` ({ ( [), return the index just past its match. */\nexport function scanBalanced(src: string, i: number): number {\n if (!CLOSERS[src[i]]) throw new Error(`scanBalanced: no open delimiter at ${i} (\"${src[i]}\")`);\n let depth = 0;\n let j = i;\n while (j < src.length) {\n const c = src[j];\n if (c === '\"' || c === \"'\") { j = scanString(src, j); continue; }\n if (c === '`') { j = scanTemplate(src, j); continue; }\n if (c === '{' || c === '(' || c === '[') { depth++; j++; continue; }\n if (c === '}' || c === ')' || c === ']') {\n depth--;\n j++;\n if (depth === 0) return j;\n continue;\n }\n j++;\n }\n throw new Error(`scanBalanced: unbalanced from ${i}`);\n}\n\n/**\n * Find the first top-level `openChar \u2026 close` group whose close is the very end of\n * `expr` (e.g. the `( \u2026 )` of `cond && ( \u2026 )` or `head.map(\u2026)`). Returns the inner\n * content, or null. Skips strings/templates/nested groups.\n */\nexport function findTrailingGroup(\n expr: string,\n openChar: '(' | '{' | '[' = '(',\n): { open: number; inner: string } | null {\n let j = 0;\n while (j < expr.length) {\n const c = expr[j];\n if (c === '\"' || c === \"'\") { j = scanString(expr, j); continue; }\n if (c === '`') { j = scanTemplate(expr, j); continue; }\n if (c === '{' || c === '(' || c === '[') {\n const end = scanBalanced(expr, j);\n if (c === openChar && end === expr.length) {\n return { open: j, inner: expr.slice(j + 1, end - 1) };\n }\n j = end;\n continue;\n }\n j++;\n }\n return null;\n}\n\n/** Split `src` on a single-character separator at top level (ignores strings/groups). */\nexport function splitTopLevel(src: string, sep: string): string[] {\n const parts: string[] = [];\n let start = 0;\n let j = 0;\n while (j < src.length) {\n const c = src[j];\n if (c === '\"' || c === \"'\") { j = scanString(src, j); continue; }\n if (c === '`') { j = scanTemplate(src, j); continue; }\n if (c === '{' || c === '(' || c === '[') { j = scanBalanced(src, j); continue; }\n if (c === sep) { parts.push(src.slice(start, j)); start = j + 1; j++; continue; }\n j++;\n }\n parts.push(src.slice(start));\n return parts.map((s) => s.trim());\n}\n", "/**\n * Recursive-descent parser for the JS-literal subset that `serialize.ts` emits \u2014\n * its exact inverse. Grammar: object | array | string | number | boolean | null,\n * with identifier-or-quoted object keys and JSON string escaping. Total over that\n * grammar; throws on anything outside it (which, for in-dialect input, never occurs).\n *\n * This is the \"tiny total evaluator\" that reads back `style(\u2026)`, `i18n(\u2026)`,\n * `export const meta = \u2026`, the `resolveProps(Astro, {\u2026})` argument, etc. \u2014 no\n * `eval`, no JS engine.\n *\n * It additionally reverses the two *expression* forms `serializeExprLiteral` emits for\n * a `{{template}}` nested inside a structured prop value (e.g. `link={{ href: link.href }}`):\n * a bare identifier/member chain (`link.href` \u2192 `{{link.href}}`) and a backtick template\n * literal (`` `/p/${slug}` `` \u2192 `/p/{{slug}}`). Quoted strings / numbers / booleans are\n * unaffected, so existing literal input parses exactly as before.\n */\n\nimport { scanBalanced } from './scan';\n\nexport interface LiteralResult {\n value: unknown;\n /** Index just past the parsed value. */\n end: number;\n}\n\nconst WS = new Set([' ', '\\t', '\\r', '\\n']);\nconst IDENT_START = /[A-Za-z_$]/;\nconst IDENT_CHAR = /[A-Za-z0-9_$]/;\n\nfunction skipWs(src: string, i: number): number {\n while (i < src.length && WS.has(src[i])) i++;\n return i;\n}\n\nfunction fail(src: string, i: number, msg: string): never {\n const around = src.slice(Math.max(0, i - 20), i + 20);\n throw new Error(`parseLiteral: ${msg} at index ${i} (\u2026${around}\u2026)`);\n}\n\nfunction parseString(src: string, i: number): LiteralResult {\n // src[i] === '\"'. Scan to the matching unescaped quote, then JSON.parse the span.\n let j = i + 1;\n while (j < src.length) {\n const c = src[j];\n if (c === '\\\\') { j += 2; continue; }\n if (c === '\"') { j++; break; }\n j++;\n }\n const raw = src.slice(i, j);\n return { value: JSON.parse(raw) as string, end: j };\n}\n\nfunction parseNumber(src: string, i: number): LiteralResult {\n let j = i;\n while (j < src.length && /[-+0-9.eE]/.test(src[j])) j++;\n const raw = src.slice(i, j);\n const n = Number(raw);\n if (Number.isNaN(n) && raw !== 'NaN') fail(src, i, `invalid number \"${raw}\"`);\n return { value: n, end: j };\n}\n\nfunction parseKey(src: string, i: number): LiteralResult {\n if (src[i] === '\"') return parseString(src, i);\n if (!IDENT_START.test(src[i])) fail(src, i, 'expected object key');\n let j = i + 1;\n while (j < src.length && IDENT_CHAR.test(src[j])) j++;\n return { value: src.slice(i, j), end: j };\n}\n\nfunction parseObject(src: string, i: number): LiteralResult {\n const obj: Record<string, unknown> = {};\n let j = skipWs(src, i + 1);\n if (src[j] === '}') return { value: obj, end: j + 1 };\n for (;;) {\n j = skipWs(src, j);\n const key = parseKey(src, j);\n j = skipWs(src, key.end);\n if (src[j] !== ':') fail(src, j, 'expected \":\"');\n j = skipWs(src, j + 1);\n const val = parseValueAt(src, j);\n obj[key.value as string] = val.value;\n j = skipWs(src, val.end);\n if (src[j] === ',') { j++; continue; }\n if (src[j] === '}') return { value: obj, end: j + 1 };\n fail(src, j, 'expected \",\" or \"}\"');\n }\n}\n\nfunction parseArray(src: string, i: number): LiteralResult {\n const arr: unknown[] = [];\n let j = skipWs(src, i + 1);\n if (src[j] === ']') return { value: arr, end: j + 1 };\n for (;;) {\n j = skipWs(src, j);\n const val = parseValueAt(src, j);\n arr.push(val.value);\n j = skipWs(src, val.end);\n if (src[j] === ',') { j++; continue; }\n if (src[j] === ']') return { value: arr, end: j + 1 };\n fail(src, j, 'expected \",\" or \"]\"');\n }\n}\n\n/** Reverse a backtick template-literal body to a `{{\u2026}}` template string. Mirrors the\n * emitter's `escapeBacktick` + `${expr}` interpolation (the inverse of `templateToExpr`). */\nfunction reverseBacktickBody(content: string): string {\n let out = '';\n let i = 0;\n while (i < content.length) {\n const c = content[i];\n if (c === '\\\\') {\n const n = content[i + 1];\n out += n === '\\\\' ? '\\\\' : n === '`' ? '`' : n === '$' ? '$' : n;\n i += 2;\n continue;\n }\n if (c === '$' && content[i + 1] === '{') {\n const end = scanBalanced(content, i + 1); // index past the matching '}'\n out += '{{' + content.slice(i + 2, end - 1).trim() + '}}';\n i = end;\n continue;\n }\n out += c;\n i++;\n }\n return out;\n}\n\n/** Parse a backtick template literal (`src[i] === '\\`'`) \u2192 reversed `{{\u2026}}` template string. */\nfunction parseBacktick(src: string, i: number): LiteralResult {\n let j = i + 1;\n while (j < src.length) {\n const c = src[j];\n if (c === '\\\\') { j += 2; continue; }\n if (c === '`') { j++; break; }\n if (c === '$' && src[j + 1] === '{') { j = scanBalanced(src, j + 1); continue; }\n j++;\n }\n return { value: reverseBacktickBody(src.slice(i + 1, j - 1)), end: j };\n}\n\n/**\n * Parse a bare expression (identifier/member chain, possibly with calls/indexing) up to\n * the first top-level `,`/`}`/`]`, and reverse it to a `{{\u2026}}` template. Only reached for\n * the expression form `serializeExprLiteral` emits inside a structured prop value.\n */\nfunction parseExprToken(src: string, i: number): LiteralResult {\n let j = i;\n let depth = 0;\n while (j < src.length) {\n const c = src[j];\n if (c === '\"' || c === \"'\" || c === '`') {\n const q = c;\n j++;\n while (j < src.length && src[j] !== q) { if (src[j] === '\\\\') j++; j++; }\n j++;\n continue;\n }\n if (c === '(' || c === '[' || c === '{') { depth++; j++; continue; }\n if (c === ')' || c === ']' || c === '}') { if (depth === 0) break; depth--; j++; continue; }\n if (depth === 0 && c === ',') break;\n j++;\n }\n return { value: `{{${src.slice(i, j).trim()}}}`, end: j };\n}\n\n/** Parse a single literal value starting at `i` (after leading whitespace). */\nexport function parseValueAt(src: string, i: number): LiteralResult {\n i = skipWs(src, i);\n const c = src[i];\n if (c === '{') return parseObject(src, i);\n if (c === '[') return parseArray(src, i);\n if (c === '\"') return parseString(src, i);\n if (c === '`') return parseBacktick(src, i);\n // Keyword literals \u2014 guarded so an identifier that merely *starts* with the keyword\n // (`trueValue`, `nullable`) falls through to the bare-expression branch instead.\n if (src.startsWith('true', i) && !IDENT_CHAR.test(src[i + 4] ?? '')) return { value: true, end: i + 4 };\n if (src.startsWith('false', i) && !IDENT_CHAR.test(src[i + 5] ?? '')) return { value: false, end: i + 5 };\n if (src.startsWith('null', i) && !IDENT_CHAR.test(src[i + 4] ?? '')) return { value: null, end: i + 4 };\n if (c === '-' || c === '+' || (c >= '0' && c <= '9')) return parseNumber(src, i);\n if (c !== undefined && IDENT_START.test(c)) return parseExprToken(src, i); // bare expr \u2192 {{\u2026}}\n return fail(src, i, `unexpected character \"${c ?? '<eof>'}\"`);\n}\n\n/** Parse a whole literal string (the entire trimmed input must be one literal). */\nexport function parseLiteral(src: string): unknown {\n const { value, end } = parseValueAt(src, 0);\n const rest = skipWs(src, end);\n if (rest !== src.length) fail(src, rest, 'trailing content after literal');\n return value;\n}\n", "import { scanBalanced } from './scan';\n\n/** Inner text of the first `( \u2026 )` call group in `expr` (e.g. `style( <here> )`). */\nexport function callArgsOf(expr: string): string {\n const open = expr.indexOf('(');\n const end = scanBalanced(expr, open);\n return expr.slice(open + 1, end - 1);\n}\n", "/**\n * Rich-text HTML codec helpers shared by the emitter and the parser.\n *\n * A Meno \"rich-text\" value is an HTML string (Tiptap \u2192 meno-core's `tiptapToHtml`). It\n * must render as REAL HTML in the converted `.astro` (via `set:html` / a backtick literal),\n * otherwise Astro escapes the markup and inline marks (custom spans, `<strong>`, `<a>`, \u2026)\n * ship as literal `<span>` text and their scoped CSS matches nothing. See the task\n * doc `docs/span-richtext-astro-task.md`.\n *\n * **Detection is content-based** (`isRichTextHtml`): a string carrying any tag `tiptapToHtml`\n * emits is rich text. This single heuristic covers both call-site prop values (emitAttr) and\n * direct content typed into a page/element (emitTextChild) \u2014 no parallel `name \u2192 propNames`\n * map is threaded from the converter. Bare rich-text *prop refs* (`{{text}}` where `text` is\n * declared `type:\"rich-text\"`) are recognized separately, by prop type, in `emitTextChild`.\n *\n * **`data-meno-span` round-trip.** A custom span carries an editor-only `data-meno-span`\n * marker \u2014 meno-core's `htmlToTiptap` (`parseSpan`) needs it to recognize a `textStyle`\n * mark. `tiptapToHtml` ALWAYS emits it equal to the class: `<span class=\"X\" data-meno-span=\"X\">`.\n * The codec strips it on emit (cleaner source) and deterministically re-adds it on parse,\n * keyed off the class. `strip`/`add` are mutual inverses on that canonical form, so\n * `parse(emit(model)) === normalizeModel(model)` stays exact; both are no-ops on strings\n * without meno spans, so applying them broadly is safe. meno-core's runtime is NOT touched.\n */\n\n/**\n * Inline + block tags emitted by `tiptapToHtml` (kept in sync with its `applyMark` /\n * `RICH_TEXT_ALLOWED_TAGS`). Their presence marks a string as rich-text HTML. Anchored with\n * `\\b` so prose like `5 < 10` or `<article` is not mistaken for a tag.\n */\nconst RICH_TEXT_TAG_RE =\n /<\\/?(?:strong|em|u|s|code|a|span|sub|sup|mark|b|i|p|br|ul|ol|li|blockquote|h[1-6]|pre|hr|small|figure|figcaption|table|thead|tbody|tr|th|td)\\b/i;\n\n/** True when a string contains rich-text markup (a tag `tiptapToHtml` can produce). */\nexport function isRichTextHtml(s: string): boolean {\n return RICH_TEXT_TAG_RE.test(s);\n}\n\n/** Strip the editor-only `data-meno-span=\"\u2026\"` attribute from every `<span>` opening tag. */\nexport function stripMenoSpanMarker(html: string): string {\n return html.replace(/<span\\b[^>]*>/gi, (tag) => tag.replace(/\\s+data-meno-span=\"[^\"]*\"/gi, ''));\n}\n\n/**\n * Re-add `data-meno-span` (= the span's class) to any classed `<span>` that lacks it \u2014 the\n * exact inverse of {@link stripMenoSpanMarker} on canonical `tiptapToHtml` output, where the\n * marker always equals the class and follows it. Idempotent (skips spans that already carry\n * it); a no-op on spans without a class or strings without spans.\n */\nexport function addMenoSpanMarker(html: string): string {\n return html.replace(/<span\\b[^>]*>/gi, (tag) => {\n if (/\\bdata-meno-span=/i.test(tag)) return tag;\n const m = tag.match(/\\bclass=\"([^\"]*)\"/i);\n if (!m) return tag;\n return tag.replace(/(\\bclass=\"[^\"]*\")/i, `$1 data-meno-span=\"${m[1]}\"`);\n });\n}\n", "/**\n * Value reversers \u2014 the inverse of the emitter's value/attribute encoders. Turn a\n * JSX attribute/expression string back into the Meno model value it came from.\n */\n\nimport { isSupportedTemplateExpression } from 'meno-core/shared';\nimport { parseLiteral } from './parseLiteral';\nimport { scanBalanced, splitTopLevel } from './scan';\nimport { callArgsOf } from './callArgs';\nimport { addMenoSpanMarker } from '../richtext';\nimport type { ParseContext } from './parseContext';\n\n/** A preserved arbitrary-JS expression the Meno model can't represent as a binding. */\nexport interface CodeMarker {\n _code: true;\n expr: string;\n}\n\n/** Tag an arbitrary JS expression as a verbatim-code marker. */\nexport function codeMarker(expr: string): CodeMarker {\n return { _code: true, expr };\n}\n\n/** Reverse `escapeBacktick` + `${expr}` interpolation: backtick content \u2192 Meno string. */\nexport function reverseTemplate(content: string): string {\n let out = '';\n let i = 0;\n while (i < content.length) {\n const c = content[i];\n if (c === '\\\\') {\n const n = content[i + 1];\n // escapeBacktick produced \\\\, \\` and \\${ \u2014 undo each (\\$ leaves the following { literal).\n out += n === '\\\\' ? '\\\\' : n === '`' ? '`' : n === '$' ? '$' : n;\n i += 2;\n continue;\n }\n if (c === '$' && content[i + 1] === '{') {\n const end = scanBalanced(content, i + 1);\n out += '{{' + content.slice(i + 2, end - 1).trim() + '}}';\n i = end;\n continue;\n }\n out += c;\n i++;\n }\n return out;\n}\n\n/**\n * Interpret a JSX expression-attribute value (the inner of `name={ \u2026 }`) back into a\n * Meno model value.\n */\nexport function interpretExprValue(expr: string, ctx: ParseContext): unknown {\n const e = expr.trim();\n\n if (ctx.embedConsts.has(e)) return ctx.embedConsts.get(e);\n // A hoisted `__codeN` reference \u2192 the verbatim JS expression it stands for.\n if (ctx.codeConsts.has(e)) return codeMarker(ctx.codeConsts.get(e)!);\n if (e.startsWith('i18n(')) return parseLiteral(callArgsOf(e));\n // href()/embedHtml() may carry a threaded `__props` arg after the literal mapping (the\n // emitter passes the host component's props). Take only the first top-level arg.\n if (e.startsWith('href(')) return parseLiteral(splitTopLevel(callArgsOf(e), ',')[0]);\n if (e.startsWith('embedHtml(')) return parseLiteral(splitTopLevel(callArgsOf(e), ',')[0]);\n // Backtick literal \u2192 Meno string. Re-add the editor-only `data-meno-span` that emit strips\n // from custom spans (no-op for non-rich-text backticks like `/p/${slug}`), so rich-text\n // values round-trip to canonical meno-core HTML. See `../richtext`.\n if (e[0] === '`') return addMenoSpanMarker(reverseTemplate(e.slice(1, -1)));\n if (e[0] === '{' || e[0] === '[') return parseLiteral(e);\n if (e[0] === '\"') return parseLiteral(e);\n if (e === 'true') return true;\n if (e === 'false') return false;\n if (e === 'null') return null;\n if (/^[-+]?(\\d|\\.\\d)/.test(e) && !Number.isNaN(Number(e))) return Number(e);\n // Reverse the empty-template node-attribute guard `EXPR || undefined` (emitAttr adds it for\n // HTML attributes meno-core drops when they resolve to \"\") back to `{{EXPR}}`. Only when the\n // inner part is itself a modelable binding, so arbitrary `x || undefined` JS isn't mis-read.\n const guard = e.match(/^(.+?)\\s*\\|\\|\\s*undefined$/);\n if (guard && isSupportedTemplateExpression(guard[1].trim())) return `{{${guard[1].trim()}}}`;\n // A binding the template engine can evaluate (identifier / member / operators /\n // ternary) \u2192 a Meno `{{template}}`. Anything else (function/method calls, arbitrary\n // JS) can't be modeled as a binding \u2014 preserve it verbatim so it is never lost and\n // still renders natively at build (see `isSupportedTemplateExpression`).\n if (isSupportedTemplateExpression(e)) return `{{${e}}}`;\n return codeMarker(e);\n}\n\n/** Reverse a `class={style(LIT[, META])}` attribute into { style, \u2026meta fields }. */\nexport function interpretStyleCall(expr: string): {\n style?: unknown;\n interactiveStyles?: unknown;\n label?: unknown;\n generateElementClass?: unknown;\n} {\n const args = callArgsOf(expr); // inside style( \u2026 )\n const parts = splitTopLevel(args, ',').filter((p) => p.length > 0);\n const out: Record<string, unknown> = {};\n if (parts[0]) out.style = parseLiteral(parts[0]);\n // Meta is the object-literal argument after the style object. Handles both the legacy\n // `style(obj, meta)` form and the current `style(obj, props, meta)` form \u2014 the `props`\n // argument is a bare identifier (`__props`/`undefined`) and is skipped.\n const metaPart = parts.slice(1).find((p) => p.trimStart().startsWith('{'));\n if (metaPart) {\n const meta = parseLiteral(metaPart) as Record<string, unknown>;\n if (meta.interactive !== undefined) out.interactiveStyles = meta.interactive;\n if (meta.label !== undefined) out.label = meta.label;\n if (meta.genClass !== undefined) out.generateElementClass = meta.genClass;\n // `instance` / `kind` are emit-only markers \u2014 intentionally dropped.\n }\n return out;\n}\n\n/** Reverse an `if` condition expression back into a Meno `if` value. */\nexport function reverseCondition(cond: string): boolean | string | unknown {\n const c = cond.trim();\n if (c === 'false') return false;\n if (c === 'true') return true;\n // `when(mapping[, __props])` \u2014 strip the threaded props arg, take the literal mapping.\n if (c.startsWith('when(')) return parseLiteral(splitTopLevel(callArgsOf(c), ',')[0]);\n // A condition the template engine can evaluate \u2192 a `{{template}}`; arbitrary JS is\n // preserved verbatim (symmetric with interpretExprValue).\n if (isSupportedTemplateExpression(c)) return `{{${c}}}`;\n return codeMarker(c);\n}\n", "/**\n * Shared state the body parser needs from the frontmatter: collection-list bindings,\n * hoisted embed consts, and the set of imported component tag names.\n */\n\nexport interface CollectionBinding {\n source: string;\n query?: Record<string, unknown>;\n}\n\n/** Absolute byte span of a model node in the original source: `[start, end)`. */\nexport interface NodeSpan {\n start: number;\n end: number;\n}\n\nexport interface ParseContext {\n /** `const blogList = await getCollectionList(\"blog\", {\u2026}, Astro)` \u2192 binding name \u2192 info. */\n collectionBindings: Map<string, CollectionBinding>;\n /** `const __embed0 = \\`\u2026\\`` \u2192 const name \u2192 verbatim (un-escaped) HTML. */\n embedConsts: Map<string, string>;\n /** `const __code0 = <raw expr>` \u2192 const name \u2192 verbatim JS expression (hoisted multi-line). */\n codeConsts: Map<string, string>;\n /** `const Tag_0 = \\`h${size}\\`` \u2192 const name \u2192 the Meno tag string (`h{{size}}`). */\n tagConsts: Map<string, string>;\n /**\n * Optional sink for source-line mapping: when present, the body parser records the\n * absolute source span of every object node it produces (keyed by node identity).\n * Off by default (the round-trip codec never sets it) so normal parsing is unchanged;\n * `buildAstroLineMap` opts in to recover `.astro` line ranges for the editor/selection.\n */\n spans?: Map<object, NodeSpan>;\n}\n\nexport function createParseContext(): ParseContext {\n return {\n collectionBindings: new Map(),\n embedConsts: new Map(),\n codeConsts: new Map(),\n tagConsts: new Map(),\n };\n}\n", "/**\n * Frontmatter parser \u2014 extracts the named consts/exports the emitter wrote:\n * `export const meta`, the `resolveProps(Astro, {\u2026})` prop literal, `const __meno`,\n * hoisted `__embedN` template consts, and `getCollectionList` bindings.\n */\n\nimport { parseValueAt, parseLiteral } from './parseLiteral';\nimport { scanBalanced, scanString, scanTemplate, splitTopLevel } from './scan';\nimport { reverseTemplate } from './parseValue';\nimport { createParseContext, type ParseContext } from './parseContext';\n\n/**\n * Scan a hoisted-const RHS (an arbitrary JS expression) from `i` to its terminating\n * top-level `;`, skipping over strings, template literals, and balanced bracket groups.\n * The hoisted value is always an expression (no statements), so the first `;` at depth 0\n * is the end. Returns the index of that `;` (or end-of-string if none).\n */\nfunction scanExprToSemicolon(code: string, i: number): number {\n let j = i;\n while (j < code.length) {\n const c = code[j];\n if (c === '\"' || c === \"'\") { j = scanString(code, j); continue; }\n if (c === '`') { j = scanTemplate(code, j); continue; }\n if (c === '(' || c === '[' || c === '{') { j = scanBalanced(code, j); continue; }\n if (c === ';') return j;\n j++;\n }\n return code.length;\n}\n\nexport interface Frontmatter {\n kind: 'page' | 'component';\n ctx: ParseContext;\n meta?: unknown;\n propsInterface?: Record<string, unknown>;\n componentMeta: Record<string, unknown>;\n}\n\n/** Read the literal RHS that follows an anchor like `export const meta = `. */\nfunction literalAfter(code: string, anchor: string): unknown | undefined {\n const idx = code.indexOf(anchor);\n if (idx < 0) return undefined;\n return parseValueAt(code, idx + anchor.length).value;\n}\n\n/**\n * The component-meta literal (`const __meno = {\u2026}`) of an emitted component file, or\n * undefined when absent. Exposed for consumers that need this ONE component fact (e.g.\n * `loadLibraries`' render-time collection of component-tier libraries) without paying\n * for a full `parseFrontmatter` scan.\n */\nexport function readComponentMeta(code: string): Record<string, unknown> | undefined {\n return literalAfter(code, 'const __meno = ') as Record<string, unknown> | undefined;\n}\n\n/**\n * The page-meta literal (`const meta = {\u2026}`) of an emitted page file, or undefined when\n * absent. The anchor is a substring of the legacy `export const meta = ` too, so both the\n * current (non-exported) form and older emitted pages are read. Exposed for consumers that\n * need this ONE page fact (e.g. `loadSlugMappings`' render-time collection of `meta.slugs`\n * for locale routing) without paying for a full `parseFrontmatter` scan.\n */\nexport function readPageMeta(code: string): Record<string, unknown> | undefined {\n return literalAfter(code, 'const meta = ') as Record<string, unknown> | undefined;\n}\n\nexport function parseFrontmatter(code: string): Frontmatter {\n const ctx = createParseContext();\n\n // Hoisted embed consts: `const __embed0 = ` + backtick template.\n for (const m of code.matchAll(/const\\s+(__embed\\d+)\\s*=\\s*/g)) {\n const tickStart = code.indexOf('`', m.index! + m[0].length);\n if (tickStart < 0) continue;\n const tickEnd = scanTemplate(code, tickStart);\n ctx.embedConsts.set(m[1], reverseTemplate(code.slice(tickStart + 1, tickEnd - 1)));\n }\n\n // Hoisted verbatim-code consts: `const __code0 = <raw expr>;` (multi-line foreign JS\n // lifted out of a `{\u2026}` value/attribute so the placer never re-indents it).\n for (const m of code.matchAll(/const\\s+(__code\\d+)\\s*=\\s*/g)) {\n const start = m.index! + m[0].length;\n const end = scanExprToSemicolon(code, start);\n ctx.codeConsts.set(m[1], code.slice(start, end).trim());\n }\n\n // Dynamic-tag consts: `const Tag_0 = ` + backtick template \u2192 Meno tag string.\n for (const m of code.matchAll(/const\\s+(Tag_\\d+)\\s*=\\s*/g)) {\n const tickStart = code.indexOf('`', m.index! + m[0].length);\n if (tickStart < 0) continue;\n const tickEnd = scanTemplate(code, tickStart);\n ctx.tagConsts.set(m[1], reverseTemplate(code.slice(tickStart + 1, tickEnd - 1)));\n }\n\n // Collection-list bindings:\n // const X = await getCollectionList(\"src\"[, {query}], Astro, getCollection)\n // The optional `{query}` is the only object-literal arg; the trailing `Astro` and\n // `getCollection` identifiers are emit-only plumbing and ignored.\n for (const m of code.matchAll(/const\\s+(\\w+)\\s*=\\s*await\\s+getCollectionList\\(/g)) {\n const open = m.index! + m[0].length - 1; // the '(' of getCollectionList(\n const inner = code.slice(open + 1, scanBalanced(code, open) - 1);\n const args = splitTopLevel(inner, ',').filter(Boolean);\n const source = parseLiteral(args[0]) as string;\n const query = args[1]?.trim().startsWith('{')\n ? (parseLiteral(args[1]) as Record<string, unknown>)\n : undefined;\n ctx.collectionBindings.set(m[1], { source, query });\n }\n\n // The authoritative prop definition is the second argument of the single\n // `resolveProps(Astro, {\u2026})` call. `literalAfter` scans the balanced `{\u2026}`\n // literal that follows the anchor and stops at its matching brace, so the trailing\n // `)`/`;` are ignored. The (cosmetic) destructured names are never read.\n const propsInterface = literalAfter(code, 'resolveProps(Astro, ') as Record<string, unknown> | undefined;\n const componentMeta = readComponentMeta(code) ?? {};\n const meta = readPageMeta(code);\n const kind: Frontmatter['kind'] = code.includes('resolveProps(') ? 'component' : 'page';\n\n return { kind, ctx, meta, propsInterface, componentMeta };\n}\n", "/**\n * Which library entries are emitted as native Astro/Vite ESM `import`s (so Vite bundles +\n * fingerprints them) vs left as `<link>`/`<script src>` tags (rendered at build by\n * `loadLibraries` \u2192 BaseLayout).\n *\n * Rule (Phase 2 \u2014 \"optimize local files via Astro\"):\n * - **Local CSS** (`url` starts with `/`) \u2192 ESM import. CSS imports are always safe.\n * - **Local JS with `type:'module'`** \u2192 ESM import. Module scripts are safe to import.\n * - **Local JS classic** (default) + **all external** \u2192 stay tags. A classic/IIFE script can rely\n * on global execution (`document.currentScript`, no module scope) so it must NOT be bundled;\n * external CDN URLs can't be bundled at all.\n *\n * The import is emitted as a bare side-effect `import '\u2026';`, which the parser ignores (it only\n * tracks `.astro` component imports \u2014 see parseFrontmatter), so it is re-derived from the\n * `libraries` config on every emit and round-trips with no model field \u2014 exactly like the\n * `import '../styles/theme.css'` line in emitPage. The `libraries` config literal\n * (`__meno.libraries` / page `const meta`) stays the single round-trippable source of truth.\n *\n * Pure (no fs); shared by the emitters (emitPage/emitComponent), the converter\n * (convertProject's `__componentLibraries`) and `loadLibraries`, so all three agree on the\n * local-vs-external split and nothing is double-loaded.\n */\n\nimport type { LibrariesConfig, CSSLibraryConfig, JSLibraryConfig } from 'meno-core/shared';\n\n/** A library URL is local when it is a project-root path (`/libraries/x.css`), not a CDN URL. */\nexport function isLocalLibraryUrl(url: string): boolean {\n return url.startsWith('/');\n}\n\n/** A CSS library that should be emitted as a Vite import (local file). */\nexport function isImportedCss(lib: CSSLibraryConfig): boolean {\n return isLocalLibraryUrl(lib.url);\n}\n\n/** A JS library that should be emitted as a Vite import (local ES module). */\nexport function isImportedJs(lib: JSLibraryConfig): boolean {\n return isLocalLibraryUrl(lib.url) && lib.type === 'module';\n}\n\n/**\n * The local library URLs (CSS first, then module JS) that should be emitted as Vite ESM\n * imports for the given config, in stable order. Each URL is a project-root path\n * (`/libraries/x.css`); the caller turns it into a file-relative import specifier.\n */\nexport function importedLibraryUrls(libs?: LibrariesConfig): string[] {\n if (!libs) return [];\n const urls: string[] = [];\n for (const css of libs.css || []) if (isImportedCss(css)) urls.push(css.url);\n for (const js of libs.js || []) if (isImportedJs(js)) urls.push(js.url);\n return urls;\n}\n\n/**\n * Drop the entries that are emitted as Vite imports, leaving only what `loadLibraries` should\n * render as tags (external + local classic JS). Preserves any extra fields (e.g. a page tier's\n * `mode`). Used to keep the import path and the tag path from double-loading the same file.\n */\nexport function stripImportedLibraries<T extends LibrariesConfig>(libs: T): T {\n return {\n ...libs,\n css: (libs.css || []).filter((c) => !isImportedCss(c)),\n js: (libs.js || []).filter((j) => !isImportedJs(j)),\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|