@let-value/translate-extract 1.1.1 → 1.1.2-beta.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/dist/bin/cli.cjs +1 -1
- package/dist/bin/cli.js +1 -1
- package/dist/{configuration-Bd6mIjFe.d.cts → configuration-CTy0NMkD.d.cts} +3 -1
- package/dist/configuration-CTy0NMkD.d.cts.map +1 -0
- package/dist/{configuration-xNU7-De0.d.ts → configuration-fs9HmV_j.d.ts} +3 -1
- package/dist/configuration-fs9HmV_j.d.ts.map +1 -0
- package/dist/{run-MHj974iT.cjs → run-BvhgGiZE.cjs} +49 -18
- package/dist/{run-DbV8QpUz.js → run-Dc4eZUPV.js} +50 -19
- package/dist/run-Dc4eZUPV.js.map +1 -0
- package/dist/src/core.d.cts +1 -1
- package/dist/src/core.d.ts +1 -1
- package/dist/src/index.cjs +1 -1
- package/dist/src/index.d.cts +1 -1
- package/dist/src/index.d.cts.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/static.d.cts +1 -1
- package/dist/src/static.d.ts +1 -1
- package/package.json +2 -2
- package/dist/configuration-Bd6mIjFe.d.cts.map +0 -1
- package/dist/configuration-xNU7-De0.d.ts.map +0 -1
- package/dist/run-DbV8QpUz.js.map +0 -1
package/dist/bin/cli.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
const require_chunk = require('../chunk-CUT6urMc.cjs');
|
|
3
|
-
const require_run = require('../run-
|
|
3
|
+
const require_run = require('../run-BvhgGiZE.cjs');
|
|
4
4
|
let node_util = require("node:util");
|
|
5
5
|
node_util = require_chunk.__toESM(node_util);
|
|
6
6
|
let cosmiconfig = require("cosmiconfig");
|
package/dist/bin/cli.js
CHANGED
|
@@ -67,6 +67,7 @@ type MaybePromise<T> = T | Promise<T>;
|
|
|
67
67
|
interface Context {
|
|
68
68
|
config: ResolvedConfig;
|
|
69
69
|
generatedAt: Date;
|
|
70
|
+
paths: Set<string>;
|
|
70
71
|
logger?: Logger;
|
|
71
72
|
}
|
|
72
73
|
interface ResolveArgs<TInput = unknown> {
|
|
@@ -114,6 +115,7 @@ type LoadHook<TInput = unknown> = (args: LoadArgs<TInput>) => MaybePromise<LoadR
|
|
|
114
115
|
type ProcessHook<TInput = unknown, TOutput = unknown> = (args: ProcessArgs<TInput>) => MaybePromise<ProcessResult<TOutput> | undefined>;
|
|
115
116
|
interface Build<TInput = unknown, TOutput = unknown> {
|
|
116
117
|
context: Context;
|
|
118
|
+
source(path: string): void;
|
|
117
119
|
resolve(args: ResolveArgs<unknown>): void;
|
|
118
120
|
load(args: LoadArgs<unknown>): void;
|
|
119
121
|
process(args: ProcessArgs<unknown>): void;
|
|
@@ -238,4 +240,4 @@ interface ResolvedConfig {
|
|
|
238
240
|
declare function defineConfig(config: UserConfig): ResolvedConfig;
|
|
239
241
|
//#endregion
|
|
240
242
|
export { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, Logger, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, StaticPlugin, UniversalPlugin, UserConfig, cleanup, cleanup$1, core, core$1, defineConfig, po, po$1, react$1 as react, react as react$1 };
|
|
241
|
-
//# sourceMappingURL=configuration-
|
|
243
|
+
//# sourceMappingURL=configuration-CTy0NMkD.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-CTy0NMkD.d.cts","names":[],"sources":["../src/logger.ts","../src/plugins/cleanup/cleanup.ts","../src/plugins/core/queries/types.ts","../src/plugins/core/core.ts","../src/plugins/po/po.ts","../src/plugins/react/react.ts","../src/static.ts","../src/plugin.ts","../src/configuration.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -68,6 +68,7 @@ type MaybePromise<T> = T | Promise<T>;
|
|
|
68
68
|
interface Context {
|
|
69
69
|
config: ResolvedConfig;
|
|
70
70
|
generatedAt: Date;
|
|
71
|
+
paths: Set<string>;
|
|
71
72
|
logger?: Logger;
|
|
72
73
|
}
|
|
73
74
|
interface ResolveArgs<TInput = unknown> {
|
|
@@ -115,6 +116,7 @@ type LoadHook<TInput = unknown> = (args: LoadArgs<TInput>) => MaybePromise<LoadR
|
|
|
115
116
|
type ProcessHook<TInput = unknown, TOutput = unknown> = (args: ProcessArgs<TInput>) => MaybePromise<ProcessResult<TOutput> | undefined>;
|
|
116
117
|
interface Build<TInput = unknown, TOutput = unknown> {
|
|
117
118
|
context: Context;
|
|
119
|
+
source(path: string): void;
|
|
118
120
|
resolve(args: ResolveArgs<unknown>): void;
|
|
119
121
|
load(args: LoadArgs<unknown>): void;
|
|
120
122
|
process(args: ProcessArgs<unknown>): void;
|
|
@@ -239,4 +241,4 @@ interface ResolvedConfig {
|
|
|
239
241
|
declare function defineConfig(config: UserConfig): ResolvedConfig;
|
|
240
242
|
//#endregion
|
|
241
243
|
export { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, Logger, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, StaticPlugin, UniversalPlugin, UserConfig, cleanup, cleanup$1, core, core$1, defineConfig, po, po$1, react$1 as react, react as react$1 };
|
|
242
|
-
//# sourceMappingURL=configuration-
|
|
244
|
+
//# sourceMappingURL=configuration-fs9HmV_j.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-fs9HmV_j.d.ts","names":[],"sources":["../src/logger.ts","../src/plugins/cleanup/cleanup.ts","../src/plugins/core/queries/types.ts","../src/plugins/core/core.ts","../src/plugins/po/po.ts","../src/plugins/react/react.ts","../src/static.ts","../src/plugin.ts","../src/configuration.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -121,6 +121,16 @@ const withComment = (query) => ({
|
|
|
121
121
|
}
|
|
122
122
|
});
|
|
123
123
|
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region src/plugins/core/queries/entrypoint.ts
|
|
126
|
+
const entrypointCommentPattern = /(?:^|\s)@?translate-entrypoint(?:\s|$)/;
|
|
127
|
+
const entrypointQuery = {
|
|
128
|
+
pattern: `(comment) @comment`,
|
|
129
|
+
extract(match) {
|
|
130
|
+
return match.captures.filter((capture) => capture.name === "comment").some((capture) => entrypointCommentPattern.test(getComment(capture.node)));
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
124
134
|
//#endregion
|
|
125
135
|
//#region src/plugins/core/queries/import.ts
|
|
126
136
|
const importQuery = {
|
|
@@ -543,6 +553,7 @@ function parseSource$1(source, path$1) {
|
|
|
543
553
|
const context = { path: path$1 };
|
|
544
554
|
const { parser, language } = getParser(path$1);
|
|
545
555
|
const tree = parser.parse(source);
|
|
556
|
+
const entrypoint = getCachedQuery(language, entrypointQuery.pattern).matches(tree.rootNode).some(entrypointQuery.extract);
|
|
546
557
|
const translations = [];
|
|
547
558
|
const warnings = [];
|
|
548
559
|
const imports = [];
|
|
@@ -577,7 +588,8 @@ function parseSource$1(source, path$1) {
|
|
|
577
588
|
return {
|
|
578
589
|
translations,
|
|
579
590
|
imports,
|
|
580
|
-
warnings
|
|
591
|
+
warnings,
|
|
592
|
+
entrypoint
|
|
581
593
|
};
|
|
582
594
|
}
|
|
583
595
|
|
|
@@ -666,14 +678,22 @@ function core() {
|
|
|
666
678
|
filter: filter$1,
|
|
667
679
|
namespace: namespace$1
|
|
668
680
|
}, ({ entrypoint, path: path$1, data }) => {
|
|
669
|
-
const
|
|
681
|
+
const result = parseSource$1(data, path$1);
|
|
682
|
+
if (result.entrypoint && entrypoint !== path$1) {
|
|
683
|
+
build.source(path$1);
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
const { translations, imports, warnings } = result;
|
|
670
687
|
if (build.context.config.walk) {
|
|
671
688
|
const paths = resolveImports(path$1, imports);
|
|
672
|
-
for (const path$2 of paths)
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
689
|
+
for (const path$2 of paths) {
|
|
690
|
+
if (build.context.paths.has(path$2)) continue;
|
|
691
|
+
build.resolve({
|
|
692
|
+
entrypoint,
|
|
693
|
+
path: path$2,
|
|
694
|
+
namespace: namespace$1
|
|
695
|
+
});
|
|
696
|
+
}
|
|
677
697
|
}
|
|
678
698
|
for (const warning of warnings) build.context.logger?.warn(`${warning.error} at ${warning.reference}`);
|
|
679
699
|
build.resolve({
|
|
@@ -1291,11 +1311,17 @@ function resolveStaticPlugin(item) {
|
|
|
1291
1311
|
|
|
1292
1312
|
//#endregion
|
|
1293
1313
|
//#region src/run.ts
|
|
1314
|
+
async function getPaths(entrypoint) {
|
|
1315
|
+
const pattern = entrypoint.entrypoint.replace(/\\/g, "/");
|
|
1316
|
+
const paths = fast_glob.default.isDynamicPattern(pattern) ? await (0, fast_glob.default)(pattern, { onlyFiles: true }) : [entrypoint.entrypoint];
|
|
1317
|
+
return new Set(paths);
|
|
1318
|
+
}
|
|
1294
1319
|
async function run(entrypoint, { config, logger }) {
|
|
1295
1320
|
const destination = entrypoint.destination ?? config.destination;
|
|
1296
1321
|
const obsolete = entrypoint.obsolete ?? config.obsolete;
|
|
1297
1322
|
const exclude = entrypoint.exclude ?? config.exclude;
|
|
1298
1323
|
const walk = entrypoint.walk ?? config.walk;
|
|
1324
|
+
const paths = /* @__PURE__ */ new Set();
|
|
1299
1325
|
const context = {
|
|
1300
1326
|
config: {
|
|
1301
1327
|
...config,
|
|
@@ -1305,6 +1331,7 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1305
1331
|
walk
|
|
1306
1332
|
},
|
|
1307
1333
|
generatedAt: /* @__PURE__ */ new Date(),
|
|
1334
|
+
paths,
|
|
1308
1335
|
logger
|
|
1309
1336
|
};
|
|
1310
1337
|
logger?.info(entrypoint, "starting extraction");
|
|
@@ -1329,6 +1356,19 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1329
1356
|
function defer(namespace$3) {
|
|
1330
1357
|
return getDeferred(namespace$3).promise;
|
|
1331
1358
|
}
|
|
1359
|
+
function source(path$1) {
|
|
1360
|
+
if (paths.has(path$1)) return;
|
|
1361
|
+
logger?.debug({
|
|
1362
|
+
entrypoint: entrypoint.entrypoint,
|
|
1363
|
+
path: path$1
|
|
1364
|
+
}, "resolved path");
|
|
1365
|
+
paths.add(path$1);
|
|
1366
|
+
resolve$4({
|
|
1367
|
+
entrypoint: path$1,
|
|
1368
|
+
path: path$1,
|
|
1369
|
+
namespace: "source"
|
|
1370
|
+
});
|
|
1371
|
+
}
|
|
1332
1372
|
function resolve$4(args) {
|
|
1333
1373
|
const { entrypoint: entrypoint$1, path: path$1, namespace: namespace$3 } = args;
|
|
1334
1374
|
const skipped = context.config.exclude.some((ex) => typeof ex === "function" ? ex(args) : ex.test(args.path));
|
|
@@ -1373,6 +1413,7 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1373
1413
|
}
|
|
1374
1414
|
const build = {
|
|
1375
1415
|
context,
|
|
1416
|
+
source,
|
|
1376
1417
|
resolve: resolve$4,
|
|
1377
1418
|
load,
|
|
1378
1419
|
process: process$1,
|
|
@@ -1401,17 +1442,7 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1401
1442
|
logger?.debug({ plugin: plugin.name }, "setting up plugin");
|
|
1402
1443
|
plugin.setup(build);
|
|
1403
1444
|
}
|
|
1404
|
-
const
|
|
1405
|
-
const paths = fast_glob.default.isDynamicPattern(pattern) ? await (0, fast_glob.default)(pattern, { onlyFiles: true }) : [entrypoint.entrypoint];
|
|
1406
|
-
logger?.debug({
|
|
1407
|
-
entrypoint: entrypoint.entrypoint,
|
|
1408
|
-
paths
|
|
1409
|
-
}, "resolved paths");
|
|
1410
|
-
for (const path$1 of paths) resolve$4({
|
|
1411
|
-
entrypoint: path$1,
|
|
1412
|
-
path: path$1,
|
|
1413
|
-
namespace: "source"
|
|
1414
|
-
});
|
|
1445
|
+
for (const path$1 of await getPaths(entrypoint)) source(path$1);
|
|
1415
1446
|
async function processTask(task) {
|
|
1416
1447
|
const { type } = task;
|
|
1417
1448
|
let args = task.args;
|
|
@@ -109,6 +109,16 @@ const withComment = (query) => ({
|
|
|
109
109
|
}
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region src/plugins/core/queries/entrypoint.ts
|
|
114
|
+
const entrypointCommentPattern = /(?:^|\s)@?translate-entrypoint(?:\s|$)/;
|
|
115
|
+
const entrypointQuery = {
|
|
116
|
+
pattern: `(comment) @comment`,
|
|
117
|
+
extract(match) {
|
|
118
|
+
return match.captures.filter((capture) => capture.name === "comment").some((capture) => entrypointCommentPattern.test(getComment(capture.node)));
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
|
|
112
122
|
//#endregion
|
|
113
123
|
//#region src/plugins/core/queries/import.ts
|
|
114
124
|
const importQuery = {
|
|
@@ -531,6 +541,7 @@ function parseSource$1(source, path$1) {
|
|
|
531
541
|
const context = { path: path$1 };
|
|
532
542
|
const { parser, language } = getParser(path$1);
|
|
533
543
|
const tree = parser.parse(source);
|
|
544
|
+
const entrypoint = getCachedQuery(language, entrypointQuery.pattern).matches(tree.rootNode).some(entrypointQuery.extract);
|
|
534
545
|
const translations = [];
|
|
535
546
|
const warnings = [];
|
|
536
547
|
const imports = [];
|
|
@@ -565,7 +576,8 @@ function parseSource$1(source, path$1) {
|
|
|
565
576
|
return {
|
|
566
577
|
translations,
|
|
567
578
|
imports,
|
|
568
|
-
warnings
|
|
579
|
+
warnings,
|
|
580
|
+
entrypoint
|
|
569
581
|
};
|
|
570
582
|
}
|
|
571
583
|
|
|
@@ -654,14 +666,22 @@ function core() {
|
|
|
654
666
|
filter: filter$1,
|
|
655
667
|
namespace: namespace$1
|
|
656
668
|
}, ({ entrypoint, path: path$1, data }) => {
|
|
657
|
-
const
|
|
669
|
+
const result = parseSource$1(data, path$1);
|
|
670
|
+
if (result.entrypoint && entrypoint !== path$1) {
|
|
671
|
+
build.source(path$1);
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
const { translations, imports, warnings } = result;
|
|
658
675
|
if (build.context.config.walk) {
|
|
659
676
|
const paths = resolveImports(path$1, imports);
|
|
660
|
-
for (const path$2 of paths)
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
677
|
+
for (const path$2 of paths) {
|
|
678
|
+
if (build.context.paths.has(path$2)) continue;
|
|
679
|
+
build.resolve({
|
|
680
|
+
entrypoint,
|
|
681
|
+
path: path$2,
|
|
682
|
+
namespace: namespace$1
|
|
683
|
+
});
|
|
684
|
+
}
|
|
665
685
|
}
|
|
666
686
|
for (const warning of warnings) build.context.logger?.warn(`${warning.error} at ${warning.reference}`);
|
|
667
687
|
build.resolve({
|
|
@@ -1279,11 +1299,17 @@ function resolveStaticPlugin(item) {
|
|
|
1279
1299
|
|
|
1280
1300
|
//#endregion
|
|
1281
1301
|
//#region src/run.ts
|
|
1302
|
+
async function getPaths(entrypoint) {
|
|
1303
|
+
const pattern = entrypoint.entrypoint.replace(/\\/g, "/");
|
|
1304
|
+
const paths = glob.isDynamicPattern(pattern) ? await glob(pattern, { onlyFiles: true }) : [entrypoint.entrypoint];
|
|
1305
|
+
return new Set(paths);
|
|
1306
|
+
}
|
|
1282
1307
|
async function run(entrypoint, { config, logger }) {
|
|
1283
1308
|
const destination = entrypoint.destination ?? config.destination;
|
|
1284
1309
|
const obsolete = entrypoint.obsolete ?? config.obsolete;
|
|
1285
1310
|
const exclude = entrypoint.exclude ?? config.exclude;
|
|
1286
1311
|
const walk = entrypoint.walk ?? config.walk;
|
|
1312
|
+
const paths = /* @__PURE__ */ new Set();
|
|
1287
1313
|
const context = {
|
|
1288
1314
|
config: {
|
|
1289
1315
|
...config,
|
|
@@ -1293,6 +1319,7 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1293
1319
|
walk
|
|
1294
1320
|
},
|
|
1295
1321
|
generatedAt: /* @__PURE__ */ new Date(),
|
|
1322
|
+
paths,
|
|
1296
1323
|
logger
|
|
1297
1324
|
};
|
|
1298
1325
|
logger?.info(entrypoint, "starting extraction");
|
|
@@ -1317,6 +1344,19 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1317
1344
|
function defer(namespace$3) {
|
|
1318
1345
|
return getDeferred(namespace$3).promise;
|
|
1319
1346
|
}
|
|
1347
|
+
function source(path$1) {
|
|
1348
|
+
if (paths.has(path$1)) return;
|
|
1349
|
+
logger?.debug({
|
|
1350
|
+
entrypoint: entrypoint.entrypoint,
|
|
1351
|
+
path: path$1
|
|
1352
|
+
}, "resolved path");
|
|
1353
|
+
paths.add(path$1);
|
|
1354
|
+
resolve$1({
|
|
1355
|
+
entrypoint: path$1,
|
|
1356
|
+
path: path$1,
|
|
1357
|
+
namespace: "source"
|
|
1358
|
+
});
|
|
1359
|
+
}
|
|
1320
1360
|
function resolve$1(args) {
|
|
1321
1361
|
const { entrypoint: entrypoint$1, path: path$1, namespace: namespace$3 } = args;
|
|
1322
1362
|
const skipped = context.config.exclude.some((ex) => typeof ex === "function" ? ex(args) : ex.test(args.path));
|
|
@@ -1361,6 +1401,7 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1361
1401
|
}
|
|
1362
1402
|
const build = {
|
|
1363
1403
|
context,
|
|
1404
|
+
source,
|
|
1364
1405
|
resolve: resolve$1,
|
|
1365
1406
|
load,
|
|
1366
1407
|
process: process$1,
|
|
@@ -1389,17 +1430,7 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1389
1430
|
logger?.debug({ plugin: plugin.name }, "setting up plugin");
|
|
1390
1431
|
plugin.setup(build);
|
|
1391
1432
|
}
|
|
1392
|
-
const
|
|
1393
|
-
const paths = glob.isDynamicPattern(pattern) ? await glob(pattern, { onlyFiles: true }) : [entrypoint.entrypoint];
|
|
1394
|
-
logger?.debug({
|
|
1395
|
-
entrypoint: entrypoint.entrypoint,
|
|
1396
|
-
paths
|
|
1397
|
-
}, "resolved paths");
|
|
1398
|
-
for (const path$1 of paths) resolve$1({
|
|
1399
|
-
entrypoint: path$1,
|
|
1400
|
-
path: path$1,
|
|
1401
|
-
namespace: "source"
|
|
1402
|
-
});
|
|
1433
|
+
for (const path$1 of await getPaths(entrypoint)) source(path$1);
|
|
1403
1434
|
async function processTask(task) {
|
|
1404
1435
|
const { type } = task;
|
|
1405
1436
|
let args = task.args;
|
|
@@ -1436,4 +1467,4 @@ async function run(entrypoint, { config, logger }) {
|
|
|
1436
1467
|
|
|
1437
1468
|
//#endregion
|
|
1438
1469
|
export { cleanup, core, po, react, run };
|
|
1439
|
-
//# sourceMappingURL=run-
|
|
1470
|
+
//# sourceMappingURL=run-Dc4eZUPV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-Dc4eZUPV.js","names":["namespace","path","path","entrypointQuery: EntrypointSpec","importQuery: ImportQuerySpec","current: Parser.SyntaxNode | null","messageQuery: QuerySpec","allowed","messageInvalidQuery: QuerySpec","ids: string[]","strs: string[]","subMatch: Parser.QueryMatch","translation: Translation","contextMsgQuery: QuerySpec","msgCall","contextPluralQuery: QuerySpec","contextInvalidQuery: QuerySpec","gettextQuery: QuerySpec","gettextInvalidQuery: QuerySpec","msgCall","plainMsg","msgArg","ngettextQuery: QuerySpec","msgCall","npgettextQuery: QuerySpec","pgettextQuery: QuerySpec","pluralQuery: QuerySpec","queries: QuerySpec[]","messageQuery","pluralQuery","path","parseSource","context: Context","translations: Translation[]","warnings: Warning[]","imports: string[]","queries","fs","resolved: string[]","filter","namespace","path","parseSource","translations: GetTextTranslationRecord","value","normalizedHeaders: Record<string, string>","headers: Record<string, string>","translations: GetTextTranslationRecord","obsoleteTranslations: GetTextTranslationRecord","collected: GetTextTranslationRecord","translations","existing","path","parts: Part[]","text","strings: string[]","values: string[]","messageQuery: QuerySpec","attrs: Parser.SyntaxNode[]","msgctxt: string | undefined","childValue: Parser.SyntaxNode | undefined","error: string | undefined","translation: Translation","forms: string[]","pluralQuery: QuerySpec","attrs: Parser.SyntaxNode[]","msgctxt: string | undefined","formsNode: Parser.SyntaxNode | null | undefined","translation: Translation","queries: QuerySpec[]","context: Context","path","translations: Translation[]","warnings: Warning[]","path","context: Context","resolvers: { filter: Filter; hook: ResolveHook }[]","loaders: { filter: Filter; hook: LoadHook }[]","processors: { filter: Filter; hook: ProcessHook }[]","queue: Task[]","defer","namespace","path","resolve","process","build: Build","filter"],"sources":["../src/defer.ts","../src/plugins/cleanup/cleanup.ts","../src/plugins/core/queries/comment.ts","../src/plugins/core/queries/entrypoint.ts","../src/plugins/core/queries/import.ts","../src/plugins/core/queries/utils.ts","../src/plugins/core/queries/message.ts","../src/plugins/core/queries/plural-utils.ts","../src/plugins/core/queries/context.ts","../src/plugins/core/queries/gettext.ts","../src/plugins/core/queries/ngettext.ts","../src/plugins/core/queries/npgettext.ts","../src/plugins/core/queries/pgettext.ts","../src/plugins/core/queries/plural.ts","../src/plugins/core/queries/index.ts","../src/plugins/core/parse.ts","../src/plugins/core/resolve.ts","../src/plugins/core/core.ts","../src/plugins/po/collect.ts","../src/plugins/po/hasChanges.ts","../src/plugins/po/merge.ts","../src/plugins/po/po.ts","../src/plugins/react/queries/utils.ts","../src/plugins/react/queries/message.ts","../src/plugins/react/queries/plural.ts","../src/plugins/react/queries/index.ts","../src/plugins/react/parse.ts","../src/plugins/react/react.ts","../src/plugins/static.ts","../src/run.ts"],"sourcesContent":["export class Defer {\n pending = 0;\n promise: Promise<void> = Promise.resolve();\n resolve?: () => void;\n\n enqueue() {\n if (this.pending++ === 0) {\n this.promise = new Promise<void>((res) => {\n this.resolve = res;\n });\n }\n }\n dequeue() {\n if (this.pending > 0 && --this.pending === 0) {\n this.resolve?.();\n }\n }\n}\n","import fs from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport * as gettextParser from \"gettext-parser\";\n\nimport type { Plugin } from \"../../plugin.ts\";\n\nconst namespace = \"cleanup\";\n\nexport function cleanup(): Plugin {\n return {\n name: \"cleanup\",\n setup(build) {\n build.context.logger?.debug(\"cleanup plugin initialized\");\n const processed = new Set<string>();\n const generated = new Set<string>();\n const dirs = new Set<string>();\n let dispatched = false;\n\n build.onResolve({ namespace, filter: /.*/ }, ({ path }) => {\n generated.add(path);\n dirs.add(dirname(path));\n\n Promise.all([build.defer(\"source\"), build.defer(\"translate\"), build.defer(namespace)]).then(() => {\n if (dispatched) {\n return;\n }\n dispatched = true;\n\n for (const path of dirs.values()) {\n build.process({ entrypoint: path, path, namespace, data: undefined });\n }\n });\n\n return undefined;\n });\n\n build.onProcess({ namespace, filter: /.*/ }, async ({ path }) => {\n if (processed.has(path)) {\n return undefined;\n }\n processed.add(path);\n const files = await fs.readdir(path).catch(() => []);\n for (const f of files.filter((p) => p.endsWith(\".po\"))) {\n const full = join(path, f);\n const contents = await fs.readFile(full).catch(() => undefined);\n if (!contents) {\n continue;\n }\n const parsed = gettextParser.po.parse(contents);\n const hasTranslations = Object.entries(parsed.translations || {}).some(([ctx, msgs]) =>\n Object.keys(msgs).some((id) => !(ctx === \"\" && id === \"\")),\n );\n if (!hasTranslations && generated.has(full)) {\n await fs.unlink(full);\n }\n if (hasTranslations && !generated.has(full)) {\n build.context.logger?.warn({ path: full }, \"stray translation file\");\n }\n }\n return undefined;\n });\n },\n };\n}\n","import { relative } from \"node:path\";\nimport type Parser from \"@keqingmoe/tree-sitter\";\n\nimport type { Context, QuerySpec } from \"./types.ts\";\n\nexport function getReference(node: Parser.SyntaxNode, { path }: Context) {\n const line = node.startPosition.row + 1;\n const rel = relative(process.cwd(), path).replace(/\\\\+/g, \"/\");\n return `${rel}:${line}`;\n}\n\nexport function getComment(node: Parser.SyntaxNode): string {\n const text = node.text;\n if (text.startsWith(\"/*\")) {\n return text\n .slice(2, -2)\n .replace(/^\\s*\\*?\\s*/gm, \"\")\n .trim();\n }\n return text.replace(/^\\/\\/\\s?/, \"\").trim();\n}\n\nexport const withComment = (query: QuerySpec): QuerySpec => ({\n pattern: `(\n\t((comment) @comment)?\n .\n\t(_ ${query.pattern})\n)`,\n extract(match) {\n const result = query.extract(match);\n if (!result?.translation) {\n return result;\n }\n\n const comment = match.captures.find((c) => c.name === \"comment\")?.node;\n if (!comment) {\n return result;\n }\n\n if (comment) {\n result.translation.comments = {\n ...result.translation.comments,\n extracted: getComment(comment),\n };\n }\n\n return result;\n },\n});\n","import type Parser from \"@keqingmoe/tree-sitter\";\nimport { getComment } from \"./comment.ts\";\nimport type { EntrypointSpec } from \"./types.ts\";\n\nconst entrypointCommentPattern = /(?:^|\\s)@?translate-entrypoint(?:\\s|$)/;\n\nexport const entrypointQuery: EntrypointSpec = {\n pattern: `(comment) @comment`,\n extract(match: Parser.QueryMatch): boolean | undefined {\n return match.captures\n .filter((capture) => capture.name === \"comment\")\n .some((capture) => entrypointCommentPattern.test(getComment(capture.node)));\n },\n};\n","import type Parser from \"@keqingmoe/tree-sitter\";\nimport type { ImportQuerySpec } from \"./types.ts\";\n\nexport const importQuery: ImportQuerySpec = {\n pattern: `\n [\n (import_statement\n source: (string (string_fragment) @import))\n (export_statement\n source: (string (string_fragment) @import))\n (call_expression\n function: (identifier) @func\n arguments: (arguments (string (string_fragment) @import))\n (#eq? @func \"require\"))\n (call_expression\n function: (member_expression\n object: (identifier) @obj\n property: (property_identifier) @method)\n arguments: (arguments (string (string_fragment) @import))\n (#eq? @obj \"require\")\n (#eq? @method \"resolve\"))\n (call_expression\n function: (import)\n arguments: (arguments (string (string_fragment) @import)))\n ]\n `,\n extract(match: Parser.QueryMatch): string | undefined {\n const node = match.captures.find((c) => c.name === \"import\")?.node;\n return node?.text;\n },\n};\n","import type Parser from \"@keqingmoe/tree-sitter\";\n\nexport const callPattern = (fnName: string, args: string, allowMember = true): string => `(\n (call_expression\n function: ${\n allowMember\n ? `[\n (identifier) @func\n (member_expression property: (property_identifier) @func)\n ]`\n : `(identifier) @func`\n }\n arguments: ${args}\n ) @call\n (#eq? @func \"${fnName}\")\n)`;\n\nexport function isDescendant(node: Parser.SyntaxNode, ancestor: Parser.SyntaxNode): boolean {\n let current: Parser.SyntaxNode | null = node;\n while (current) {\n if (current.id === ancestor.id) return true;\n current = current.parent;\n }\n return false;\n}\n","import type Parser from \"@keqingmoe/tree-sitter\";\nimport { withComment } from \"./comment.ts\";\nimport type { MessageMatch, QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst notInPlural = (query: QuerySpec): QuerySpec => ({\n pattern: query.pattern,\n extract(match) {\n const result = query.extract(match);\n if (!result?.node) {\n return result;\n }\n\n let parent = result.node.parent;\n\n if (parent && parent.type === \"arguments\") {\n parent = parent.parent;\n }\n\n if (parent && parent.type === \"call_expression\") {\n const fn = parent.childForFieldName(\"function\");\n if (fn) {\n if (\n (fn.type === \"identifier\" &&\n (fn.text === \"plural\" ||\n fn.text === \"ngettext\" ||\n fn.text === \"pgettext\" ||\n fn.text === \"npgettext\")) ||\n (fn.type === \"member_expression\" &&\n [\"plural\", \"ngettext\", \"pgettext\", \"npgettext\"].includes(\n fn.childForFieldName(\"property\")?.text ?? \"\",\n ))\n ) {\n return undefined;\n }\n }\n }\n\n return result;\n },\n});\n\nexport const messageArg = `[\n (string (string_fragment) @msgid)\n (object\n (_)*\n (pair\n key: (property_identifier) @id_key\n value: (string (string_fragment) @id)\n (#eq? @id_key \"id\")\n )?\n (_)*\n (pair\n key: (property_identifier) @msg_key\n value: (string (string_fragment) @message)\n (#eq? @msg_key \"message\")\n )?\n (_)*\n )\n (template_string) @tpl\n]`;\n\nexport const messageArgs = `[ (arguments ${messageArg}) (template_string) @tpl ]`;\n\nexport const extractMessage =\n (name: string) =>\n (match: Parser.QueryMatch): MessageMatch | undefined => {\n const node = match.captures.find((c) => c.name === \"call\")?.node;\n if (!node) {\n return undefined;\n }\n\n const msgid = match.captures.find((c) => c.name === \"msgid\")?.node.text;\n if (msgid) {\n return {\n node,\n translation: {\n id: msgid,\n message: [msgid],\n },\n };\n }\n\n const tpl = match.captures.find((c) => c.name === \"tpl\")?.node;\n if (tpl) {\n for (const child of tpl.children) {\n if (child.type !== \"template_substitution\") {\n continue;\n }\n\n const expr = child.namedChildren[0];\n if (!expr || expr.type !== \"identifier\") {\n return {\n node,\n error: `${name}() template expressions must be simple identifiers`,\n };\n }\n }\n\n const text = tpl.text.slice(1, -1);\n\n return {\n node,\n translation: { id: text, message: [text] },\n };\n }\n\n const id = match.captures.find((c) => c.name === \"id\")?.node.text;\n const message = match.captures.find((c) => c.name === \"message\")?.node.text;\n const msgId = id ?? message;\n if (!msgId) {\n return undefined;\n }\n\n const msgstr = message ?? id ?? \"\";\n\n return {\n node,\n translation: {\n id: msgId,\n message: [msgstr],\n },\n };\n };\n\nexport const messageQuery: QuerySpec = notInPlural(\n withComment({\n pattern: callPattern(\"message\", messageArgs),\n extract: extractMessage(\"message\"),\n }),\n);\n\nconst allowed = new Set([\"string\", \"object\", \"template_string\"]);\n\nexport const messageInvalidQuery: QuerySpec = notInPlural({\n pattern: callPattern(\"message\", \"(arguments (_) @arg)\"),\n extract(match) {\n const call = match.captures.find((c) => c.name === \"call\")?.node;\n const node = match.captures.find((c) => c.name === \"arg\")?.node;\n\n if (!call || !node) {\n return undefined;\n }\n\n if (allowed.has(node.type)) {\n return undefined;\n }\n\n return {\n node,\n error: \"message() argument must be a string literal, object literal, or template literal\",\n };\n },\n});\n","import type Parser from \"@keqingmoe/tree-sitter\";\nimport { extractMessage } from \"./message.ts\";\nimport type { MessageMatch, Translation } from \"./types.ts\";\nimport { isDescendant } from \"./utils.ts\";\n\nexport const extractPluralForms =\n (name: string) =>\n (match: Parser.QueryMatch): MessageMatch | undefined => {\n const call = match.captures.find((c) => c.name === \"call\")?.node;\n const n = match.captures.find((c) => c.name === \"n\")?.node;\n if (!call || !n || n.nextNamedSibling) {\n return undefined;\n }\n\n const msgctxt = match.captures.find((c) => c.name === \"msgctxt\")?.node?.text;\n const msgNodes = match.captures.filter((c) => c.name === \"msg\").map((c) => c.node);\n\n const ids: string[] = [];\n const strs: string[] = [];\n\n for (const node of msgNodes) {\n const relevant = match.captures.filter(\n (c) => [\"msgid\", \"id\", \"message\", \"tpl\"].includes(c.name) && isDescendant(c.node, node),\n );\n\n const subMatch: Parser.QueryMatch = {\n pattern: 0,\n captures: [{ name: \"call\", node }, ...relevant],\n };\n\n const result = extractMessage(name)(subMatch);\n if (!result) continue;\n if (result.error) {\n return { node: call, error: result.error };\n }\n if (result.translation) {\n ids.push(result.translation.id);\n strs.push(result.translation.message[0] ?? \"\");\n }\n }\n\n if (ids.length === 0) {\n return undefined;\n }\n\n const translation: Translation = {\n id: ids[0],\n plural: ids[1],\n message: strs,\n };\n if (msgctxt) translation.context = msgctxt;\n\n return { node: call, translation };\n };\n","import { withComment } from \"./comment.ts\";\nimport { extractMessage, messageArgs } from \"./message.ts\";\nimport { extractPluralForms } from \"./plural-utils.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst ctxCall = callPattern(\n \"context\",\n `[\n (arguments (string (string_fragment) @msgctxt))\n (template_string) @msgctxt\n]`,\n)\n .replace(/@call/g, \"@ctx\")\n .replace(/@func/g, \"@ctxfn\");\n\nexport const contextMsgQuery: QuerySpec = withComment({\n pattern: `(\n (call_expression\n function: (member_expression\n object: ${ctxCall}\n property: (property_identifier) @func\n )\n arguments: ${messageArgs}\n ) @call\n (#eq? @func \"message\")\n)`,\n extract(match) {\n const result = extractMessage(\"context.message\")(match);\n const contextNode = match.captures.find((c) => c.name === \"msgctxt\")?.node;\n if (!result || !result.translation || !contextNode) {\n return result;\n }\n\n if (contextNode.type === \"template_string\") {\n for (const child of contextNode.children) {\n if (child.type !== \"template_substitution\") {\n continue;\n }\n\n const expr = child.namedChildren[0];\n if (!expr || expr.type !== \"identifier\") {\n return {\n node: contextNode,\n error: \"context() template expressions must be simple identifiers\",\n };\n }\n }\n }\n\n const contextText = contextNode.type === \"template_string\" ? contextNode.text.slice(1, -1) : contextNode.text;\n return {\n node: result.node,\n translation: {\n ...result.translation,\n context: contextText,\n },\n };\n },\n});\n\nconst msgCall = callPattern(\"message\", messageArgs, false).replace(/@call/g, \"@msg\").replace(/@func/g, \"@msgfn\");\n\nexport const contextPluralQuery: QuerySpec = withComment({\n pattern: `(\n (call_expression\n function: (member_expression\n object: ${ctxCall}\n property: (property_identifier) @func\n )\n arguments: (arguments (\n (${msgCall} (\",\" )?)+\n (number) @n\n ))\n ) @call\n (#eq? @func \"plural\")\n)`,\n extract: extractPluralForms(\"context.plural\"),\n});\n\nexport const contextInvalidQuery: QuerySpec = withComment({\n pattern: ctxCall,\n extract(match) {\n const call = match.captures.find((c) => c.name === \"ctx\")?.node;\n if (!call) {\n return undefined;\n }\n\n const parent = call.parent;\n if (parent && parent.type === \"member_expression\" && parent.childForFieldName(\"object\")?.id === call.id) {\n const property = parent.childForFieldName(\"property\")?.text;\n const grandparent = parent.parent;\n if (\n grandparent &&\n grandparent.type === \"call_expression\" &&\n grandparent.childForFieldName(\"function\")?.id === parent.id &&\n (property === \"message\" || property === \"plural\")\n ) {\n return undefined;\n }\n }\n\n return {\n node: call,\n error: \"context() must be used with message() or plural() in the same expression\",\n };\n },\n});\n","import { withComment } from \"./comment.ts\";\nimport { extractMessage, messageArgs } from \"./message.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nexport const gettextQuery: QuerySpec = withComment({\n pattern: callPattern(\"gettext\", messageArgs),\n extract: extractMessage(\"gettext\"),\n});\n\nconst allowed = new Set([\"string\", \"object\", \"template_string\", \"identifier\", \"call_expression\"]);\n\nexport const gettextInvalidQuery: QuerySpec = {\n pattern: callPattern(\"gettext\", \"(arguments (_) @arg)\"),\n extract(match) {\n const call = match.captures.find((c) => c.name === \"call\")?.node;\n const node = match.captures.find((c) => c.name === \"arg\")?.node;\n\n if (!call || !node) {\n return undefined;\n }\n\n if (allowed.has(node.type)) {\n return undefined;\n }\n\n return {\n node,\n error: \"gettext() argument must be a string literal, object literal, or template literal\",\n };\n },\n};\n","import { withComment } from \"./comment.ts\";\nimport { messageArg, messageArgs } from \"./message.ts\";\nimport { extractPluralForms } from \"./plural-utils.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst msgCall = callPattern(\"message\", messageArgs).replace(/@call/g, \"@msg\").replace(/@func/g, \"@msgfn\");\nconst plainMsg = `(${messageArg}) @msg`;\nconst msgArg = `[${msgCall} ${plainMsg}]`;\n\nexport const ngettextQuery: QuerySpec = withComment({\n pattern: callPattern(\"ngettext\", `(arguments ${msgArg} \",\" ${msgArg} (\",\" ${msgArg})* \",\" (_) @n)`),\n extract: extractPluralForms(\"ngettext\"),\n});\n","import { withComment } from \"./comment.ts\";\nimport { messageArg, messageArgs } from \"./message.ts\";\nimport { extractPluralForms } from \"./plural-utils.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst msgCall = callPattern(\"message\", messageArgs).replace(/@call/g, \"@msg\").replace(/@func/g, \"@msgfn\");\nconst plainMsg = `(${messageArg}) @msg`;\nconst msgArg = `[${msgCall} ${plainMsg}]`;\n\nexport const npgettextQuery: QuerySpec = withComment({\n pattern: callPattern(\n \"npgettext\",\n `(arguments (string (string_fragment) @msgctxt) \",\" ${msgArg} \",\" ${msgArg} (\",\" ${msgArg})* \",\" (_) @n)`,\n ),\n extract: extractPluralForms(\"npgettext\"),\n});\n","import { withComment } from \"./comment.ts\";\nimport { extractMessage, messageArg } from \"./message.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nexport const pgettextQuery: QuerySpec = withComment({\n pattern: callPattern(\"pgettext\", `(arguments (string (string_fragment) @msgctxt) \",\" ${messageArg})`),\n extract(match) {\n const result = extractMessage(\"pgettext\")(match);\n const contextNode = match.captures.find((c) => c.name === \"msgctxt\")?.node;\n if (!result || !contextNode || !result.translation) {\n return result;\n }\n return {\n node: result.node,\n translation: {\n ...result.translation,\n context: contextNode.text,\n },\n };\n },\n});\n","import { withComment } from \"./comment.ts\";\nimport { messageArgs } from \"./message.ts\";\nimport { extractPluralForms } from \"./plural-utils.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst msgCall = callPattern(\"message\", messageArgs, false).replace(/@call/g, \"@msg\").replace(/@func/g, \"@msgfn\");\n\nexport const pluralQuery: QuerySpec = withComment({\n pattern: callPattern(\n \"plural\",\n `(arguments (\n (${msgCall} (\",\" )?)+\n (number) @n\n ))`,\n false,\n ),\n extract: extractPluralForms(\"plural\"),\n});\n","import { contextInvalidQuery, contextMsgQuery, contextPluralQuery } from \"./context.ts\";\nimport { gettextInvalidQuery, gettextQuery } from \"./gettext.ts\";\nimport { messageInvalidQuery, messageQuery } from \"./message.ts\";\nimport { ngettextQuery } from \"./ngettext.ts\";\nimport { npgettextQuery } from \"./npgettext.ts\";\nimport { pgettextQuery } from \"./pgettext.ts\";\nimport { pluralQuery } from \"./plural.ts\";\nimport type { QuerySpec } from \"./types.ts\";\n\nexport type { MessageMatch, QuerySpec } from \"./types.ts\";\n\nexport const queries: QuerySpec[] = [\n contextMsgQuery,\n contextPluralQuery,\n contextInvalidQuery,\n messageQuery,\n messageInvalidQuery,\n gettextQuery,\n gettextInvalidQuery,\n pluralQuery,\n ngettextQuery,\n pgettextQuery,\n npgettextQuery,\n];\n","import fs from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\n\nimport Parser from \"@keqingmoe/tree-sitter\";\nimport JavaScript from \"tree-sitter-javascript\";\nimport TS from \"tree-sitter-typescript\";\n\nimport { getReference } from \"./queries/comment.ts\";\nimport { entrypointQuery } from \"./queries/entrypoint.ts\";\nimport { importQuery } from \"./queries/import.ts\";\nimport { queries } from \"./queries/index.ts\";\nimport type { Context, Translation, Warning } from \"./queries/types.ts\";\n\nexport interface ParseResult {\n translations: Translation[];\n imports: string[];\n warnings: Warning[];\n entrypoint: boolean;\n}\n\nfunction getLanguage(ext: string) {\n switch (ext) {\n case \".ts\":\n return TS.typescript;\n case \".tsx\":\n return TS.tsx;\n default:\n return JavaScript;\n }\n}\n\nconst parserCache = new Map<string, { parser: Parser; language: Parser.Language }>();\nconst queryCache = new WeakMap<Parser.Language, Map<string, Parser.Query>>();\n\nfunction getCachedParser(ext: string) {\n let cached = parserCache.get(ext);\n if (!cached) {\n const parser = new Parser();\n const language = getLanguage(ext) as Parser.Language;\n parser.setLanguage(language);\n cached = { parser, language };\n parserCache.set(ext, cached);\n }\n return cached;\n}\n\nfunction getCachedQuery(language: Parser.Language, pattern: string) {\n let cache = queryCache.get(language);\n if (!cache) {\n cache = new Map();\n queryCache.set(language, cache);\n }\n\n let query = cache.get(pattern);\n if (!query) {\n query = new Parser.Query(language, pattern);\n cache.set(pattern, query);\n }\n\n return query;\n}\n\nexport function getParser(path: string) {\n const ext = extname(path);\n return getCachedParser(ext);\n}\n\nexport function getQuery(language: Parser.Language, pattern: string) {\n return getCachedQuery(language, pattern);\n}\n\nexport function parseFile(filePath: string): ParseResult {\n const path = resolve(filePath);\n const source = fs.readFileSync(path, \"utf8\");\n return parseSource(source, path);\n}\n\nexport function parseSource(source: string, path: string): ParseResult {\n const context: Context = {\n path,\n };\n\n const { parser, language } = getParser(path);\n const tree = parser.parse(source);\n\n const commentQuery = getCachedQuery(language, entrypointQuery.pattern);\n const entrypoint = commentQuery.matches(tree.rootNode).some(entrypointQuery.extract);\n\n const translations: Translation[] = [];\n const warnings: Warning[] = [];\n const imports: string[] = [];\n\n const seen = new Set<number>();\n\n for (const spec of queries) {\n const query = getCachedQuery(language, spec.pattern);\n for (const match of query.matches(tree.rootNode)) {\n const message = spec.extract(match);\n if (!message) {\n continue;\n }\n\n const { node, translation, error } = message;\n if (seen.has(node.id)) {\n continue;\n }\n seen.add(node.id);\n const reference = getReference(node, context);\n\n if (translation) {\n translations.push({\n ...translation,\n comments: {\n ...translation.comments,\n reference,\n },\n });\n }\n\n if (error) {\n warnings.push({\n error,\n reference,\n });\n }\n }\n }\n\n const importTreeQuery = getCachedQuery(language, importQuery.pattern);\n for (const match of importTreeQuery.matches(tree.rootNode)) {\n const imp = importQuery.extract(match);\n if (imp) {\n imports.push(imp);\n }\n }\n\n return { translations, imports, warnings, entrypoint };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ResolverFactory } from \"oxc-resolver\";\n\nfunction findTsconfig(dir: string): string | undefined {\n let current = dir;\n while (true) {\n const config = path.join(current, \"tsconfig.json\");\n if (fs.existsSync(config)) {\n return config;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\nconst resolverCache = new Map<string, ResolverFactory>();\n\nfunction getResolver(dir: string) {\n const tsconfig = findTsconfig(dir);\n const key = tsconfig ?? \"__default__\";\n let resolver = resolverCache.get(key);\n if (!resolver) {\n resolver = new ResolverFactory({\n extensions: [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".json\"],\n conditionNames: [\"import\", \"require\", \"node\"],\n ...(tsconfig ? { tsconfig: { configFile: tsconfig } } : {}),\n });\n resolverCache.set(key, resolver);\n }\n return resolver;\n}\n\nfunction resolveFromDir(dir: string, spec: string): string | undefined {\n const resolver = getResolver(dir);\n const res = resolver.sync(dir, spec) as { path?: string };\n return res.path;\n}\n\nexport function resolveImport(file: string, spec: string): string | undefined {\n const dir = path.dirname(path.resolve(file));\n return resolveFromDir(dir, spec);\n}\n\nexport function resolveImports(file: string, imports: string[]): string[] {\n const dir = path.dirname(path.resolve(file));\n const resolver = getResolver(dir);\n const resolved: string[] = [];\n for (const spec of imports) {\n const res = resolver.sync(dir, spec) as { path?: string };\n if (res.path) {\n resolved.push(res.path);\n }\n }\n return resolved;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport type { Plugin } from \"../../plugin.ts\";\nimport { parseSource } from \"./parse.ts\";\nimport type { Translation } from \"./queries/types.ts\";\nimport { resolveImports } from \"./resolve.ts\";\n\nconst filter = /\\.([cm]?tsx?|jsx?)$/;\nconst namespace = \"source\";\n\nexport function core(): Plugin<string, Translation[]> {\n return {\n name: \"core\",\n setup(build) {\n build.context.logger?.debug(\"core plugin initialized\");\n build.onResolve({ filter, namespace }, ({ entrypoint, path }) => {\n return {\n entrypoint,\n namespace,\n path: resolve(path),\n };\n });\n\n build.onLoad({ filter, namespace }, async ({ entrypoint, path }) => {\n const data = await readFile(path, \"utf8\");\n return {\n entrypoint,\n path,\n namespace,\n data,\n };\n });\n\n build.onProcess({ filter, namespace }, ({ entrypoint, path, data }) => {\n const result = parseSource(data, path);\n\n if (result.entrypoint && entrypoint !== path) {\n build.source(path);\n return;\n }\n\n const { translations, imports, warnings } = result;\n\n if (build.context.config.walk) {\n const paths = resolveImports(path, imports);\n for (const path of paths) {\n if (build.context.paths.has(path)) {\n continue;\n }\n\n build.resolve({ entrypoint, path, namespace });\n }\n }\n\n for (const warning of warnings) {\n build.context.logger?.warn(`${warning.error} at ${warning.reference}`);\n }\n\n build.resolve({\n entrypoint,\n path,\n namespace: \"translate\",\n data: translations,\n });\n\n return undefined;\n });\n },\n };\n}\n","import type { GetTextTranslationRecord } from \"gettext-parser\";\nimport { getNPlurals } from \"plural-forms\";\n\nimport type { Translation } from \"../core/queries/types.ts\";\n\nexport function collect(source: Translation[], locale?: string): GetTextTranslationRecord {\n const translations: GetTextTranslationRecord = { \"\": {} };\n const nplurals = locale ? getNPlurals(locale) : undefined;\n\n for (const { context, id, message, comments, obsolete, plural } of source) {\n const ctx = context || \"\";\n if (!translations[ctx]) {\n translations[ctx] = {};\n }\n\n const length = plural ? (nplurals ?? message.length) : 1;\n\n const existing = translations[ctx][id];\n const refs = new Set<string>();\n if (existing?.comments?.reference) {\n existing.comments.reference.split(/\\r?\\n|\\r/).forEach((r) => {\n refs.add(r);\n });\n }\n if (comments?.reference) {\n comments.reference.split(/\\r?\\n|\\r/).forEach((r) => {\n refs.add(r);\n });\n }\n\n const msgstr = existing?.msgstr ? existing.msgstr.slice(0, length) : Array.from({ length }, () => \"\");\n while (msgstr.length < length) msgstr.push(\"\");\n\n translations[ctx][id] = {\n msgctxt: context || undefined,\n msgid: id,\n msgid_plural: plural,\n msgstr,\n comments: {\n ...existing?.comments,\n ...comments,\n reference: refs.size ? Array.from(refs).join(\"\\n\") : undefined,\n },\n obsolete: existing?.obsolete ?? obsolete,\n };\n }\n\n return translations;\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport type { GetTextTranslations } from \"gettext-parser\";\nimport * as gettextParser from \"gettext-parser\";\n\nconst IGNORED_HEADER_KEYS = new Set([\"pot-creation-date\", \"po-revision-date\"]);\nconst IGNORED_HEADER_LINE_PREFIXES = [\"pot-creation-date:\", \"po-revision-date:\"];\n\nfunction normalizeHeaderString(value: string): string {\n const lines = value.split(\"\\n\");\n const hadTrailingNewline = value.endsWith(\"\\n\");\n\n const filtered = lines\n .filter((line) => {\n const trimmed = line.trimStart().toLowerCase();\n return !IGNORED_HEADER_LINE_PREFIXES.some((prefix) => trimmed.startsWith(prefix));\n })\n .map((line) => {\n const separatorIndex = line.indexOf(\":\");\n if (separatorIndex === -1) {\n return line;\n }\n\n const key = line.slice(0, separatorIndex).trim().toLowerCase();\n const value = line.slice(separatorIndex + 1);\n return `${key}:${value}`;\n });\n\n if (hadTrailingNewline && filtered[filtered.length - 1] !== \"\") {\n filtered.push(\"\");\n }\n\n return filtered.join(\"\\n\");\n}\n\nfunction normalize(translations: GetTextTranslations): GetTextTranslations {\n const compiled = gettextParser.po.compile(translations);\n const parsed = gettextParser.po.parse(compiled);\n\n if (parsed.headers) {\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed.headers)) {\n if (!IGNORED_HEADER_KEYS.has(key.toLowerCase())) {\n normalizedHeaders[key.toLowerCase()] = value as string;\n }\n }\n parsed.headers = normalizedHeaders;\n }\n\n const headerMessage = parsed.translations?.[\"\"]?.[\"\"];\n if (headerMessage?.msgstr) {\n headerMessage.msgstr = headerMessage.msgstr.map((item) => normalizeHeaderString(item));\n }\n\n return parsed;\n}\n\nexport function hasChanges(left: GetTextTranslations, right?: GetTextTranslations): boolean {\n if (!right) {\n return true;\n }\n\n const normalizedLeft = normalize(left);\n const normalizedRight = normalize(right);\n\n return !isDeepStrictEqual(normalizedLeft, normalizedRight);\n}\n","import type { GetTextTranslationRecord, GetTextTranslations } from \"gettext-parser\";\nimport { getFormula, getNPlurals } from \"plural-forms\";\n\nimport type { ObsoleteStrategy } from \"../../configuration.ts\";\n\nexport interface Collected {\n translations: GetTextTranslationRecord;\n}\n\nexport function formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n const tzo = -date.getTimezoneOffset();\n const sign = tzo >= 0 ? \"+\" : \"-\";\n const offsetHours = pad(Math.floor(Math.abs(tzo) / 60));\n const offsetMinutes = pad(Math.abs(tzo) % 60);\n return `${year}-${month}-${day} ${hours}:${minutes}${sign}${offsetHours}${offsetMinutes}`;\n}\n\nexport function merge(\n sources: Collected[],\n existing: GetTextTranslations | undefined,\n obsolete: ObsoleteStrategy,\n locale: string,\n generatedAt: Date,\n): GetTextTranslations {\n let headers: Record<string, string> = {};\n let translations: GetTextTranslationRecord = { \"\": {} };\n let obsoleteTranslations: GetTextTranslationRecord = {};\n const nplurals = getNPlurals(locale);\n\n if (existing) {\n headers = existing.headers ? structuredClone(existing.headers) : {};\n translations = existing.translations ? structuredClone(existing.translations) : { \"\": {} };\n obsoleteTranslations = existing.obsolete ? structuredClone(existing.obsolete) : {};\n for (const ctx of Object.keys(translations)) {\n for (const id of Object.keys(translations[ctx])) {\n if (ctx === \"\" && id === \"\") continue;\n translations[ctx][id].obsolete = true;\n }\n }\n }\n\n const collected: GetTextTranslationRecord = { \"\": {} };\n for (const { translations } of sources) {\n for (const [ctx, msgs] of Object.entries(translations)) {\n if (!collected[ctx]) collected[ctx] = {};\n for (const [id, entry] of Object.entries(msgs)) {\n const existing = collected[ctx][id];\n const refs = new Set<string>();\n if (existing?.comments?.reference) {\n existing.comments.reference.split(/\\r?\\n|\\r/).forEach((r) => {\n refs.add(r);\n });\n }\n if (entry.comments?.reference) {\n entry.comments.reference.split(/\\r?\\n|\\r/).forEach((r) => {\n refs.add(r);\n });\n }\n collected[ctx][id] = {\n ...existing,\n ...entry,\n comments: {\n ...existing?.comments,\n ...entry.comments,\n reference: refs.size ? Array.from(refs).join(\"\\n\") : undefined,\n },\n };\n }\n }\n }\n\n for (const [ctx, msgs] of Object.entries(collected)) {\n if (!translations[ctx]) translations[ctx] = {};\n for (const [id, entry] of Object.entries(msgs)) {\n const existingEntry = translations[ctx][id] ?? obsoleteTranslations[ctx]?.[id];\n if (existingEntry) {\n entry.msgstr = existingEntry.msgstr;\n entry.comments = {\n ...entry.comments,\n translator: existingEntry.comments?.translator,\n };\n }\n delete entry.obsolete;\n entry.msgstr = entry.msgstr.slice(0, nplurals);\n while (entry.msgstr.length < nplurals) {\n entry.msgstr.push(\"\");\n }\n translations[ctx][id] = entry;\n if (obsoleteTranslations[ctx]) {\n delete obsoleteTranslations[ctx][id];\n }\n }\n }\n\n for (const ctx of Object.keys(translations)) {\n for (const id of Object.keys(translations[ctx])) {\n if (ctx === \"\" && id === \"\") {\n continue;\n }\n const entry = translations[ctx][id];\n if (entry.obsolete) {\n if (!obsoleteTranslations[ctx]) {\n obsoleteTranslations[ctx] = {};\n }\n obsoleteTranslations[ctx][id] = entry;\n delete translations[ctx][id];\n }\n }\n }\n\n headers = {\n ...headers,\n \"Content-Type\": headers[\"Content-Type\"] || \"text/plain; charset=UTF-8\",\n \"Plural-Forms\": `nplurals=${nplurals}; plural=${getFormula(locale)};`,\n language: locale,\n \"MIME-Version\": \"1.0\",\n \"Content-Transfer-Encoding\": \"8bit\",\n \"POT-Creation-Date\": formatDate(generatedAt),\n \"x-generator\": \"@let-value/translate-extract\",\n };\n\n return {\n charset: \"utf-8\",\n headers,\n translations,\n ...(obsolete === \"mark\" && Object.keys(obsoleteTranslations).length ? { obsolete: obsoleteTranslations } : {}),\n };\n}\n","import fs from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport * as gettextParser from \"gettext-parser\";\n\nimport type { Plugin } from \"../../plugin.ts\";\nimport type { Translation } from \"../core/queries/types.ts\";\nimport { collect } from \"./collect.ts\";\nimport { hasChanges } from \"./hasChanges.ts\";\nimport { merge } from \"./merge.ts\";\n\nconst namespace = \"translate\";\n\nexport function po(): Plugin {\n return {\n name: \"po\",\n setup(build) {\n build.context.logger?.debug(\"po plugin initialized\");\n const collections = new Map<\n string,\n {\n locale: string;\n translations: Translation[];\n }\n >();\n let dispatched = false;\n\n build.onResolve({ filter: /.*/, namespace }, async ({ entrypoint, path, data }) => {\n if (!data || !Array.isArray(data)) {\n return undefined;\n }\n\n for (const locale of build.context.config.locales) {\n const destination = build.context.config.destination({ entrypoint, locale, path });\n if (!collections.has(destination)) {\n collections.set(destination, { locale, translations: [] });\n }\n\n collections.get(destination)?.translations.push(...data);\n }\n\n Promise.all([build.defer(\"source\"), build.defer(namespace)]).then(() => {\n if (dispatched) {\n return;\n }\n dispatched = true;\n\n for (const path of collections.keys()) {\n build.load({ entrypoint, path, namespace });\n }\n });\n\n return undefined;\n });\n\n build.onLoad({ filter: /.*\\.po$/, namespace }, async ({ entrypoint, path }) => {\n const contents = await fs.readFile(path).catch(() => undefined);\n const data = contents ? gettextParser.po.parse(contents) : undefined;\n return {\n entrypoint,\n path,\n namespace,\n data,\n };\n });\n\n build.onProcess({ filter: /.*\\.po$/, namespace }, async ({ entrypoint, path, data }) => {\n const collected = collections.get(path);\n if (!collected) {\n build.context.logger?.warn({ path }, \"no translations collected for this path\");\n return undefined;\n }\n\n const { locale, translations } = collected;\n\n const record = collect(translations, locale);\n\n const out = merge(\n [{ translations: record }],\n data as never,\n build.context.config.obsolete,\n locale,\n build.context.generatedAt,\n );\n\n if (hasChanges(out, data as never)) {\n await fs.mkdir(dirname(path), { recursive: true });\n await fs.writeFile(path, gettextParser.po.compile(out));\n }\n\n build.resolve({\n entrypoint,\n path,\n namespace: \"cleanup\",\n data: translations,\n });\n });\n },\n };\n}\n","import type Parser from \"@keqingmoe/tree-sitter\";\n\nexport function buildTemplate(node: Parser.SyntaxNode): { text: string; error?: string } {\n const source = node.tree.rootNode.text;\n const open = node.childForFieldName(\"open_tag\");\n const close = node.childForFieldName(\"close_tag\");\n const contentStart = open?.endIndex ?? node.startIndex;\n const contentEnd = close?.startIndex ?? node.endIndex;\n\n type Part = { kind: \"text\"; text: string; raw: boolean } | { kind: \"expr\"; value: string };\n\n const parts: Part[] = [];\n let segmentStart = contentStart;\n\n const pushRawText = (endIndex: number) => {\n if (endIndex <= segmentStart) {\n segmentStart = Math.max(segmentStart, endIndex);\n return;\n }\n const text = source.slice(segmentStart, endIndex);\n if (text) {\n parts.push({ kind: \"text\", text, raw: true });\n }\n segmentStart = endIndex;\n };\n\n const children = node.namedChildren.slice(1, -1);\n for (const child of children) {\n if (child.type === \"jsx_expression\") {\n pushRawText(child.startIndex);\n const expr = child.namedChildren[0];\n if (!expr) {\n return { text: \"\", error: \"Empty JSX expression\" };\n }\n\n if (expr.type === \"identifier\") {\n parts.push({ kind: \"expr\", value: expr.text });\n } else if (expr.type === \"string\") {\n parts.push({ kind: \"text\", text: expr.text.slice(1, -1), raw: false });\n } else if (expr.type === \"template_string\") {\n const hasSubstitutions = expr.children.some((c) => c.type === \"template_substitution\");\n if (hasSubstitutions) {\n return { text: \"\", error: \"JSX expressions with template substitutions are not supported\" };\n }\n parts.push({ kind: \"text\", text: expr.text.slice(1, -1), raw: false });\n } else {\n return { text: \"\", error: \"JSX expressions must be simple identifiers, strings, or template literals\" };\n }\n segmentStart = child.endIndex;\n } else if (child.type === \"string\") {\n pushRawText(child.startIndex);\n parts.push({ kind: \"text\", text: child.text.slice(1, -1), raw: false });\n segmentStart = child.endIndex;\n } else if (child.type === \"jsx_text\" || child.type === \"html_character_reference\" || child.isError) {\n } else {\n return { text: \"\", error: \"Unsupported JSX child\" };\n }\n }\n\n pushRawText(contentEnd);\n\n const firstRawIndex = parts.findIndex((part) => part.kind === \"text\" && part.raw);\n if (firstRawIndex === 0) {\n const part = parts[firstRawIndex] as Extract<Part, { kind: \"text\" }>;\n part.text = part.text.replace(/^\\s+/, \"\");\n }\n\n let lastRawIndex = -1;\n for (let i = parts.length - 1; i >= 0; i--) {\n const part = parts[i];\n if (part.kind === \"text\" && part.raw) {\n lastRawIndex = i;\n break;\n }\n }\n if (lastRawIndex !== -1 && lastRawIndex === parts.length - 1) {\n const part = parts[lastRawIndex] as Extract<Part, { kind: \"text\" }>;\n part.text = part.text.replace(/\\s+$/, \"\");\n }\n\n const strings: string[] = [\"\"];\n const values: string[] = [];\n for (const part of parts) {\n if (part.kind === \"text\") {\n if (part.text) {\n strings[strings.length - 1] += part.text;\n }\n } else {\n values.push(part.value);\n strings.push(\"\");\n }\n }\n\n let text = \"\";\n for (let i = 0; i < strings.length; i++) {\n text += strings[i];\n if (values[i]) {\n text += `\\${${values[i]}}`;\n }\n }\n return { text };\n}\n\nexport function buildAttrValue(node: Parser.SyntaxNode): { text: string; error?: string } {\n if (node.type === \"string\") {\n return { text: node.text.slice(1, -1) };\n }\n if (node.type === \"jsx_expression\") {\n const expr = node.namedChildren[0];\n if (!expr) {\n return { text: \"\", error: \"Empty JSX expression\" };\n }\n\n if (expr.type === \"identifier\") {\n return { text: `\\${${expr.text}}` };\n } else if (expr.type === \"string\") {\n return { text: expr.text.slice(1, -1) };\n } else if (expr.type === \"template_string\") {\n // Check if it's a simple template string with no substitutions\n const hasSubstitutions = expr.children.some((c) => c.type === \"template_substitution\");\n if (hasSubstitutions) {\n return { text: \"\", error: \"JSX expressions with template substitutions are not supported\" };\n }\n // Extract the text content from the template string\n const content = expr.text.slice(1, -1); // Remove backticks\n return { text: content };\n } else {\n return { text: \"\", error: \"JSX expressions must be simple identifiers, strings, or template literals\" };\n }\n }\n return { text: \"\", error: \"Unsupported JSX child\" };\n}\n","import type Parser from \"@keqingmoe/tree-sitter\";\n\nimport { withComment } from \"../../core/queries/comment.ts\";\nimport type { MessageMatch, QuerySpec, Translation } from \"../../core/queries/types.ts\";\nimport { buildAttrValue, buildTemplate } from \"./utils.ts\";\n\nexport const messageQuery: QuerySpec = withComment({\n pattern: `(\n [\n (jsx_element (jsx_opening_element name: (identifier) @name)) @call\n (jsx_self_closing_element name: (identifier) @name) @call\n (lexical_declaration \n (variable_declarator \n value: [\n (jsx_element (jsx_opening_element name: (identifier) @name)) @call\n (jsx_self_closing_element name: (identifier) @name) @call\n ]\n )\n )\n ]\n (#eq? @name \"Message\")\n )`,\n extract(match: Parser.QueryMatch): MessageMatch | undefined {\n const node = match.captures.find((c) => c.name === \"call\")?.node;\n if (!node) return undefined;\n let attrs: Parser.SyntaxNode[] = [];\n if (node.type === \"jsx_element\") {\n const open = node.childForFieldName(\"open_tag\");\n if (open) attrs = open.namedChildren;\n } else if (node.type === \"jsx_self_closing_element\") {\n attrs = node.namedChildren.slice(1);\n }\n let msgctxt: string | undefined;\n let childValue: Parser.SyntaxNode | undefined;\n for (const child of attrs) {\n if (child.type !== \"jsx_attribute\") continue;\n const name = child.child(0);\n const value = child.child(child.childCount - 1);\n if (name?.text === \"context\" && value?.type === \"string\") {\n msgctxt = value.text.slice(1, -1);\n } else if (name?.text === \"children\" && value) {\n childValue = value;\n }\n }\n let text = \"\";\n let error: string | undefined;\n if (node.type === \"jsx_element\") {\n ({ text, error } = buildTemplate(node));\n } else if (childValue) {\n ({ text, error } = buildAttrValue(childValue));\n }\n if (error) {\n return { node, error };\n }\n if (!text) return undefined;\n const translation: Translation = {\n id: text,\n message: [text],\n };\n if (msgctxt) translation.context = msgctxt;\n return { node, translation };\n },\n});\n","import type Parser from \"@keqingmoe/tree-sitter\";\n\nimport { withComment } from \"../../core/queries/comment.ts\";\nimport type { MessageMatch, QuerySpec, Translation } from \"../../core/queries/types.ts\";\nimport { buildTemplate } from \"./utils.ts\";\n\nfunction parseForms(node: Parser.SyntaxNode): { forms: string[]; error?: string } {\n const forms: string[] = [];\n if (node.type === \"jsx_expression\") {\n const arr = node.namedChildren[0];\n if (!arr || arr.type !== \"array\") {\n return { forms: [], error: \"Plural forms must be an array\" };\n }\n for (const el of arr.namedChildren) {\n if (el.type === \"jsx_element\" || el.type === \"jsx_fragment\") {\n const { text, error } = buildTemplate(el);\n if (error) return { forms: [], error };\n forms.push(text);\n } else if (el.type === \"string\") {\n forms.push(el.text.slice(1, -1));\n } else {\n return { forms: [], error: \"Unsupported plural form\" };\n }\n }\n }\n return { forms };\n}\n\nexport const pluralQuery: QuerySpec = withComment({\n pattern: `(\n [\n (jsx_element (jsx_opening_element name: (identifier) @name))\n (jsx_self_closing_element name: (identifier) @name)\n ] @call\n (#eq? @name \"Plural\")\n )`,\n extract(match: Parser.QueryMatch): MessageMatch | undefined {\n const node = match.captures.find((c) => c.name === \"call\")?.node;\n if (!node) return undefined;\n let attrs: Parser.SyntaxNode[] = [];\n if (node.type === \"jsx_element\") {\n const open = node.childForFieldName(\"open_tag\");\n if (open) attrs = open.namedChildren;\n } else if (node.type === \"jsx_self_closing_element\") {\n attrs = node.namedChildren.slice(1);\n }\n let msgctxt: string | undefined;\n let formsNode: Parser.SyntaxNode | null | undefined;\n for (const child of attrs) {\n if (child.type !== \"jsx_attribute\") continue;\n const name = child.child(0);\n const value = child.child(child.childCount - 1);\n if (name?.text === \"context\" && value?.type === \"string\") {\n msgctxt = value.text.slice(1, -1);\n } else if (name?.text === \"forms\" && value) {\n formsNode = value;\n }\n }\n if (!formsNode) return undefined;\n const { forms, error } = parseForms(formsNode);\n if (error) {\n return { node, error };\n }\n if (forms.length === 0) return undefined;\n const translation: Translation = {\n id: forms[0],\n plural: forms[1],\n message: forms,\n };\n if (msgctxt) translation.context = msgctxt;\n return { node, translation };\n },\n});\n","import type { QuerySpec } from \"../../core/queries/types.ts\";\nimport { messageQuery } from \"./message.ts\";\nimport { pluralQuery } from \"./plural.ts\";\n\nexport const queries: QuerySpec[] = [messageQuery, pluralQuery];\n","import fs from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { getParser, getQuery } from \"../core/parse.ts\";\nimport { getReference } from \"../core/queries/comment.ts\";\n\nimport type { Context, Translation, Warning } from \"../core/queries/types.ts\";\nimport { queries } from \"./queries/index.ts\";\n\nexport interface ParseResult {\n translations: Translation[];\n warnings: Warning[];\n}\n\nexport function parseFile(filePath: string): ParseResult {\n const path = resolve(filePath);\n const source = fs.readFileSync(path, \"utf8\");\n return parseSource(source, path);\n}\n\nexport function parseSource(source: string, path: string): ParseResult {\n const context: Context = { path };\n const { parser, language } = getParser(path);\n const tree = parser.parse(source);\n\n const translations: Translation[] = [];\n const warnings: Warning[] = [];\n const seen = new Set<number>();\n\n for (const spec of queries) {\n const query = getQuery(language, spec.pattern);\n for (const match of query.matches(tree.rootNode)) {\n const message = spec.extract(match);\n if (!message) continue;\n const { node, translation, error } = message;\n if (seen.has(node.id)) continue;\n seen.add(node.id);\n const reference = getReference(node, context);\n if (translation) {\n translations.push({\n ...translation,\n comments: {\n ...translation.comments,\n reference,\n },\n });\n }\n if (error) {\n warnings.push({\n error,\n reference,\n });\n }\n }\n }\n\n return { translations, warnings };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport type { Plugin } from \"../../plugin.ts\";\nimport type { Translation } from \"../core/queries/types.ts\";\nimport { parseSource } from \"./parse.ts\";\n\nconst filter = /\\.[cm]?[jt]sx$/;\n\nexport function react(): Plugin<string, Translation[]> {\n return {\n name: \"react\",\n setup(build) {\n build.context.logger?.debug(\"react plugin initialized\");\n build.onResolve({ filter: /.*/, namespace: \"source\" }, ({ entrypoint, path, namespace }) => {\n return {\n entrypoint,\n namespace,\n path: resolve(path),\n };\n });\n build.onLoad({ filter, namespace: \"source\" }, async ({ entrypoint, path, namespace }) => {\n const data = await readFile(path, \"utf8\");\n return {\n entrypoint,\n path,\n namespace,\n data,\n };\n });\n build.onProcess({ filter, namespace: \"source\" }, ({ entrypoint, path, data }) => {\n const { translations, warnings } = parseSource(data, path);\n\n for (const warning of warnings) {\n build.context.logger?.warn(`${warning.error} at ${warning.reference}`);\n }\n\n build.resolve({\n entrypoint,\n path,\n namespace: \"translate\",\n data: translations,\n });\n\n return undefined;\n });\n },\n };\n}\n","import type { Plugin, UniversalPlugin } from \"../plugin.ts\";\n\nimport { cleanup, core, po, react } from \"./index.ts\";\n\nconst original = {\n cleanup,\n core,\n po,\n react,\n} as const;\n\nexport function resolveStaticPlugin(item: UniversalPlugin): Plugin {\n if (\"static\" in item) {\n return original[item.static.name](...item.static.props);\n }\n\n return item;\n}\n","import glob from \"fast-glob\";\nimport type { ResolvedConfig, ResolvedEntrypoint } from \"./configuration.ts\";\nimport { Defer } from \"./defer.ts\";\nimport type { Logger } from \"./logger.ts\";\nimport type {\n Build,\n Context,\n Filter,\n LoadArgs,\n LoadHook,\n ProcessArgs,\n ProcessHook,\n ResolveArgs,\n ResolveHook,\n} from \"./plugin.ts\";\nimport { resolveStaticPlugin } from \"./plugins/static.ts\";\n\nexport type Task =\n | {\n type: \"resolve\";\n args: ResolveArgs;\n }\n | {\n type: \"load\";\n args: LoadArgs;\n }\n | {\n type: \"process\";\n args: ProcessArgs;\n };\n\nasync function getPaths(entrypoint: ResolvedEntrypoint) {\n const pattern = entrypoint.entrypoint.replace(/\\\\/g, \"/\");\n const paths = glob.isDynamicPattern(pattern) ? await glob(pattern, { onlyFiles: true }) : [entrypoint.entrypoint];\n return new Set(paths);\n}\n\nexport async function run(\n entrypoint: ResolvedEntrypoint,\n { config, logger }: { config: ResolvedConfig; logger?: Logger },\n) {\n const destination = entrypoint.destination ?? config.destination;\n const obsolete = entrypoint.obsolete ?? config.obsolete;\n const exclude = entrypoint.exclude ?? config.exclude;\n const walk = entrypoint.walk ?? config.walk;\n const paths = new Set<string>();\n\n const context: Context = {\n config: { ...config, destination, obsolete, exclude, walk },\n generatedAt: new Date(),\n paths,\n logger,\n };\n\n logger?.info(entrypoint, \"starting extraction\");\n\n const resolvers: { filter: Filter; hook: ResolveHook }[] = [];\n const loaders: { filter: Filter; hook: LoadHook }[] = [];\n const processors: { filter: Filter; hook: ProcessHook }[] = [];\n const hooks = {\n resolve: resolvers,\n load: loaders,\n process: processors,\n };\n\n const pending = new Map<string, Defer>();\n const queue: Task[] = [];\n\n function getDeferred(namespace: string) {\n let defer = pending.get(namespace);\n if (defer === undefined) {\n defer = new Defer();\n pending.set(namespace, defer);\n }\n return defer;\n }\n\n function defer(namespace: string) {\n const defer = getDeferred(namespace);\n return defer.promise;\n }\n\n function source(path: string) {\n if (paths.has(path)) {\n return;\n }\n\n logger?.debug({ entrypoint: entrypoint.entrypoint, path }, \"resolved path\");\n\n paths.add(path);\n resolve({ entrypoint: path, path, namespace: \"source\" });\n }\n\n function resolve(args: ResolveArgs) {\n const { entrypoint, path, namespace } = args;\n const skipped = context.config.exclude.some((ex) => (typeof ex === \"function\" ? ex(args) : ex.test(args.path)));\n logger?.debug({ entrypoint, path, namespace, skipped }, \"resolve\");\n\n if (skipped) {\n return;\n }\n\n queue.push({ type: \"resolve\", args });\n getDeferred(namespace).enqueue();\n }\n\n function load(args: LoadArgs) {\n const { entrypoint, path, namespace } = args;\n logger?.debug({ entrypoint, path, namespace }, \"load\");\n\n queue.push({ type: \"load\", args });\n getDeferred(namespace).enqueue();\n }\n\n function process(args: ProcessArgs) {\n const { entrypoint, path, namespace } = args;\n logger?.debug({ entrypoint, path, namespace }, \"process\");\n\n queue.push({ type: \"process\", args });\n getDeferred(namespace).enqueue();\n }\n\n const build: Build = {\n context,\n source,\n resolve,\n load,\n process,\n defer,\n onResolve(filter, hook) {\n resolvers.push({ filter, hook });\n },\n onLoad(filter, hook) {\n loaders.push({ filter, hook });\n },\n onProcess(filter, hook) {\n processors.push({ filter, hook });\n },\n };\n\n for (const item of config.plugins) {\n const plugin = resolveStaticPlugin(item);\n logger?.debug({ plugin: plugin.name }, \"setting up plugin\");\n plugin.setup(build);\n }\n\n for (const path of await getPaths(entrypoint)) {\n source(path);\n }\n\n async function processTask(task: Task) {\n const { type } = task;\n let args = task.args;\n const { entrypoint, path, namespace } = args;\n logger?.trace({ type, entrypoint, path, namespace }, \"processing task\");\n\n for (const { filter, hook } of hooks[type]) {\n if (filter.namespace !== namespace) continue;\n if (filter.filter && !filter.filter.test(path)) continue;\n\n const result = await hook(args as never);\n if (result !== undefined) {\n args = result as never;\n }\n }\n\n if (args !== undefined) {\n if (type === \"resolve\") {\n load(args as never);\n } else if (type === \"load\") {\n process(args as never);\n }\n }\n\n getDeferred(namespace).dequeue();\n }\n\n while (queue.length || Array.from(pending.values()).some((d) => d.pending > 0)) {\n while (queue.length) {\n const task = queue.shift();\n if (!task) {\n break;\n }\n\n await processTask(task);\n }\n\n await Promise.all(Array.from(pending.values()).map((d) => d.promise));\n await Promise.resolve();\n }\n\n logger?.info(entrypoint, \"extraction completed\");\n}\n"],"mappings":"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"}
|
package/dist/src/core.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, defineConfig } from "../configuration-
|
|
1
|
+
import { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, defineConfig } from "../configuration-CTy0NMkD.cjs";
|
|
2
2
|
import "../core-CPg6_re5.cjs";
|
|
3
3
|
export { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, defineConfig };
|
package/dist/src/core.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, defineConfig } from "../configuration-
|
|
1
|
+
import { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, defineConfig } from "../configuration-fs9HmV_j.js";
|
|
2
2
|
import "../core-ACuLoi2B.js";
|
|
3
3
|
export { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, defineConfig };
|
package/dist/src/index.cjs
CHANGED
package/dist/src/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, Logger, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, cleanup$1 as cleanup, core$1 as core, defineConfig, po$1 as po, react$1 as react } from "../configuration-
|
|
1
|
+
import { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, Logger, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, cleanup$1 as cleanup, core$1 as core, defineConfig, po$1 as po, react$1 as react } from "../configuration-CTy0NMkD.cjs";
|
|
2
2
|
import "../core-CPg6_re5.cjs";
|
|
3
3
|
|
|
4
4
|
//#region src/run.d.ts
|
package/dist/src/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/run.ts"],"sourcesContent":[],"mappings":";;;;KAiBY,IAAA;EAAA,IAAA,EAAA,SAAI;EAAA,IAAA,EAGA,WAHA;;MAOA,EAAA,MAAA;MAIA,EAJA,QAIA;CAAW,GAAA;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/run.ts"],"sourcesContent":[],"mappings":";;;;KAiBY,IAAA;EAAA,IAAA,EAAA,SAAI;EAAA,IAAA,EAGA,WAHA;;MAOA,EAAA,MAAA;MAIA,EAJA,QAIA;CAAW,GAAA;EASL,IAAA,EAAG,SAAA;EAAA,IAAA,EATT,WASS;;AAEnB,iBAFgB,GAAA,CAEhB,UAAA,EADU,kBACV,EAAA;EAAA,MAAA;EAAA;CAAA,EAAA;QAAQ,EAAoB,cAApB;QAAoB,CAAA,EAAyB,MAAzB;IAAiC,OAAR,CAAA,IAAA,CAAA"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, Logger, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, cleanup$1 as cleanup, core$1 as core, defineConfig, po$1 as po, react$1 as react } from "../configuration-
|
|
1
|
+
import { Build, Context, DestinationFn, EntrypointConfig, Exclude, ExcludeFn, Filter, LoadArgs, LoadHook, LoadResult, Logger, ObsoleteStrategy, Plugin, ProcessArgs, ProcessHook, ProcessResult, ResolveArgs, ResolveHook, ResolveResult, ResolvedConfig, ResolvedEntrypoint, UniversalPlugin, UserConfig, cleanup$1 as cleanup, core$1 as core, defineConfig, po$1 as po, react$1 as react } from "../configuration-fs9HmV_j.js";
|
|
2
2
|
import "../core-ACuLoi2B.js";
|
|
3
3
|
|
|
4
4
|
//#region src/run.d.ts
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/run.ts"],"sourcesContent":[],"mappings":";;;;KAiBY,IAAA;EAAA,IAAA,EAAA,SAAI;EAAA,IAAA,EAGA,WAHA;;MAOA,EAAA,MAAA;MAIA,EAJA,QAIA;CAAW,GAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/run.ts"],"sourcesContent":[],"mappings":";;;;KAiBY,IAAA;EAAA,IAAA,EAAA,SAAI;EAAA,IAAA,EAGA,WAHA;;MAOA,EAAA,MAAA;MAIA,EAJA,QAIA;CAAW,GAAA;EASL,IAAA,EAAG,SAAA;EAAA,IAAA,EATT,WASS;;AAEnB,iBAFgB,GAAA,CAEhB,UAAA,EADU,kBACV,EAAA;EAAA,MAAA;EAAA;CAAA,EAAA;QAAQ,EAAoB,cAApB;QAAoB,CAAA,EAAyB,MAAzB;IAAiC,OAAR,CAAA,IAAA,CAAA"}
|
package/dist/src/index.js
CHANGED
package/dist/src/static.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { StaticPlugin, cleanup, core, po, react } from "../configuration-
|
|
1
|
+
import { StaticPlugin, cleanup, core, po, react } from "../configuration-CTy0NMkD.cjs";
|
|
2
2
|
export { StaticPlugin, cleanup, core, po, react };
|
package/dist/src/static.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { StaticPlugin, cleanup, core, po, react } from "../configuration-
|
|
1
|
+
import { StaticPlugin, cleanup, core, po, react } from "../configuration-fs9HmV_j.js";
|
|
2
2
|
export { StaticPlugin, cleanup, core, po, react };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@let-value/translate-extract",
|
|
3
|
-
"version": "1.1.1",
|
|
3
|
+
"version": "1.1.2-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"dist"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@let-value/translate": "1.1.1",
|
|
37
|
+
"@let-value/translate": "1.1.2-beta.1",
|
|
38
38
|
"chalk": "5.3.0",
|
|
39
39
|
"cosmiconfig": "9.0.0",
|
|
40
40
|
"fast-glob": "3.3.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configuration-Bd6mIjFe.d.cts","names":[],"sources":["../src/logger.ts","../src/plugins/cleanup/cleanup.ts","../src/plugins/core/queries/types.ts","../src/plugins/core/core.ts","../src/plugins/po/po.ts","../src/plugins/react/react.ts","../src/static.ts","../src/plugin.ts","../src/configuration.ts"],"sourcesContent":[],"mappings":";;;;KAIY,MAAA,GAAS,GAAA,CAAI;KACb,aAAA,GAAgB,GAAA,CAAI;KACpB,QAAA,GAAW;;;iBCGP,SAAA,CAAA,GAAW;;;UCPV,QAAA;;;EFEL,SAAM,CAAA,EAAA,MAAA;EACN,IAAA,CAAA,EAAA,MAAA;EACA,QAAA,CAAA,EAAQ,MAAA;;UEIH,WAAA;;EDDD,EAAA,EAAA,MAAA;;;aCMD;EAbE,QAAA,CAAA,EAAQ,OAAA;AAQzB;;;iBCCgB,MAAA,CAAA,GAAQ,eAAe;;;iBCCvB,IAAA,CAAA,GAAM;;;iBCHN,KAAA,CAAA,GAAS,eAAe;;;ALL5B,iBMCI,IAAA,CNDS,GAAA,KAAM,EMCA,UNDA,CAAA,OMCkB,MNDlB,CAAA,CAAA,EAAA;EACnB,SAAA,MAAA,EAAa;IACb,SAAQ,IAAA,EAAA,MAAG;;;;ACGP,iBKKA,OAAA,CLLW,GAAA,KAAM,EKKD,ULLC,CAAA,OKKiB,KLLjB,CAAA,CAAA,EAAA;;;;ECPhB,CAAA;AAQjB,CAAA;iBIYgB,EAAA,WAAa,kBAAkB;;;IHX/B,SAAI,KAAA,EAAA,EAAA;EAAA,CAAA;;AAAI,iBGoBR,OAAA,CHpBQ,GAAA,KAAA,EGoBU,UHpBV,CAAA,OGoB4B,SHpB5B,CAAA,CAAA,EAAA;EAAM,SAAA,MAAA,EAAA;;;;ACC9B,CAAA;KE4BY,YAAA,GACN,kBAAkB,QAClB,kBAAkB,WAClB,kBAAkB,MAClB,kBAAkB;;;KCxCnB,kBAAkB,IAAI,QAAQ;APAvB,UOEK,OAAA,CPFI;EACT,MAAA,EOEA,cPFa;EACb,WAAQ,EOEH,IPFG;WOGP;;UAGI;ENHD,UAAA,EAAO,MAAA;;;SMOZ;ALdX;AAQiB,UKSA,aLJF,CAAA,SAAQ,OAAA,CAAA,CAAA;;;;ECJP,IAAA,CAAA,EIYL,MJZS;;AAAmB,UIetB,QJfsB,CAAA,SAAA,OAAA,CAAA,CAAA;YAAf,EAAA,MAAA;EAAM,IAAA,EAAA,MAAA;;SImBnB;;AHlBK,UGqBC,UHrBK,CAAA,SAAM,OAAA,CAAA,CAAA;;;;ECHZ,IAAA,EE4BN,MF5BW;;AAAmB,UE+BvB,WF/BuB,CAAA,SAAA,OAAA,CAAA,CAAA;YAAf,EAAA,MAAA;EAAM,IAAA,EAAA,MAAA;;QEmCrB;;ADvCM,UC0CC,aD1CG,CAAA,UAAA,OAAA,CAAA,CAAA;EAAA,UAAA,EAAA,MAAA;MAA6B,EAAA,MAAA;WAAlB,EAAA,MAAA;EAAU,IAAA,EC8C/B,OD9C+B;AASzC;AAAqB,KCwCT,MAAA,GDxCS;QAA6B,ECwCnB,MDxCmB;WAAlB,CAAA,EAAA,MAAA;CAAU;AAQ1B,KCiCJ,WDjCM,CAAA,SAAA,OAAA,CAAA,GAAA,CAAA,IAAA,ECkCR,WDlCQ,CCkCI,MDlCJ,CAAA,EAAA,GCmCb,YDnCa,CCmCA,aDnCA,CCmCc,MDnCd,CAAA,GAAA,SAAA,CAAA;AAAA,KCoCN,QDpCM,CAAA,SAAA,OAAA,CAAA,GAAA,CAAA,IAAA,ECoC8B,QDpC9B,CCoCuC,MDpCvC,CAAA,EAAA,GCoCmD,YDpCnD,CCoCgE,UDpChE,CCoC2E,MDpC3E,CAAA,GAAA,SAAA,CAAA;AAA6B,KCqCnC,WDrCmC,CAAA,SAAA,OAAA,EAAA,UAAA,OAAA,CAAA,GAAA,CAAA,IAAA,ECsCrC,WDtCqC,CCsCzB,MDtCyB,CAAA,EAAA,GCuC1C,YDvC0C,CCuC7B,aDvC6B,CCuCf,ODvCe,CAAA,GAAA,SAAA,CAAA;AAAlB,UCyCZ,KDzCY,CAAA,SAAA,OAAA,EAAA,UAAA,OAAA,CAAA,CAAA;EAAU,OAAA,EC0C1B,OD1C0B;EASvB,OAAA,CAAA,IAAO,ECkCL,WDlCK,CAAA,OAAA,CAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,IAAA,ECmCR,QDnCQ,CAAA,OAAA,CAAA,CAAA,EAAA,IAAA;SAA6B,CAAA,IAAA,ECoClC,WDpCkC,CAAA,OAAA,CAAA,CAAA,EAAA,IAAA;OAAlB,CAAA,SAAA,EAAA,MAAA,CAAA,ECqCJ,ODrCI,CAAA,IAAA,CAAA;EAAU,SAAA,CAAA,OAAA,ECsCrB,MDtCqB,EAAA,IAAA,ECsCP,WDtCO,CCsCK,MDtCL,CAAA,CAAA,EAAA,IAAA;EAShC,MAAA,CAAA,OAAA,EC8BQ,MD9BI,EAAA,IAAA,EC8BU,QD9BV,CC8BmB,MD9BnB,CAAA,CAAA,EAAA,IAAA;EAAA,SAAA,CAAA,OAAA,EC+BD,MD/BC,EAAA,IAAA,EC+Ba,WD/Bb,CC+ByB,MD/BzB,EC+BiC,OD/BjC,CAAA,CAAA,EAAA,IAAA;;AAClB,UCiCW,MDjCX,CAAA,SAAA,OAAA,EAAA,UAAA,OAAA,CAAA,CAAA;MACkB,EAAA,MAAA;OAAlB,CAAA,KAAA,ECkCW,KDlCX,CCkCiB,MDlCjB,ECkCyB,ODlCzB,CAAA,CAAA,EAAA,IAAA;;AACA,KCoCM,eAAA,GAAkB,MDpCxB,GCoCiC,YDpCjC;;;ANvCM,KQGA,aAAA,GRHa,CAAA,IAAA,EAAM;EACnB,MAAA,EAAA,MAAA;EACA,UAAA,EAAQ,MAAA;;;KQER,SAAA;EPCI,UAAA,EAAO,MAAA;;;KOAX,OAAA,GAAU,SAAS;ANP/B,cMSM,cNTmB,EAAA;EAQR,IAAA,EAAA,WAAW;;;;ACC5B,KKCK,cAAA,GLDe,OKCS,cLDT;;;;;;KKQR,gBAAA;UAEK,gBAAA;EJTD,UAAE,EAAA,MAAI;gBIWJ;aACH;;EHfC,OAAA,CAAK,EGiBP,OHjBO,GGiBG,OHjBH,EAAA;;AAAmB,UGoBvB,UAAA,CHpBuB;;;;;;ECJxB,aAAI,CAAA,EE8BA,iBF9BA;EAAA;;;;AASpB;EAAqB,OAAA,CAAA,EE2BP,iBF3BO,EAAA;;;;AAQrB;;SAA+C,CAAA,EEyBjC,eFzBiC,EAAA,GAAA,CAAA,CAAA,cAAA,EEyBK,cFzBL,EAAA,GEyBwB,eFzBxB,EAAA,CAAA;;;AAS/C;;;;;EASY,WAAA,EAAA,MAAY,GEeE,gBFfF,GEeqB,KFfrB,CAAA,MAAA,GEeoC,gBFfpC,CAAA;EAAA;;;;;;aAGlB,CAAA,EEmBY,aFnBZ;;;;;;;ECvCD,QAAA,CAAA,ECiEU,gBDjEE;EAAA;;;;;EAEA,IAAA,CAAA,EAAA,OAAO;EAAA;;;;;EAMP,OAAA,CAAA,ECqEH,ODrEc,GCqEJ,ODjEb,EAAA;EAGM;AAOjB;AAOA;AAOA;EAOiB,QAAA,CAAA,ECuCF,QDvCe;AAO9B;AACY,UCkCK,kBAAA,SAA2B,IDlCrB,CCkC0B,gBDlC1B,EAAA,SAAA,CAAA,CAAA;EAAA,OAAA,CAAA,ECmCT,ODnCS,EAAA;;AACb,UCqCO,cAAA,CDrCP;SACsB,ECqCnB,eDrCmB,EAAA;aAAd,ECsCD,kBDtCC,EAAA;eAAb,EAAA,MAAA;EAAY,OAAA,EAAA,MAAA,EAAA;EACL,WAAQ,ECwCH,aDxCG;EAAA,QAAA,ECyCN,gBDzCM;MAAqC,EAAA,OAAA;UAAT,EC2ClC,QD3CkC;SAA6C,EC4ChF,OD5CgF,EAAA;;;;AAC7F;;AACsB,iBCiFN,YAAA,CDjFM,MAAA,ECiFe,UDjFf,CAAA,ECiF4B,cDjF5B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configuration-xNU7-De0.d.ts","names":[],"sources":["../src/logger.ts","../src/plugins/cleanup/cleanup.ts","../src/plugins/core/queries/types.ts","../src/plugins/core/core.ts","../src/plugins/po/po.ts","../src/plugins/react/react.ts","../src/static.ts","../src/plugin.ts","../src/configuration.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/run-DbV8QpUz.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-DbV8QpUz.js","names":["namespace","path","path","importQuery: ImportQuerySpec","current: Parser.SyntaxNode | null","messageQuery: QuerySpec","allowed","messageInvalidQuery: QuerySpec","ids: string[]","strs: string[]","subMatch: Parser.QueryMatch","translation: Translation","contextMsgQuery: QuerySpec","msgCall","contextPluralQuery: QuerySpec","contextInvalidQuery: QuerySpec","gettextQuery: QuerySpec","gettextInvalidQuery: QuerySpec","msgCall","plainMsg","msgArg","ngettextQuery: QuerySpec","msgCall","npgettextQuery: QuerySpec","pgettextQuery: QuerySpec","pluralQuery: QuerySpec","queries: QuerySpec[]","messageQuery","pluralQuery","path","parseSource","context: Context","translations: Translation[]","warnings: Warning[]","imports: string[]","queries","fs","resolved: string[]","filter","namespace","path","parseSource","translations: GetTextTranslationRecord","value","normalizedHeaders: Record<string, string>","headers: Record<string, string>","translations: GetTextTranslationRecord","obsoleteTranslations: GetTextTranslationRecord","collected: GetTextTranslationRecord","translations","existing","path","parts: Part[]","text","strings: string[]","values: string[]","messageQuery: QuerySpec","attrs: Parser.SyntaxNode[]","msgctxt: string | undefined","childValue: Parser.SyntaxNode | undefined","error: string | undefined","translation: Translation","forms: string[]","pluralQuery: QuerySpec","attrs: Parser.SyntaxNode[]","msgctxt: string | undefined","formsNode: Parser.SyntaxNode | null | undefined","translation: Translation","queries: QuerySpec[]","context: Context","path","translations: Translation[]","warnings: Warning[]","path","context: Context","resolvers: { filter: Filter; hook: ResolveHook }[]","loaders: { filter: Filter; hook: LoadHook }[]","processors: { filter: Filter; hook: ProcessHook }[]","queue: Task[]","defer","namespace","resolve","process","build: Build","path","filter"],"sources":["../src/defer.ts","../src/plugins/cleanup/cleanup.ts","../src/plugins/core/queries/comment.ts","../src/plugins/core/queries/import.ts","../src/plugins/core/queries/utils.ts","../src/plugins/core/queries/message.ts","../src/plugins/core/queries/plural-utils.ts","../src/plugins/core/queries/context.ts","../src/plugins/core/queries/gettext.ts","../src/plugins/core/queries/ngettext.ts","../src/plugins/core/queries/npgettext.ts","../src/plugins/core/queries/pgettext.ts","../src/plugins/core/queries/plural.ts","../src/plugins/core/queries/index.ts","../src/plugins/core/parse.ts","../src/plugins/core/resolve.ts","../src/plugins/core/core.ts","../src/plugins/po/collect.ts","../src/plugins/po/hasChanges.ts","../src/plugins/po/merge.ts","../src/plugins/po/po.ts","../src/plugins/react/queries/utils.ts","../src/plugins/react/queries/message.ts","../src/plugins/react/queries/plural.ts","../src/plugins/react/queries/index.ts","../src/plugins/react/parse.ts","../src/plugins/react/react.ts","../src/plugins/static.ts","../src/run.ts"],"sourcesContent":["export class Defer {\n pending = 0;\n promise: Promise<void> = Promise.resolve();\n resolve?: () => void;\n\n enqueue() {\n if (this.pending++ === 0) {\n this.promise = new Promise<void>((res) => {\n this.resolve = res;\n });\n }\n }\n dequeue() {\n if (this.pending > 0 && --this.pending === 0) {\n this.resolve?.();\n }\n }\n}\n","import fs from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport * as gettextParser from \"gettext-parser\";\n\nimport type { Plugin } from \"../../plugin.ts\";\n\nconst namespace = \"cleanup\";\n\nexport function cleanup(): Plugin {\n return {\n name: \"cleanup\",\n setup(build) {\n build.context.logger?.debug(\"cleanup plugin initialized\");\n const processed = new Set<string>();\n const generated = new Set<string>();\n const dirs = new Set<string>();\n let dispatched = false;\n\n build.onResolve({ namespace, filter: /.*/ }, ({ path }) => {\n generated.add(path);\n dirs.add(dirname(path));\n\n Promise.all([build.defer(\"source\"), build.defer(\"translate\"), build.defer(namespace)]).then(() => {\n if (dispatched) {\n return;\n }\n dispatched = true;\n\n for (const path of dirs.values()) {\n build.process({ entrypoint: path, path, namespace, data: undefined });\n }\n });\n\n return undefined;\n });\n\n build.onProcess({ namespace, filter: /.*/ }, async ({ path }) => {\n if (processed.has(path)) {\n return undefined;\n }\n processed.add(path);\n const files = await fs.readdir(path).catch(() => []);\n for (const f of files.filter((p) => p.endsWith(\".po\"))) {\n const full = join(path, f);\n const contents = await fs.readFile(full).catch(() => undefined);\n if (!contents) {\n continue;\n }\n const parsed = gettextParser.po.parse(contents);\n const hasTranslations = Object.entries(parsed.translations || {}).some(([ctx, msgs]) =>\n Object.keys(msgs).some((id) => !(ctx === \"\" && id === \"\")),\n );\n if (!hasTranslations && generated.has(full)) {\n await fs.unlink(full);\n }\n if (hasTranslations && !generated.has(full)) {\n build.context.logger?.warn({ path: full }, \"stray translation file\");\n }\n }\n return undefined;\n });\n },\n };\n}\n","import { relative } from \"node:path\";\nimport type Parser from \"@keqingmoe/tree-sitter\";\n\nimport type { Context, QuerySpec } from \"./types.ts\";\n\nexport function getReference(node: Parser.SyntaxNode, { path }: Context) {\n const line = node.startPosition.row + 1;\n const rel = relative(process.cwd(), path).replace(/\\\\+/g, \"/\");\n return `${rel}:${line}`;\n}\n\nfunction getComment(node: Parser.SyntaxNode): string {\n const text = node.text;\n if (text.startsWith(\"/*\")) {\n return text\n .slice(2, -2)\n .replace(/^\\s*\\*?\\s*/gm, \"\")\n .trim();\n }\n return text.replace(/^\\/\\/\\s?/, \"\").trim();\n}\n\nexport const withComment = (query: QuerySpec): QuerySpec => ({\n pattern: `(\n\t((comment) @comment)?\n .\n\t(_ ${query.pattern})\n)`,\n extract(match) {\n const result = query.extract(match);\n if (!result?.translation) {\n return result;\n }\n\n const comment = match.captures.find((c) => c.name === \"comment\")?.node;\n if (!comment) {\n return result;\n }\n\n if (comment) {\n result.translation.comments = {\n ...result.translation.comments,\n extracted: getComment(comment),\n };\n }\n\n return result;\n },\n});\n","import type Parser from \"@keqingmoe/tree-sitter\";\nimport type { ImportQuerySpec } from \"./types.ts\";\n\nexport const importQuery: ImportQuerySpec = {\n pattern: `\n [\n (import_statement\n source: (string (string_fragment) @import))\n (export_statement\n source: (string (string_fragment) @import))\n (call_expression\n function: (identifier) @func\n arguments: (arguments (string (string_fragment) @import))\n (#eq? @func \"require\"))\n (call_expression\n function: (member_expression\n object: (identifier) @obj\n property: (property_identifier) @method)\n arguments: (arguments (string (string_fragment) @import))\n (#eq? @obj \"require\")\n (#eq? @method \"resolve\"))\n (call_expression\n function: (import)\n arguments: (arguments (string (string_fragment) @import)))\n ]\n `,\n extract(match: Parser.QueryMatch): string | undefined {\n const node = match.captures.find((c) => c.name === \"import\")?.node;\n return node?.text;\n },\n};\n","import type Parser from \"@keqingmoe/tree-sitter\";\n\nexport const callPattern = (fnName: string, args: string, allowMember = true): string => `(\n (call_expression\n function: ${\n allowMember\n ? `[\n (identifier) @func\n (member_expression property: (property_identifier) @func)\n ]`\n : `(identifier) @func`\n }\n arguments: ${args}\n ) @call\n (#eq? @func \"${fnName}\")\n)`;\n\nexport function isDescendant(node: Parser.SyntaxNode, ancestor: Parser.SyntaxNode): boolean {\n let current: Parser.SyntaxNode | null = node;\n while (current) {\n if (current.id === ancestor.id) return true;\n current = current.parent;\n }\n return false;\n}\n","import type Parser from \"@keqingmoe/tree-sitter\";\nimport { withComment } from \"./comment.ts\";\nimport type { MessageMatch, QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst notInPlural = (query: QuerySpec): QuerySpec => ({\n pattern: query.pattern,\n extract(match) {\n const result = query.extract(match);\n if (!result?.node) {\n return result;\n }\n\n let parent = result.node.parent;\n\n if (parent && parent.type === \"arguments\") {\n parent = parent.parent;\n }\n\n if (parent && parent.type === \"call_expression\") {\n const fn = parent.childForFieldName(\"function\");\n if (fn) {\n if (\n (fn.type === \"identifier\" &&\n (fn.text === \"plural\" ||\n fn.text === \"ngettext\" ||\n fn.text === \"pgettext\" ||\n fn.text === \"npgettext\")) ||\n (fn.type === \"member_expression\" &&\n [\"plural\", \"ngettext\", \"pgettext\", \"npgettext\"].includes(\n fn.childForFieldName(\"property\")?.text ?? \"\",\n ))\n ) {\n return undefined;\n }\n }\n }\n\n return result;\n },\n});\n\nexport const messageArg = `[\n (string (string_fragment) @msgid)\n (object\n (_)*\n (pair\n key: (property_identifier) @id_key\n value: (string (string_fragment) @id)\n (#eq? @id_key \"id\")\n )?\n (_)*\n (pair\n key: (property_identifier) @msg_key\n value: (string (string_fragment) @message)\n (#eq? @msg_key \"message\")\n )?\n (_)*\n )\n (template_string) @tpl\n]`;\n\nexport const messageArgs = `[ (arguments ${messageArg}) (template_string) @tpl ]`;\n\nexport const extractMessage =\n (name: string) =>\n (match: Parser.QueryMatch): MessageMatch | undefined => {\n const node = match.captures.find((c) => c.name === \"call\")?.node;\n if (!node) {\n return undefined;\n }\n\n const msgid = match.captures.find((c) => c.name === \"msgid\")?.node.text;\n if (msgid) {\n return {\n node,\n translation: {\n id: msgid,\n message: [msgid],\n },\n };\n }\n\n const tpl = match.captures.find((c) => c.name === \"tpl\")?.node;\n if (tpl) {\n for (const child of tpl.children) {\n if (child.type !== \"template_substitution\") {\n continue;\n }\n\n const expr = child.namedChildren[0];\n if (!expr || expr.type !== \"identifier\") {\n return {\n node,\n error: `${name}() template expressions must be simple identifiers`,\n };\n }\n }\n\n const text = tpl.text.slice(1, -1);\n\n return {\n node,\n translation: { id: text, message: [text] },\n };\n }\n\n const id = match.captures.find((c) => c.name === \"id\")?.node.text;\n const message = match.captures.find((c) => c.name === \"message\")?.node.text;\n const msgId = id ?? message;\n if (!msgId) {\n return undefined;\n }\n\n const msgstr = message ?? id ?? \"\";\n\n return {\n node,\n translation: {\n id: msgId,\n message: [msgstr],\n },\n };\n };\n\nexport const messageQuery: QuerySpec = notInPlural(\n withComment({\n pattern: callPattern(\"message\", messageArgs),\n extract: extractMessage(\"message\"),\n }),\n);\n\nconst allowed = new Set([\"string\", \"object\", \"template_string\"]);\n\nexport const messageInvalidQuery: QuerySpec = notInPlural({\n pattern: callPattern(\"message\", \"(arguments (_) @arg)\"),\n extract(match) {\n const call = match.captures.find((c) => c.name === \"call\")?.node;\n const node = match.captures.find((c) => c.name === \"arg\")?.node;\n\n if (!call || !node) {\n return undefined;\n }\n\n if (allowed.has(node.type)) {\n return undefined;\n }\n\n return {\n node,\n error: \"message() argument must be a string literal, object literal, or template literal\",\n };\n },\n});\n","import type Parser from \"@keqingmoe/tree-sitter\";\nimport { extractMessage } from \"./message.ts\";\nimport type { MessageMatch, Translation } from \"./types.ts\";\nimport { isDescendant } from \"./utils.ts\";\n\nexport const extractPluralForms =\n (name: string) =>\n (match: Parser.QueryMatch): MessageMatch | undefined => {\n const call = match.captures.find((c) => c.name === \"call\")?.node;\n const n = match.captures.find((c) => c.name === \"n\")?.node;\n if (!call || !n || n.nextNamedSibling) {\n return undefined;\n }\n\n const msgctxt = match.captures.find((c) => c.name === \"msgctxt\")?.node?.text;\n const msgNodes = match.captures.filter((c) => c.name === \"msg\").map((c) => c.node);\n\n const ids: string[] = [];\n const strs: string[] = [];\n\n for (const node of msgNodes) {\n const relevant = match.captures.filter(\n (c) => [\"msgid\", \"id\", \"message\", \"tpl\"].includes(c.name) && isDescendant(c.node, node),\n );\n\n const subMatch: Parser.QueryMatch = {\n pattern: 0,\n captures: [{ name: \"call\", node }, ...relevant],\n };\n\n const result = extractMessage(name)(subMatch);\n if (!result) continue;\n if (result.error) {\n return { node: call, error: result.error };\n }\n if (result.translation) {\n ids.push(result.translation.id);\n strs.push(result.translation.message[0] ?? \"\");\n }\n }\n\n if (ids.length === 0) {\n return undefined;\n }\n\n const translation: Translation = {\n id: ids[0],\n plural: ids[1],\n message: strs,\n };\n if (msgctxt) translation.context = msgctxt;\n\n return { node: call, translation };\n };\n","import { withComment } from \"./comment.ts\";\nimport { extractMessage, messageArgs } from \"./message.ts\";\nimport { extractPluralForms } from \"./plural-utils.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst ctxCall = callPattern(\n \"context\",\n `[\n (arguments (string (string_fragment) @msgctxt))\n (template_string) @msgctxt\n]`,\n)\n .replace(/@call/g, \"@ctx\")\n .replace(/@func/g, \"@ctxfn\");\n\nexport const contextMsgQuery: QuerySpec = withComment({\n pattern: `(\n (call_expression\n function: (member_expression\n object: ${ctxCall}\n property: (property_identifier) @func\n )\n arguments: ${messageArgs}\n ) @call\n (#eq? @func \"message\")\n)`,\n extract(match) {\n const result = extractMessage(\"context.message\")(match);\n const contextNode = match.captures.find((c) => c.name === \"msgctxt\")?.node;\n if (!result || !result.translation || !contextNode) {\n return result;\n }\n\n if (contextNode.type === \"template_string\") {\n for (const child of contextNode.children) {\n if (child.type !== \"template_substitution\") {\n continue;\n }\n\n const expr = child.namedChildren[0];\n if (!expr || expr.type !== \"identifier\") {\n return {\n node: contextNode,\n error: \"context() template expressions must be simple identifiers\",\n };\n }\n }\n }\n\n const contextText =\n contextNode.type === \"template_string\" ? contextNode.text.slice(1, -1) : contextNode.text;\n return {\n node: result.node,\n translation: {\n ...result.translation,\n context: contextText,\n },\n };\n },\n});\n\nconst msgCall = callPattern(\"message\", messageArgs, false).replace(/@call/g, \"@msg\").replace(/@func/g, \"@msgfn\");\n\nexport const contextPluralQuery: QuerySpec = withComment({\n pattern: `(\n (call_expression\n function: (member_expression\n object: ${ctxCall}\n property: (property_identifier) @func\n )\n arguments: (arguments (\n (${msgCall} (\",\" )?)+\n (number) @n\n ))\n ) @call\n (#eq? @func \"plural\")\n)`,\n extract: extractPluralForms(\"context.plural\"),\n});\n\nexport const contextInvalidQuery: QuerySpec = withComment({\n pattern: ctxCall,\n extract(match) {\n const call = match.captures.find((c) => c.name === \"ctx\")?.node;\n if (!call) {\n return undefined;\n }\n\n const parent = call.parent;\n if (parent && parent.type === \"member_expression\" && parent.childForFieldName(\"object\")?.id === call.id) {\n const property = parent.childForFieldName(\"property\")?.text;\n const grandparent = parent.parent;\n if (\n grandparent &&\n grandparent.type === \"call_expression\" &&\n grandparent.childForFieldName(\"function\")?.id === parent.id &&\n (property === \"message\" || property === \"plural\")\n ) {\n return undefined;\n }\n }\n\n return {\n node: call,\n error: \"context() must be used with message() or plural() in the same expression\",\n };\n },\n});\n","import { withComment } from \"./comment.ts\";\nimport { extractMessage, messageArgs } from \"./message.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nexport const gettextQuery: QuerySpec = withComment({\n pattern: callPattern(\"gettext\", messageArgs),\n extract: extractMessage(\"gettext\"),\n});\n\nconst allowed = new Set([\"string\", \"object\", \"template_string\", \"identifier\", \"call_expression\"]);\n\nexport const gettextInvalidQuery: QuerySpec = {\n pattern: callPattern(\"gettext\", \"(arguments (_) @arg)\"),\n extract(match) {\n const call = match.captures.find((c) => c.name === \"call\")?.node;\n const node = match.captures.find((c) => c.name === \"arg\")?.node;\n\n if (!call || !node) {\n return undefined;\n }\n\n if (allowed.has(node.type)) {\n return undefined;\n }\n\n return {\n node,\n error: \"gettext() argument must be a string literal, object literal, or template literal\",\n };\n },\n};\n","import { withComment } from \"./comment.ts\";\nimport { messageArg, messageArgs } from \"./message.ts\";\nimport { extractPluralForms } from \"./plural-utils.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst msgCall = callPattern(\"message\", messageArgs).replace(/@call/g, \"@msg\").replace(/@func/g, \"@msgfn\");\nconst plainMsg = `(${messageArg}) @msg`;\nconst msgArg = `[${msgCall} ${plainMsg}]`;\n\nexport const ngettextQuery: QuerySpec = withComment({\n pattern: callPattern(\"ngettext\", `(arguments ${msgArg} \",\" ${msgArg} (\",\" ${msgArg})* \",\" (_) @n)`),\n extract: extractPluralForms(\"ngettext\"),\n});\n","import { withComment } from \"./comment.ts\";\nimport { messageArg, messageArgs } from \"./message.ts\";\nimport { extractPluralForms } from \"./plural-utils.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst msgCall = callPattern(\"message\", messageArgs).replace(/@call/g, \"@msg\").replace(/@func/g, \"@msgfn\");\nconst plainMsg = `(${messageArg}) @msg`;\nconst msgArg = `[${msgCall} ${plainMsg}]`;\n\nexport const npgettextQuery: QuerySpec = withComment({\n pattern: callPattern(\n \"npgettext\",\n `(arguments (string (string_fragment) @msgctxt) \",\" ${msgArg} \",\" ${msgArg} (\",\" ${msgArg})* \",\" (_) @n)`,\n ),\n extract: extractPluralForms(\"npgettext\"),\n});\n","import { withComment } from \"./comment.ts\";\nimport { extractMessage, messageArg } from \"./message.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nexport const pgettextQuery: QuerySpec = withComment({\n pattern: callPattern(\"pgettext\", `(arguments (string (string_fragment) @msgctxt) \",\" ${messageArg})`),\n extract(match) {\n const result = extractMessage(\"pgettext\")(match);\n const contextNode = match.captures.find((c) => c.name === \"msgctxt\")?.node;\n if (!result || !contextNode || !result.translation) {\n return result;\n }\n return {\n node: result.node,\n translation: {\n ...result.translation,\n context: contextNode.text,\n },\n };\n },\n});\n","import { withComment } from \"./comment.ts\";\nimport { messageArgs } from \"./message.ts\";\nimport { extractPluralForms } from \"./plural-utils.ts\";\nimport type { QuerySpec } from \"./types.ts\";\nimport { callPattern } from \"./utils.ts\";\n\nconst msgCall = callPattern(\"message\", messageArgs, false).replace(/@call/g, \"@msg\").replace(/@func/g, \"@msgfn\");\n\nexport const pluralQuery: QuerySpec = withComment({\n pattern: callPattern(\n \"plural\",\n `(arguments (\n (${msgCall} (\",\" )?)+\n (number) @n\n ))`,\n false,\n ),\n extract: extractPluralForms(\"plural\"),\n});\n","import { contextInvalidQuery, contextMsgQuery, contextPluralQuery } from \"./context.ts\";\nimport { gettextInvalidQuery, gettextQuery } from \"./gettext.ts\";\nimport { messageInvalidQuery, messageQuery } from \"./message.ts\";\nimport { ngettextQuery } from \"./ngettext.ts\";\nimport { npgettextQuery } from \"./npgettext.ts\";\nimport { pgettextQuery } from \"./pgettext.ts\";\nimport { pluralQuery } from \"./plural.ts\";\nimport type { QuerySpec } from \"./types.ts\";\n\nexport type { MessageMatch, QuerySpec } from \"./types.ts\";\n\nexport const queries: QuerySpec[] = [\n contextMsgQuery,\n contextPluralQuery,\n contextInvalidQuery,\n messageQuery,\n messageInvalidQuery,\n gettextQuery,\n gettextInvalidQuery,\n pluralQuery,\n ngettextQuery,\n pgettextQuery,\n npgettextQuery,\n];\n","import fs from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\n\nimport Parser from \"@keqingmoe/tree-sitter\";\nimport JavaScript from \"tree-sitter-javascript\";\nimport TS from \"tree-sitter-typescript\";\n\nimport { getReference } from \"./queries/comment.ts\";\nimport { importQuery } from \"./queries/import.ts\";\nimport { queries } from \"./queries/index.ts\";\nimport type { Context, Translation, Warning } from \"./queries/types.ts\";\n\nexport interface ParseResult {\n translations: Translation[];\n imports: string[];\n warnings: Warning[];\n}\n\nfunction getLanguage(ext: string) {\n switch (ext) {\n case \".ts\":\n return TS.typescript;\n case \".tsx\":\n return TS.tsx;\n default:\n return JavaScript;\n }\n}\n\nconst parserCache = new Map<string, { parser: Parser; language: Parser.Language }>();\nconst queryCache = new WeakMap<Parser.Language, Map<string, Parser.Query>>();\n\nfunction getCachedParser(ext: string) {\n let cached = parserCache.get(ext);\n if (!cached) {\n const parser = new Parser();\n const language = getLanguage(ext) as Parser.Language;\n parser.setLanguage(language);\n cached = { parser, language };\n parserCache.set(ext, cached);\n }\n return cached;\n}\n\nfunction getCachedQuery(language: Parser.Language, pattern: string) {\n let cache = queryCache.get(language);\n if (!cache) {\n cache = new Map();\n queryCache.set(language, cache);\n }\n\n let query = cache.get(pattern);\n if (!query) {\n query = new Parser.Query(language, pattern);\n cache.set(pattern, query);\n }\n\n return query;\n}\n\nexport function getParser(path: string) {\n const ext = extname(path);\n return getCachedParser(ext);\n}\n\nexport function getQuery(language: Parser.Language, pattern: string) {\n return getCachedQuery(language, pattern);\n}\n\nexport function parseFile(filePath: string): ParseResult {\n const path = resolve(filePath);\n const source = fs.readFileSync(path, \"utf8\");\n return parseSource(source, path);\n}\n\nexport function parseSource(source: string, path: string): ParseResult {\n const context: Context = {\n path,\n };\n\n const { parser, language } = getParser(path);\n const tree = parser.parse(source);\n\n const translations: Translation[] = [];\n const warnings: Warning[] = [];\n const imports: string[] = [];\n\n const seen = new Set<number>();\n\n for (const spec of queries) {\n const query = getCachedQuery(language, spec.pattern);\n for (const match of query.matches(tree.rootNode)) {\n const message = spec.extract(match);\n if (!message) {\n continue;\n }\n\n const { node, translation, error } = message;\n if (seen.has(node.id)) {\n continue;\n }\n seen.add(node.id);\n const reference = getReference(node, context);\n\n if (translation) {\n translations.push({\n ...translation,\n comments: {\n ...translation.comments,\n reference,\n },\n });\n }\n\n if (error) {\n warnings.push({\n error,\n reference,\n });\n }\n }\n }\n\n const importTreeQuery = getCachedQuery(language, importQuery.pattern);\n for (const match of importTreeQuery.matches(tree.rootNode)) {\n const imp = importQuery.extract(match);\n if (imp) {\n imports.push(imp);\n }\n }\n\n return { translations, imports, warnings };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ResolverFactory } from \"oxc-resolver\";\n\nfunction findTsconfig(dir: string): string | undefined {\n let current = dir;\n while (true) {\n const config = path.join(current, \"tsconfig.json\");\n if (fs.existsSync(config)) {\n return config;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\nconst resolverCache = new Map<string, ResolverFactory>();\n\nfunction getResolver(dir: string) {\n const tsconfig = findTsconfig(dir);\n const key = tsconfig ?? \"__default__\";\n let resolver = resolverCache.get(key);\n if (!resolver) {\n resolver = new ResolverFactory({\n extensions: [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".json\"],\n conditionNames: [\"import\", \"require\", \"node\"],\n ...(tsconfig ? { tsconfig: { configFile: tsconfig } } : {}),\n });\n resolverCache.set(key, resolver);\n }\n return resolver;\n}\n\nfunction resolveFromDir(dir: string, spec: string): string | undefined {\n const resolver = getResolver(dir);\n const res = resolver.sync(dir, spec) as { path?: string };\n return res.path;\n}\n\nexport function resolveImport(file: string, spec: string): string | undefined {\n const dir = path.dirname(path.resolve(file));\n return resolveFromDir(dir, spec);\n}\n\nexport function resolveImports(file: string, imports: string[]): string[] {\n const dir = path.dirname(path.resolve(file));\n const resolver = getResolver(dir);\n const resolved: string[] = [];\n for (const spec of imports) {\n const res = resolver.sync(dir, spec) as { path?: string };\n if (res.path) {\n resolved.push(res.path);\n }\n }\n return resolved;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport type { Plugin } from \"../../plugin.ts\";\nimport { parseSource } from \"./parse.ts\";\nimport type { Translation } from \"./queries/types.ts\";\nimport { resolveImports } from \"./resolve.ts\";\n\nconst filter = /\\.([cm]?tsx?|jsx?)$/;\nconst namespace = \"source\";\n\nexport function core(): Plugin<string, Translation[]> {\n return {\n name: \"core\",\n setup(build) {\n build.context.logger?.debug(\"core plugin initialized\");\n build.onResolve({ filter, namespace }, ({ entrypoint, path }) => {\n return {\n entrypoint,\n namespace,\n path: resolve(path),\n };\n });\n\n build.onLoad({ filter, namespace }, async ({ entrypoint, path }) => {\n const data = await readFile(path, \"utf8\");\n return {\n entrypoint,\n path,\n namespace,\n data,\n };\n });\n\n build.onProcess({ filter, namespace }, ({ entrypoint, path, data }) => {\n const { translations, imports, warnings } = parseSource(data, path);\n\n if (build.context.config.walk) {\n const paths = resolveImports(path, imports);\n for (const path of paths) {\n build.resolve({ entrypoint, path, namespace });\n }\n }\n\n for (const warning of warnings) {\n build.context.logger?.warn(`${warning.error} at ${warning.reference}`);\n }\n\n build.resolve({\n entrypoint,\n path,\n namespace: \"translate\",\n data: translations,\n });\n\n return undefined;\n });\n },\n };\n}\n","import type { GetTextTranslationRecord } from \"gettext-parser\";\nimport { getNPlurals } from \"plural-forms\";\n\nimport type { Translation } from \"../core/queries/types.ts\";\n\nexport function collect(source: Translation[], locale?: string): GetTextTranslationRecord {\n const translations: GetTextTranslationRecord = { \"\": {} };\n const nplurals = locale ? getNPlurals(locale) : undefined;\n\n for (const { context, id, message, comments, obsolete, plural } of source) {\n const ctx = context || \"\";\n if (!translations[ctx]) {\n translations[ctx] = {};\n }\n\n const length = plural ? (nplurals ?? message.length) : 1;\n\n const existing = translations[ctx][id];\n const refs = new Set<string>();\n if (existing?.comments?.reference) {\n existing.comments.reference.split(/\\r?\\n|\\r/).forEach((r) => {\n refs.add(r);\n });\n }\n if (comments?.reference) {\n comments.reference.split(/\\r?\\n|\\r/).forEach((r) => {\n refs.add(r);\n });\n }\n\n const msgstr = existing?.msgstr ? existing.msgstr.slice(0, length) : Array.from({ length }, () => \"\");\n while (msgstr.length < length) msgstr.push(\"\");\n\n translations[ctx][id] = {\n msgctxt: context || undefined,\n msgid: id,\n msgid_plural: plural,\n msgstr,\n comments: {\n ...existing?.comments,\n ...comments,\n reference: refs.size ? Array.from(refs).join(\"\\n\") : undefined,\n },\n obsolete: existing?.obsolete ?? obsolete,\n };\n }\n\n return translations;\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport type { GetTextTranslations } from \"gettext-parser\";\nimport * as gettextParser from \"gettext-parser\";\n\nconst IGNORED_HEADER_KEYS = new Set([\"pot-creation-date\", \"po-revision-date\"]);\nconst IGNORED_HEADER_LINE_PREFIXES = [\"pot-creation-date:\", \"po-revision-date:\"];\n\nfunction normalizeHeaderString(value: string): string {\n const lines = value.split(\"\\n\");\n const hadTrailingNewline = value.endsWith(\"\\n\");\n\n const filtered = lines\n .filter((line) => {\n const trimmed = line.trimStart().toLowerCase();\n return !IGNORED_HEADER_LINE_PREFIXES.some((prefix) => trimmed.startsWith(prefix));\n })\n .map((line) => {\n const separatorIndex = line.indexOf(\":\");\n if (separatorIndex === -1) {\n return line;\n }\n\n const key = line.slice(0, separatorIndex).trim().toLowerCase();\n const value = line.slice(separatorIndex + 1);\n return `${key}:${value}`;\n });\n\n if (hadTrailingNewline && filtered[filtered.length - 1] !== \"\") {\n filtered.push(\"\");\n }\n\n return filtered.join(\"\\n\");\n}\n\nfunction normalize(translations: GetTextTranslations): GetTextTranslations {\n const compiled = gettextParser.po.compile(translations);\n const parsed = gettextParser.po.parse(compiled);\n\n if (parsed.headers) {\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(parsed.headers)) {\n if (!IGNORED_HEADER_KEYS.has(key.toLowerCase())) {\n normalizedHeaders[key.toLowerCase()] = value as string;\n }\n }\n parsed.headers = normalizedHeaders;\n }\n\n const headerMessage = parsed.translations?.[\"\"]?.[\"\"];\n if (headerMessage?.msgstr) {\n headerMessage.msgstr = headerMessage.msgstr.map((item) => normalizeHeaderString(item));\n }\n\n return parsed;\n}\n\nexport function hasChanges(left: GetTextTranslations, right?: GetTextTranslations): boolean {\n if (!right) {\n return true;\n }\n\n const normalizedLeft = normalize(left);\n const normalizedRight = normalize(right);\n\n return !isDeepStrictEqual(normalizedLeft, normalizedRight);\n}\n","import type { GetTextTranslationRecord, GetTextTranslations } from \"gettext-parser\";\nimport { getFormula, getNPlurals } from \"plural-forms\";\n\nimport type { ObsoleteStrategy } from \"../../configuration.ts\";\n\nexport interface Collected {\n translations: GetTextTranslationRecord;\n}\n\nexport function formatDate(date: Date): string {\n const pad = (n: number) => n.toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n const tzo = -date.getTimezoneOffset();\n const sign = tzo >= 0 ? \"+\" : \"-\";\n const offsetHours = pad(Math.floor(Math.abs(tzo) / 60));\n const offsetMinutes = pad(Math.abs(tzo) % 60);\n return `${year}-${month}-${day} ${hours}:${minutes}${sign}${offsetHours}${offsetMinutes}`;\n}\n\nexport function merge(\n sources: Collected[],\n existing: GetTextTranslations | undefined,\n obsolete: ObsoleteStrategy,\n locale: string,\n generatedAt: Date,\n): GetTextTranslations {\n let headers: Record<string, string> = {};\n let translations: GetTextTranslationRecord = { \"\": {} };\n let obsoleteTranslations: GetTextTranslationRecord = {};\n const nplurals = getNPlurals(locale);\n\n if (existing) {\n headers = existing.headers ? structuredClone(existing.headers) : {};\n translations = existing.translations ? structuredClone(existing.translations) : { \"\": {} };\n obsoleteTranslations = existing.obsolete ? structuredClone(existing.obsolete) : {};\n for (const ctx of Object.keys(translations)) {\n for (const id of Object.keys(translations[ctx])) {\n if (ctx === \"\" && id === \"\") continue;\n translations[ctx][id].obsolete = true;\n }\n }\n }\n\n const collected: GetTextTranslationRecord = { \"\": {} };\n for (const { translations } of sources) {\n for (const [ctx, msgs] of Object.entries(translations)) {\n if (!collected[ctx]) collected[ctx] = {};\n for (const [id, entry] of Object.entries(msgs)) {\n const existing = collected[ctx][id];\n const refs = new Set<string>();\n if (existing?.comments?.reference) {\n existing.comments.reference.split(/\\r?\\n|\\r/).forEach((r) => {\n refs.add(r);\n });\n }\n if (entry.comments?.reference) {\n entry.comments.reference.split(/\\r?\\n|\\r/).forEach((r) => {\n refs.add(r);\n });\n }\n collected[ctx][id] = {\n ...existing,\n ...entry,\n comments: {\n ...existing?.comments,\n ...entry.comments,\n reference: refs.size ? Array.from(refs).join(\"\\n\") : undefined,\n },\n };\n }\n }\n }\n\n for (const [ctx, msgs] of Object.entries(collected)) {\n if (!translations[ctx]) translations[ctx] = {};\n for (const [id, entry] of Object.entries(msgs)) {\n const existingEntry = translations[ctx][id] ?? obsoleteTranslations[ctx]?.[id];\n if (existingEntry) {\n entry.msgstr = existingEntry.msgstr;\n entry.comments = {\n ...entry.comments,\n translator: existingEntry.comments?.translator,\n };\n }\n delete entry.obsolete;\n entry.msgstr = entry.msgstr.slice(0, nplurals);\n while (entry.msgstr.length < nplurals) {\n entry.msgstr.push(\"\");\n }\n translations[ctx][id] = entry;\n if (obsoleteTranslations[ctx]) {\n delete obsoleteTranslations[ctx][id];\n }\n }\n }\n\n for (const ctx of Object.keys(translations)) {\n for (const id of Object.keys(translations[ctx])) {\n if (ctx === \"\" && id === \"\") {\n continue;\n }\n const entry = translations[ctx][id];\n if (entry.obsolete) {\n if (!obsoleteTranslations[ctx]) {\n obsoleteTranslations[ctx] = {};\n }\n obsoleteTranslations[ctx][id] = entry;\n delete translations[ctx][id];\n }\n }\n }\n\n headers = {\n ...headers,\n \"Content-Type\": headers[\"Content-Type\"] || \"text/plain; charset=UTF-8\",\n \"Plural-Forms\": `nplurals=${nplurals}; plural=${getFormula(locale)};`,\n language: locale,\n \"MIME-Version\": \"1.0\",\n \"Content-Transfer-Encoding\": \"8bit\",\n \"POT-Creation-Date\": formatDate(generatedAt),\n \"x-generator\": \"@let-value/translate-extract\",\n };\n\n return {\n charset: \"utf-8\",\n headers,\n translations,\n ...(obsolete === \"mark\" && Object.keys(obsoleteTranslations).length ? { obsolete: obsoleteTranslations } : {}),\n };\n}\n","import fs from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport * as gettextParser from \"gettext-parser\";\n\nimport type { Plugin } from \"../../plugin.ts\";\nimport type { Translation } from \"../core/queries/types.ts\";\nimport { collect } from \"./collect.ts\";\nimport { hasChanges } from \"./hasChanges.ts\";\nimport { merge } from \"./merge.ts\";\n\nconst namespace = \"translate\";\n\nexport function po(): Plugin {\n return {\n name: \"po\",\n setup(build) {\n build.context.logger?.debug(\"po plugin initialized\");\n const collections = new Map<\n string,\n {\n locale: string;\n translations: Translation[];\n }\n >();\n let dispatched = false;\n\n build.onResolve({ filter: /.*/, namespace }, async ({ entrypoint, path, data }) => {\n if (!data || !Array.isArray(data)) {\n return undefined;\n }\n\n for (const locale of build.context.config.locales) {\n const destination = build.context.config.destination({ entrypoint, locale, path });\n if (!collections.has(destination)) {\n collections.set(destination, { locale, translations: [] });\n }\n\n collections.get(destination)?.translations.push(...data);\n }\n\n Promise.all([build.defer(\"source\"), build.defer(namespace)]).then(() => {\n if (dispatched) {\n return;\n }\n dispatched = true;\n\n for (const path of collections.keys()) {\n build.load({ entrypoint, path, namespace });\n }\n });\n\n return undefined;\n });\n\n build.onLoad({ filter: /.*\\.po$/, namespace }, async ({ entrypoint, path }) => {\n const contents = await fs.readFile(path).catch(() => undefined);\n const data = contents ? gettextParser.po.parse(contents) : undefined;\n return {\n entrypoint,\n path,\n namespace,\n data,\n };\n });\n\n build.onProcess({ filter: /.*\\.po$/, namespace }, async ({ entrypoint, path, data }) => {\n const collected = collections.get(path);\n if (!collected) {\n build.context.logger?.warn({ path }, \"no translations collected for this path\");\n return undefined;\n }\n\n const { locale, translations } = collected;\n\n const record = collect(translations, locale);\n\n const out = merge(\n [{ translations: record }],\n data as never,\n build.context.config.obsolete,\n locale,\n build.context.generatedAt,\n );\n\n if (hasChanges(out, data as never)) {\n await fs.mkdir(dirname(path), { recursive: true });\n await fs.writeFile(path, gettextParser.po.compile(out));\n }\n\n build.resolve({\n entrypoint,\n path,\n namespace: \"cleanup\",\n data: translations,\n });\n });\n },\n };\n}\n","import type Parser from \"@keqingmoe/tree-sitter\";\n\nexport function buildTemplate(node: Parser.SyntaxNode): { text: string; error?: string } {\n const source = node.tree.rootNode.text;\n const open = node.childForFieldName(\"open_tag\");\n const close = node.childForFieldName(\"close_tag\");\n const contentStart = open?.endIndex ?? node.startIndex;\n const contentEnd = close?.startIndex ?? node.endIndex;\n\n type Part = { kind: \"text\"; text: string; raw: boolean } | { kind: \"expr\"; value: string };\n\n const parts: Part[] = [];\n let segmentStart = contentStart;\n\n const pushRawText = (endIndex: number) => {\n if (endIndex <= segmentStart) {\n segmentStart = Math.max(segmentStart, endIndex);\n return;\n }\n const text = source.slice(segmentStart, endIndex);\n if (text) {\n parts.push({ kind: \"text\", text, raw: true });\n }\n segmentStart = endIndex;\n };\n\n const children = node.namedChildren.slice(1, -1);\n for (const child of children) {\n if (child.type === \"jsx_expression\") {\n pushRawText(child.startIndex);\n const expr = child.namedChildren[0];\n if (!expr) {\n return { text: \"\", error: \"Empty JSX expression\" };\n }\n\n if (expr.type === \"identifier\") {\n parts.push({ kind: \"expr\", value: expr.text });\n } else if (expr.type === \"string\") {\n parts.push({ kind: \"text\", text: expr.text.slice(1, -1), raw: false });\n } else if (expr.type === \"template_string\") {\n const hasSubstitutions = expr.children.some((c) => c.type === \"template_substitution\");\n if (hasSubstitutions) {\n return { text: \"\", error: \"JSX expressions with template substitutions are not supported\" };\n }\n parts.push({ kind: \"text\", text: expr.text.slice(1, -1), raw: false });\n } else {\n return { text: \"\", error: \"JSX expressions must be simple identifiers, strings, or template literals\" };\n }\n segmentStart = child.endIndex;\n } else if (child.type === \"string\") {\n pushRawText(child.startIndex);\n parts.push({ kind: \"text\", text: child.text.slice(1, -1), raw: false });\n segmentStart = child.endIndex;\n } else if (child.type === \"jsx_text\" || child.type === \"html_character_reference\" || child.isError) {\n } else {\n return { text: \"\", error: \"Unsupported JSX child\" };\n }\n }\n\n pushRawText(contentEnd);\n\n const firstRawIndex = parts.findIndex((part) => part.kind === \"text\" && part.raw);\n if (firstRawIndex === 0) {\n const part = parts[firstRawIndex] as Extract<Part, { kind: \"text\" }>;\n part.text = part.text.replace(/^\\s+/, \"\");\n }\n\n let lastRawIndex = -1;\n for (let i = parts.length - 1; i >= 0; i--) {\n const part = parts[i];\n if (part.kind === \"text\" && part.raw) {\n lastRawIndex = i;\n break;\n }\n }\n if (lastRawIndex !== -1 && lastRawIndex === parts.length - 1) {\n const part = parts[lastRawIndex] as Extract<Part, { kind: \"text\" }>;\n part.text = part.text.replace(/\\s+$/, \"\");\n }\n\n const strings: string[] = [\"\"];\n const values: string[] = [];\n for (const part of parts) {\n if (part.kind === \"text\") {\n if (part.text) {\n strings[strings.length - 1] += part.text;\n }\n } else {\n values.push(part.value);\n strings.push(\"\");\n }\n }\n\n let text = \"\";\n for (let i = 0; i < strings.length; i++) {\n text += strings[i];\n if (values[i]) {\n text += `\\${${values[i]}}`;\n }\n }\n return { text };\n}\n\nexport function buildAttrValue(node: Parser.SyntaxNode): { text: string; error?: string } {\n if (node.type === \"string\") {\n return { text: node.text.slice(1, -1) };\n }\n if (node.type === \"jsx_expression\") {\n const expr = node.namedChildren[0];\n if (!expr) {\n return { text: \"\", error: \"Empty JSX expression\" };\n }\n\n if (expr.type === \"identifier\") {\n return { text: `\\${${expr.text}}` };\n } else if (expr.type === \"string\") {\n return { text: expr.text.slice(1, -1) };\n } else if (expr.type === \"template_string\") {\n // Check if it's a simple template string with no substitutions\n const hasSubstitutions = expr.children.some((c) => c.type === \"template_substitution\");\n if (hasSubstitutions) {\n return { text: \"\", error: \"JSX expressions with template substitutions are not supported\" };\n }\n // Extract the text content from the template string\n const content = expr.text.slice(1, -1); // Remove backticks\n return { text: content };\n } else {\n return { text: \"\", error: \"JSX expressions must be simple identifiers, strings, or template literals\" };\n }\n }\n return { text: \"\", error: \"Unsupported JSX child\" };\n}\n","import type Parser from \"@keqingmoe/tree-sitter\";\n\nimport { withComment } from \"../../core/queries/comment.ts\";\nimport type { MessageMatch, QuerySpec, Translation } from \"../../core/queries/types.ts\";\nimport { buildAttrValue, buildTemplate } from \"./utils.ts\";\n\nexport const messageQuery: QuerySpec = withComment({\n pattern: `(\n [\n (jsx_element (jsx_opening_element name: (identifier) @name)) @call\n (jsx_self_closing_element name: (identifier) @name) @call\n (lexical_declaration \n (variable_declarator \n value: [\n (jsx_element (jsx_opening_element name: (identifier) @name)) @call\n (jsx_self_closing_element name: (identifier) @name) @call\n ]\n )\n )\n ]\n (#eq? @name \"Message\")\n )`,\n extract(match: Parser.QueryMatch): MessageMatch | undefined {\n const node = match.captures.find((c) => c.name === \"call\")?.node;\n if (!node) return undefined;\n let attrs: Parser.SyntaxNode[] = [];\n if (node.type === \"jsx_element\") {\n const open = node.childForFieldName(\"open_tag\");\n if (open) attrs = open.namedChildren;\n } else if (node.type === \"jsx_self_closing_element\") {\n attrs = node.namedChildren.slice(1);\n }\n let msgctxt: string | undefined;\n let childValue: Parser.SyntaxNode | undefined;\n for (const child of attrs) {\n if (child.type !== \"jsx_attribute\") continue;\n const name = child.child(0);\n const value = child.child(child.childCount - 1);\n if (name?.text === \"context\" && value?.type === \"string\") {\n msgctxt = value.text.slice(1, -1);\n } else if (name?.text === \"children\" && value) {\n childValue = value;\n }\n }\n let text = \"\";\n let error: string | undefined;\n if (node.type === \"jsx_element\") {\n ({ text, error } = buildTemplate(node));\n } else if (childValue) {\n ({ text, error } = buildAttrValue(childValue));\n }\n if (error) {\n return { node, error };\n }\n if (!text) return undefined;\n const translation: Translation = {\n id: text,\n message: [text],\n };\n if (msgctxt) translation.context = msgctxt;\n return { node, translation };\n },\n});\n","import type Parser from \"@keqingmoe/tree-sitter\";\n\nimport { withComment } from \"../../core/queries/comment.ts\";\nimport type { MessageMatch, QuerySpec, Translation } from \"../../core/queries/types.ts\";\nimport { buildTemplate } from \"./utils.ts\";\n\nfunction parseForms(node: Parser.SyntaxNode): { forms: string[]; error?: string } {\n const forms: string[] = [];\n if (node.type === \"jsx_expression\") {\n const arr = node.namedChildren[0];\n if (!arr || arr.type !== \"array\") {\n return { forms: [], error: \"Plural forms must be an array\" };\n }\n for (const el of arr.namedChildren) {\n if (el.type === \"jsx_element\" || el.type === \"jsx_fragment\") {\n const { text, error } = buildTemplate(el);\n if (error) return { forms: [], error };\n forms.push(text);\n } else if (el.type === \"string\") {\n forms.push(el.text.slice(1, -1));\n } else {\n return { forms: [], error: \"Unsupported plural form\" };\n }\n }\n }\n return { forms };\n}\n\nexport const pluralQuery: QuerySpec = withComment({\n pattern: `(\n [\n (jsx_element (jsx_opening_element name: (identifier) @name))\n (jsx_self_closing_element name: (identifier) @name)\n ] @call\n (#eq? @name \"Plural\")\n )`,\n extract(match: Parser.QueryMatch): MessageMatch | undefined {\n const node = match.captures.find((c) => c.name === \"call\")?.node;\n if (!node) return undefined;\n let attrs: Parser.SyntaxNode[] = [];\n if (node.type === \"jsx_element\") {\n const open = node.childForFieldName(\"open_tag\");\n if (open) attrs = open.namedChildren;\n } else if (node.type === \"jsx_self_closing_element\") {\n attrs = node.namedChildren.slice(1);\n }\n let msgctxt: string | undefined;\n let formsNode: Parser.SyntaxNode | null | undefined;\n for (const child of attrs) {\n if (child.type !== \"jsx_attribute\") continue;\n const name = child.child(0);\n const value = child.child(child.childCount - 1);\n if (name?.text === \"context\" && value?.type === \"string\") {\n msgctxt = value.text.slice(1, -1);\n } else if (name?.text === \"forms\" && value) {\n formsNode = value;\n }\n }\n if (!formsNode) return undefined;\n const { forms, error } = parseForms(formsNode);\n if (error) {\n return { node, error };\n }\n if (forms.length === 0) return undefined;\n const translation: Translation = {\n id: forms[0],\n plural: forms[1],\n message: forms,\n };\n if (msgctxt) translation.context = msgctxt;\n return { node, translation };\n },\n});\n","import type { QuerySpec } from \"../../core/queries/types.ts\";\nimport { messageQuery } from \"./message.ts\";\nimport { pluralQuery } from \"./plural.ts\";\n\nexport const queries: QuerySpec[] = [messageQuery, pluralQuery];\n","import fs from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { getParser, getQuery } from \"../core/parse.ts\";\nimport { getReference } from \"../core/queries/comment.ts\";\n\nimport type { Context, Translation, Warning } from \"../core/queries/types.ts\";\nimport { queries } from \"./queries/index.ts\";\n\nexport interface ParseResult {\n translations: Translation[];\n warnings: Warning[];\n}\n\nexport function parseFile(filePath: string): ParseResult {\n const path = resolve(filePath);\n const source = fs.readFileSync(path, \"utf8\");\n return parseSource(source, path);\n}\n\nexport function parseSource(source: string, path: string): ParseResult {\n const context: Context = { path };\n const { parser, language } = getParser(path);\n const tree = parser.parse(source);\n\n const translations: Translation[] = [];\n const warnings: Warning[] = [];\n const seen = new Set<number>();\n\n for (const spec of queries) {\n const query = getQuery(language, spec.pattern);\n for (const match of query.matches(tree.rootNode)) {\n const message = spec.extract(match);\n if (!message) continue;\n const { node, translation, error } = message;\n if (seen.has(node.id)) continue;\n seen.add(node.id);\n const reference = getReference(node, context);\n if (translation) {\n translations.push({\n ...translation,\n comments: {\n ...translation.comments,\n reference,\n },\n });\n }\n if (error) {\n warnings.push({\n error,\n reference,\n });\n }\n }\n }\n\n return { translations, warnings };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport type { Plugin } from \"../../plugin.ts\";\nimport type { Translation } from \"../core/queries/types.ts\";\nimport { parseSource } from \"./parse.ts\";\n\nconst filter = /\\.[cm]?[jt]sx$/;\n\nexport function react(): Plugin<string, Translation[]> {\n return {\n name: \"react\",\n setup(build) {\n build.context.logger?.debug(\"react plugin initialized\");\n build.onResolve({ filter: /.*/, namespace: \"source\" }, ({ entrypoint, path, namespace }) => {\n return {\n entrypoint,\n namespace,\n path: resolve(path),\n };\n });\n build.onLoad({ filter, namespace: \"source\" }, async ({ entrypoint, path, namespace }) => {\n const data = await readFile(path, \"utf8\");\n return {\n entrypoint,\n path,\n namespace,\n data,\n };\n });\n build.onProcess({ filter, namespace: \"source\" }, ({ entrypoint, path, data }) => {\n const { translations, warnings } = parseSource(data, path);\n\n for (const warning of warnings) {\n build.context.logger?.warn(`${warning.error} at ${warning.reference}`);\n }\n\n build.resolve({\n entrypoint,\n path,\n namespace: \"translate\",\n data: translations,\n });\n\n return undefined;\n });\n },\n };\n}\n","import type { Plugin, UniversalPlugin } from \"../plugin.ts\";\n\nimport { cleanup, core, po, react } from \"./index.ts\";\n\nconst original = {\n cleanup,\n core,\n po,\n react,\n} as const;\n\nexport function resolveStaticPlugin(item: UniversalPlugin): Plugin {\n if (\"static\" in item) {\n return original[item.static.name](...item.static.props);\n }\n\n return item;\n}\n","import glob from \"fast-glob\";\nimport type { ResolvedConfig, ResolvedEntrypoint } from \"./configuration.ts\";\nimport { Defer } from \"./defer.ts\";\nimport type { Logger } from \"./logger.ts\";\nimport type {\n Build,\n Context,\n Filter,\n LoadArgs,\n LoadHook,\n ProcessArgs,\n ProcessHook,\n ResolveArgs,\n ResolveHook,\n} from \"./plugin.ts\";\nimport { resolveStaticPlugin } from \"./plugins/static.ts\";\n\nexport type Task =\n | {\n type: \"resolve\";\n args: ResolveArgs;\n }\n | {\n type: \"load\";\n args: LoadArgs;\n }\n | {\n type: \"process\";\n args: ProcessArgs;\n };\n\nexport async function run(\n entrypoint: ResolvedEntrypoint,\n { config, logger }: { config: ResolvedConfig; logger?: Logger },\n) {\n const destination = entrypoint.destination ?? config.destination;\n const obsolete = entrypoint.obsolete ?? config.obsolete;\n const exclude = entrypoint.exclude ?? config.exclude;\n const walk = entrypoint.walk ?? config.walk;\n\n const context: Context = {\n config: { ...config, destination, obsolete, exclude, walk },\n generatedAt: new Date(),\n logger,\n };\n\n logger?.info(entrypoint, \"starting extraction\");\n\n const resolvers: { filter: Filter; hook: ResolveHook }[] = [];\n const loaders: { filter: Filter; hook: LoadHook }[] = [];\n const processors: { filter: Filter; hook: ProcessHook }[] = [];\n const hooks = {\n resolve: resolvers,\n load: loaders,\n process: processors,\n };\n\n const pending = new Map<string, Defer>();\n const queue: Task[] = [];\n\n function getDeferred(namespace: string) {\n let defer = pending.get(namespace);\n if (defer === undefined) {\n defer = new Defer();\n pending.set(namespace, defer);\n }\n return defer;\n }\n\n function defer(namespace: string) {\n const defer = getDeferred(namespace);\n return defer.promise;\n }\n\n function resolve(args: ResolveArgs) {\n const { entrypoint, path, namespace } = args;\n const skipped = context.config.exclude.some((ex) => (typeof ex === \"function\" ? ex(args) : ex.test(args.path)));\n logger?.debug({ entrypoint, path, namespace, skipped }, \"resolve\");\n\n if (skipped) {\n return;\n }\n\n queue.push({ type: \"resolve\", args });\n getDeferred(namespace).enqueue();\n }\n\n function load(args: LoadArgs) {\n const { entrypoint, path, namespace } = args;\n logger?.debug({ entrypoint, path, namespace }, \"load\");\n\n queue.push({ type: \"load\", args });\n getDeferred(namespace).enqueue();\n }\n\n function process(args: ProcessArgs) {\n const { entrypoint, path, namespace } = args;\n logger?.debug({ entrypoint, path, namespace }, \"process\");\n\n queue.push({ type: \"process\", args });\n getDeferred(namespace).enqueue();\n }\n\n const build: Build = {\n context,\n resolve,\n load,\n process,\n defer,\n onResolve(filter, hook) {\n resolvers.push({ filter, hook });\n },\n onLoad(filter, hook) {\n loaders.push({ filter, hook });\n },\n onProcess(filter, hook) {\n processors.push({ filter, hook });\n },\n };\n\n for (const item of config.plugins) {\n const plugin = resolveStaticPlugin(item);\n logger?.debug({ plugin: plugin.name }, \"setting up plugin\");\n plugin.setup(build);\n }\n\n const pattern = entrypoint.entrypoint.replace(/\\\\/g, \"/\");\n const paths = glob.isDynamicPattern(pattern) ? await glob(pattern, { onlyFiles: true }) : [entrypoint.entrypoint];\n logger?.debug({ entrypoint: entrypoint.entrypoint, paths }, \"resolved paths\");\n\n for (const path of paths) {\n resolve({ entrypoint: path, path, namespace: \"source\" });\n }\n\n async function processTask(task: Task) {\n const { type } = task;\n let args = task.args;\n const { entrypoint, path, namespace } = args;\n logger?.trace({ type, entrypoint, path, namespace }, \"processing task\");\n\n for (const { filter, hook } of hooks[type]) {\n if (filter.namespace !== namespace) continue;\n if (filter.filter && !filter.filter.test(path)) continue;\n\n const result = await hook(args as never);\n if (result !== undefined) {\n args = result as never;\n }\n }\n\n if (args !== undefined) {\n if (type === \"resolve\") {\n load(args as never);\n } else if (type === \"load\") {\n process(args as never);\n }\n }\n\n getDeferred(namespace).dequeue();\n }\n\n while (queue.length || Array.from(pending.values()).some((d) => d.pending > 0)) {\n while (queue.length) {\n const task = queue.shift();\n if (!task) {\n break;\n }\n\n await processTask(task);\n }\n\n await Promise.all(Array.from(pending.values()).map((d) => d.promise));\n await Promise.resolve();\n }\n\n logger?.info(entrypoint, \"extraction completed\");\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,IAAa,QAAb,MAAmB;CACf,UAAU;CACV,UAAyB,QAAQ,SAAS;CAC1C;CAEA,UAAU;AACN,MAAI,KAAK,cAAc,EACnB,MAAK,UAAU,IAAI,SAAe,QAAQ;AACtC,QAAK,UAAU;IACjB;;CAGV,UAAU;AACN,MAAI,KAAK,UAAU,KAAK,EAAE,KAAK,YAAY,EACvC,MAAK,WAAW;;;;;;ACP5B,MAAMA,cAAY;AAElB,SAAgB,UAAkB;AAC9B,QAAO;EACH,MAAM;EACN,MAAM,OAAO;AACT,SAAM,QAAQ,QAAQ,MAAM,6BAA6B;GACzD,MAAM,4BAAY,IAAI,KAAa;GACnC,MAAM,4BAAY,IAAI,KAAa;GACnC,MAAM,uBAAO,IAAI,KAAa;GAC9B,IAAI,aAAa;AAEjB,SAAM,UAAU;IAAE;IAAW,QAAQ;IAAM,GAAG,EAAE,mBAAW;AACvD,cAAU,IAAIC,OAAK;AACnB,SAAK,IAAI,QAAQA,OAAK,CAAC;AAEvB,YAAQ,IAAI;KAAC,MAAM,MAAM,SAAS;KAAE,MAAM,MAAM,YAAY;KAAE,MAAM,MAAMD,YAAU;KAAC,CAAC,CAAC,WAAW;AAC9F,SAAI,WACA;AAEJ,kBAAa;AAEb,UAAK,MAAMC,UAAQ,KAAK,QAAQ,CAC5B,OAAM,QAAQ;MAAE,YAAYA;MAAM;MAAM;MAAW,MAAM;MAAW,CAAC;MAE3E;KAGJ;AAEF,SAAM,UAAU;IAAE;IAAW,QAAQ;IAAM,EAAE,OAAO,EAAE,mBAAW;AAC7D,QAAI,UAAU,IAAIA,OAAK,CACnB;AAEJ,cAAU,IAAIA,OAAK;IACnB,MAAM,QAAQ,MAAM,GAAG,QAAQA,OAAK,CAAC,YAAY,EAAE,CAAC;AACpD,SAAK,MAAM,KAAK,MAAM,QAAQ,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE;KACpD,MAAM,OAAO,KAAKA,QAAM,EAAE;KAC1B,MAAM,WAAW,MAAM,GAAG,SAAS,KAAK,CAAC,YAAY,OAAU;AAC/D,SAAI,CAAC,SACD;KAEJ,MAAM,SAAS,cAAc,GAAG,MAAM,SAAS;KAC/C,MAAM,kBAAkB,OAAO,QAAQ,OAAO,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,UAC1E,OAAO,KAAK,KAAK,CAAC,MAAM,OAAO,EAAE,QAAQ,MAAM,OAAO,IAAI,CAC7D;AACD,SAAI,CAAC,mBAAmB,UAAU,IAAI,KAAK,CACvC,OAAM,GAAG,OAAO,KAAK;AAEzB,SAAI,mBAAmB,CAAC,UAAU,IAAI,KAAK,CACvC,OAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,MAAM,EAAE,yBAAyB;;KAI9E;;EAET;;;;;AC1DL,SAAgB,aAAa,MAAyB,EAAE,gBAAiB;CACrE,MAAM,OAAO,KAAK,cAAc,MAAM;AAEtC,QAAO,GADK,SAAS,QAAQ,KAAK,EAAEC,OAAK,CAAC,QAAQ,QAAQ,IAAI,CAChD,GAAG;;AAGrB,SAAS,WAAW,MAAiC;CACjD,MAAM,OAAO,KAAK;AAClB,KAAI,KAAK,WAAW,KAAK,CACrB,QAAO,KACF,MAAM,GAAG,GAAG,CACZ,QAAQ,gBAAgB,GAAG,CAC3B,MAAM;AAEf,QAAO,KAAK,QAAQ,YAAY,GAAG,CAAC,MAAM;;AAG9C,MAAa,eAAe,WAAiC;CACzD,SAAS;;;MAGP,MAAM,QAAQ;;CAEhB,QAAQ,OAAO;EACX,MAAM,SAAS,MAAM,QAAQ,MAAM;AACnC,MAAI,CAAC,QAAQ,YACT,QAAO;EAGX,MAAM,UAAU,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,UAAU,EAAE;AAClE,MAAI,CAAC,QACD,QAAO;AAGX,MAAI,QACA,QAAO,YAAY,WAAW;GAC1B,GAAG,OAAO,YAAY;GACtB,WAAW,WAAW,QAAQ;GACjC;AAGL,SAAO;;CAEd;;;;AC7CD,MAAaC,cAA+B;CACxC,SAAS;;;;;;;;;;;;;;;;;;;;;;CAsBT,QAAQ,OAA8C;AAElD,UADa,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,SAAS,EAAE,OACjD;;CAEpB;;;;AC5BD,MAAa,eAAe,QAAgB,MAAc,cAAc,SAAiB;;gBAGjF,cACM;;;SAIA,qBACT;iBACY,KAAK;;iBAEL,OAAO;;AAGxB,SAAgB,aAAa,MAAyB,UAAsC;CACxF,IAAIC,UAAoC;AACxC,QAAO,SAAS;AACZ,MAAI,QAAQ,OAAO,SAAS,GAAI,QAAO;AACvC,YAAU,QAAQ;;AAEtB,QAAO;;;;;AClBX,MAAM,eAAe,WAAiC;CAClD,SAAS,MAAM;CACf,QAAQ,OAAO;EACX,MAAM,SAAS,MAAM,QAAQ,MAAM;AACnC,MAAI,CAAC,QAAQ,KACT,QAAO;EAGX,IAAI,SAAS,OAAO,KAAK;AAEzB,MAAI,UAAU,OAAO,SAAS,YAC1B,UAAS,OAAO;AAGpB,MAAI,UAAU,OAAO,SAAS,mBAAmB;GAC7C,MAAM,KAAK,OAAO,kBAAkB,WAAW;AAC/C,OAAI,IACA;QACK,GAAG,SAAS,iBACR,GAAG,SAAS,YACT,GAAG,SAAS,cACZ,GAAG,SAAS,cACZ,GAAG,SAAS,gBACnB,GAAG,SAAS,uBACT;KAAC;KAAU;KAAY;KAAY;KAAY,CAAC,SAC5C,GAAG,kBAAkB,WAAW,EAAE,QAAQ,GAC7C,CAEL;;;AAKZ,SAAO;;CAEd;AAED,MAAa,aAAa;;;;;;;;;;;;;;;;;;;AAoB1B,MAAa,cAAc,gBAAgB,WAAW;AAEtD,MAAa,kBACR,UACA,UAAuD;CACpD,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE;AAC5D,KAAI,CAAC,KACD;CAGJ,MAAM,QAAQ,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,QAAQ,EAAE,KAAK;AACnE,KAAI,MACA,QAAO;EACH;EACA,aAAa;GACT,IAAI;GACJ,SAAS,CAAC,MAAM;GACnB;EACJ;CAGL,MAAM,MAAM,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE;AAC1D,KAAI,KAAK;AACL,OAAK,MAAM,SAAS,IAAI,UAAU;AAC9B,OAAI,MAAM,SAAS,wBACf;GAGJ,MAAM,OAAO,MAAM,cAAc;AACjC,OAAI,CAAC,QAAQ,KAAK,SAAS,aACvB,QAAO;IACH;IACA,OAAO,GAAG,KAAK;IAClB;;EAIT,MAAM,OAAO,IAAI,KAAK,MAAM,GAAG,GAAG;AAElC,SAAO;GACH;GACA,aAAa;IAAE,IAAI;IAAM,SAAS,CAAC,KAAK;IAAE;GAC7C;;CAGL,MAAM,KAAK,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,KAAK,EAAE,KAAK;CAC7D,MAAM,UAAU,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,UAAU,EAAE,KAAK;CACvE,MAAM,QAAQ,MAAM;AACpB,KAAI,CAAC,MACD;AAKJ,QAAO;EACH;EACA,aAAa;GACT,IAAI;GACJ,SAAS,CANF,WAAW,MAAM,GAMP;GACpB;EACJ;;AAGT,MAAaC,iBAA0B,YACnC,YAAY;CACR,SAAS,YAAY,WAAW,YAAY;CAC5C,SAAS,eAAe,UAAU;CACrC,CAAC,CACL;AAED,MAAMC,YAAU,IAAI,IAAI;CAAC;CAAU;CAAU;CAAkB,CAAC;AAEhE,MAAaC,sBAAiC,YAAY;CACtD,SAAS,YAAY,WAAW,uBAAuB;CACvD,QAAQ,OAAO;EACX,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE;EAC5D,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE;AAE3D,MAAI,CAAC,QAAQ,CAAC,KACV;AAGJ,MAAID,UAAQ,IAAI,KAAK,KAAK,CACtB;AAGJ,SAAO;GACH;GACA,OAAO;GACV;;CAER,CAAC;;;;ACpJF,MAAa,sBACR,UACA,UAAuD;CACpD,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE;CAC5D,MAAM,IAAI,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,IAAI,EAAE;AACtD,KAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,iBACjB;CAGJ,MAAM,UAAU,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,UAAU,EAAE,MAAM;CACxE,MAAM,WAAW,MAAM,SAAS,QAAQ,MAAM,EAAE,SAAS,MAAM,CAAC,KAAK,MAAM,EAAE,KAAK;CAElF,MAAME,MAAgB,EAAE;CACxB,MAAMC,OAAiB,EAAE;AAEzB,MAAK,MAAM,QAAQ,UAAU;EACzB,MAAM,WAAW,MAAM,SAAS,QAC3B,MAAM;GAAC;GAAS;GAAM;GAAW;GAAM,CAAC,SAAS,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,KAAK,CAC1F;EAED,MAAMC,WAA8B;GAChC,SAAS;GACT,UAAU,CAAC;IAAE,MAAM;IAAQ;IAAM,EAAE,GAAG,SAAS;GAClD;EAED,MAAM,SAAS,eAAe,KAAK,CAAC,SAAS;AAC7C,MAAI,CAAC,OAAQ;AACb,MAAI,OAAO,MACP,QAAO;GAAE,MAAM;GAAM,OAAO,OAAO;GAAO;AAE9C,MAAI,OAAO,aAAa;AACpB,OAAI,KAAK,OAAO,YAAY,GAAG;AAC/B,QAAK,KAAK,OAAO,YAAY,QAAQ,MAAM,GAAG;;;AAItD,KAAI,IAAI,WAAW,EACf;CAGJ,MAAMC,cAA2B;EAC7B,IAAI,IAAI;EACR,QAAQ,IAAI;EACZ,SAAS;EACZ;AACD,KAAI,QAAS,aAAY,UAAU;AAEnC,QAAO;EAAE,MAAM;EAAM;EAAa;;;;;AC9C1C,MAAM,UAAU,YACZ,WACA;;;GAIH,CACI,QAAQ,UAAU,OAAO,CACzB,QAAQ,UAAU,SAAS;AAEhC,MAAaC,kBAA6B,YAAY;CAClD,SAAS;;;gBAGG,QAAQ;;;iBAGP,YAAY;;;;CAIzB,QAAQ,OAAO;EACX,MAAM,SAAS,eAAe,kBAAkB,CAAC,MAAM;EACvD,MAAM,cAAc,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,UAAU,EAAE;AACtE,MAAI,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,YACnC,QAAO;AAGX,MAAI,YAAY,SAAS,kBACrB,MAAK,MAAM,SAAS,YAAY,UAAU;AACtC,OAAI,MAAM,SAAS,wBACf;GAGJ,MAAM,OAAO,MAAM,cAAc;AACjC,OAAI,CAAC,QAAQ,KAAK,SAAS,aACvB,QAAO;IACH,MAAM;IACN,OAAO;IACV;;EAKb,MAAM,cACF,YAAY,SAAS,oBAAoB,YAAY,KAAK,MAAM,GAAG,GAAG,GAAG,YAAY;AACzF,SAAO;GACH,MAAM,OAAO;GACb,aAAa;IACT,GAAG,OAAO;IACV,SAAS;IACZ;GACJ;;CAER,CAAC;AAEF,MAAMC,YAAU,YAAY,WAAW,aAAa,MAAM,CAAC,QAAQ,UAAU,OAAO,CAAC,QAAQ,UAAU,SAAS;AAEhH,MAAaC,qBAAgC,YAAY;CACrD,SAAS;;;gBAGG,QAAQ;;;;SAIfD,UAAQ;;;;;;CAMb,SAAS,mBAAmB,iBAAiB;CAChD,CAAC;AAEF,MAAaE,sBAAiC,YAAY;CACtD,SAAS;CACT,QAAQ,OAAO;EACX,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE;AAC3D,MAAI,CAAC,KACD;EAGJ,MAAM,SAAS,KAAK;AACpB,MAAI,UAAU,OAAO,SAAS,uBAAuB,OAAO,kBAAkB,SAAS,EAAE,OAAO,KAAK,IAAI;GACrG,MAAM,WAAW,OAAO,kBAAkB,WAAW,EAAE;GACvD,MAAM,cAAc,OAAO;AAC3B,OACI,eACA,YAAY,SAAS,qBACrB,YAAY,kBAAkB,WAAW,EAAE,OAAO,OAAO,OACxD,aAAa,aAAa,aAAa,UAExC;;AAIR,SAAO;GACH,MAAM;GACN,OAAO;GACV;;CAER,CAAC;;;;ACvGF,MAAaC,eAA0B,YAAY;CAC/C,SAAS,YAAY,WAAW,YAAY;CAC5C,SAAS,eAAe,UAAU;CACrC,CAAC;AAEF,MAAM,UAAU,IAAI,IAAI;CAAC;CAAU;CAAU;CAAmB;CAAc;CAAkB,CAAC;AAEjG,MAAaC,sBAAiC;CAC1C,SAAS,YAAY,WAAW,uBAAuB;CACvD,QAAQ,OAAO;EACX,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE;EAC5D,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE;AAE3D,MAAI,CAAC,QAAQ,CAAC,KACV;AAGJ,MAAI,QAAQ,IAAI,KAAK,KAAK,CACtB;AAGJ,SAAO;GACH;GACA,OAAO;GACV;;CAER;;;;ACzBD,MAAMC,YAAU,YAAY,WAAW,YAAY,CAAC,QAAQ,UAAU,OAAO,CAAC,QAAQ,UAAU,SAAS;AACzG,MAAMC,aAAW,IAAI,WAAW;AAChC,MAAMC,WAAS,IAAIF,UAAQ,GAAGC,WAAS;AAEvC,MAAaE,gBAA2B,YAAY;CAChD,SAAS,YAAY,YAAY,cAAcD,SAAO,OAAOA,SAAO,QAAQA,SAAO,gBAAgB;CACnG,SAAS,mBAAmB,WAAW;CAC1C,CAAC;;;;ACPF,MAAME,YAAU,YAAY,WAAW,YAAY,CAAC,QAAQ,UAAU,OAAO,CAAC,QAAQ,UAAU,SAAS;AACzG,MAAM,WAAW,IAAI,WAAW;AAChC,MAAM,SAAS,IAAIA,UAAQ,GAAG,SAAS;AAEvC,MAAaC,iBAA4B,YAAY;CACjD,SAAS,YACL,aACA,sDAAsD,OAAO,OAAO,OAAO,QAAQ,OAAO,gBAC7F;CACD,SAAS,mBAAmB,YAAY;CAC3C,CAAC;;;;ACXF,MAAaC,gBAA2B,YAAY;CAChD,SAAS,YAAY,YAAY,sDAAsD,WAAW,GAAG;CACrG,QAAQ,OAAO;EACX,MAAM,SAAS,eAAe,WAAW,CAAC,MAAM;EAChD,MAAM,cAAc,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,UAAU,EAAE;AACtE,MAAI,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,YACnC,QAAO;AAEX,SAAO;GACH,MAAM,OAAO;GACb,aAAa;IACT,GAAG,OAAO;IACV,SAAS,YAAY;IACxB;GACJ;;CAER,CAAC;;;;ACfF,MAAM,UAAU,YAAY,WAAW,aAAa,MAAM,CAAC,QAAQ,UAAU,OAAO,CAAC,QAAQ,UAAU,SAAS;AAEhH,MAAaC,gBAAyB,YAAY;CAC9C,SAAS,YACL,UACA;eACO,QAAQ;;aAGf,MACH;CACD,SAAS,mBAAmB,SAAS;CACxC,CAAC;;;;ACPF,MAAaC,YAAuB;CAChC;CACA;CACA;CACAC;CACA;CACA;CACA;CACAC;CACA;CACA;CACA;CACH;;;;ACLD,SAAS,YAAY,KAAa;AAC9B,SAAQ,KAAR;EACI,KAAK,MACD,QAAO,GAAG;EACd,KAAK,OACD,QAAO,GAAG;EACd,QACI,QAAO;;;AAInB,MAAM,8BAAc,IAAI,KAA4D;AACpF,MAAM,6BAAa,IAAI,SAAqD;AAE5E,SAAS,gBAAgB,KAAa;CAClC,IAAI,SAAS,YAAY,IAAI,IAAI;AACjC,KAAI,CAAC,QAAQ;EACT,MAAM,SAAS,IAAI,QAAQ;EAC3B,MAAM,WAAW,YAAY,IAAI;AACjC,SAAO,YAAY,SAAS;AAC5B,WAAS;GAAE;GAAQ;GAAU;AAC7B,cAAY,IAAI,KAAK,OAAO;;AAEhC,QAAO;;AAGX,SAAS,eAAe,UAA2B,SAAiB;CAChE,IAAI,QAAQ,WAAW,IAAI,SAAS;AACpC,KAAI,CAAC,OAAO;AACR,0BAAQ,IAAI,KAAK;AACjB,aAAW,IAAI,UAAU,MAAM;;CAGnC,IAAI,QAAQ,MAAM,IAAI,QAAQ;AAC9B,KAAI,CAAC,OAAO;AACR,UAAQ,IAAI,OAAO,MAAM,UAAU,QAAQ;AAC3C,QAAM,IAAI,SAAS,MAAM;;AAG7B,QAAO;;AAGX,SAAgB,UAAU,QAAc;CACpC,MAAM,MAAM,QAAQC,OAAK;AACzB,QAAO,gBAAgB,IAAI;;AAG/B,SAAgB,SAAS,UAA2B,SAAiB;AACjE,QAAO,eAAe,UAAU,QAAQ;;AAS5C,SAAgBC,cAAY,QAAgB,QAA2B;CACnE,MAAMC,UAAmB,EACrB,cACH;CAED,MAAM,EAAE,QAAQ,aAAa,UAAUF,OAAK;CAC5C,MAAM,OAAO,OAAO,MAAM,OAAO;CAEjC,MAAMG,eAA8B,EAAE;CACtC,MAAMC,WAAsB,EAAE;CAC9B,MAAMC,UAAoB,EAAE;CAE5B,MAAM,uBAAO,IAAI,KAAa;AAE9B,MAAK,MAAM,QAAQC,WAAS;EACxB,MAAM,QAAQ,eAAe,UAAU,KAAK,QAAQ;AACpD,OAAK,MAAM,SAAS,MAAM,QAAQ,KAAK,SAAS,EAAE;GAC9C,MAAM,UAAU,KAAK,QAAQ,MAAM;AACnC,OAAI,CAAC,QACD;GAGJ,MAAM,EAAE,MAAM,aAAa,UAAU;AACrC,OAAI,KAAK,IAAI,KAAK,GAAG,CACjB;AAEJ,QAAK,IAAI,KAAK,GAAG;GACjB,MAAM,YAAY,aAAa,MAAM,QAAQ;AAE7C,OAAI,YACA,cAAa,KAAK;IACd,GAAG;IACH,UAAU;KACN,GAAG,YAAY;KACf;KACH;IACJ,CAAC;AAGN,OAAI,MACA,UAAS,KAAK;IACV;IACA;IACH,CAAC;;;CAKd,MAAM,kBAAkB,eAAe,UAAU,YAAY,QAAQ;AACrE,MAAK,MAAM,SAAS,gBAAgB,QAAQ,KAAK,SAAS,EAAE;EACxD,MAAM,MAAM,YAAY,QAAQ,MAAM;AACtC,MAAI,IACA,SAAQ,KAAK,IAAI;;AAIzB,QAAO;EAAE;EAAc;EAAS;EAAU;;;;;AC/H9C,SAAS,aAAa,KAAiC;CACnD,IAAI,UAAU;AACd,QAAO,MAAM;EACT,MAAM,SAAS,KAAK,KAAK,SAAS,gBAAgB;AAClD,MAAIC,KAAG,WAAW,OAAO,CACrB,QAAO;EAEX,MAAM,SAAS,KAAK,QAAQ,QAAQ;AACpC,MAAI,WAAW,QACX;AAEJ,YAAU;;;AAIlB,MAAM,gCAAgB,IAAI,KAA8B;AAExD,SAAS,YAAY,KAAa;CAC9B,MAAM,WAAW,aAAa,IAAI;CAClC,MAAM,MAAM,YAAY;CACxB,IAAI,WAAW,cAAc,IAAI,IAAI;AACrC,KAAI,CAAC,UAAU;AACX,aAAW,IAAI,gBAAgB;GAC3B,YAAY;IAAC;IAAO;IAAQ;IAAO;IAAQ;IAAQ;IAAQ;IAAQ;GACnE,gBAAgB;IAAC;IAAU;IAAW;IAAO;GAC7C,GAAI,WAAW,EAAE,UAAU,EAAE,YAAY,UAAU,EAAE,GAAG,EAAE;GAC7D,CAAC;AACF,gBAAc,IAAI,KAAK,SAAS;;AAEpC,QAAO;;AAcX,SAAgB,eAAe,MAAc,SAA6B;CACtE,MAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ,KAAK,CAAC;CAC5C,MAAM,WAAW,YAAY,IAAI;CACjC,MAAMC,WAAqB,EAAE;AAC7B,MAAK,MAAM,QAAQ,SAAS;EACxB,MAAM,MAAM,SAAS,KAAK,KAAK,KAAK;AACpC,MAAI,IAAI,KACJ,UAAS,KAAK,IAAI,KAAK;;AAG/B,QAAO;;;;;ACjDX,MAAMC,WAAS;AACf,MAAMC,cAAY;AAElB,SAAgB,OAAsC;AAClD,QAAO;EACH,MAAM;EACN,MAAM,OAAO;AACT,SAAM,QAAQ,QAAQ,MAAM,0BAA0B;AACtD,SAAM,UAAU;IAAE;IAAQ;IAAW,GAAG,EAAE,YAAY,mBAAW;AAC7D,WAAO;KACH;KACA;KACA,MAAM,QAAQC,OAAK;KACtB;KACH;AAEF,SAAM,OAAO;IAAE;IAAQ;IAAW,EAAE,OAAO,EAAE,YAAY,mBAAW;IAChE,MAAM,OAAO,MAAM,SAASA,QAAM,OAAO;AACzC,WAAO;KACH;KACA;KACA;KACA;KACH;KACH;AAEF,SAAM,UAAU;IAAE;IAAQ;IAAW,GAAG,EAAE,YAAY,cAAM,WAAW;IACnE,MAAM,EAAE,cAAc,SAAS,aAAaC,cAAY,MAAMD,OAAK;AAEnE,QAAI,MAAM,QAAQ,OAAO,MAAM;KAC3B,MAAM,QAAQ,eAAeA,QAAM,QAAQ;AAC3C,UAAK,MAAMA,UAAQ,MACf,OAAM,QAAQ;MAAE;MAAY;MAAM;MAAW,CAAC;;AAItD,SAAK,MAAM,WAAW,SAClB,OAAM,QAAQ,QAAQ,KAAK,GAAG,QAAQ,MAAM,MAAM,QAAQ,YAAY;AAG1E,UAAM,QAAQ;KACV;KACA;KACA,WAAW;KACX,MAAM;KACT,CAAC;KAGJ;;EAET;;;;;ACrDL,SAAgB,QAAQ,QAAuB,QAA2C;CACtF,MAAME,eAAyC,EAAE,IAAI,EAAE,EAAE;CACzD,MAAM,WAAW,SAAS,YAAY,OAAO,GAAG;AAEhD,MAAK,MAAM,EAAE,SAAS,IAAI,SAAS,UAAU,UAAU,YAAY,QAAQ;EACvE,MAAM,MAAM,WAAW;AACvB,MAAI,CAAC,aAAa,KACd,cAAa,OAAO,EAAE;EAG1B,MAAM,SAAS,SAAU,YAAY,QAAQ,SAAU;EAEvD,MAAM,WAAW,aAAa,KAAK;EACnC,MAAM,uBAAO,IAAI,KAAa;AAC9B,MAAI,UAAU,UAAU,UACpB,UAAS,SAAS,UAAU,MAAM,WAAW,CAAC,SAAS,MAAM;AACzD,QAAK,IAAI,EAAE;IACb;AAEN,MAAI,UAAU,UACV,UAAS,UAAU,MAAM,WAAW,CAAC,SAAS,MAAM;AAChD,QAAK,IAAI,EAAE;IACb;EAGN,MAAM,SAAS,UAAU,SAAS,SAAS,OAAO,MAAM,GAAG,OAAO,GAAG,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG;AACrG,SAAO,OAAO,SAAS,OAAQ,QAAO,KAAK,GAAG;AAE9C,eAAa,KAAK,MAAM;GACpB,SAAS,WAAW;GACpB,OAAO;GACP,cAAc;GACd;GACA,UAAU;IACN,GAAG,UAAU;IACb,GAAG;IACH,WAAW,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,GAAG;IACxD;GACD,UAAU,UAAU,YAAY;GACnC;;AAGL,QAAO;;;;;AC3CX,MAAM,sBAAsB,IAAI,IAAI,CAAC,qBAAqB,mBAAmB,CAAC;AAC9E,MAAM,+BAA+B,CAAC,sBAAsB,oBAAoB;AAEhF,SAAS,sBAAsB,OAAuB;CAClD,MAAM,QAAQ,MAAM,MAAM,KAAK;CAC/B,MAAM,qBAAqB,MAAM,SAAS,KAAK;CAE/C,MAAM,WAAW,MACZ,QAAQ,SAAS;EACd,MAAM,UAAU,KAAK,WAAW,CAAC,aAAa;AAC9C,SAAO,CAAC,6BAA6B,MAAM,WAAW,QAAQ,WAAW,OAAO,CAAC;GACnF,CACD,KAAK,SAAS;EACX,MAAM,iBAAiB,KAAK,QAAQ,IAAI;AACxC,MAAI,mBAAmB,GACnB,QAAO;EAGX,MAAM,MAAM,KAAK,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,aAAa;EAC9D,MAAMC,UAAQ,KAAK,MAAM,iBAAiB,EAAE;AAC5C,SAAO,GAAG,IAAI,GAAGA;GACnB;AAEN,KAAI,sBAAsB,SAAS,SAAS,SAAS,OAAO,GACxD,UAAS,KAAK,GAAG;AAGrB,QAAO,SAAS,KAAK,KAAK;;AAG9B,SAAS,UAAU,cAAwD;CACvE,MAAM,WAAW,cAAc,GAAG,QAAQ,aAAa;CACvD,MAAM,SAAS,cAAc,GAAG,MAAM,SAAS;AAE/C,KAAI,OAAO,SAAS;EAChB,MAAMC,oBAA4C,EAAE;AACpD,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,QAAQ,CACrD,KAAI,CAAC,oBAAoB,IAAI,IAAI,aAAa,CAAC,CAC3C,mBAAkB,IAAI,aAAa,IAAI;AAG/C,SAAO,UAAU;;CAGrB,MAAM,gBAAgB,OAAO,eAAe,MAAM;AAClD,KAAI,eAAe,OACf,eAAc,SAAS,cAAc,OAAO,KAAK,SAAS,sBAAsB,KAAK,CAAC;AAG1F,QAAO;;AAGX,SAAgB,WAAW,MAA2B,OAAsC;AACxF,KAAI,CAAC,MACD,QAAO;CAGX,MAAM,iBAAiB,UAAU,KAAK;CACtC,MAAM,kBAAkB,UAAU,MAAM;AAExC,QAAO,CAAC,kBAAkB,gBAAgB,gBAAgB;;;;;ACvD9D,SAAgB,WAAW,MAAoB;CAC3C,MAAM,OAAO,MAAc,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI;CACxD,MAAM,OAAO,KAAK,aAAa;CAC/B,MAAM,QAAQ,IAAI,KAAK,UAAU,GAAG,EAAE;CACtC,MAAM,MAAM,IAAI,KAAK,SAAS,CAAC;CAC/B,MAAM,QAAQ,IAAI,KAAK,UAAU,CAAC;CAClC,MAAM,UAAU,IAAI,KAAK,YAAY,CAAC;CACtC,MAAM,MAAM,CAAC,KAAK,mBAAmB;CACrC,MAAM,OAAO,OAAO,IAAI,MAAM;CAC9B,MAAM,cAAc,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG,GAAG,CAAC;CACvD,MAAM,gBAAgB,IAAI,KAAK,IAAI,IAAI,GAAG,GAAG;AAC7C,QAAO,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,OAAO,cAAc;;AAG9E,SAAgB,MACZ,SACA,UACA,UACA,QACA,aACmB;CACnB,IAAIC,UAAkC,EAAE;CACxC,IAAIC,eAAyC,EAAE,IAAI,EAAE,EAAE;CACvD,IAAIC,uBAAiD,EAAE;CACvD,MAAM,WAAW,YAAY,OAAO;AAEpC,KAAI,UAAU;AACV,YAAU,SAAS,UAAU,gBAAgB,SAAS,QAAQ,GAAG,EAAE;AACnE,iBAAe,SAAS,eAAe,gBAAgB,SAAS,aAAa,GAAG,EAAE,IAAI,EAAE,EAAE;AAC1F,yBAAuB,SAAS,WAAW,gBAAgB,SAAS,SAAS,GAAG,EAAE;AAClF,OAAK,MAAM,OAAO,OAAO,KAAK,aAAa,CACvC,MAAK,MAAM,MAAM,OAAO,KAAK,aAAa,KAAK,EAAE;AAC7C,OAAI,QAAQ,MAAM,OAAO,GAAI;AAC7B,gBAAa,KAAK,IAAI,WAAW;;;CAK7C,MAAMC,YAAsC,EAAE,IAAI,EAAE,EAAE;AACtD,MAAK,MAAM,EAAE,kCAAkB,QAC3B,MAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQC,eAAa,EAAE;AACpD,MAAI,CAAC,UAAU,KAAM,WAAU,OAAO,EAAE;AACxC,OAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,KAAK,EAAE;GAC5C,MAAMC,aAAW,UAAU,KAAK;GAChC,MAAM,uBAAO,IAAI,KAAa;AAC9B,OAAIA,YAAU,UAAU,UACpB,YAAS,SAAS,UAAU,MAAM,WAAW,CAAC,SAAS,MAAM;AACzD,SAAK,IAAI,EAAE;KACb;AAEN,OAAI,MAAM,UAAU,UAChB,OAAM,SAAS,UAAU,MAAM,WAAW,CAAC,SAAS,MAAM;AACtD,SAAK,IAAI,EAAE;KACb;AAEN,aAAU,KAAK,MAAM;IACjB,GAAGA;IACH,GAAG;IACH,UAAU;KACN,GAAGA,YAAU;KACb,GAAG,MAAM;KACT,WAAW,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,GAAG;KACxD;IACJ;;;AAKb,MAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,UAAU,EAAE;AACjD,MAAI,CAAC,aAAa,KAAM,cAAa,OAAO,EAAE;AAC9C,OAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,KAAK,EAAE;GAC5C,MAAM,gBAAgB,aAAa,KAAK,OAAO,qBAAqB,OAAO;AAC3E,OAAI,eAAe;AACf,UAAM,SAAS,cAAc;AAC7B,UAAM,WAAW;KACb,GAAG,MAAM;KACT,YAAY,cAAc,UAAU;KACvC;;AAEL,UAAO,MAAM;AACb,SAAM,SAAS,MAAM,OAAO,MAAM,GAAG,SAAS;AAC9C,UAAO,MAAM,OAAO,SAAS,SACzB,OAAM,OAAO,KAAK,GAAG;AAEzB,gBAAa,KAAK,MAAM;AACxB,OAAI,qBAAqB,KACrB,QAAO,qBAAqB,KAAK;;;AAK7C,MAAK,MAAM,OAAO,OAAO,KAAK,aAAa,CACvC,MAAK,MAAM,MAAM,OAAO,KAAK,aAAa,KAAK,EAAE;AAC7C,MAAI,QAAQ,MAAM,OAAO,GACrB;EAEJ,MAAM,QAAQ,aAAa,KAAK;AAChC,MAAI,MAAM,UAAU;AAChB,OAAI,CAAC,qBAAqB,KACtB,sBAAqB,OAAO,EAAE;AAElC,wBAAqB,KAAK,MAAM;AAChC,UAAO,aAAa,KAAK;;;AAKrC,WAAU;EACN,GAAG;EACH,gBAAgB,QAAQ,mBAAmB;EAC3C,gBAAgB,YAAY,SAAS,WAAW,WAAW,OAAO,CAAC;EACnE,UAAU;EACV,gBAAgB;EAChB,6BAA6B;EAC7B,qBAAqB,WAAW,YAAY;EAC5C,eAAe;EAClB;AAED,QAAO;EACH,SAAS;EACT;EACA;EACA,GAAI,aAAa,UAAU,OAAO,KAAK,qBAAqB,CAAC,SAAS,EAAE,UAAU,sBAAsB,GAAG,EAAE;EAChH;;;;;AC1HL,MAAM,YAAY;AAElB,SAAgB,KAAa;AACzB,QAAO;EACH,MAAM;EACN,MAAM,OAAO;AACT,SAAM,QAAQ,QAAQ,MAAM,wBAAwB;GACpD,MAAM,8BAAc,IAAI,KAMrB;GACH,IAAI,aAAa;AAEjB,SAAM,UAAU;IAAE,QAAQ;IAAM;IAAW,EAAE,OAAO,EAAE,YAAY,cAAM,WAAW;AAC/E,QAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,KAAK,CAC7B;AAGJ,SAAK,MAAM,UAAU,MAAM,QAAQ,OAAO,SAAS;KAC/C,MAAM,cAAc,MAAM,QAAQ,OAAO,YAAY;MAAE;MAAY;MAAQ;MAAM,CAAC;AAClF,SAAI,CAAC,YAAY,IAAI,YAAY,CAC7B,aAAY,IAAI,aAAa;MAAE;MAAQ,cAAc,EAAE;MAAE,CAAC;AAG9D,iBAAY,IAAI,YAAY,EAAE,aAAa,KAAK,GAAG,KAAK;;AAG5D,YAAQ,IAAI,CAAC,MAAM,MAAM,SAAS,EAAE,MAAM,MAAM,UAAU,CAAC,CAAC,CAAC,WAAW;AACpE,SAAI,WACA;AAEJ,kBAAa;AAEb,UAAK,MAAMC,UAAQ,YAAY,MAAM,CACjC,OAAM,KAAK;MAAE;MAAY;MAAM;MAAW,CAAC;MAEjD;KAGJ;AAEF,SAAM,OAAO;IAAE,QAAQ;IAAW;IAAW,EAAE,OAAO,EAAE,YAAY,mBAAW;IAC3E,MAAM,WAAW,MAAM,GAAG,SAASA,OAAK,CAAC,YAAY,OAAU;IAC/D,MAAM,OAAO,WAAW,cAAc,GAAG,MAAM,SAAS,GAAG;AAC3D,WAAO;KACH;KACA;KACA;KACA;KACH;KACH;AAEF,SAAM,UAAU;IAAE,QAAQ;IAAW;IAAW,EAAE,OAAO,EAAE,YAAY,cAAM,WAAW;IACpF,MAAM,YAAY,YAAY,IAAIA,OAAK;AACvC,QAAI,CAAC,WAAW;AACZ,WAAM,QAAQ,QAAQ,KAAK,EAAE,cAAM,EAAE,0CAA0C;AAC/E;;IAGJ,MAAM,EAAE,QAAQ,iBAAiB;IAEjC,MAAM,SAAS,QAAQ,cAAc,OAAO;IAE5C,MAAM,MAAM,MACR,CAAC,EAAE,cAAc,QAAQ,CAAC,EAC1B,MACA,MAAM,QAAQ,OAAO,UACrB,QACA,MAAM,QAAQ,YACjB;AAED,QAAI,WAAW,KAAK,KAAc,EAAE;AAChC,WAAM,GAAG,MAAM,QAAQA,OAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AAClD,WAAM,GAAG,UAAUA,QAAM,cAAc,GAAG,QAAQ,IAAI,CAAC;;AAG3D,UAAM,QAAQ;KACV;KACA;KACA,WAAW;KACX,MAAM;KACT,CAAC;KACJ;;EAET;;;;;AC/FL,SAAgB,cAAc,MAA2D;CACrF,MAAM,SAAS,KAAK,KAAK,SAAS;CAClC,MAAM,OAAO,KAAK,kBAAkB,WAAW;CAC/C,MAAM,QAAQ,KAAK,kBAAkB,YAAY;CACjD,MAAM,eAAe,MAAM,YAAY,KAAK;CAC5C,MAAM,aAAa,OAAO,cAAc,KAAK;CAI7C,MAAMC,QAAgB,EAAE;CACxB,IAAI,eAAe;CAEnB,MAAM,eAAe,aAAqB;AACtC,MAAI,YAAY,cAAc;AAC1B,kBAAe,KAAK,IAAI,cAAc,SAAS;AAC/C;;EAEJ,MAAMC,SAAO,OAAO,MAAM,cAAc,SAAS;AACjD,MAAIA,OACA,OAAM,KAAK;GAAE,MAAM;GAAQ;GAAM,KAAK;GAAM,CAAC;AAEjD,iBAAe;;CAGnB,MAAM,WAAW,KAAK,cAAc,MAAM,GAAG,GAAG;AAChD,MAAK,MAAM,SAAS,SAChB,KAAI,MAAM,SAAS,kBAAkB;AACjC,cAAY,MAAM,WAAW;EAC7B,MAAM,OAAO,MAAM,cAAc;AACjC,MAAI,CAAC,KACD,QAAO;GAAE,MAAM;GAAI,OAAO;GAAwB;AAGtD,MAAI,KAAK,SAAS,aACd,OAAM,KAAK;GAAE,MAAM;GAAQ,OAAO,KAAK;GAAM,CAAC;WACvC,KAAK,SAAS,SACrB,OAAM,KAAK;GAAE,MAAM;GAAQ,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG;GAAE,KAAK;GAAO,CAAC;WAC/D,KAAK,SAAS,mBAAmB;AAExC,OADyB,KAAK,SAAS,MAAM,MAAM,EAAE,SAAS,wBAAwB,CAElF,QAAO;IAAE,MAAM;IAAI,OAAO;IAAiE;AAE/F,SAAM,KAAK;IAAE,MAAM;IAAQ,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG;IAAE,KAAK;IAAO,CAAC;QAEtE,QAAO;GAAE,MAAM;GAAI,OAAO;GAA6E;AAE3G,iBAAe,MAAM;YACd,MAAM,SAAS,UAAU;AAChC,cAAY,MAAM,WAAW;AAC7B,QAAM,KAAK;GAAE,MAAM;GAAQ,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG;GAAE,KAAK;GAAO,CAAC;AACvE,iBAAe,MAAM;YACd,MAAM,SAAS,cAAc,MAAM,SAAS,8BAA8B,MAAM,SAAS,OAEhG,QAAO;EAAE,MAAM;EAAI,OAAO;EAAyB;AAI3D,aAAY,WAAW;CAEvB,MAAM,gBAAgB,MAAM,WAAW,SAAS,KAAK,SAAS,UAAU,KAAK,IAAI;AACjF,KAAI,kBAAkB,GAAG;EACrB,MAAM,OAAO,MAAM;AACnB,OAAK,OAAO,KAAK,KAAK,QAAQ,QAAQ,GAAG;;CAG7C,IAAI,eAAe;AACnB,MAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EACxC,MAAM,OAAO,MAAM;AACnB,MAAI,KAAK,SAAS,UAAU,KAAK,KAAK;AAClC,kBAAe;AACf;;;AAGR,KAAI,iBAAiB,MAAM,iBAAiB,MAAM,SAAS,GAAG;EAC1D,MAAM,OAAO,MAAM;AACnB,OAAK,OAAO,KAAK,KAAK,QAAQ,QAAQ,GAAG;;CAG7C,MAAMC,UAAoB,CAAC,GAAG;CAC9B,MAAMC,SAAmB,EAAE;AAC3B,MAAK,MAAM,QAAQ,MACf,KAAI,KAAK,SAAS,QACd;MAAI,KAAK,KACL,SAAQ,QAAQ,SAAS,MAAM,KAAK;QAErC;AACH,SAAO,KAAK,KAAK,MAAM;AACvB,UAAQ,KAAK,GAAG;;CAIxB,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAQ,QAAQ;AAChB,MAAI,OAAO,GACP,SAAQ,MAAM,OAAO,GAAG;;AAGhC,QAAO,EAAE,MAAM;;AAGnB,SAAgB,eAAe,MAA2D;AACtF,KAAI,KAAK,SAAS,SACd,QAAO,EAAE,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,EAAE;AAE3C,KAAI,KAAK,SAAS,kBAAkB;EAChC,MAAM,OAAO,KAAK,cAAc;AAChC,MAAI,CAAC,KACD,QAAO;GAAE,MAAM;GAAI,OAAO;GAAwB;AAGtD,MAAI,KAAK,SAAS,aACd,QAAO,EAAE,MAAM,MAAM,KAAK,KAAK,IAAI;WAC5B,KAAK,SAAS,SACrB,QAAO,EAAE,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,EAAE;WAChC,KAAK,SAAS,mBAAmB;AAGxC,OADyB,KAAK,SAAS,MAAM,MAAM,EAAE,SAAS,wBAAwB,CAElF,QAAO;IAAE,MAAM;IAAI,OAAO;IAAiE;AAI/F,UAAO,EAAE,MADO,KAAK,KAAK,MAAM,GAAG,GAAG,EACd;QAExB,QAAO;GAAE,MAAM;GAAI,OAAO;GAA6E;;AAG/G,QAAO;EAAE,MAAM;EAAI,OAAO;EAAyB;;;;;AC5HvD,MAAaC,eAA0B,YAAY;CAC/C,SAAS;;;;;;;;;;;;;;;CAeT,QAAQ,OAAoD;EACxD,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE;AAC5D,MAAI,CAAC,KAAM,QAAO;EAClB,IAAIC,QAA6B,EAAE;AACnC,MAAI,KAAK,SAAS,eAAe;GAC7B,MAAM,OAAO,KAAK,kBAAkB,WAAW;AAC/C,OAAI,KAAM,SAAQ,KAAK;aAChB,KAAK,SAAS,2BACrB,SAAQ,KAAK,cAAc,MAAM,EAAE;EAEvC,IAAIC;EACJ,IAAIC;AACJ,OAAK,MAAM,SAAS,OAAO;AACvB,OAAI,MAAM,SAAS,gBAAiB;GACpC,MAAM,OAAO,MAAM,MAAM,EAAE;GAC3B,MAAM,QAAQ,MAAM,MAAM,MAAM,aAAa,EAAE;AAC/C,OAAI,MAAM,SAAS,aAAa,OAAO,SAAS,SAC5C,WAAU,MAAM,KAAK,MAAM,GAAG,GAAG;YAC1B,MAAM,SAAS,cAAc,MACpC,cAAa;;EAGrB,IAAI,OAAO;EACX,IAAIC;AACJ,MAAI,KAAK,SAAS,cACd,EAAC,CAAE,MAAM,SAAU,cAAc,KAAK;WAC/B,WACP,EAAC,CAAE,MAAM,SAAU,eAAe,WAAW;AAEjD,MAAI,MACA,QAAO;GAAE;GAAM;GAAO;AAE1B,MAAI,CAAC,KAAM,QAAO;EAClB,MAAMC,cAA2B;GAC7B,IAAI;GACJ,SAAS,CAAC,KAAK;GAClB;AACD,MAAI,QAAS,aAAY,UAAU;AACnC,SAAO;GAAE;GAAM;GAAa;;CAEnC,CAAC;;;;ACxDF,SAAS,WAAW,MAA8D;CAC9E,MAAMC,QAAkB,EAAE;AAC1B,KAAI,KAAK,SAAS,kBAAkB;EAChC,MAAM,MAAM,KAAK,cAAc;AAC/B,MAAI,CAAC,OAAO,IAAI,SAAS,QACrB,QAAO;GAAE,OAAO,EAAE;GAAE,OAAO;GAAiC;AAEhE,OAAK,MAAM,MAAM,IAAI,cACjB,KAAI,GAAG,SAAS,iBAAiB,GAAG,SAAS,gBAAgB;GACzD,MAAM,EAAE,MAAM,UAAU,cAAc,GAAG;AACzC,OAAI,MAAO,QAAO;IAAE,OAAO,EAAE;IAAE;IAAO;AACtC,SAAM,KAAK,KAAK;aACT,GAAG,SAAS,SACnB,OAAM,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC;MAEhC,QAAO;GAAE,OAAO,EAAE;GAAE,OAAO;GAA2B;;AAIlE,QAAO,EAAE,OAAO;;AAGpB,MAAaC,cAAyB,YAAY;CAC9C,SAAS;;;;;;;CAOT,QAAQ,OAAoD;EACxD,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE;AAC5D,MAAI,CAAC,KAAM,QAAO;EAClB,IAAIC,QAA6B,EAAE;AACnC,MAAI,KAAK,SAAS,eAAe;GAC7B,MAAM,OAAO,KAAK,kBAAkB,WAAW;AAC/C,OAAI,KAAM,SAAQ,KAAK;aAChB,KAAK,SAAS,2BACrB,SAAQ,KAAK,cAAc,MAAM,EAAE;EAEvC,IAAIC;EACJ,IAAIC;AACJ,OAAK,MAAM,SAAS,OAAO;AACvB,OAAI,MAAM,SAAS,gBAAiB;GACpC,MAAM,OAAO,MAAM,MAAM,EAAE;GAC3B,MAAM,QAAQ,MAAM,MAAM,MAAM,aAAa,EAAE;AAC/C,OAAI,MAAM,SAAS,aAAa,OAAO,SAAS,SAC5C,WAAU,MAAM,KAAK,MAAM,GAAG,GAAG;YAC1B,MAAM,SAAS,WAAW,MACjC,aAAY;;AAGpB,MAAI,CAAC,UAAW,QAAO;EACvB,MAAM,EAAE,OAAO,UAAU,WAAW,UAAU;AAC9C,MAAI,MACA,QAAO;GAAE;GAAM;GAAO;AAE1B,MAAI,MAAM,WAAW,EAAG,QAAO;EAC/B,MAAMC,cAA2B;GAC7B,IAAI,MAAM;GACV,QAAQ,MAAM;GACd,SAAS;GACZ;AACD,MAAI,QAAS,aAAY,UAAU;AACnC,SAAO;GAAE;GAAM;GAAa;;CAEnC,CAAC;;;;ACpEF,MAAaC,UAAuB,CAAC,cAAc,YAAY;;;;ACe/D,SAAgB,YAAY,QAAgB,QAA2B;CACnE,MAAMC,UAAmB,EAAE,cAAM;CACjC,MAAM,EAAE,QAAQ,aAAa,UAAUC,OAAK;CAC5C,MAAM,OAAO,OAAO,MAAM,OAAO;CAEjC,MAAMC,eAA8B,EAAE;CACtC,MAAMC,WAAsB,EAAE;CAC9B,MAAM,uBAAO,IAAI,KAAa;AAE9B,MAAK,MAAM,QAAQ,SAAS;EACxB,MAAM,QAAQ,SAAS,UAAU,KAAK,QAAQ;AAC9C,OAAK,MAAM,SAAS,MAAM,QAAQ,KAAK,SAAS,EAAE;GAC9C,MAAM,UAAU,KAAK,QAAQ,MAAM;AACnC,OAAI,CAAC,QAAS;GACd,MAAM,EAAE,MAAM,aAAa,UAAU;AACrC,OAAI,KAAK,IAAI,KAAK,GAAG,CAAE;AACvB,QAAK,IAAI,KAAK,GAAG;GACjB,MAAM,YAAY,aAAa,MAAM,QAAQ;AAC7C,OAAI,YACA,cAAa,KAAK;IACd,GAAG;IACH,UAAU;KACN,GAAG,YAAY;KACf;KACH;IACJ,CAAC;AAEN,OAAI,MACA,UAAS,KAAK;IACV;IACA;IACH,CAAC;;;AAKd,QAAO;EAAE;EAAc;EAAU;;;;;AChDrC,MAAM,SAAS;AAEf,SAAgB,QAAuC;AACnD,QAAO;EACH,MAAM;EACN,MAAM,OAAO;AACT,SAAM,QAAQ,QAAQ,MAAM,2BAA2B;AACvD,SAAM,UAAU;IAAE,QAAQ;IAAM,WAAW;IAAU,GAAG,EAAE,YAAY,cAAM,6BAAgB;AACxF,WAAO;KACH;KACA;KACA,MAAM,QAAQC,OAAK;KACtB;KACH;AACF,SAAM,OAAO;IAAE;IAAQ,WAAW;IAAU,EAAE,OAAO,EAAE,YAAY,cAAM,6BAAgB;IACrF,MAAM,OAAO,MAAM,SAASA,QAAM,OAAO;AACzC,WAAO;KACH;KACA;KACA;KACA;KACH;KACH;AACF,SAAM,UAAU;IAAE;IAAQ,WAAW;IAAU,GAAG,EAAE,YAAY,cAAM,WAAW;IAC7E,MAAM,EAAE,cAAc,aAAa,YAAY,MAAMA,OAAK;AAE1D,SAAK,MAAM,WAAW,SAClB,OAAM,QAAQ,QAAQ,KAAK,GAAG,QAAQ,MAAM,MAAM,QAAQ,YAAY;AAG1E,UAAM,QAAQ;KACV;KACA;KACA,WAAW;KACX,MAAM;KACT,CAAC;KAGJ;;EAET;;;;;AC3CL,MAAM,WAAW;CACb;CACA;CACA;CACA;CACH;AAED,SAAgB,oBAAoB,MAA+B;AAC/D,KAAI,YAAY,KACZ,QAAO,SAAS,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,MAAM;AAG3D,QAAO;;;;;ACeX,eAAsB,IAClB,YACA,EAAE,QAAQ,UACZ;CACE,MAAM,cAAc,WAAW,eAAe,OAAO;CACrD,MAAM,WAAW,WAAW,YAAY,OAAO;CAC/C,MAAM,UAAU,WAAW,WAAW,OAAO;CAC7C,MAAM,OAAO,WAAW,QAAQ,OAAO;CAEvC,MAAMC,UAAmB;EACrB,QAAQ;GAAE,GAAG;GAAQ;GAAa;GAAU;GAAS;GAAM;EAC3D,6BAAa,IAAI,MAAM;EACvB;EACH;AAED,SAAQ,KAAK,YAAY,sBAAsB;CAE/C,MAAMC,YAAqD,EAAE;CAC7D,MAAMC,UAAgD,EAAE;CACxD,MAAMC,aAAsD,EAAE;CAC9D,MAAM,QAAQ;EACV,SAAS;EACT,MAAM;EACN,SAAS;EACZ;CAED,MAAM,0BAAU,IAAI,KAAoB;CACxC,MAAMC,QAAgB,EAAE;CAExB,SAAS,YAAY,aAAmB;EACpC,IAAIC,UAAQ,QAAQ,IAAIC,YAAU;AAClC,MAAID,YAAU,QAAW;AACrB,aAAQ,IAAI,OAAO;AACnB,WAAQ,IAAIC,aAAWD,QAAM;;AAEjC,SAAOA;;CAGX,SAAS,MAAM,aAAmB;AAE9B,SADc,YAAYC,YAAU,CACvB;;CAGjB,SAASC,UAAQ,MAAmB;EAChC,MAAM,EAAE,0BAAY,cAAM,2BAAc;EACxC,MAAM,UAAU,QAAQ,OAAO,QAAQ,MAAM,OAAQ,OAAO,OAAO,aAAa,GAAG,KAAK,GAAG,GAAG,KAAK,KAAK,KAAK,CAAE;AAC/G,UAAQ,MAAM;GAAE;GAAY;GAAM;GAAW;GAAS,EAAE,UAAU;AAElE,MAAI,QACA;AAGJ,QAAM,KAAK;GAAE,MAAM;GAAW;GAAM,CAAC;AACrC,cAAYD,YAAU,CAAC,SAAS;;CAGpC,SAAS,KAAK,MAAgB;EAC1B,MAAM,EAAE,0BAAY,cAAM,2BAAc;AACxC,UAAQ,MAAM;GAAE;GAAY;GAAM;GAAW,EAAE,OAAO;AAEtD,QAAM,KAAK;GAAE,MAAM;GAAQ;GAAM,CAAC;AAClC,cAAYA,YAAU,CAAC,SAAS;;CAGpC,SAASE,UAAQ,MAAmB;EAChC,MAAM,EAAE,0BAAY,cAAM,2BAAc;AACxC,UAAQ,MAAM;GAAE;GAAY;GAAM;GAAW,EAAE,UAAU;AAEzD,QAAM,KAAK;GAAE,MAAM;GAAW;GAAM,CAAC;AACrC,cAAYF,YAAU,CAAC,SAAS;;CAGpC,MAAMG,QAAe;EACjB;EACA;EACA;EACA;EACA;EACA,UAAU,UAAQ,MAAM;AACpB,aAAU,KAAK;IAAE;IAAQ;IAAM,CAAC;;EAEpC,OAAO,UAAQ,MAAM;AACjB,WAAQ,KAAK;IAAE;IAAQ;IAAM,CAAC;;EAElC,UAAU,UAAQ,MAAM;AACpB,cAAW,KAAK;IAAE;IAAQ;IAAM,CAAC;;EAExC;AAED,MAAK,MAAM,QAAQ,OAAO,SAAS;EAC/B,MAAM,SAAS,oBAAoB,KAAK;AACxC,UAAQ,MAAM,EAAE,QAAQ,OAAO,MAAM,EAAE,oBAAoB;AAC3D,SAAO,MAAM,MAAM;;CAGvB,MAAM,UAAU,WAAW,WAAW,QAAQ,OAAO,IAAI;CACzD,MAAM,QAAQ,KAAK,iBAAiB,QAAQ,GAAG,MAAM,KAAK,SAAS,EAAE,WAAW,MAAM,CAAC,GAAG,CAAC,WAAW,WAAW;AACjH,SAAQ,MAAM;EAAE,YAAY,WAAW;EAAY;EAAO,EAAE,iBAAiB;AAE7E,MAAK,MAAMC,UAAQ,MACf,WAAQ;EAAE,YAAYA;EAAM;EAAM,WAAW;EAAU,CAAC;CAG5D,eAAe,YAAY,MAAY;EACnC,MAAM,EAAE,SAAS;EACjB,IAAI,OAAO,KAAK;EAChB,MAAM,EAAE,0BAAY,cAAM,2BAAc;AACxC,UAAQ,MAAM;GAAE;GAAM;GAAY;GAAM;GAAW,EAAE,kBAAkB;AAEvE,OAAK,MAAM,EAAE,kBAAQ,UAAU,MAAM,OAAO;AACxC,OAAIC,SAAO,cAAcL,YAAW;AACpC,OAAIK,SAAO,UAAU,CAACA,SAAO,OAAO,KAAKD,OAAK,CAAE;GAEhD,MAAM,SAAS,MAAM,KAAK,KAAc;AACxC,OAAI,WAAW,OACX,QAAO;;AAIf,MAAI,SAAS,QACT;OAAI,SAAS,UACT,MAAK,KAAc;YACZ,SAAS,OAChB,WAAQ,KAAc;;AAI9B,cAAYJ,YAAU,CAAC,SAAS;;AAGpC,QAAO,MAAM,UAAU,MAAM,KAAK,QAAQ,QAAQ,CAAC,CAAC,MAAM,MAAM,EAAE,UAAU,EAAE,EAAE;AAC5E,SAAO,MAAM,QAAQ;GACjB,MAAM,OAAO,MAAM,OAAO;AAC1B,OAAI,CAAC,KACD;AAGJ,SAAM,YAAY,KAAK;;AAG3B,QAAM,QAAQ,IAAI,MAAM,KAAK,QAAQ,QAAQ,CAAC,CAAC,KAAK,MAAM,EAAE,QAAQ,CAAC;AACrE,QAAM,QAAQ,SAAS;;AAG3B,SAAQ,KAAK,YAAY,uBAAuB"}
|