[{"data":1,"prerenderedAt":2250},["ShallowReactive",2],{"navigation_docs":3,"-tooling-goldens-and-testing":191,"-tooling-goldens-and-testing-surround":2245},[4,31,67,103,129,155,175],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":30},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-play",{"title":26,"path":27,"stem":28,"icon":29},"Agent Skill","\u002Fgetting-started\u002Fagent-skill","1.getting-started\u002F4.agent-skill","i-lucide-sparkles",false,{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":30},"Authoring","i-lucide-pen-line","\u002Fauthoring","2.authoring",[37,42,47,52,57,62],{"title":38,"path":39,"stem":40,"icon":41},"Comark syntax","\u002Fauthoring\u002Fcomark-syntax","2.authoring\u002F1.comark-syntax","i-lucide-file-code",{"title":43,"path":44,"stem":45,"icon":46},"Frontmatter","\u002Fauthoring\u002Ffrontmatter","2.authoring\u002F2.frontmatter","i-lucide-heading",{"title":48,"path":49,"stem":50,"icon":51},"Modules","\u002Fauthoring\u002Fmodules","2.authoring\u002F3.modules","i-lucide-blocks",{"title":53,"path":54,"stem":55,"icon":56},"Merge tags and bindings","\u002Fauthoring\u002Fmerge-tags-and-bindings","2.authoring\u002F4.merge-tags-and-bindings","i-lucide-braces",{"title":58,"path":59,"stem":60,"icon":61},"Actions and spans","\u002Fauthoring\u002Factions-and-spans","2.authoring\u002F5.actions-and-spans","i-lucide-mouse-pointer-click",{"title":63,"path":64,"stem":65,"icon":66},"Compile errors","\u002Fauthoring\u002Fcompile-errors","2.authoring\u002F6.compile-errors","i-lucide-circle-alert",{"title":68,"icon":69,"path":70,"stem":71,"children":72,"page":30},"Rendering","i-lucide-layout-template","\u002Frendering","3.rendering",[73,78,83,88,93,98],{"title":74,"path":75,"stem":76,"icon":77},"Families and streams","\u002Frendering\u002Ffamilies-and-streams","3.rendering\u002F1.families-and-streams","i-lucide-users",{"title":79,"path":80,"stem":81,"icon":82},"Themes","\u002Frendering\u002Fthemes","3.rendering\u002F2.themes","i-lucide-palette",{"title":84,"path":85,"stem":86,"icon":87},"Config and the renderer","\u002Frendering\u002Fconfig-and-renderer","3.rendering\u002F3.config-and-renderer","i-lucide-settings",{"title":89,"path":90,"stem":91,"icon":92},"Layout and spacing","\u002Frendering\u002Flayout-and-spacing","3.rendering\u002F4.layout-and-spacing","i-lucide-ruler",{"title":94,"path":95,"stem":96,"icon":97},"HTML output","\u002Frendering\u002Fhtml-output","3.rendering\u002F5.html-output","i-lucide-code-xml",{"title":99,"path":100,"stem":101,"icon":102},"Plain text","\u002Frendering\u002Fplain-text","3.rendering\u002F6.plain-text","i-lucide-file-text",{"title":104,"icon":105,"path":106,"stem":107,"children":108,"page":30},"Sending","i-lucide-send","\u002Fsending","4.sending",[109,114,119,124],{"title":110,"path":111,"stem":112,"icon":113},"Message and MIME","\u002Fsending\u002Fmessage-and-mime","4.sending\u002F1.message-and-mime","i-lucide-mail",{"title":115,"path":116,"stem":117,"icon":118},"Router and streams","\u002Fsending\u002Frouter-and-streams","4.sending\u002F2.router-and-streams","i-lucide-route",{"title":120,"path":121,"stem":122,"icon":123},"SMTP","\u002Fsending\u002Fsmtp","4.sending\u002F3.smtp","i-lucide-server",{"title":125,"path":126,"stem":127,"icon":128},"Maps","\u002Fsending\u002Fmaps","4.sending\u002F4.maps","i-lucide-map",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":30},"Tooling","i-lucide-wrench","\u002Ftooling","5.tooling",[135,140,145,150],{"title":136,"path":137,"stem":138,"icon":139},"The lttr CLI","\u002Ftooling\u002Fcli","5.tooling\u002F1.cli","i-lucide-terminal",{"title":141,"path":142,"stem":143,"icon":144},"Live preview","\u002Ftooling\u002Flive-preview","5.tooling\u002F2.live-preview","i-lucide-eye",{"title":146,"path":147,"stem":148,"icon":149},"Screenshots","\u002Ftooling\u002Fscreenshots","5.tooling\u002F3.screenshots","i-lucide-camera",{"title":151,"path":152,"stem":153,"icon":154},"Goldens and testing","\u002Ftooling\u002Fgoldens-and-testing","5.tooling\u002F4.goldens-and-testing","i-lucide-flask-conical",{"title":156,"icon":157,"path":158,"stem":159,"children":160,"page":30},"Guides","i-lucide-book-open","\u002Fguides","6.guides",[161,166,170],{"title":162,"path":163,"stem":164,"icon":165},"The Quiet example","\u002Fguides\u002Fthe-quiet-example","6.guides\u002F1.the-quiet-example","i-lucide-mail-open",{"title":167,"path":168,"stem":169,"icon":82},"Your own family and theme","\u002Fguides\u002Fyour-own-family-and-theme","6.guides\u002F2.your-own-family-and-theme",{"title":171,"path":172,"stem":173,"icon":174},"Releasing","\u002Fguides\u002Freleasing","6.guides\u002F3.releasing","i-lucide-tag",{"title":176,"icon":177,"path":178,"stem":179,"children":180,"page":30},"Reference","i-lucide-library","\u002Freference","7.reference",[181,186],{"title":182,"path":183,"stem":184,"icon":185},"API reference","\u002Freference\u002Fapi-reference","7.reference\u002F1.api-reference","i-lucide-list-tree",{"title":187,"path":188,"stem":189,"icon":190},"Gallery","\u002Freference\u002Fgallery","7.reference\u002F2.gallery","i-lucide-images",{"id":192,"title":151,"body":193,"description":2238,"extension":2239,"links":2240,"meta":2241,"navigation":2242,"path":152,"seo":2243,"stem":153,"__hash__":2244},"docs\u002F5.tooling\u002F4.goldens-and-testing.md",{"type":194,"value":195,"toc":2228},"minimark",[196,200,205,236,262,271,297,308,312,321,440,469,476,493,496,598,602,626,687,694,698,733,752,756,759,2160,2184,2205,2209,2225],[197,198,199],"p",{},"lttr's own test suite (SPEC §18) is the model for testing templates you write against the library: golden files reviewed in the diff, a structural lint run on every golden, fuzzing on the parser and compiler, and a coverage floor enforced per package.",[201,202,204],"h2",{"id":203},"regenerate-and-review-goldens","Regenerate and review goldens",[206,207,213],"pre",{"className":208,"code":209,"filename":210,"language":211,"meta":212,"style":212},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","make golden\n# = go test .\u002Fexamples\u002Fquiet -run TestGolden -update\n","Terminal","bash","",[214,215,216,229],"code",{"__ignoreMap":212},[217,218,221,225],"span",{"class":219,"line":220},"line",1,[217,222,224],{"class":223},"sBMFI","make",[217,226,228],{"class":227},"sfazB"," golden\n",[217,230,232],{"class":219,"line":231},2,[217,233,235],{"class":234},"sHwdD","# = go test .\u002Fexamples\u002Fquiet -run TestGolden -update\n",[197,237,238,241,242,245,246,249,250,253,254,257,258,261],{},[214,239,240],{},"TestGolden"," renders each of the nine examples and compares ",[214,243,244],{},".HTML","\u002F",[214,247,248],{},".Text"," against ",[214,251,252],{},"testdata\u002Fgolden\u002F{NN}-{name}.html"," and ",[214,255,256],{},".txt",". With ",[214,259,260],{},"-update"," it rewrites those files from the current render instead of comparing; without it, a mismatch fails with the first differing line shown both ways:",[206,263,269],{"className":264,"code":266,"filename":267,"language":268,"meta":212},[265],"language-text","..\u002F..\u002Ftestdata\u002Fgolden\u002F01-order.out_for_delivery.html differs from the render at line 89:\n  golden: \"...EC$185...\" (abbreviated: the real line is the whole row's HTML)\n  render: \"...EC$999...\" (review, then -update)\n","go test output","text",[214,270,266],{"__ignoreMap":212},[197,272,273,277,278,281,282,285,286,289,290,292,293,296],{},[274,275,276],"strong",{},"Goldens are reviewed in the PR diff, not rubber-stamped."," After ",[214,279,280],{},"make golden",", run ",[214,283,284],{},"git diff testdata\u002Fgolden\u002F"," and read every changed line: a golden diff is the actual, final proof that a template or renderer change did what you meant and nothing else — it is the one place a stray attribute, a rounding change in ",[214,287,288],{},"Money",", or a copy edit that slipped into the wrong module shows up as a literal, reviewable line of HTML or text. ",[214,291,240],{}," also fails if the render produced any ",[214,294,295],{},"Message.Warnings"," — a clean render has none.",[197,298,299,300,303,304,307],{},"Two more checks run over the files on disk (",[214,301,302],{},"TestGoldenFiles","): every text golden's lines are at most 70 runes unless they contain a URL (SPEC §9.3's wrapping rule), and every HTML golden passes the structural lint below. ",[214,305,306],{},"TestGoldenText01MatchesSpec"," additionally pins template 01's text body byte for byte against the literal block in SPEC §9.3 — the one example the spec spells out in full.",[201,309,311],{"id":310},"run-the-structural-lint","Run the structural lint",[197,313,314,317,318,320],{},[214,315,316],{},"internal\u002Fhtmlcheck.Lint(doc string) []string"," is the SPEC §18 structural lint: it returns one message per violation, and an empty result means clean. It runs on every HTML golden (",[214,319,302],{},") and is available to your own tests too. It checks:",[322,323,324,348,365,385,411,420,426,429],"ul",{},[325,326,327,328,331,332,335,336,347],"li",{},"no ",[214,329,330],{},"flex"," or ",[214,333,334],{},"grid"," in CSS (matched case-insensitively, but ",[274,337,338,339,342,343,346],{},"only inside ",[214,340,341],{},"style=\"…\""," attributes and ",[214,344,345],{},"\u003Cstyle>"," bodies"," — the word \"grid\" in visible copy is not an error);",[325,349,327,350,353,354,353,357,360,361,364],{},[214,351,352],{},"var(",", ",[214,355,356],{},"@import",[214,358,359],{},"\u003Cscript"," (case-insensitively) or unexpanded ",[214,362,363],{},"{{"," anywhere in the document;",[325,366,367,368,371,372,353,375,353,378,253,381,384],{},"every ",[214,369,370],{},"\u003Ctable>"," has ",[214,373,374],{},"role=\"presentation\"",[214,376,377],{},"cellpadding=\"0\"",[214,379,380],{},"cellspacing=\"0\"",[214,382,383],{},"border=\"0\"",";",[325,386,367,387,371,390,353,393,396,397,400,401,245,404,407,408,384],{},[214,388,389],{},"\u003Cimg>",[214,391,392],{},"alt",[214,394,395],{},"width",", and ",[214,398,399],{},"border:0"," (or ",[214,402,403],{},"0px",[214,405,406],{},"none",") in its ",[214,409,410],{},"style",[325,412,327,413,416,417,384],{},[214,414,415],{},"\u003Cdiv style=\"...\">"," containing ",[214,418,419],{},"display:flex",[325,421,422,423,384],{},"the document has ",[214,424,425],{},"\u003Cmeta name=\"color-scheme\" content=\"light dark\">",[325,427,428],{},"the document is under 100 KB;",[325,430,431,432,435,436,439],{},"Outlook conditional comments (",[214,433,434],{},"\u003C!--[if …]>"," \u002F ",[214,437,438],{},"\u003C![endif]-->",") are balanced, and none closes before it opens.",[197,441,442,443,447,448,451,452,455,456,458,459,462,463,245,465,468],{},"It also looks ",[444,445,446],"em",{},"inside"," ",[214,449,450],{},"\u003C!--[if mso]>…\u003C![endif]-->"," blocks: the tables, images, ",[214,453,454],{},"\u003Cdiv>","s and ",[214,457,345],{}," bodies an Outlook-only branch contains obey the same rules, at their real byte offsets in the document; a VML element like ",[214,460,461],{},"v:roundrect"," is neither a table nor an image, so only the CSS checks apply to it. It is a small tokenizer, not a full HTML parser — enough to find tags, attributes and comments in the markup lttr itself generates, with comments skipped and ",[214,464,345],{},[214,466,467],{},"\u003Cscript>"," bodies treated as raw text.",[201,470,472,473],{"id":471},"run-make-check","Run ",[214,474,475],{},"make check",[206,477,479],{"className":208,"code":478,"filename":210,"language":211,"meta":212,"style":212},"make check\n# = fmt vet staticcheck test cover fuzz\n",[214,480,481,488],{"__ignoreMap":212},[217,482,483,485],{"class":219,"line":220},[217,484,224],{"class":223},[217,486,487],{"class":227}," check\n",[217,489,490],{"class":219,"line":231},[217,491,492],{"class":234},"# = fmt vet staticcheck test cover fuzz\n",[197,494,495],{},"is everything CI runs, in order:",[497,498,499,512],"table",{},[500,501,502],"thead",{},[503,504,505,509],"tr",{},[506,507,508],"th",{},"Step",[506,510,511],{},"What it does",[513,514,515,529,541,558,570,580],"tbody",{},[503,516,517,523],{},[518,519,520],"td",{},[214,521,522],{},"fmt",[518,524,525,528],{},[214,526,527],{},"gofmt -l ."," must report nothing",[503,530,531,536],{},[518,532,533],{},[214,534,535],{},"vet",[518,537,538],{},[214,539,540],{},"go vet .\u002F...",[503,542,543,548],{},[518,544,545],{},[214,546,547],{},"staticcheck",[518,549,550,551,553,554,557],{},"An installed ",[214,552,547],{},", falling back to ",[214,555,556],{},"go run honnef.co\u002Fgo\u002Ftools\u002Fcmd\u002Fstaticcheck@latest"," if the installed binary can't load current stdlib files (D25) — a real finding fails both",[503,559,560,565],{},[518,561,562],{},[214,563,564],{},"test",[518,566,567],{},[214,568,569],{},"go test -race .\u002F...",[503,571,572,577],{},[518,573,574],{},[214,575,576],{},"cover",[518,578,579],{},"The coverage floor (below)",[503,581,582,587],{},[518,583,584],{},[214,585,586],{},"fuzz",[518,588,589,590,593,594,597],{},"Every ",[214,591,592],{},"Fuzz*"," target for ",[214,595,596],{},"$FUZZTIME"," each (default 20s)",[201,599,601],{"id":600},"run-the-fuzz-targets","Run the fuzz targets",[197,603,604,607,608,610,611,613,614,617,618,621,622,625],{},[214,605,606],{},"scripts\u002Ffuzz.sh"," lists every ",[214,609,592],{}," function in every package and runs each for ",[214,612,596],{}," (default ",[214,615,616],{},"20s",", overridable: ",[214,619,620],{},"FUZZTIME=2m make check","), with ",[214,623,624],{},"-fuzzminimizetime=1s"," — Go's 60s default minimisation window made every target sit idle for most of a 20s smoke run (D33). The three targets:",[497,627,628,641],{},[500,629,630],{},[503,631,632,635,638],{},[506,633,634],{},"Target",[506,636,637],{},"Package",[506,639,640],{},"Guards",[513,642,643,658,672],{},[503,644,645,650,655],{},[518,646,647],{},[214,648,649],{},"FuzzParse",[518,651,652],{},[214,653,654],{},"comark",[518,656,657],{},"The Comark block parser never panics",[503,659,660,665,669],{},[518,661,662],{},[214,663,664],{},"FuzzParseText",[518,666,667],{},[214,668,654],{},[518,670,671],{},"The inline\u002Fmerge-tag text parser never panics",[503,673,674,679,684],{},[518,675,676],{},[214,677,678],{},"FuzzCompile",[518,680,681],{},[214,682,683],{},"ir",[518,685,686],{},"Compiling arbitrary Comark to IR never panics",[197,688,689,690,693],{},"None of the three is allowed to panic on any input; a crash found by fuzzing gets minimised and saved to that package's ",[214,691,692],{},"testdata\u002Ffuzz\u002F"," corpus.",[201,695,697],{"id":696},"enforce-the-coverage-floor","Enforce the coverage floor",[206,699,701],{"className":208,"code":700,"filename":210,"language":211,"meta":212,"style":212},"scripts\u002Fcover.sh 85 . .\u002Fcomark .\u002Fdata .\u002Fir .\u002Flayout .\u002Frender\u002Fhtml .\u002Frender\u002Ftext\n",[214,702,703],{"__ignoreMap":212},[217,704,705,708,712,715,718,721,724,727,730],{"class":219,"line":220},[217,706,707],{"class":223},"scripts\u002Fcover.sh",[217,709,711],{"class":710},"sbssI"," 85",[217,713,714],{"class":227}," .",[217,716,717],{"class":227}," .\u002Fcomark",[217,719,720],{"class":227}," .\u002Fdata",[217,722,723],{"class":227}," .\u002Fir",[217,725,726],{"class":227}," .\u002Flayout",[217,728,729],{"class":227}," .\u002Frender\u002Fhtml",[217,731,732],{"class":227}," .\u002Frender\u002Ftext\n",[197,734,735,736,739,740,743,744,747,748,751],{},"runs ",[214,737,738],{},"go test -cover"," on each listed directory and fails if any package's statement coverage is below the floor (",[214,741,742],{},"COVER_MIN",", default 85 in the Makefile). A package that exists but has no Go files is skipped; one whose only code is, say, a lone ",[214,745,746],{},"const"," declaration reports ",[214,749,750],{},"[no statements]"," and is treated as a pass rather than a missing figure (D23) — a package with zero coverable statements vacuously clears any floor.",[201,753,755],{"id":754},"test-your-own-templates","Test your own templates",[197,757,758],{},"The same three-step shape lttr's own examples use — compile against your data type, render with sample data, compare to a golden — works for templates you write:",[206,760,765],{"className":761,"code":762,"filename":763,"language":764,"meta":212,"style":212},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package myapp\n\nimport (\n    _ \"embed\"\n    \"flag\"\n    \"os\"\n    \"strings\"\n    \"testing\"\n\n    \"github.com\u002Fsulv-io\u002Flttr\"\n)\n\nvar update = flag.Bool(\"update\", false, \"rewrite golden files\")\n\n\u002F\u002F lintBasics is a small stand-in for the repo's own internal\u002Fhtmlcheck.Lint\n\u002F\u002F (unexported, so consumers can't import it — see the note below): it\n\u002F\u002F checks a couple of the same categories from \"Run the structural lint\"\n\u002F\u002F above, cheaply enough to run in every test.\nfunc lintBasics(html string) []string {\n    var msgs []string\n    if !strings.Contains(html, `\u003Cmeta name=\"color-scheme\" content=\"light dark\">`) {\n        msgs = append(msgs, `missing \u003Cmeta name=\"color-scheme\" content=\"light dark\">`)\n    }\n    if strings.Contains(strings.ToLower(html), \"\u003Cscript\") {\n        msgs = append(msgs, \"contains \u003Cscript>\")\n    }\n    if strings.Contains(html, \"{{\") {\n        msgs = append(msgs, \"contains unexpanded {{\")\n    }\n    return msgs\n}\n\n\u002F\u002Fgo:embed templates\u002Forder-shipped.md\nvar orderShippedSrc []byte\n\ntype OrderShippedData struct {\n    OrderID, TrackURL string\n}\n\nfunc TestOrderShippedCompiles(t *testing.T) {\n    \u002F\u002F Compile checks the template against OrderShippedData and your family\n    \u002F\u002F registry once, the same way your production init would.\n    if _, err := lttr.Compile[OrderShippedData](myFamilies, \"order.shipped\", orderShippedSrc); err != nil {\n        t.Fatal(err)\n    }\n}\n\nfunc TestOrderShippedRenders(t *testing.T) {\n    tmpl, err := lttr.Compile[OrderShippedData](myFamilies, \"order.shipped\", orderShippedSrc)\n    if err != nil {\n        t.Fatal(err)\n    }\n    r, err := lttr.NewRenderer(myConfig)\n    if err != nil {\n        t.Fatal(err)\n    }\n\n    to := lttr.Recipient{Address: \"keisha@example.com\", FirstName: \"Keisha\"}\n    data := OrderShippedData{OrderID: \"CH-20417\", TrackURL: \"https:\u002F\u002Fexample.com\u002Ft\u002FCH-20417\"}\n\n    msg, err := tmpl.Render(r, to, data)\n    if err != nil {\n        t.Fatal(err)\n    }\n    if len(msg.Warnings) != 0 {\n        t.Errorf(\"warnings: %q\", msg.Warnings)\n    }\n    for _, m := range lintBasics(msg.HTML) {\n        t.Errorf(\"lint: %s\", m)\n    }\n\n    for _, part := range []struct{ path, got string }{\n        {\"testdata\u002Forder-shipped.html\", msg.HTML},\n        {\"testdata\u002Forder-shipped.txt\", msg.Text},\n    } {\n        if *update {\n            os.WriteFile(part.path, []byte(part.got), 0o644)\n            continue\n        }\n        want, err := os.ReadFile(part.path)\n        if err != nil {\n            t.Fatal(err)\n        }\n        if part.got != string(want) {\n            t.Errorf(\"%s differs from the render\", part.path)\n        }\n    }\n}\n","templates_test.go","go",[214,766,767,776,782,792,808,819,829,839,849,854,864,870,875,926,931,937,943,949,955,986,1001,1035,1062,1068,1106,1130,1135,1162,1186,1191,1200,1206,1211,1217,1230,1235,1249,1262,1267,1272,1299,1305,1311,1374,1392,1397,1402,1407,1431,1471,1484,1499,1504,1530,1543,1558,1563,1568,1615,1655,1660,1697,1710,1725,1730,1758,1792,1797,1830,1858,1863,1868,1900,1924,1947,1955,1969,2013,2019,2025,2055,2068,2084,2089,2115,2145,2150,2155],{"__ignoreMap":212},[217,768,769,773],{"class":219,"line":220},[217,770,772],{"class":771},"sMK4o","package",[217,774,775],{"class":223}," myapp\n",[217,777,778],{"class":219,"line":231},[217,779,781],{"emptyLinePlaceholder":780},true,"\n",[217,783,785,789],{"class":219,"line":784},3,[217,786,788],{"class":787},"s7zQu","import",[217,790,791],{"class":771}," (\n",[217,793,795,799,802,805],{"class":219,"line":794},4,[217,796,798],{"class":797},"sTEyZ","    _ ",[217,800,801],{"class":771},"\"",[217,803,804],{"class":223},"embed",[217,806,807],{"class":771},"\"\n",[217,809,811,814,817],{"class":219,"line":810},5,[217,812,813],{"class":771},"    \"",[217,815,816],{"class":223},"flag",[217,818,807],{"class":771},[217,820,822,824,827],{"class":219,"line":821},6,[217,823,813],{"class":771},[217,825,826],{"class":223},"os",[217,828,807],{"class":771},[217,830,832,834,837],{"class":219,"line":831},7,[217,833,813],{"class":771},[217,835,836],{"class":223},"strings",[217,838,807],{"class":771},[217,840,842,844,847],{"class":219,"line":841},8,[217,843,813],{"class":771},[217,845,846],{"class":223},"testing",[217,848,807],{"class":771},[217,850,852],{"class":219,"line":851},9,[217,853,781],{"emptyLinePlaceholder":780},[217,855,857,859,862],{"class":219,"line":856},10,[217,858,813],{"class":771},[217,860,861],{"class":223},"github.com\u002Fsulv-io\u002Flttr",[217,863,807],{"class":771},[217,865,867],{"class":219,"line":866},11,[217,868,869],{"class":771},")\n",[217,871,873],{"class":219,"line":872},12,[217,874,781],{"emptyLinePlaceholder":780},[217,876,878,881,884,887,890,893,897,900,902,905,907,910,914,916,919,922,924],{"class":219,"line":877},13,[217,879,880],{"class":771},"var",[217,882,883],{"class":797}," update ",[217,885,886],{"class":771},"=",[217,888,889],{"class":797}," flag",[217,891,892],{"class":771},".",[217,894,896],{"class":895},"s2Zo4","Bool",[217,898,899],{"class":771},"(",[217,901,801],{"class":771},[217,903,904],{"class":227},"update",[217,906,801],{"class":771},[217,908,909],{"class":771},",",[217,911,913],{"class":912},"sfNiH"," false",[217,915,909],{"class":771},[217,917,918],{"class":771}," \"",[217,920,921],{"class":227},"rewrite golden files",[217,923,801],{"class":771},[217,925,869],{"class":771},[217,927,929],{"class":219,"line":928},14,[217,930,781],{"emptyLinePlaceholder":780},[217,932,934],{"class":219,"line":933},15,[217,935,936],{"class":234},"\u002F\u002F lintBasics is a small stand-in for the repo's own internal\u002Fhtmlcheck.Lint\n",[217,938,940],{"class":219,"line":939},16,[217,941,942],{"class":234},"\u002F\u002F (unexported, so consumers can't import it — see the note below): it\n",[217,944,946],{"class":219,"line":945},17,[217,947,948],{"class":234},"\u002F\u002F checks a couple of the same categories from \"Run the structural lint\"\n",[217,950,952],{"class":219,"line":951},18,[217,953,954],{"class":234},"\u002F\u002F above, cheaply enough to run in every test.\n",[217,956,958,961,964,966,970,974,977,980,983],{"class":219,"line":957},19,[217,959,960],{"class":771},"func",[217,962,963],{"class":895}," lintBasics",[217,965,899],{"class":771},[217,967,969],{"class":968},"sHdIc","html",[217,971,973],{"class":972},"spNyl"," string",[217,975,976],{"class":771},")",[217,978,979],{"class":771}," []",[217,981,982],{"class":972},"string",[217,984,985],{"class":771}," {\n",[217,987,989,992,995,998],{"class":219,"line":988},20,[217,990,991],{"class":771},"    var",[217,993,994],{"class":797}," msgs ",[217,996,997],{"class":771},"[]",[217,999,1000],{"class":972},"string\n",[217,1002,1004,1007,1010,1012,1014,1017,1019,1021,1023,1026,1028,1031,1033],{"class":219,"line":1003},21,[217,1005,1006],{"class":787},"    if",[217,1008,1009],{"class":771}," !",[217,1011,836],{"class":797},[217,1013,892],{"class":771},[217,1015,1016],{"class":895},"Contains",[217,1018,899],{"class":771},[217,1020,969],{"class":797},[217,1022,909],{"class":771},[217,1024,1025],{"class":771}," `",[217,1027,425],{"class":227},[217,1029,1030],{"class":771},"`",[217,1032,976],{"class":771},[217,1034,985],{"class":771},[217,1036,1038,1041,1043,1046,1048,1051,1053,1055,1058,1060],{"class":219,"line":1037},22,[217,1039,1040],{"class":797},"        msgs ",[217,1042,886],{"class":771},[217,1044,1045],{"class":895}," append",[217,1047,899],{"class":771},[217,1049,1050],{"class":797},"msgs",[217,1052,909],{"class":771},[217,1054,1025],{"class":771},[217,1056,1057],{"class":227},"missing \u003Cmeta name=\"color-scheme\" content=\"light dark\">",[217,1059,1030],{"class":771},[217,1061,869],{"class":771},[217,1063,1065],{"class":219,"line":1064},23,[217,1066,1067],{"class":771},"    }\n",[217,1069,1071,1073,1076,1078,1080,1082,1084,1086,1089,1091,1093,1096,1098,1100,1102,1104],{"class":219,"line":1070},24,[217,1072,1006],{"class":787},[217,1074,1075],{"class":797}," strings",[217,1077,892],{"class":771},[217,1079,1016],{"class":895},[217,1081,899],{"class":771},[217,1083,836],{"class":797},[217,1085,892],{"class":771},[217,1087,1088],{"class":895},"ToLower",[217,1090,899],{"class":771},[217,1092,969],{"class":797},[217,1094,1095],{"class":771},"),",[217,1097,918],{"class":771},[217,1099,359],{"class":227},[217,1101,801],{"class":771},[217,1103,976],{"class":771},[217,1105,985],{"class":771},[217,1107,1109,1111,1113,1115,1117,1119,1121,1123,1126,1128],{"class":219,"line":1108},25,[217,1110,1040],{"class":797},[217,1112,886],{"class":771},[217,1114,1045],{"class":895},[217,1116,899],{"class":771},[217,1118,1050],{"class":797},[217,1120,909],{"class":771},[217,1122,918],{"class":771},[217,1124,1125],{"class":227},"contains \u003Cscript>",[217,1127,801],{"class":771},[217,1129,869],{"class":771},[217,1131,1133],{"class":219,"line":1132},26,[217,1134,1067],{"class":771},[217,1136,1138,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158,1160],{"class":219,"line":1137},27,[217,1139,1006],{"class":787},[217,1141,1075],{"class":797},[217,1143,892],{"class":771},[217,1145,1016],{"class":895},[217,1147,899],{"class":771},[217,1149,969],{"class":797},[217,1151,909],{"class":771},[217,1153,918],{"class":771},[217,1155,363],{"class":227},[217,1157,801],{"class":771},[217,1159,976],{"class":771},[217,1161,985],{"class":771},[217,1163,1165,1167,1169,1171,1173,1175,1177,1179,1182,1184],{"class":219,"line":1164},28,[217,1166,1040],{"class":797},[217,1168,886],{"class":771},[217,1170,1045],{"class":895},[217,1172,899],{"class":771},[217,1174,1050],{"class":797},[217,1176,909],{"class":771},[217,1178,918],{"class":771},[217,1180,1181],{"class":227},"contains unexpanded {{",[217,1183,801],{"class":771},[217,1185,869],{"class":771},[217,1187,1189],{"class":219,"line":1188},29,[217,1190,1067],{"class":771},[217,1192,1194,1197],{"class":219,"line":1193},30,[217,1195,1196],{"class":787},"    return",[217,1198,1199],{"class":797}," msgs\n",[217,1201,1203],{"class":219,"line":1202},31,[217,1204,1205],{"class":771},"}\n",[217,1207,1209],{"class":219,"line":1208},32,[217,1210,781],{"emptyLinePlaceholder":780},[217,1212,1214],{"class":219,"line":1213},33,[217,1215,1216],{"class":234},"\u002F\u002Fgo:embed templates\u002Forder-shipped.md\n",[217,1218,1220,1222,1225,1227],{"class":219,"line":1219},34,[217,1221,880],{"class":771},[217,1223,1224],{"class":797}," orderShippedSrc ",[217,1226,997],{"class":771},[217,1228,1229],{"class":972},"byte\n",[217,1231,1233],{"class":219,"line":1232},35,[217,1234,781],{"emptyLinePlaceholder":780},[217,1236,1238,1241,1244,1247],{"class":219,"line":1237},36,[217,1239,1240],{"class":771},"type",[217,1242,1243],{"class":223}," OrderShippedData",[217,1245,1246],{"class":771}," struct",[217,1248,985],{"class":771},[217,1250,1252,1255,1257,1260],{"class":219,"line":1251},37,[217,1253,1254],{"class":797},"    OrderID",[217,1256,909],{"class":771},[217,1258,1259],{"class":797}," TrackURL ",[217,1261,1000],{"class":972},[217,1263,1265],{"class":219,"line":1264},38,[217,1266,1205],{"class":771},[217,1268,1270],{"class":219,"line":1269},39,[217,1271,781],{"emptyLinePlaceholder":780},[217,1273,1275,1277,1280,1282,1285,1288,1290,1292,1295,1297],{"class":219,"line":1274},40,[217,1276,960],{"class":771},[217,1278,1279],{"class":895}," TestOrderShippedCompiles",[217,1281,899],{"class":771},[217,1283,1284],{"class":968},"t",[217,1286,1287],{"class":771}," *",[217,1289,846],{"class":223},[217,1291,892],{"class":771},[217,1293,1294],{"class":223},"T",[217,1296,976],{"class":771},[217,1298,985],{"class":771},[217,1300,1302],{"class":219,"line":1301},41,[217,1303,1304],{"class":234},"    \u002F\u002F Compile checks the template against OrderShippedData and your family\n",[217,1306,1308],{"class":219,"line":1307},42,[217,1309,1310],{"class":234},"    \u002F\u002F registry once, the same way your production init would.\n",[217,1312,1314,1316,1319,1321,1324,1327,1330,1332,1335,1338,1341,1344,1347,1349,1351,1354,1356,1358,1361,1364,1366,1369,1372],{"class":219,"line":1313},43,[217,1315,1006],{"class":787},[217,1317,1318],{"class":797}," _",[217,1320,909],{"class":771},[217,1322,1323],{"class":797}," err ",[217,1325,1326],{"class":771},":=",[217,1328,1329],{"class":797}," lttr",[217,1331,892],{"class":771},[217,1333,1334],{"class":895},"Compile",[217,1336,1337],{"class":771},"[",[217,1339,1340],{"class":223},"OrderShippedData",[217,1342,1343],{"class":771},"](",[217,1345,1346],{"class":797},"myFamilies",[217,1348,909],{"class":771},[217,1350,918],{"class":771},[217,1352,1353],{"class":227},"order.shipped",[217,1355,801],{"class":771},[217,1357,909],{"class":771},[217,1359,1360],{"class":797}," orderShippedSrc",[217,1362,1363],{"class":771},");",[217,1365,1323],{"class":797},[217,1367,1368],{"class":771},"!=",[217,1370,1371],{"class":771}," nil",[217,1373,985],{"class":771},[217,1375,1377,1380,1382,1385,1387,1390],{"class":219,"line":1376},44,[217,1378,1379],{"class":797},"        t",[217,1381,892],{"class":771},[217,1383,1384],{"class":895},"Fatal",[217,1386,899],{"class":771},[217,1388,1389],{"class":797},"err",[217,1391,869],{"class":771},[217,1393,1395],{"class":219,"line":1394},45,[217,1396,1067],{"class":771},[217,1398,1400],{"class":219,"line":1399},46,[217,1401,1205],{"class":771},[217,1403,1405],{"class":219,"line":1404},47,[217,1406,781],{"emptyLinePlaceholder":780},[217,1408,1410,1412,1415,1417,1419,1421,1423,1425,1427,1429],{"class":219,"line":1409},48,[217,1411,960],{"class":771},[217,1413,1414],{"class":895}," TestOrderShippedRenders",[217,1416,899],{"class":771},[217,1418,1284],{"class":968},[217,1420,1287],{"class":771},[217,1422,846],{"class":223},[217,1424,892],{"class":771},[217,1426,1294],{"class":223},[217,1428,976],{"class":771},[217,1430,985],{"class":771},[217,1432,1434,1437,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469],{"class":219,"line":1433},49,[217,1435,1436],{"class":797},"    tmpl",[217,1438,909],{"class":771},[217,1440,1323],{"class":797},[217,1442,1326],{"class":771},[217,1444,1329],{"class":797},[217,1446,892],{"class":771},[217,1448,1334],{"class":895},[217,1450,1337],{"class":771},[217,1452,1340],{"class":223},[217,1454,1343],{"class":771},[217,1456,1346],{"class":797},[217,1458,909],{"class":771},[217,1460,918],{"class":771},[217,1462,1353],{"class":227},[217,1464,801],{"class":771},[217,1466,909],{"class":771},[217,1468,1360],{"class":797},[217,1470,869],{"class":771},[217,1472,1474,1476,1478,1480,1482],{"class":219,"line":1473},50,[217,1475,1006],{"class":787},[217,1477,1323],{"class":797},[217,1479,1368],{"class":771},[217,1481,1371],{"class":771},[217,1483,985],{"class":771},[217,1485,1487,1489,1491,1493,1495,1497],{"class":219,"line":1486},51,[217,1488,1379],{"class":797},[217,1490,892],{"class":771},[217,1492,1384],{"class":895},[217,1494,899],{"class":771},[217,1496,1389],{"class":797},[217,1498,869],{"class":771},[217,1500,1502],{"class":219,"line":1501},52,[217,1503,1067],{"class":771},[217,1505,1507,1510,1512,1514,1516,1518,1520,1523,1525,1528],{"class":219,"line":1506},53,[217,1508,1509],{"class":797},"    r",[217,1511,909],{"class":771},[217,1513,1323],{"class":797},[217,1515,1326],{"class":771},[217,1517,1329],{"class":797},[217,1519,892],{"class":771},[217,1521,1522],{"class":895},"NewRenderer",[217,1524,899],{"class":771},[217,1526,1527],{"class":797},"myConfig",[217,1529,869],{"class":771},[217,1531,1533,1535,1537,1539,1541],{"class":219,"line":1532},54,[217,1534,1006],{"class":787},[217,1536,1323],{"class":797},[217,1538,1368],{"class":771},[217,1540,1371],{"class":771},[217,1542,985],{"class":771},[217,1544,1546,1548,1550,1552,1554,1556],{"class":219,"line":1545},55,[217,1547,1379],{"class":797},[217,1549,892],{"class":771},[217,1551,1384],{"class":895},[217,1553,899],{"class":771},[217,1555,1389],{"class":797},[217,1557,869],{"class":771},[217,1559,1561],{"class":219,"line":1560},56,[217,1562,1067],{"class":771},[217,1564,1566],{"class":219,"line":1565},57,[217,1567,781],{"emptyLinePlaceholder":780},[217,1569,1571,1574,1576,1578,1580,1583,1586,1589,1592,1594,1597,1599,1601,1604,1606,1608,1611,1613],{"class":219,"line":1570},58,[217,1572,1573],{"class":797},"    to ",[217,1575,1326],{"class":771},[217,1577,1329],{"class":223},[217,1579,892],{"class":771},[217,1581,1582],{"class":223},"Recipient",[217,1584,1585],{"class":771},"{",[217,1587,1588],{"class":797},"Address",[217,1590,1591],{"class":771},":",[217,1593,918],{"class":771},[217,1595,1596],{"class":227},"keisha@example.com",[217,1598,801],{"class":771},[217,1600,909],{"class":771},[217,1602,1603],{"class":797}," FirstName",[217,1605,1591],{"class":771},[217,1607,918],{"class":771},[217,1609,1610],{"class":227},"Keisha",[217,1612,801],{"class":771},[217,1614,1205],{"class":771},[217,1616,1618,1621,1623,1625,1627,1630,1632,1634,1637,1639,1641,1644,1646,1648,1651,1653],{"class":219,"line":1617},59,[217,1619,1620],{"class":797},"    data ",[217,1622,1326],{"class":771},[217,1624,1243],{"class":223},[217,1626,1585],{"class":771},[217,1628,1629],{"class":797},"OrderID",[217,1631,1591],{"class":771},[217,1633,918],{"class":771},[217,1635,1636],{"class":227},"CH-20417",[217,1638,801],{"class":771},[217,1640,909],{"class":771},[217,1642,1643],{"class":797}," TrackURL",[217,1645,1591],{"class":771},[217,1647,918],{"class":771},[217,1649,1650],{"class":227},"https:\u002F\u002Fexample.com\u002Ft\u002FCH-20417",[217,1652,801],{"class":771},[217,1654,1205],{"class":771},[217,1656,1658],{"class":219,"line":1657},60,[217,1659,781],{"emptyLinePlaceholder":780},[217,1661,1663,1666,1668,1670,1672,1675,1677,1680,1682,1685,1687,1690,1692,1695],{"class":219,"line":1662},61,[217,1664,1665],{"class":797},"    msg",[217,1667,909],{"class":771},[217,1669,1323],{"class":797},[217,1671,1326],{"class":771},[217,1673,1674],{"class":797}," tmpl",[217,1676,892],{"class":771},[217,1678,1679],{"class":895},"Render",[217,1681,899],{"class":771},[217,1683,1684],{"class":797},"r",[217,1686,909],{"class":771},[217,1688,1689],{"class":797}," to",[217,1691,909],{"class":771},[217,1693,1694],{"class":797}," data",[217,1696,869],{"class":771},[217,1698,1700,1702,1704,1706,1708],{"class":219,"line":1699},62,[217,1701,1006],{"class":787},[217,1703,1323],{"class":797},[217,1705,1368],{"class":771},[217,1707,1371],{"class":771},[217,1709,985],{"class":771},[217,1711,1713,1715,1717,1719,1721,1723],{"class":219,"line":1712},63,[217,1714,1379],{"class":797},[217,1716,892],{"class":771},[217,1718,1384],{"class":895},[217,1720,899],{"class":771},[217,1722,1389],{"class":797},[217,1724,869],{"class":771},[217,1726,1728],{"class":219,"line":1727},64,[217,1729,1067],{"class":771},[217,1731,1733,1735,1738,1740,1743,1745,1748,1750,1753,1756],{"class":219,"line":1732},65,[217,1734,1006],{"class":787},[217,1736,1737],{"class":895}," len",[217,1739,899],{"class":771},[217,1741,1742],{"class":797},"msg",[217,1744,892],{"class":771},[217,1746,1747],{"class":797},"Warnings",[217,1749,976],{"class":771},[217,1751,1752],{"class":771}," !=",[217,1754,1755],{"class":710}," 0",[217,1757,985],{"class":771},[217,1759,1761,1763,1765,1768,1770,1772,1775,1779,1781,1783,1786,1788,1790],{"class":219,"line":1760},66,[217,1762,1379],{"class":797},[217,1764,892],{"class":771},[217,1766,1767],{"class":895},"Errorf",[217,1769,899],{"class":771},[217,1771,801],{"class":771},[217,1773,1774],{"class":227},"warnings: ",[217,1776,1778],{"class":1777},"swJcz","%q",[217,1780,801],{"class":771},[217,1782,909],{"class":771},[217,1784,1785],{"class":797}," msg",[217,1787,892],{"class":771},[217,1789,1747],{"class":797},[217,1791,869],{"class":771},[217,1793,1795],{"class":219,"line":1794},67,[217,1796,1067],{"class":771},[217,1798,1800,1803,1805,1807,1810,1812,1815,1817,1819,1821,1823,1826,1828],{"class":219,"line":1799},68,[217,1801,1802],{"class":787},"    for",[217,1804,1318],{"class":797},[217,1806,909],{"class":771},[217,1808,1809],{"class":797}," m ",[217,1811,1326],{"class":771},[217,1813,1814],{"class":787}," range",[217,1816,963],{"class":895},[217,1818,899],{"class":771},[217,1820,1742],{"class":797},[217,1822,892],{"class":771},[217,1824,1825],{"class":797},"HTML",[217,1827,976],{"class":771},[217,1829,985],{"class":771},[217,1831,1833,1835,1837,1839,1841,1843,1846,1849,1851,1853,1856],{"class":219,"line":1832},69,[217,1834,1379],{"class":797},[217,1836,892],{"class":771},[217,1838,1767],{"class":895},[217,1840,899],{"class":771},[217,1842,801],{"class":771},[217,1844,1845],{"class":227},"lint: ",[217,1847,1848],{"class":1777},"%s",[217,1850,801],{"class":771},[217,1852,909],{"class":771},[217,1854,1855],{"class":797}," m",[217,1857,869],{"class":771},[217,1859,1861],{"class":219,"line":1860},70,[217,1862,1067],{"class":771},[217,1864,1866],{"class":219,"line":1865},71,[217,1867,781],{"emptyLinePlaceholder":780},[217,1869,1871,1873,1875,1877,1880,1882,1884,1887,1890,1892,1895,1897],{"class":219,"line":1870},72,[217,1872,1802],{"class":787},[217,1874,1318],{"class":797},[217,1876,909],{"class":771},[217,1878,1879],{"class":797}," part ",[217,1881,1326],{"class":771},[217,1883,1814],{"class":787},[217,1885,1886],{"class":771}," []struct{",[217,1888,1889],{"class":797}," path",[217,1891,909],{"class":771},[217,1893,1894],{"class":797}," got ",[217,1896,982],{"class":972},[217,1898,1899],{"class":771}," }{\n",[217,1901,1903,1906,1908,1911,1913,1915,1917,1919,1921],{"class":219,"line":1902},73,[217,1904,1905],{"class":771},"        {",[217,1907,801],{"class":771},[217,1909,1910],{"class":227},"testdata\u002Forder-shipped.html",[217,1912,801],{"class":771},[217,1914,909],{"class":771},[217,1916,1785],{"class":797},[217,1918,892],{"class":771},[217,1920,1825],{"class":797},[217,1922,1923],{"class":771},"},\n",[217,1925,1927,1929,1931,1934,1936,1938,1940,1942,1945],{"class":219,"line":1926},74,[217,1928,1905],{"class":771},[217,1930,801],{"class":771},[217,1932,1933],{"class":227},"testdata\u002Forder-shipped.txt",[217,1935,801],{"class":771},[217,1937,909],{"class":771},[217,1939,1785],{"class":797},[217,1941,892],{"class":771},[217,1943,1944],{"class":797},"Text",[217,1946,1923],{"class":771},[217,1948,1950,1953],{"class":219,"line":1949},75,[217,1951,1952],{"class":771},"    }",[217,1954,985],{"class":771},[217,1956,1958,1961,1963,1966],{"class":219,"line":1957},76,[217,1959,1960],{"class":787},"        if",[217,1962,1287],{"class":771},[217,1964,1965],{"class":797},"update ",[217,1967,1968],{"class":771},"{\n",[217,1970,1972,1975,1977,1980,1982,1985,1987,1990,1992,1994,1997,1999,2001,2003,2006,2008,2011],{"class":219,"line":1971},77,[217,1973,1974],{"class":797},"            os",[217,1976,892],{"class":771},[217,1978,1979],{"class":895},"WriteFile",[217,1981,899],{"class":771},[217,1983,1984],{"class":797},"part",[217,1986,892],{"class":771},[217,1988,1989],{"class":797},"path",[217,1991,909],{"class":771},[217,1993,979],{"class":771},[217,1995,1996],{"class":972},"byte",[217,1998,899],{"class":771},[217,2000,1984],{"class":797},[217,2002,892],{"class":771},[217,2004,2005],{"class":797},"got",[217,2007,1095],{"class":771},[217,2009,2010],{"class":710}," 0o644",[217,2012,869],{"class":771},[217,2014,2016],{"class":219,"line":2015},78,[217,2017,2018],{"class":787},"            continue\n",[217,2020,2022],{"class":219,"line":2021},79,[217,2023,2024],{"class":771},"        }\n",[217,2026,2028,2031,2033,2035,2037,2040,2042,2045,2047,2049,2051,2053],{"class":219,"line":2027},80,[217,2029,2030],{"class":797},"        want",[217,2032,909],{"class":771},[217,2034,1323],{"class":797},[217,2036,1326],{"class":771},[217,2038,2039],{"class":797}," os",[217,2041,892],{"class":771},[217,2043,2044],{"class":895},"ReadFile",[217,2046,899],{"class":771},[217,2048,1984],{"class":797},[217,2050,892],{"class":771},[217,2052,1989],{"class":797},[217,2054,869],{"class":771},[217,2056,2058,2060,2062,2064,2066],{"class":219,"line":2057},81,[217,2059,1960],{"class":787},[217,2061,1323],{"class":797},[217,2063,1368],{"class":771},[217,2065,1371],{"class":771},[217,2067,985],{"class":771},[217,2069,2071,2074,2076,2078,2080,2082],{"class":219,"line":2070},82,[217,2072,2073],{"class":797},"            t",[217,2075,892],{"class":771},[217,2077,1384],{"class":895},[217,2079,899],{"class":771},[217,2081,1389],{"class":797},[217,2083,869],{"class":771},[217,2085,2087],{"class":219,"line":2086},83,[217,2088,2024],{"class":771},[217,2090,2092,2094,2097,2099,2102,2104,2106,2108,2111,2113],{"class":219,"line":2091},84,[217,2093,1960],{"class":787},[217,2095,2096],{"class":797}," part",[217,2098,892],{"class":771},[217,2100,2101],{"class":797},"got ",[217,2103,1368],{"class":771},[217,2105,973],{"class":972},[217,2107,899],{"class":771},[217,2109,2110],{"class":797},"want",[217,2112,976],{"class":771},[217,2114,985],{"class":771},[217,2116,2118,2120,2122,2124,2126,2128,2130,2133,2135,2137,2139,2141,2143],{"class":219,"line":2117},85,[217,2119,2073],{"class":797},[217,2121,892],{"class":771},[217,2123,1767],{"class":895},[217,2125,899],{"class":771},[217,2127,801],{"class":771},[217,2129,1848],{"class":1777},[217,2131,2132],{"class":227}," differs from the render",[217,2134,801],{"class":771},[217,2136,909],{"class":771},[217,2138,2096],{"class":797},[217,2140,892],{"class":771},[217,2142,1989],{"class":797},[217,2144,869],{"class":771},[217,2146,2148],{"class":219,"line":2147},86,[217,2149,2024],{"class":771},[217,2151,2153],{"class":219,"line":2152},87,[217,2154,1067],{"class":771},[217,2156,2158],{"class":219,"line":2157},88,[217,2159,1205],{"class":771},[2161,2162,2163,2166,2167,2171,2172,2175,2176,2179,2180,2183],"note",{},[214,2164,2165],{},"internal\u002Fhtmlcheck"," (the package behind ",[2168,2169,311],"a",{"href":2170},"#run-the-structural-lint"," above) is unexported: only code inside ",[214,2173,2174],{},"github.com\u002Fsulv-io\u002Flttr\u002F..."," can import it, so ",[214,2177,2178],{},"lintBasics"," above can't just call ",[214,2181,2182],{},"htmlcheck.Lint",". Copy the rules you care about into your own test package instead — the point is to gate on the same categories of mistake, not necessarily lttr's own function.",[197,2185,2186,2187,2189,2190,2193,2194,2197,2198,2201,2202,2204],{},"Wire an ",[214,2188,260],{}," flag exactly like ",[214,2191,2192],{},"examples\u002Fquiet\u002Fgolden_test.go"," does (",[214,2195,2196],{},"flag.Bool(\"update\", false, \"rewrite golden files\")",") so ",[214,2199,2200],{},"go test .\u002F... -run TestOrderShipped -update"," regenerates your goldens the same way ",[214,2203,280],{}," does lttr's own, and review the diff the same way before committing it.",[201,2206,2208],{"id":2207},"next-steps","Next steps",[322,2210,2211,2216],{},[325,2212,2213,2215],{},[2168,2214,146],{"href":147}," for the visual check goldens don't cover (layout overflow).",[325,2217,2218,2220,2221,2224],{},[2168,2219,110],{"href":111}," for what a render's ",[214,2222,2223],{},"Message"," guarantees before it ever reaches a golden.",[410,2226,2227],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":212,"searchDepth":231,"depth":231,"links":2229},[2230,2231,2232,2234,2235,2236,2237],{"id":203,"depth":231,"text":204},{"id":310,"depth":231,"text":311},{"id":471,"depth":231,"text":2233},"Run make check",{"id":600,"depth":231,"text":601},{"id":696,"depth":231,"text":697},{"id":754,"depth":231,"text":755},{"id":2207,"depth":231,"text":2208},"make golden and reviewing its diffs, the structural lint, make check, fuzzing, the coverage floor, and testing your own templates.","md",null,{},{"icon":154},{"title":151,"description":2238},"uTi2gU-8j7a7QpqbKXwlMrZhVZNIYdBbKbhZpkLlqLU",[2246,2248],{"title":146,"path":147,"stem":148,"description":2247,"icon":149,"children":-1},"make shoot, tools\u002Fshoot's flags, the contact sheet it builds, and why a horizontal scroll fails the run.",{"title":162,"path":163,"stem":164,"description":2249,"icon":165,"children":-1},"A tour of examples\u002Fquiet, the worked example that doubles as lttr's conformance suite, and how its nine emails map to the design handoff.",1790309828130]