@newcms/core 0.2.0 → 0.3.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/index.d.cts CHANGED
@@ -566,4 +566,132 @@ declare class BootstrapManager {
566
566
  reset(): void;
567
567
  }
568
568
 
569
- export { type AddHookOptions, BOOTSTRAP_PHASES, BUILTIN_POST_TYPES, BUILTIN_TAXONOMIES, BootstrapManager, type BootstrapPhase, type CapabilityContext, type ExtensionEntry, type ExtensionManifest, ExtensionRegistry, type ExtensionStatus, HOOK_PRIORITY, type HasHookResult, type HookCallback, HookEngine, type HookHandler, type HookStackEntry, POST_STATUS, type PhaseHandler, type PostTypeDefinition, PostTypeRegistry, type TaxonomyDefinition, TaxonomyRegistry, type TemplateContext, type ThemeEntry, type ThemeManifest, ThemeRegistry, type ThemeSupports, USER_ROLES, resolveTemplateHierarchy };
569
+ /**
570
+ * Shortcode system — register named patterns with callbacks,
571
+ * then process content to replace shortcodes with rendered output.
572
+ *
573
+ * Syntax: [name attr="value"]content[/name] or [name attr="value" /]
574
+ */
575
+ type ShortcodeCallback = (attributes: Record<string, string>, content: string, tag: string) => string;
576
+ declare class ShortcodeRegistry {
577
+ private handlers;
578
+ register(tag: string, callback: ShortcodeCallback): void;
579
+ unregister(tag: string): boolean;
580
+ has(tag: string): boolean;
581
+ /**
582
+ * Process a string, replacing all registered shortcodes with their output.
583
+ * Supports nesting: inner shortcodes are processed first.
584
+ */
585
+ process(content: string): string;
586
+ /**
587
+ * Strip all shortcodes from content (remove tags, keep content).
588
+ */
589
+ strip(content: string): string;
590
+ getAll(): string[];
591
+ reset(): void;
592
+ }
593
+
594
+ /**
595
+ * Menu navigation system — register menu locations and manage menu items.
596
+ */
597
+ interface MenuLocation {
598
+ name: string;
599
+ description: string;
600
+ }
601
+ interface MenuItem {
602
+ id: number;
603
+ title: string;
604
+ url: string;
605
+ target?: string;
606
+ cssClasses?: string[];
607
+ description?: string;
608
+ /** Type: custom, post_type, taxonomy */
609
+ type: 'custom' | 'post_type' | 'taxonomy';
610
+ /** Object ID (post ID or term ID) for non-custom items */
611
+ objectId?: number;
612
+ /** Post type or taxonomy name */
613
+ objectType?: string;
614
+ /** Parent item ID (0 for top-level) */
615
+ parentId: number;
616
+ /** Sort order */
617
+ menuOrder: number;
618
+ /** Children (built client-side from parentId) */
619
+ children?: MenuItem[];
620
+ }
621
+ declare class MenuRegistry {
622
+ private locations;
623
+ /**
624
+ * Register a menu location (e.g., "primary", "footer").
625
+ */
626
+ registerLocation(name: string, description: string): void;
627
+ /**
628
+ * Unregister a menu location.
629
+ */
630
+ unregisterLocation(name: string): boolean;
631
+ /**
632
+ * Get all registered locations.
633
+ */
634
+ getLocations(): MenuLocation[];
635
+ /**
636
+ * Check if a location is registered.
637
+ */
638
+ hasLocation(name: string): boolean;
639
+ /**
640
+ * Build a tree from a flat list of menu items using parentId.
641
+ */
642
+ static buildTree(items: MenuItem[]): MenuItem[];
643
+ reset(): void;
644
+ }
645
+
646
+ /**
647
+ * URL Rewrite system — maps URL patterns to query variables.
648
+ *
649
+ * Permalink structures use tags like %year%, %monthnum%, %postname%.
650
+ * The rewriter converts these to regex patterns that capture named groups,
651
+ * then resolves a URL path into query parameters.
652
+ */
653
+ interface RewriteRule {
654
+ /** Regex pattern to match against the URL path */
655
+ pattern: RegExp;
656
+ /** Named query variables extracted from the match */
657
+ queryVars: string[];
658
+ /** Source (e.g., "post_permalink", "category", "custom") */
659
+ source: string;
660
+ /** Priority for ordering (lower = earlier) */
661
+ priority: number;
662
+ }
663
+ interface RewriteResult {
664
+ matched: boolean;
665
+ rule?: RewriteRule;
666
+ queryVars: Record<string, string>;
667
+ }
668
+ declare class UrlRewriter {
669
+ private rules;
670
+ /**
671
+ * Add a rewrite rule.
672
+ */
673
+ addRule(pattern: RegExp, queryVars: string[], source: string, priority?: number): void;
674
+ /**
675
+ * Generate rules from a permalink structure string.
676
+ * E.g., "/%year%/%monthnum%/%postname%/"
677
+ */
678
+ addPermalinkStructure(structure: string, source?: string): void;
679
+ /**
680
+ * Add default rules for categories, tags, authors, search, pages, feeds.
681
+ */
682
+ addDefaultRules(): void;
683
+ /**
684
+ * Resolve a URL path to query variables.
685
+ */
686
+ resolve(path: string): RewriteResult;
687
+ /**
688
+ * Build a permalink URL from a structure and values.
689
+ * E.g., buildPermalink("/%year%/%monthnum%/%postname%/", { year: "2026", monthnum: "04", postname: "hello" })
690
+ * → "/2026/04/hello/"
691
+ */
692
+ static buildPermalink(structure: string, values: Record<string, string>): string;
693
+ getRules(): RewriteRule[];
694
+ reset(): void;
695
+ }
696
+
697
+ export { type AddHookOptions, BOOTSTRAP_PHASES, BUILTIN_POST_TYPES, BUILTIN_TAXONOMIES, BootstrapManager, type BootstrapPhase, type CapabilityContext, type ExtensionEntry, type ExtensionManifest, ExtensionRegistry, type ExtensionStatus, HOOK_PRIORITY, type HasHookResult, type HookCallback, HookEngine, type HookHandler, type HookStackEntry, type MenuItem, type MenuLocation, MenuRegistry, POST_STATUS, type PhaseHandler, type PostTypeDefinition, PostTypeRegistry, type RewriteResult, type RewriteRule, type ShortcodeCallback, ShortcodeRegistry, type TaxonomyDefinition, TaxonomyRegistry, type TemplateContext, type ThemeEntry, type ThemeManifest, ThemeRegistry, type ThemeSupports, USER_ROLES, UrlRewriter, resolveTemplateHierarchy };
package/dist/index.d.ts CHANGED
@@ -566,4 +566,132 @@ declare class BootstrapManager {
566
566
  reset(): void;
567
567
  }
568
568
 
569
- export { type AddHookOptions, BOOTSTRAP_PHASES, BUILTIN_POST_TYPES, BUILTIN_TAXONOMIES, BootstrapManager, type BootstrapPhase, type CapabilityContext, type ExtensionEntry, type ExtensionManifest, ExtensionRegistry, type ExtensionStatus, HOOK_PRIORITY, type HasHookResult, type HookCallback, HookEngine, type HookHandler, type HookStackEntry, POST_STATUS, type PhaseHandler, type PostTypeDefinition, PostTypeRegistry, type TaxonomyDefinition, TaxonomyRegistry, type TemplateContext, type ThemeEntry, type ThemeManifest, ThemeRegistry, type ThemeSupports, USER_ROLES, resolveTemplateHierarchy };
569
+ /**
570
+ * Shortcode system — register named patterns with callbacks,
571
+ * then process content to replace shortcodes with rendered output.
572
+ *
573
+ * Syntax: [name attr="value"]content[/name] or [name attr="value" /]
574
+ */
575
+ type ShortcodeCallback = (attributes: Record<string, string>, content: string, tag: string) => string;
576
+ declare class ShortcodeRegistry {
577
+ private handlers;
578
+ register(tag: string, callback: ShortcodeCallback): void;
579
+ unregister(tag: string): boolean;
580
+ has(tag: string): boolean;
581
+ /**
582
+ * Process a string, replacing all registered shortcodes with their output.
583
+ * Supports nesting: inner shortcodes are processed first.
584
+ */
585
+ process(content: string): string;
586
+ /**
587
+ * Strip all shortcodes from content (remove tags, keep content).
588
+ */
589
+ strip(content: string): string;
590
+ getAll(): string[];
591
+ reset(): void;
592
+ }
593
+
594
+ /**
595
+ * Menu navigation system — register menu locations and manage menu items.
596
+ */
597
+ interface MenuLocation {
598
+ name: string;
599
+ description: string;
600
+ }
601
+ interface MenuItem {
602
+ id: number;
603
+ title: string;
604
+ url: string;
605
+ target?: string;
606
+ cssClasses?: string[];
607
+ description?: string;
608
+ /** Type: custom, post_type, taxonomy */
609
+ type: 'custom' | 'post_type' | 'taxonomy';
610
+ /** Object ID (post ID or term ID) for non-custom items */
611
+ objectId?: number;
612
+ /** Post type or taxonomy name */
613
+ objectType?: string;
614
+ /** Parent item ID (0 for top-level) */
615
+ parentId: number;
616
+ /** Sort order */
617
+ menuOrder: number;
618
+ /** Children (built client-side from parentId) */
619
+ children?: MenuItem[];
620
+ }
621
+ declare class MenuRegistry {
622
+ private locations;
623
+ /**
624
+ * Register a menu location (e.g., "primary", "footer").
625
+ */
626
+ registerLocation(name: string, description: string): void;
627
+ /**
628
+ * Unregister a menu location.
629
+ */
630
+ unregisterLocation(name: string): boolean;
631
+ /**
632
+ * Get all registered locations.
633
+ */
634
+ getLocations(): MenuLocation[];
635
+ /**
636
+ * Check if a location is registered.
637
+ */
638
+ hasLocation(name: string): boolean;
639
+ /**
640
+ * Build a tree from a flat list of menu items using parentId.
641
+ */
642
+ static buildTree(items: MenuItem[]): MenuItem[];
643
+ reset(): void;
644
+ }
645
+
646
+ /**
647
+ * URL Rewrite system — maps URL patterns to query variables.
648
+ *
649
+ * Permalink structures use tags like %year%, %monthnum%, %postname%.
650
+ * The rewriter converts these to regex patterns that capture named groups,
651
+ * then resolves a URL path into query parameters.
652
+ */
653
+ interface RewriteRule {
654
+ /** Regex pattern to match against the URL path */
655
+ pattern: RegExp;
656
+ /** Named query variables extracted from the match */
657
+ queryVars: string[];
658
+ /** Source (e.g., "post_permalink", "category", "custom") */
659
+ source: string;
660
+ /** Priority for ordering (lower = earlier) */
661
+ priority: number;
662
+ }
663
+ interface RewriteResult {
664
+ matched: boolean;
665
+ rule?: RewriteRule;
666
+ queryVars: Record<string, string>;
667
+ }
668
+ declare class UrlRewriter {
669
+ private rules;
670
+ /**
671
+ * Add a rewrite rule.
672
+ */
673
+ addRule(pattern: RegExp, queryVars: string[], source: string, priority?: number): void;
674
+ /**
675
+ * Generate rules from a permalink structure string.
676
+ * E.g., "/%year%/%monthnum%/%postname%/"
677
+ */
678
+ addPermalinkStructure(structure: string, source?: string): void;
679
+ /**
680
+ * Add default rules for categories, tags, authors, search, pages, feeds.
681
+ */
682
+ addDefaultRules(): void;
683
+ /**
684
+ * Resolve a URL path to query variables.
685
+ */
686
+ resolve(path: string): RewriteResult;
687
+ /**
688
+ * Build a permalink URL from a structure and values.
689
+ * E.g., buildPermalink("/%year%/%monthnum%/%postname%/", { year: "2026", monthnum: "04", postname: "hello" })
690
+ * → "/2026/04/hello/"
691
+ */
692
+ static buildPermalink(structure: string, values: Record<string, string>): string;
693
+ getRules(): RewriteRule[];
694
+ reset(): void;
695
+ }
696
+
697
+ export { type AddHookOptions, BOOTSTRAP_PHASES, BUILTIN_POST_TYPES, BUILTIN_TAXONOMIES, BootstrapManager, type BootstrapPhase, type CapabilityContext, type ExtensionEntry, type ExtensionManifest, ExtensionRegistry, type ExtensionStatus, HOOK_PRIORITY, type HasHookResult, type HookCallback, HookEngine, type HookHandler, type HookStackEntry, type MenuItem, type MenuLocation, MenuRegistry, POST_STATUS, type PhaseHandler, type PostTypeDefinition, PostTypeRegistry, type RewriteResult, type RewriteRule, type ShortcodeCallback, ShortcodeRegistry, type TaxonomyDefinition, TaxonomyRegistry, type TemplateContext, type ThemeEntry, type ThemeManifest, ThemeRegistry, type ThemeSupports, USER_ROLES, UrlRewriter, resolveTemplateHierarchy };
package/dist/index.js CHANGED
@@ -946,6 +946,251 @@ var HOOK_PRIORITY = {
946
946
  LATE: 15,
947
947
  LATEST: 20
948
948
  };
949
+
950
+ // src/shortcode.ts
951
+ var ShortcodeRegistry = class {
952
+ handlers = /* @__PURE__ */ new Map();
953
+ register(tag, callback) {
954
+ this.handlers.set(tag, callback);
955
+ }
956
+ unregister(tag) {
957
+ return this.handlers.delete(tag);
958
+ }
959
+ has(tag) {
960
+ return this.handlers.has(tag);
961
+ }
962
+ /**
963
+ * Process a string, replacing all registered shortcodes with their output.
964
+ * Supports nesting: inner shortcodes are processed first.
965
+ */
966
+ process(content) {
967
+ if (this.handlers.size === 0) return content;
968
+ const tagPattern = [...this.handlers.keys()].map(escRegex).join("|");
969
+ const selfClosingRe = new RegExp(
970
+ `\\[(${tagPattern})(\\s[^\\]]*?)?\\s*\\/\\]`,
971
+ "g"
972
+ );
973
+ const enclosingRe = new RegExp(
974
+ `\\[(${tagPattern})(\\s[^\\]]*?)?\\]([\\s\\S]*?)\\[\\/\\1\\]`,
975
+ "g"
976
+ );
977
+ let result = content;
978
+ let prevResult = "";
979
+ let iterations = 0;
980
+ while (result !== prevResult && iterations < 10) {
981
+ prevResult = result;
982
+ result = result.replace(enclosingRe, (full, tag, attrStr, inner) => {
983
+ const handler = this.handlers.get(tag);
984
+ if (!handler) return full;
985
+ const attrs = parseShortcodeAttributes(attrStr?.trim() ?? "");
986
+ return handler(attrs, inner, tag);
987
+ });
988
+ iterations++;
989
+ }
990
+ result = result.replace(selfClosingRe, (full, tag, attrStr) => {
991
+ const handler = this.handlers.get(tag);
992
+ if (!handler) return full;
993
+ const attrs = parseShortcodeAttributes(attrStr?.trim() ?? "");
994
+ return handler(attrs, "", tag);
995
+ });
996
+ return result;
997
+ }
998
+ /**
999
+ * Strip all shortcodes from content (remove tags, keep content).
1000
+ */
1001
+ strip(content) {
1002
+ const tagPattern = [...this.handlers.keys()].map(escRegex).join("|");
1003
+ if (!tagPattern) return content;
1004
+ let result = content;
1005
+ result = result.replace(
1006
+ new RegExp(`\\[(${tagPattern})(\\s[^\\]]*?)?\\]([\\s\\S]*?)\\[\\/\\1\\]`, "g"),
1007
+ "$3"
1008
+ );
1009
+ result = result.replace(
1010
+ new RegExp(`\\[(${tagPattern})(\\s[^\\]]*?)?\\s*\\/\\]`, "g"),
1011
+ ""
1012
+ );
1013
+ return result;
1014
+ }
1015
+ getAll() {
1016
+ return [...this.handlers.keys()];
1017
+ }
1018
+ reset() {
1019
+ this.handlers.clear();
1020
+ }
1021
+ };
1022
+ function parseShortcodeAttributes(attrStr) {
1023
+ const attrs = {};
1024
+ if (!attrStr) return attrs;
1025
+ const re = /([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S+))|([a-zA-Z_][-a-zA-Z0-9_]*)/g;
1026
+ let match;
1027
+ while ((match = re.exec(attrStr)) !== null) {
1028
+ if (match[1]) {
1029
+ attrs[match[1]] = match[2] ?? match[3] ?? match[4] ?? "";
1030
+ } else if (match[5]) {
1031
+ attrs[match[5]] = "";
1032
+ }
1033
+ }
1034
+ return attrs;
1035
+ }
1036
+ function escRegex(s) {
1037
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1038
+ }
1039
+
1040
+ // src/menu-registry.ts
1041
+ var MenuRegistry = class {
1042
+ locations = /* @__PURE__ */ new Map();
1043
+ /**
1044
+ * Register a menu location (e.g., "primary", "footer").
1045
+ */
1046
+ registerLocation(name, description) {
1047
+ this.locations.set(name, { name, description });
1048
+ }
1049
+ /**
1050
+ * Unregister a menu location.
1051
+ */
1052
+ unregisterLocation(name) {
1053
+ return this.locations.delete(name);
1054
+ }
1055
+ /**
1056
+ * Get all registered locations.
1057
+ */
1058
+ getLocations() {
1059
+ return [...this.locations.values()];
1060
+ }
1061
+ /**
1062
+ * Check if a location is registered.
1063
+ */
1064
+ hasLocation(name) {
1065
+ return this.locations.has(name);
1066
+ }
1067
+ /**
1068
+ * Build a tree from a flat list of menu items using parentId.
1069
+ */
1070
+ static buildTree(items) {
1071
+ const map = /* @__PURE__ */ new Map();
1072
+ const roots = [];
1073
+ const sorted = [...items].sort((a, b) => a.menuOrder - b.menuOrder);
1074
+ for (const item of sorted) {
1075
+ map.set(item.id, { ...item, children: [] });
1076
+ }
1077
+ for (const item of sorted) {
1078
+ const node = map.get(item.id);
1079
+ if (item.parentId === 0) {
1080
+ roots.push(node);
1081
+ } else {
1082
+ const parent = map.get(item.parentId);
1083
+ if (parent) {
1084
+ parent.children = parent.children ?? [];
1085
+ parent.children.push(node);
1086
+ } else {
1087
+ roots.push(node);
1088
+ }
1089
+ }
1090
+ }
1091
+ return roots;
1092
+ }
1093
+ reset() {
1094
+ this.locations.clear();
1095
+ }
1096
+ };
1097
+
1098
+ // src/url-rewrite.ts
1099
+ var STRUCTURE_TAGS = {
1100
+ "%year%": { regex: "(?<year>\\d{4})", queryVar: "year" },
1101
+ "%monthnum%": { regex: "(?<monthnum>\\d{2})", queryVar: "monthnum" },
1102
+ "%day%": { regex: "(?<day>\\d{2})", queryVar: "day" },
1103
+ "%hour%": { regex: "(?<hour>\\d{2})", queryVar: "hour" },
1104
+ "%minute%": { regex: "(?<minute>\\d{2})", queryVar: "minute" },
1105
+ "%second%": { regex: "(?<second>\\d{2})", queryVar: "second" },
1106
+ "%postname%": { regex: "(?<postname>[^/]+)", queryVar: "name" },
1107
+ "%post_id%": { regex: "(?<post_id>\\d+)", queryVar: "p" },
1108
+ "%category%": { regex: "(?<category>[^/]+)", queryVar: "category_name" },
1109
+ "%tag%": { regex: "(?<tag>[^/]+)", queryVar: "tag" },
1110
+ "%author%": { regex: "(?<author>[^/]+)", queryVar: "author_name" },
1111
+ "%pagename%": { regex: "(?<pagename>[^/]+)", queryVar: "pagename" }
1112
+ };
1113
+ var UrlRewriter = class {
1114
+ rules = [];
1115
+ /**
1116
+ * Add a rewrite rule.
1117
+ */
1118
+ addRule(pattern, queryVars, source, priority = 10) {
1119
+ this.rules.push({ pattern, queryVars, source, priority });
1120
+ this.rules.sort((a, b) => a.priority - b.priority);
1121
+ }
1122
+ /**
1123
+ * Generate rules from a permalink structure string.
1124
+ * E.g., "/%year%/%monthnum%/%postname%/"
1125
+ */
1126
+ addPermalinkStructure(structure, source = "post_permalink") {
1127
+ let regexStr = structure;
1128
+ const queryVars = [];
1129
+ for (const [tag, def] of Object.entries(STRUCTURE_TAGS)) {
1130
+ if (regexStr.includes(tag)) {
1131
+ regexStr = regexStr.replace(tag, def.regex);
1132
+ queryVars.push(def.queryVar);
1133
+ }
1134
+ }
1135
+ regexStr = regexStr.replace(/^\//, "").replace(/\/$/, "");
1136
+ const pattern = new RegExp(`^${regexStr}/?$`);
1137
+ this.addRule(pattern, queryVars, source, 5);
1138
+ }
1139
+ /**
1140
+ * Add default rules for categories, tags, authors, search, pages, feeds.
1141
+ */
1142
+ addDefaultRules() {
1143
+ this.addRule(/^category\/(?<category>[^/]+)\/?$/, ["category_name"], "category", 10);
1144
+ this.addRule(/^tag\/(?<tag>[^/]+)\/?$/, ["tag"], "tag", 10);
1145
+ this.addRule(/^author\/(?<author>[^/]+)\/?$/, ["author_name"], "author", 10);
1146
+ this.addRule(/^search\/(?<s>.+)\/?$/, ["s"], "search", 10);
1147
+ this.addRule(/^page\/(?<paged>\d+)\/?$/, ["paged"], "paging", 10);
1148
+ this.addRule(/^feed\/?(?<feed>rss2?|atom|rdf)?\/?$/, ["feed"], "feed", 10);
1149
+ this.addRule(/^(?<pagename>[^/]+)\/?$/, ["pagename"], "page", 99);
1150
+ }
1151
+ /**
1152
+ * Resolve a URL path to query variables.
1153
+ */
1154
+ resolve(path) {
1155
+ const cleanPath = path.replace(/^\//, "").replace(/\/$/, "");
1156
+ for (const rule of this.rules) {
1157
+ const match = cleanPath.match(rule.pattern);
1158
+ if (match?.groups) {
1159
+ const queryVars = {};
1160
+ for (const [key, value] of Object.entries(match.groups)) {
1161
+ if (value !== void 0) {
1162
+ const tag = Object.entries(STRUCTURE_TAGS).find(
1163
+ ([_, def]) => def.regex.includes(`<${key}>`)
1164
+ );
1165
+ queryVars[tag ? tag[1].queryVar : key] = value;
1166
+ }
1167
+ }
1168
+ return { matched: true, rule, queryVars };
1169
+ }
1170
+ }
1171
+ return { matched: false, queryVars: {} };
1172
+ }
1173
+ /**
1174
+ * Build a permalink URL from a structure and values.
1175
+ * E.g., buildPermalink("/%year%/%monthnum%/%postname%/", { year: "2026", monthnum: "04", postname: "hello" })
1176
+ * → "/2026/04/hello/"
1177
+ */
1178
+ static buildPermalink(structure, values) {
1179
+ let result = structure;
1180
+ for (const [tag, def] of Object.entries(STRUCTURE_TAGS)) {
1181
+ if (result.includes(tag) && values[def.queryVar]) {
1182
+ result = result.replace(tag, values[def.queryVar]);
1183
+ }
1184
+ }
1185
+ return result;
1186
+ }
1187
+ getRules() {
1188
+ return [...this.rules];
1189
+ }
1190
+ reset() {
1191
+ this.rules = [];
1192
+ }
1193
+ };
949
1194
  export {
950
1195
  BOOTSTRAP_PHASES,
951
1196
  BUILTIN_POST_TYPES,
@@ -954,11 +1199,14 @@ export {
954
1199
  ExtensionRegistry,
955
1200
  HOOK_PRIORITY,
956
1201
  HookEngine,
1202
+ MenuRegistry,
957
1203
  POST_STATUS,
958
1204
  PostTypeRegistry,
1205
+ ShortcodeRegistry,
959
1206
  TaxonomyRegistry,
960
1207
  ThemeRegistry,
961
1208
  USER_ROLES,
1209
+ UrlRewriter,
962
1210
  resolveTemplateHierarchy
963
1211
  };
964
1212
  //# sourceMappingURL=index.js.map