@mohasinac/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js ADDED
@@ -0,0 +1,363 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ __spreadValues
4
+ } from "./chunk-N3ETBM74.js";
5
+
6
+ // src/cli.ts
7
+ import { Command as Command4 } from "commander";
8
+
9
+ // src/commands/add.ts
10
+ import { Command } from "commander";
11
+ import { join as join2 } from "path";
12
+
13
+ // src/utils.ts
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
15
+ import { dirname, join } from "path";
16
+ function findProjectRoot(cwd = process.cwd()) {
17
+ var _a, _b;
18
+ let dir = cwd;
19
+ while (true) {
20
+ const pkgPath = join(dir, "package.json");
21
+ if (existsSync(pkgPath)) {
22
+ try {
23
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
24
+ const deps = __spreadValues(__spreadValues({}, (_a = pkg.dependencies) != null ? _a : {}), (_b = pkg.devDependencies) != null ? _b : {});
25
+ if ("next" in deps) return dir;
26
+ } catch (e) {
27
+ }
28
+ }
29
+ const parent = dirname(dir);
30
+ if (parent === dir)
31
+ throw new Error("Could not find Next.js project root from: " + cwd);
32
+ dir = parent;
33
+ }
34
+ }
35
+ async function loadManifest(name, projectRoot) {
36
+ const monoSrcPath = join(
37
+ projectRoot,
38
+ "packages",
39
+ `feat-${name}`,
40
+ "src",
41
+ "manifest.ts"
42
+ );
43
+ const monoJsPath = join(
44
+ projectRoot,
45
+ "packages",
46
+ `feat-${name}`,
47
+ "dist",
48
+ "esm",
49
+ "manifest.js"
50
+ );
51
+ const pkgPath = join(
52
+ projectRoot,
53
+ "node_modules",
54
+ "@mohasinac",
55
+ `feat-${name}`,
56
+ "dist",
57
+ "esm",
58
+ "manifest.js"
59
+ );
60
+ const tryPaths = [monoJsPath, pkgPath];
61
+ let mod = null;
62
+ for (const p of tryPaths) {
63
+ if (existsSync(p)) {
64
+ mod = await import(
65
+ /* @vite-ignore */
66
+ `file://${p}`
67
+ );
68
+ break;
69
+ }
70
+ }
71
+ if (!mod) {
72
+ if (existsSync(monoSrcPath)) {
73
+ mod = await import(
74
+ /* @vite-ignore */
75
+ `file://${monoSrcPath}`
76
+ );
77
+ }
78
+ }
79
+ if (!(mod == null ? void 0 : mod.manifest)) {
80
+ throw new Error(
81
+ `Cannot find manifest for @mohasinac/feat-${name}. Tried:
82
+ ${tryPaths.join("\n ")}`
83
+ );
84
+ }
85
+ return mod.manifest;
86
+ }
87
+ function generateRouteStub(stub, featureName) {
88
+ const { default: def, generateMetadata: gm } = stub.exports;
89
+ const named = gm ? `{ ${def} as default, ${gm} }` : `{ ${def} as default }`;
90
+ return `// Auto-generated by @mohasinac/cli \u2014 do not edit
91
+ export ${named} from "@mohasinac/feat-${featureName}";
92
+ `;
93
+ }
94
+ function generateApiRouteStub(stub, featureName) {
95
+ const methods = stub.methods.join(", ");
96
+ const segment = stub.segment;
97
+ return `// Auto-generated by @mohasinac/cli \u2014 do not edit
98
+ export { ${methods} } from "@mohasinac/feat-${featureName}/${segment}";
99
+ `;
100
+ }
101
+ function writeStub(filePath, content) {
102
+ if (existsSync(filePath)) return "skipped";
103
+ mkdirSync(dirname(filePath), { recursive: true });
104
+ writeFileSync(filePath, content, "utf-8");
105
+ return "created";
106
+ }
107
+ function patchFeaturesConfig(projectRoot, featureKey, value) {
108
+ const candidates = [
109
+ join(projectRoot, "features.config.ts"),
110
+ join(projectRoot, "features.config.js")
111
+ ];
112
+ const configPath = candidates.find(existsSync);
113
+ if (!configPath) {
114
+ console.warn(" \u26A0 features.config.ts not found \u2014 skipping config patch");
115
+ return;
116
+ }
117
+ let source = readFileSync(configPath, "utf-8");
118
+ const valueStr = String(value);
119
+ const existingPattern = new RegExp(
120
+ `(\\b${featureKey}\\s*:\\s*)(true|false)`,
121
+ "g"
122
+ );
123
+ if (existingPattern.test(source)) {
124
+ source = source.replace(existingPattern, `$1${valueStr}`);
125
+ } else {
126
+ source = source.replace(
127
+ /(}\s*satisfies\s*FeaturesConfig)/,
128
+ ` ${featureKey}: ${valueStr},
129
+ $1`
130
+ );
131
+ }
132
+ writeFileSync(configPath, source, "utf-8");
133
+ }
134
+ function patchEnvExample(projectRoot, envKeys) {
135
+ if (envKeys.length === 0) return;
136
+ const envPath = join(projectRoot, ".env.example");
137
+ const existing = existsSync(envPath) ? readFileSync(envPath, "utf-8") : "";
138
+ const missing = envKeys.filter((k) => !existing.includes(k));
139
+ if (missing.length === 0) return;
140
+ const block = "\n# Added by @mohasinac/cli\n" + missing.map((k) => `${k}=`).join("\n") + "\n";
141
+ writeFileSync(envPath, existing + block, "utf-8");
142
+ }
143
+
144
+ // src/commands/add.ts
145
+ function addCommand() {
146
+ const cmd = new Command("add");
147
+ cmd.description("Add a @mohasinac/feat-<name> feature to the project").argument("<name>", "Feature name, e.g. events").option("-r, --root <path>", "Project root (default: auto-detect)").option("--dry-run", "Print what would be created without writing files").action(async (name, opts) => {
148
+ var _a, _b;
149
+ const projectRoot = (_a = opts.root) != null ? _a : findProjectRoot();
150
+ const dryRun = (_b = opts.dryRun) != null ? _b : false;
151
+ console.log(`
152
+ Adding @mohasinac/feat-${name}...
153
+ `);
154
+ let manifest;
155
+ try {
156
+ manifest = await loadManifest(name, projectRoot);
157
+ } catch (err) {
158
+ console.error(` \u2717 ${err.message}`);
159
+ process.exit(1);
160
+ }
161
+ for (const route of manifest.routes) {
162
+ const stubPath = join2(projectRoot, "app", route.segment, "page.tsx");
163
+ const content = generateRouteStub(route, name);
164
+ if (dryRun) {
165
+ console.log(
166
+ ` [dry-run] would create: app/${route.segment}/page.tsx`
167
+ );
168
+ } else {
169
+ const result = writeStub(stubPath, content);
170
+ const icon = result === "created" ? "\u2714" : "\u2013";
171
+ const label = result === "created" ? "created" : "already exists";
172
+ console.log(` ${icon} app/${route.segment}/page.tsx \u2192 ${label}`);
173
+ }
174
+ }
175
+ for (const route of manifest.apiRoutes) {
176
+ const stubPath = join2(projectRoot, "app", route.segment, "route.ts");
177
+ const content = generateApiRouteStub(route, name);
178
+ if (dryRun) {
179
+ console.log(
180
+ ` [dry-run] would create: app/${route.segment}/route.ts`
181
+ );
182
+ } else {
183
+ const result = writeStub(stubPath, content);
184
+ const icon = result === "created" ? "\u2714" : "\u2013";
185
+ const label = result === "created" ? "created" : "already exists";
186
+ console.log(` ${icon} app/${route.segment}/route.ts \u2192 ${label}`);
187
+ }
188
+ }
189
+ if (!dryRun) {
190
+ patchFeaturesConfig(projectRoot, name, true);
191
+ console.log(` \u2714 features.config.ts \u2192 ${name}: true`);
192
+ } else {
193
+ console.log(
194
+ ` [dry-run] would patch: features.config.ts \u2192 ${name}: true`
195
+ );
196
+ }
197
+ if (manifest.envKeys.length > 0) {
198
+ if (!dryRun) {
199
+ patchEnvExample(projectRoot, manifest.envKeys);
200
+ console.log(` \u2714 .env.example \u2192 ${manifest.envKeys.join(", ")}`);
201
+ } else {
202
+ console.log(
203
+ ` [dry-run] would add to .env.example: ${manifest.envKeys.join(", ")}`
204
+ );
205
+ }
206
+ }
207
+ console.log(`
208
+ Done.
209
+ `);
210
+ });
211
+ return cmd;
212
+ }
213
+
214
+ // src/commands/remove.ts
215
+ import { Command as Command2 } from "commander";
216
+ import { existsSync as existsSync2, rmSync } from "fs";
217
+ import { readFileSync as readFileSync2 } from "fs";
218
+ import { join as join3 } from "path";
219
+ var AUTO_GEN_MARKER = "// @mohasinac-generated";
220
+ function removeCommand() {
221
+ const cmd = new Command2("remove");
222
+ cmd.alias("rm").description("Remove a @mohasinac/feat-<name> feature from the project").argument("<name>", "Feature name, e.g. events").option("-r, --root <path>", "Project root (default: auto-detect)").option("--dry-run", "Print what would be removed without touching files").action(async (name, opts) => {
223
+ var _a, _b;
224
+ const projectRoot = (_a = opts.root) != null ? _a : findProjectRoot();
225
+ const dryRun = (_b = opts.dryRun) != null ? _b : false;
226
+ console.log(`
227
+ Removing @mohasinac/feat-${name}...
228
+ `);
229
+ let manifest;
230
+ try {
231
+ manifest = await loadManifest(name, projectRoot);
232
+ } catch (err) {
233
+ console.error(` \u2717 ${err.message}`);
234
+ process.exit(1);
235
+ }
236
+ for (const route of manifest.routes) {
237
+ const stubPath = join3(projectRoot, "app", route.segment, "page.tsx");
238
+ deleteIfGenerated(stubPath, dryRun, `app/${route.segment}/page.tsx`);
239
+ }
240
+ for (const route of manifest.apiRoutes) {
241
+ const stubPath = join3(projectRoot, "app", route.segment, "route.ts");
242
+ deleteIfGenerated(stubPath, dryRun, `app/${route.segment}/route.ts`);
243
+ }
244
+ if (!dryRun) {
245
+ patchFeaturesConfig(projectRoot, name, false);
246
+ console.log(` \u2714 features.config.ts \u2192 ${name}: false`);
247
+ } else {
248
+ console.log(
249
+ ` [dry-run] would patch: features.config.ts \u2192 ${name}: false`
250
+ );
251
+ }
252
+ console.log(`
253
+ Done.
254
+ `);
255
+ });
256
+ return cmd;
257
+ }
258
+ function deleteIfGenerated(filePath, dryRun, label) {
259
+ if (!existsSync2(filePath)) {
260
+ console.log(` \u2013 ${label} \u2192 not found, skipping`);
261
+ return;
262
+ }
263
+ const content = readFileSync2(filePath, "utf8");
264
+ if (!content.includes(AUTO_GEN_MARKER)) {
265
+ console.log(` \u2013 ${label} \u2192 hand-edited, keeping`);
266
+ return;
267
+ }
268
+ if (dryRun) {
269
+ console.log(` [dry-run] would delete: ${label}`);
270
+ return;
271
+ }
272
+ rmSync(filePath);
273
+ console.log(` \u2714 ${label} \u2192 deleted`);
274
+ }
275
+
276
+ // src/commands/list.ts
277
+ import { Command as Command3 } from "commander";
278
+ import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
279
+ import { join as join4 } from "path";
280
+ var KNOWN_FEATURES = [
281
+ "auth",
282
+ "products",
283
+ "categories",
284
+ "events",
285
+ "orders",
286
+ "bookings",
287
+ "reviews",
288
+ "promotions",
289
+ "blog",
290
+ "sellers",
291
+ "search",
292
+ "notifications",
293
+ "analytics",
294
+ "media"
295
+ ];
296
+ function listCommand() {
297
+ const cmd = new Command3("list");
298
+ cmd.alias("ls").description("List all @mohasinac/feat-* features and their enabled state").option("-r, --root <path>", "Project root (default: auto-detect)").option("--enabled-only", "Show only enabled features").action((opts) => {
299
+ var _a;
300
+ const projectRoot = (_a = opts.root) != null ? _a : findProjectRoot();
301
+ const configPath = join4(
302
+ projectRoot,
303
+ "src",
304
+ "config",
305
+ "features.config.ts"
306
+ );
307
+ const altConfigPath = join4(projectRoot, "features.config.ts");
308
+ const resolvedPath = existsSync3(configPath) ? configPath : existsSync3(altConfigPath) ? altConfigPath : null;
309
+ const parsed = {};
310
+ if (resolvedPath) {
311
+ const source = readFileSync3(resolvedPath, "utf8");
312
+ const kvRe = /(\w+)\s*:\s*(true|false)/g;
313
+ let m;
314
+ while ((m = kvRe.exec(source)) !== null) {
315
+ parsed[m[1]] = m[2] === "true";
316
+ }
317
+ }
318
+ const allKeys = Array.from(
319
+ /* @__PURE__ */ new Set([...KNOWN_FEATURES, ...Object.keys(parsed)])
320
+ ).sort();
321
+ const rows = allKeys.map((key) => {
322
+ var _a2;
323
+ return {
324
+ key,
325
+ enabled: (_a2 = parsed[key]) != null ? _a2 : false,
326
+ pkg: `@mohasinac/feat-${key}`
327
+ };
328
+ }).filter((r) => !opts.enabledOnly || r.enabled);
329
+ if (rows.length === 0) {
330
+ console.log("\n No features found.\n");
331
+ return;
332
+ }
333
+ console.log();
334
+ console.log(
335
+ " Feature Package State"
336
+ );
337
+ console.log(
338
+ " \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"
339
+ );
340
+ for (const { key, pkg, enabled } of rows) {
341
+ const state = enabled ? "\u2714 enabled" : " disabled";
342
+ const paddedKey = key.padEnd(20);
343
+ const paddedPkg = pkg.padEnd(30);
344
+ console.log(` ${paddedKey} ${paddedPkg} ${state}`);
345
+ }
346
+ console.log();
347
+ if (!resolvedPath) {
348
+ console.log(
349
+ " \u2139 No features.config.ts found \u2014 run 'mohasinac add <name>' to create one."
350
+ );
351
+ console.log();
352
+ }
353
+ });
354
+ return cmd;
355
+ }
356
+
357
+ // src/cli.ts
358
+ var program = new Command4();
359
+ program.name("mohasinac").description("@mohasinac/* feature library CLI").version("0.1.0");
360
+ program.addCommand(addCommand());
361
+ program.addCommand(removeCommand());
362
+ program.addCommand(listCommand());
363
+ program.parse(process.argv);
package/dist/i18n.cjs ADDED
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __spreadValues = (a, b) => {
10
+ for (var prop in b || (b = {}))
11
+ if (__hasOwnProp.call(b, prop))
12
+ __defNormalProp(a, prop, b[prop]);
13
+ if (__getOwnPropSymbols)
14
+ for (var prop of __getOwnPropSymbols(b)) {
15
+ if (__propIsEnum.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ }
18
+ return a;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, { get: all[name], enumerable: true });
23
+ };
24
+ var __copyProps = (to, from, except, desc) => {
25
+ if (from && typeof from === "object" || typeof from === "function") {
26
+ for (let key of __getOwnPropNames(from))
27
+ if (!__hasOwnProp.call(to, key) && key !== except)
28
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
29
+ }
30
+ return to;
31
+ };
32
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
33
+
34
+ // src/i18n.ts
35
+ var i18n_exports = {};
36
+ __export(i18n_exports, {
37
+ mergeFeatureMessages: () => mergeFeatureMessages
38
+ });
39
+ module.exports = __toCommonJS(i18n_exports);
40
+ var _dynamicImport = new Function(
41
+ "modulePath",
42
+ "return import(modulePath)"
43
+ );
44
+ var FEATURE_NAMESPACE_MAP = {
45
+ layout: "layout",
46
+ forms: "forms",
47
+ auth: "auth",
48
+ account: "account",
49
+ products: "products",
50
+ categories: "categories",
51
+ cart: "cart",
52
+ wishlist: "wishlist",
53
+ checkout: "checkout",
54
+ orders: "orders",
55
+ payments: "payments",
56
+ blog: "blog",
57
+ reviews: "reviews",
58
+ faq: "faq",
59
+ search: "search",
60
+ homepage: "home",
61
+ admin: "admin",
62
+ events: "events",
63
+ auctions: "auctions",
64
+ promotions: "promotions",
65
+ seller: "seller",
66
+ stores: "stores",
67
+ "pre-orders": "preOrders",
68
+ consultation: "consultation",
69
+ concern: "concern",
70
+ corporate: "corporate",
71
+ "before-after": "beforeAfter",
72
+ loyalty: "loyalty",
73
+ collections: "collections",
74
+ preorders: "preorders"
75
+ };
76
+ function deepMerge(a, b) {
77
+ const result = __spreadValues({}, a);
78
+ for (const key of Object.keys(b)) {
79
+ const av = a[key];
80
+ const bv = b[key];
81
+ if (bv !== null && typeof bv === "object" && !Array.isArray(bv) && av !== null && typeof av === "object" && !Array.isArray(av)) {
82
+ result[key] = deepMerge(av, bv);
83
+ } else {
84
+ result[key] = bv;
85
+ }
86
+ }
87
+ return result;
88
+ }
89
+ async function tryLoadFeatureMessages(featureKey, locale) {
90
+ var _a;
91
+ try {
92
+ const pkg = `@mohasinac/feat-${featureKey}`;
93
+ const mod = await _dynamicImport(`${pkg}/messages/${locale}.json`);
94
+ return (_a = mod.default) != null ? _a : mod;
95
+ } catch (e) {
96
+ return {};
97
+ }
98
+ }
99
+ async function mergeFeatureMessages(locale, features) {
100
+ var _a;
101
+ let projectMessages = {};
102
+ try {
103
+ const mod = await _dynamicImport(`../../messages/${locale}.json`);
104
+ projectMessages = (_a = mod.default) != null ? _a : mod;
105
+ } catch (e) {
106
+ }
107
+ const enabledKeys = Object.entries(features).filter(([key, enabled]) => enabled && key in FEATURE_NAMESPACE_MAP).map(([key]) => key);
108
+ const fragments = await Promise.all(
109
+ enabledKeys.map((key) => tryLoadFeatureMessages(key, locale))
110
+ );
111
+ let base = {};
112
+ for (const fragment of fragments) {
113
+ base = deepMerge(base, fragment);
114
+ }
115
+ return deepMerge(base, projectMessages);
116
+ }
117
+ // Annotate the CommonJS export names for ESM import in node:
118
+ 0 && (module.exports = {
119
+ mergeFeatureMessages
120
+ });
@@ -0,0 +1,45 @@
1
+ import { FeaturesConfig } from '@mohasinac/contracts';
2
+
3
+ /**
4
+ * @mohasinac/cli/i18n
5
+ *
6
+ * Server-side i18n helper that deep-merges message fragments from all
7
+ * enabled @mohasinac/feat-* packages into the project's own message files.
8
+ *
9
+ * Local project messages always win over package defaults.
10
+ *
11
+ * Usage in src/i18n/request.ts:
12
+ *
13
+ * import { mergeFeatureMessages } from "@mohasinac/cli/i18n";
14
+ * import features from "../../features.config";
15
+ *
16
+ * const messages = await mergeFeatureMessages(locale, features);
17
+ * return { locale, messages };
18
+ */
19
+
20
+ type Messages = Record<string, unknown>;
21
+ /**
22
+ * Loads the project's own message file for the locale, then deep-merges
23
+ * message fragments from all enabled feature packages on top.
24
+ * Project-local messages always win on conflict.
25
+ *
26
+ * @param locale BCP 47 locale tag, e.g. "en"
27
+ * @param features The project's features.config.ts default export
28
+ * @param messagesGlob Optional path to the project messages dir (default: "messages")
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * // src/i18n/request.ts
33
+ * import { mergeFeatureMessages } from "@mohasinac/cli/i18n";
34
+ * import features from "../../features.config";
35
+ *
36
+ * return getRequestConfig(async ({ requestLocale }) => {
37
+ * const locale = resolveLocale(await requestLocale);
38
+ * const messages = await mergeFeatureMessages(locale, features);
39
+ * return { locale, messages };
40
+ * });
41
+ * ```
42
+ */
43
+ declare function mergeFeatureMessages(locale: string, features: FeaturesConfig): Promise<Messages>;
44
+
45
+ export { mergeFeatureMessages };
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ import { FeaturesConfig } from '@mohasinac/contracts';
2
+
3
+ /**
4
+ * @mohasinac/cli/i18n
5
+ *
6
+ * Server-side i18n helper that deep-merges message fragments from all
7
+ * enabled @mohasinac/feat-* packages into the project's own message files.
8
+ *
9
+ * Local project messages always win over package defaults.
10
+ *
11
+ * Usage in src/i18n/request.ts:
12
+ *
13
+ * import { mergeFeatureMessages } from "@mohasinac/cli/i18n";
14
+ * import features from "../../features.config";
15
+ *
16
+ * const messages = await mergeFeatureMessages(locale, features);
17
+ * return { locale, messages };
18
+ */
19
+
20
+ type Messages = Record<string, unknown>;
21
+ /**
22
+ * Loads the project's own message file for the locale, then deep-merges
23
+ * message fragments from all enabled feature packages on top.
24
+ * Project-local messages always win on conflict.
25
+ *
26
+ * @param locale BCP 47 locale tag, e.g. "en"
27
+ * @param features The project's features.config.ts default export
28
+ * @param messagesGlob Optional path to the project messages dir (default: "messages")
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * // src/i18n/request.ts
33
+ * import { mergeFeatureMessages } from "@mohasinac/cli/i18n";
34
+ * import features from "../../features.config";
35
+ *
36
+ * return getRequestConfig(async ({ requestLocale }) => {
37
+ * const locale = resolveLocale(await requestLocale);
38
+ * const messages = await mergeFeatureMessages(locale, features);
39
+ * return { locale, messages };
40
+ * });
41
+ * ```
42
+ */
43
+ declare function mergeFeatureMessages(locale: string, features: FeaturesConfig): Promise<Messages>;
44
+
45
+ export { mergeFeatureMessages };
package/dist/i18n.js ADDED
@@ -0,0 +1,7 @@
1
+ import {
2
+ mergeFeatureMessages
3
+ } from "./chunk-TH6TQLJH.js";
4
+ import "./chunk-N3ETBM74.js";
5
+ export {
6
+ mergeFeatureMessages
7
+ };