@mdwrk/i18n 1.0.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/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # mdwrk/i18n
2
+
3
+ Shared message descriptor, locale catalog, locale loader, and locale registry helpers for Markdown Workspace packages.
4
+
5
+ ## Core features
6
+
7
+ - keyed message descriptors
8
+ - locale registries with fallback resolution
9
+ - namespaced catalog helpers for package-local message keys
10
+ - locale loader definitions for lazy per-locale imports
11
+
12
+ ## Example
13
+
14
+ ```ts
15
+ import {
16
+ createLocaleRegistry,
17
+ createNamespacedLocaleCatalog,
18
+ loadLocaleCatalogs,
19
+ } from "@mdwrk/i18n";
20
+
21
+ const registry = createLocaleRegistry({ defaultLocale: "en", fallbackLocale: "en" });
22
+
23
+ const catalogs = await loadLocaleCatalogs({
24
+ locale: "es-MX",
25
+ namespace: "core.extension-manager",
26
+ loaders: {
27
+ en: async () => ({ locale: "en", messages: { "view.title": "Extension Manager" } }),
28
+ es: async () => ({ locale: "es", messages: { "view.title": "Administrador de extensiones" } }),
29
+ },
30
+ });
31
+
32
+ for (const catalog of catalogs) {
33
+ registry.registerCatalog(catalog);
34
+ }
35
+
36
+ registry.setLocale("es-MX");
37
+ registry.resolve({
38
+ key: "core.extension-manager.view.title",
39
+ defaultMessage: "Extension Manager",
40
+ });
41
+ ```
@@ -0,0 +1,6 @@
1
+ import type { MessageDescriptor, MessageValue } from "./types.js";
2
+ export declare function defineMessages<T extends Record<string, MessageDescriptor>>(messages: T): T;
3
+ export declare function normalizeMessageDescriptor(descriptor: string | MessageDescriptor, key?: string): MessageDescriptor;
4
+ export declare function interpolateMessage(template: string, values?: Readonly<Record<string, MessageValue>>): string;
5
+ export declare function formatMessage(descriptor: string | MessageDescriptor, values?: Readonly<Record<string, MessageValue>>): string;
6
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAElE,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAE1F;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,GAAG,iBAAiB,EACtC,GAAG,CAAC,EAAE,MAAM,GACX,iBAAiB,CASnB;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAM,GAClD,MAAM,CAKR;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,GAAG,iBAAiB,EACtC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,GAC9C,MAAM,CAMR"}
package/dist/format.js ADDED
@@ -0,0 +1,26 @@
1
+ export function defineMessages(messages) {
2
+ return messages;
3
+ }
4
+ export function normalizeMessageDescriptor(descriptor, key) {
5
+ if (typeof descriptor === "string") {
6
+ return {
7
+ key,
8
+ defaultMessage: descriptor,
9
+ };
10
+ }
11
+ return descriptor;
12
+ }
13
+ export function interpolateMessage(template, values = {}) {
14
+ return template.replace(/\{([a-zA-Z0-9_.-]+)\}/g, (_, name) => {
15
+ const value = values[name];
16
+ return value === null || value === undefined ? "" : String(value);
17
+ });
18
+ }
19
+ export function formatMessage(descriptor, values) {
20
+ const normalized = normalizeMessageDescriptor(descriptor);
21
+ return interpolateMessage(normalized.defaultMessage, {
22
+ ...(normalized.values ?? {}),
23
+ ...(values ?? {}),
24
+ });
25
+ }
26
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAA8C,QAAW;IACrF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,UAAsC,EACtC,GAAY;IAEZ,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,GAAG;YACH,cAAc,EAAE,UAAU;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,SAAiD,EAAE;IAEnD,OAAO,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,UAAsC,EACtC,MAA+C;IAE/C,MAAM,UAAU,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAC1D,OAAO,kBAAkB,CAAC,UAAU,CAAC,cAAc,EAAE;QACnD,GAAG,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;KAClB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./version.js";
2
+ export * from "./types.js";
3
+ export * from "./format.js";
4
+ export * from "./registry.js";
5
+ export * from "./loaders.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from "./version.js";
2
+ export * from "./types.js";
3
+ export * from "./format.js";
4
+ export * from "./registry.js";
5
+ export * from "./loaders.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { LocaleCatalog, LocaleCatalogMessages } from "./types.js";
2
+ export type LocaleCatalogLoader = () => LocaleCatalog | Promise<LocaleCatalog>;
3
+ export type LocaleCatalogLoaderRecord = Readonly<Record<string, LocaleCatalogLoader>>;
4
+ export interface LocaleCatalogLoaderDefinition {
5
+ readonly defaultLocale?: string;
6
+ readonly fallbackLocale?: string;
7
+ readonly loaders: LocaleCatalogLoaderRecord;
8
+ }
9
+ export interface LoadLocaleCatalogsOptions {
10
+ readonly locale: string;
11
+ readonly defaultLocale?: string;
12
+ readonly fallbackLocale?: string;
13
+ readonly loaders: LocaleCatalogLoaderRecord;
14
+ readonly namespace?: string;
15
+ }
16
+ export declare function createLocaleFallbackChain(locale: string, options?: {
17
+ readonly defaultLocale?: string;
18
+ readonly fallbackLocale?: string;
19
+ }): readonly string[];
20
+ export declare function createNamespacedLocaleCatalog(namespace: string, locale: string, messages: LocaleCatalogMessages): LocaleCatalog;
21
+ export declare function loadLocaleCatalogs(options: LoadLocaleCatalogsOptions): Promise<readonly LocaleCatalog[]>;
22
+ //# sourceMappingURL=loaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaders.d.ts","sourceRoot":"","sources":["../src/loaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,mBAAmB,GAAG,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC/E,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAEtF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;CAC7C;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAWD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GAClF,SAAS,MAAM,EAAE,CAmBnB;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,qBAAqB,GAC9B,aAAa,CASf;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAqB9G"}
@@ -0,0 +1,51 @@
1
+ function normalizeLocale(locale) {
2
+ return locale.trim().replace(/_/g, "-").toLowerCase();
3
+ }
4
+ function qualifyMessageKey(namespace, key) {
5
+ if (!namespace)
6
+ return key;
7
+ return key.startsWith(`${namespace}.`) ? key : `${namespace}.${key}`;
8
+ }
9
+ export function createLocaleFallbackChain(locale, options = {}) {
10
+ const normalizedLocale = normalizeLocale(locale);
11
+ const defaultLocale = normalizeLocale(options.defaultLocale ?? "en");
12
+ const fallbackLocale = normalizeLocale(options.fallbackLocale ?? defaultLocale);
13
+ const segments = normalizedLocale.split("-").filter(Boolean);
14
+ const candidates = [];
15
+ for (let index = segments.length; index > 0; index -= 1) {
16
+ candidates.push(segments.slice(0, index).join("-"));
17
+ }
18
+ if (!candidates.includes(fallbackLocale)) {
19
+ candidates.push(fallbackLocale);
20
+ }
21
+ if (!candidates.includes(defaultLocale)) {
22
+ candidates.push(defaultLocale);
23
+ }
24
+ return Object.freeze(candidates.filter(Boolean));
25
+ }
26
+ export function createNamespacedLocaleCatalog(namespace, locale, messages) {
27
+ return {
28
+ locale,
29
+ messages: Object.freeze(Object.fromEntries(Object.entries(messages).map(([key, value]) => [qualifyMessageKey(namespace, key), value]))),
30
+ };
31
+ }
32
+ export async function loadLocaleCatalogs(options) {
33
+ const chain = createLocaleFallbackChain(options.locale, {
34
+ defaultLocale: options.defaultLocale,
35
+ fallbackLocale: options.fallbackLocale,
36
+ });
37
+ const loaded = [];
38
+ const seen = new Set();
39
+ for (const candidate of chain) {
40
+ const loader = options.loaders[candidate];
41
+ if (!loader || seen.has(candidate))
42
+ continue;
43
+ const catalog = await loader();
44
+ loaded.push(options.namespace
45
+ ? createNamespacedLocaleCatalog(options.namespace, catalog.locale, catalog.messages)
46
+ : catalog);
47
+ seen.add(candidate);
48
+ }
49
+ return Object.freeze(loaded);
50
+ }
51
+ //# sourceMappingURL=loaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaders.js","sourceRoot":"","sources":["../src/loaders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { LocaleCatalog, LocaleRegistryOptions, MessageDescriptor, MessageValue } from "./types.js";
2
+ export interface LocaleRegistry {
3
+ getLocale(): string;
4
+ setLocale(locale: string): void;
5
+ registerCatalog(catalog: LocaleCatalog): void;
6
+ hasMessage(key: string, locale?: string): boolean;
7
+ resolve(descriptor: string | MessageDescriptor, values?: Readonly<Record<string, MessageValue>>): string;
8
+ }
9
+ export declare function createLocaleRegistry(options?: LocaleRegistryOptions): LocaleRegistry;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAExG,MAAM,WAAW,cAAc;IAC7B,SAAS,IAAI,MAAM,CAAC;IACpB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClD,OAAO,CACL,UAAU,EAAE,MAAM,GAAG,iBAAiB,EACtC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,GAC9C,MAAM,CAAC;CACX;AA2BD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAmDxF"}
@@ -0,0 +1,73 @@
1
+ import { formatMessage, normalizeMessageDescriptor } from "./format.js";
2
+ function normalizeLocale(locale) {
3
+ return locale.trim().replace(/_/g, "-").toLowerCase();
4
+ }
5
+ function createLocaleChain(locale, fallbackLocale, defaultLocale) {
6
+ const normalizedLocale = normalizeLocale(locale);
7
+ const normalizedFallback = normalizeLocale(fallbackLocale);
8
+ const normalizedDefault = normalizeLocale(defaultLocale);
9
+ const segments = normalizedLocale.split("-").filter(Boolean);
10
+ const candidates = [];
11
+ for (let index = segments.length; index > 0; index -= 1) {
12
+ candidates.push(segments.slice(0, index).join("-"));
13
+ }
14
+ if (!candidates.includes(normalizedFallback)) {
15
+ candidates.push(normalizedFallback);
16
+ }
17
+ if (!candidates.includes(normalizedDefault)) {
18
+ candidates.push(normalizedDefault);
19
+ }
20
+ return Object.freeze(candidates.filter(Boolean));
21
+ }
22
+ export function createLocaleRegistry(options = {}) {
23
+ const defaultLocale = normalizeLocale(options.defaultLocale ?? "en");
24
+ const fallbackLocale = normalizeLocale(options.fallbackLocale ?? defaultLocale);
25
+ const catalogs = new Map();
26
+ let activeLocale = defaultLocale;
27
+ const getCatalog = (locale) => {
28
+ const normalizedLocale = normalizeLocale(locale);
29
+ const existing = catalogs.get(normalizedLocale);
30
+ if (existing)
31
+ return existing;
32
+ const created = new Map();
33
+ catalogs.set(normalizedLocale, created);
34
+ return created;
35
+ };
36
+ const findMessage = (key, locale) => {
37
+ for (const candidate of createLocaleChain(locale, fallbackLocale, defaultLocale)) {
38
+ const message = getCatalog(candidate).get(key);
39
+ if (message)
40
+ return message;
41
+ }
42
+ return undefined;
43
+ };
44
+ return {
45
+ getLocale() {
46
+ return activeLocale;
47
+ },
48
+ setLocale(locale) {
49
+ activeLocale = normalizeLocale(locale);
50
+ },
51
+ registerCatalog(catalog) {
52
+ const target = getCatalog(catalog.locale);
53
+ for (const [key, descriptor] of Object.entries(catalog.messages)) {
54
+ target.set(key, normalizeMessageDescriptor(descriptor, key));
55
+ }
56
+ },
57
+ hasMessage(key, locale = activeLocale) {
58
+ return Boolean(findMessage(key, locale));
59
+ },
60
+ resolve(descriptor, values) {
61
+ const normalized = normalizeMessageDescriptor(descriptor);
62
+ const key = normalized.key;
63
+ if (key) {
64
+ const translated = findMessage(key, activeLocale);
65
+ if (translated) {
66
+ return formatMessage({ ...translated, key }, values);
67
+ }
68
+ }
69
+ return formatMessage(normalized, values);
70
+ },
71
+ };
72
+ }
73
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type MessageValue = string | number | boolean | null | undefined;
2
+ export interface MessageDescriptor {
3
+ readonly key?: string;
4
+ readonly defaultMessage: string;
5
+ readonly description?: string;
6
+ readonly values?: Readonly<Record<string, MessageValue>>;
7
+ }
8
+ export type LocaleCatalogMessage = string | MessageDescriptor;
9
+ export type LocaleCatalogMessages = Readonly<Record<string, LocaleCatalogMessage>>;
10
+ export interface LocaleCatalog {
11
+ readonly locale: string;
12
+ readonly messages: LocaleCatalogMessages;
13
+ }
14
+ export interface LocaleRegistryOptions {
15
+ readonly defaultLocale?: string;
16
+ readonly fallbackLocale?: string;
17
+ }
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CAC1D;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAC9D,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAEnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare const I18N_PACKAGE_VERSION: "1.0.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,EAAG,OAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const I18N_PACKAGE_VERSION = "1.0.0";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAgB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "type": "module",
4
+ "license": "Apache-2.0",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "engines": {
9
+ "node": ">=20 <23"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "name": "@mdwrk/i18n",
16
+ "description": "Shared message descriptors, locale catalogs, and locale registry helpers for Markdown Workspace packages.",
17
+ "sideEffects": false,
18
+ "keywords": [
19
+ "markdown-workspace",
20
+ "shared",
21
+ "i18n",
22
+ "localization"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.json",
26
+ "typecheck": "tsc --noEmit -p tsconfig.json",
27
+ "lint": "npm run typecheck",
28
+ "test": "npm run build && node ./tests/run-smoke.mjs",
29
+ "prepack": "npm run build"
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ },
36
+ "./version": {
37
+ "types": "./dist/version.d.ts",
38
+ "import": "./dist/version.js"
39
+ },
40
+ "./types": {
41
+ "types": "./dist/types.d.ts",
42
+ "import": "./dist/types.js"
43
+ },
44
+ "./registry": {
45
+ "types": "./dist/registry.d.ts",
46
+ "import": "./dist/registry.js"
47
+ },
48
+ "./format": {
49
+ "types": "./dist/format.d.ts",
50
+ "import": "./dist/format.js"
51
+ },
52
+ "./loaders": {
53
+ "types": "./dist/loaders.d.ts",
54
+ "import": "./dist/loaders.js"
55
+ }
56
+ },
57
+ "main": "./dist/index.js",
58
+ "types": "./dist/index.d.ts",
59
+ "author": "Jacob Stewart <jacob@swarmauri.com>",
60
+ "homepage": "https://mdwrk.com"
61
+ }