{
  "version": 3,
  "sources": ["../../../../html-validation/src/browserErrors.ts"],
  "sourcesContent": ["import type {\n\tInvalidCloseTagErrorParams,\n\tInvalidSelfClosingTagErrorParams,\n\tJSONLDScriptValidationParams,\n\tNestedLinkErrorParams,\n\tNestingErrorParams,\n\tStrayCloseTagErrorParams,\n\tTagInfo,\n\tTextNestingErrorParams,\n\tUnclosedTagErrorParams,\n\tValidationErrorBuilder,\n} from \"./types.ts\"\n\nexport enum ValidationSeverity {\n\tError = \"error\",\n\tWarning = \"warning\",\n\tInfo = \"info\",\n}\n\ninterface ValidationDetails {\n\tstart: number\n\tend: number\n\tmessage: string\n\tseverity: ValidationSeverity\n\tlink?: {\n\t\turl: string\n\t\ttext: string\n\t}\n}\n\ninterface ValidationItem {\n\t/**\n\t * This should be called after parsing has finished, so that full context is available.\n\t */\n\tgetMessage(context: string[]): ValidationDetails\n}\n\nexport class NestingError implements ValidationItem {\n\tconstructor(\n\t\tprivate ancestorTagName: string,\n\t\tprivate childTagName: string,\n\t\t/**\n\t\t * This flag is to distinguish between \"can't be a direct child\" vs \"can't be nested\" cases.\n\t\t *\n\t\t * For example, <td> is allowed inside <table>, but can't be a direct child (requires a <tr> as a parent).\n\t\t *\n\t\t * The two cases have slightly different error messages, to make this more clear.\n\t\t *\n\t\t * See also: `isTagValidWithParent` vs `findInvalidAncestorForTag` in validateDOMNesting.ts.\n\t\t */\n\t\tprivate invalidParent: boolean,\n\t\tprivate tagInfo: { start: number; end: number },\n\t) {}\n\n\tgetMessage() {\n\t\tlet message = `The tag <${this.childTagName}> cannot be ${\n\t\t\tthis.invalidParent ? \"a direct child\" : \"nested inside\"\n\t\t} of <${this.ancestorTagName}>.`\n\n\t\tif (this.ancestorTagName === \"table\" && this.childTagName === \"tr\") {\n\t\t\t// This is technically valid, but the browser will implicitly add the <tbody> during parsing, which can\n\t\t\t// cause a hydration error.\n\t\t\tmessage += \"\\nTo fix this, wrap your <tr> tags in a <tbody>.\"\n\t\t} else if (!this.invalidParent) {\n\t\t\tmessage += \"\\nTo fix this, change either the outer or the nested tag.\"\n\t\t}\n\t\t// Else, it's a \"cannot be a direct child\" error, and how to fix it depends on the context.\n\t\t//\n\t\t// These should be rare and almost certainly custom HTML or code components, so we're okay with being a little\n\t\t// less hand-holdy.\n\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: ValidationSeverity.Error,\n\t\t\tmessage,\n\t\t}\n\t}\n}\n\nexport class NestedLinkError implements ValidationItem {\n\tconstructor(private tagInfo: { start: number; end: number }) {}\n\n\tgetMessage() {\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: ValidationSeverity.Error,\n\t\t\tmessage: \"Nested links (<a> tags) are not allowed.\",\n\t\t}\n\t}\n}\n\nexport class TextNestingError implements ValidationItem {\n\tconstructor(\n\t\tprivate parentTagName: string,\n\t\tprivate tagInfo: { start: number; end: number },\n\t) {}\n\n\tgetMessage() {\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: ValidationSeverity.Error,\n\t\t\tmessage: `Text cannot be a direct child of <${this.parentTagName}>.`,\n\t\t}\n\t}\n}\n\nexport class InvalidSelfClosingTagError implements ValidationItem {\n\tconstructor(\n\t\tprivate tagName: string,\n\t\tprivate tagInfo: { start: number; end: number },\n\t) {}\n\n\tgetMessage() {\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: ValidationSeverity.Error,\n\t\t\tmessage: `<${this.tagName}/> cannot be self-closing.\\nChange it to <${this.tagName}></${this.tagName}>.`,\n\t\t}\n\t}\n}\n\nexport class InvalidCloseTag implements ValidationItem {\n\tconstructor(\n\t\tprivate openTagName: string,\n\t\tprivate closeTagName: string,\n\t\tprivate tagInfo: { start: number; end: number },\n\t) {}\n\n\tgetMessage() {\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: ValidationSeverity.Error,\n\t\t\tmessage: `End tag </${this.closeTagName}> seen, but the open element is <${this.openTagName}>.`,\n\t\t}\n\t}\n}\n\nexport class StrayCloseTag implements ValidationItem {\n\tconstructor(\n\t\tprivate closeTagName: string,\n\t\tprivate tagInfo: { start: number; end: number },\n\t) {}\n\n\tgetMessage() {\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: ValidationSeverity.Error,\n\t\t\tmessage: `Stray end tag </${this.closeTagName}>.`,\n\t\t}\n\t}\n}\n\nexport class UnclosedTag implements ValidationItem {\n\tconstructor(\n\t\tprivate unclosedTagName: string,\n\t\tprivate tagInfo: { start: number; end: number },\n\t) {}\n\n\tgetMessage() {\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: ValidationSeverity.Error,\n\t\t\tmessage: `Unclosed <${this.unclosedTagName}>.`,\n\t\t}\n\t}\n}\n\nexport class RenderBlockingScript implements ValidationItem {\n\tconstructor(private tagInfo: { start: number; end: number }) {}\n\n\tgetMessage() {\n\t\tconst message = `This script tag will slow down page loading, keeping the page invisible until it downloads. Move it to \"End of <body> tag\".`\n\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: ValidationSeverity.Warning,\n\t\t\tmessage,\n\t\t\tlink: { url: \"https://www.framer.com/help/articles/site-optimization/#custom-code\", text: \"Learn more\" },\n\t\t}\n\t}\n}\n\nexport class JSONLDScriptValidation implements ValidationItem {\n\tconstructor(\n\t\tprivate message: string,\n\t\tprivate severity: ValidationSeverity,\n\t\tprivate tagInfo: { start: number; end: number },\n\t) {}\n\n\tgetMessage() {\n\t\treturn {\n\t\t\t...this.tagInfo,\n\t\t\tseverity: this.severity,\n\t\t\tmessage: this.message,\n\t\t}\n\t}\n}\n\nexport class BrowserValidationErrorBuilder implements ValidationErrorBuilder<ValidationDetails[]> {\n\tprivate context: string[] = []\n\tprivate errors: ValidationItem[] = []\n\n\tsetContext(context: string[]) {\n\t\tthis.context = context\n\t}\n\n\tprivate add(error: ValidationItem) {\n\t\tthis.errors.push(error)\n\t}\n\n\tbuild(): ValidationDetails[] {\n\t\tconst messages: ValidationDetails[] = []\n\n\t\tfor (const error of this.errors) {\n\t\t\tmessages.push(error.getMessage(this.context))\n\t\t}\n\n\t\treturn messages\n\t}\n\n\taddNestingError({ ancestorTagName, childTagName, invalidParent }: NestingErrorParams, tagInfo: TagInfo): void {\n\t\tthis.add(new NestingError(ancestorTagName, childTagName, invalidParent, tagInfo))\n\t}\n\n\taddNestedLinkError(_params: NestedLinkErrorParams, tagInfo: TagInfo): void {\n\t\tthis.add(new NestedLinkError(tagInfo))\n\t}\n\n\taddTextNestingError({ parentTagName }: TextNestingErrorParams, tagInfo: TagInfo): void {\n\t\tthis.add(new TextNestingError(parentTagName, tagInfo))\n\t}\n\n\taddInvalidSelfClosingTag({ tagName }: InvalidSelfClosingTagErrorParams, tagInfo: TagInfo): void {\n\t\tthis.add(new InvalidSelfClosingTagError(tagName, tagInfo))\n\t}\n\n\taddInvalidCloseTag({ tagName, closeTagName }: InvalidCloseTagErrorParams, tagInfo: TagInfo): void {\n\t\tthis.add(new InvalidCloseTag(tagName, closeTagName, tagInfo))\n\t}\n\n\taddStrayCloseTag({ closeTagName }: StrayCloseTagErrorParams, tagInfo: TagInfo): void {\n\t\tthis.add(new StrayCloseTag(closeTagName, tagInfo))\n\t}\n\n\taddUnclosedTag({ unclosedTagName }: UnclosedTagErrorParams, tagInfo: TagInfo): void {\n\t\tthis.add(new UnclosedTag(unclosedTagName, tagInfo))\n\t}\n\n\taddRenderBlockingScript(tagInfo: TagInfo): void {\n\t\tthis.add(new RenderBlockingScript(tagInfo))\n\t}\n\n\taddJSONLDScriptError({ message }: JSONLDScriptValidationParams, tagInfo: TagInfo): void {\n\t\tthis.add(new JSONLDScriptValidation(message, ValidationSeverity.Error, tagInfo))\n\t}\n\n\taddJSONLDScriptInfo({ message }: JSONLDScriptValidationParams, tagInfo: TagInfo): void {\n\t\tthis.add(new JSONLDScriptValidation(message, ValidationSeverity.Info, tagInfo))\n\t}\n}\n"],
  "mappings": "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",
  "names": ["ValidationSeverity"]
}
