[{"data":1,"prerenderedAt":1875},["ShallowReactive",2],{"navigation_docs":3,"-guide-npm-tooling":93,"-guide-npm-tooling-surround":1870},[4,71],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":70},"Guide","i-lucide-book-open","\u002Fguide","1.guide",[10,14,18,22,26,30,34,38,42,46,50,54,58,62,66],{"title":11,"path":12,"stem":13},"Getting started","\u002Fguide\u002Fgetting-started","1.guide\u002F01.getting-started",{"title":15,"path":16,"stem":17},"Adoption paths","\u002Fguide\u002Fadoption","1.guide\u002F02.adoption",{"title":19,"path":20,"stem":21},"Routes and typed $fetch","\u002Fguide\u002Froutes","1.guide\u002F02.routes",{"title":23,"path":24,"stem":25},"Kyo handlers","\u002Fguide\u002Fkyo","1.guide\u002F03.kyo",{"title":27,"path":28,"stem":29},"ZIO handlers","\u002Fguide\u002Fzio","1.guide\u002F04.zio",{"title":31,"path":32,"stem":33},"Configuration and secrets","\u002Fguide\u002Fconfiguration","1.guide\u002F05.configuration",{"title":35,"path":36,"stem":37},"Application and request lifetimes","\u002Fguide\u002Flifetimes","1.guide\u002F06.lifetimes",{"title":39,"path":40,"stem":41},"Schemas","\u002Fguide\u002Fschema","1.guide\u002F07.schema",{"title":43,"path":44,"stem":45},"PostgreSQL","\u002Fguide\u002Fdatabase","1.guide\u002F08.database",{"title":47,"path":48,"stem":49},"Streaming and cancellation","\u002Fguide\u002Fstreaming","1.guide\u002F09.streaming",{"title":51,"path":52,"stem":53},"Testing","\u002Fguide\u002Ftesting","1.guide\u002F10.testing",{"title":55,"path":56,"stem":57},"Nitro storage and NuxtHub KV","\u002Fguide\u002Fstorage","1.guide\u002F11.storage",{"title":59,"path":60,"stem":61},"Debug Scala handlers","\u002Fguide\u002Fdebugging","1.guide\u002F12.debugging",{"title":63,"path":64,"stem":65},"npm build tooling","\u002Fguide\u002Fnpm-tooling","1.guide\u002F13.npm-tooling",{"title":67,"path":68,"stem":69},"Set up h34s with a coding assistant","\u002Fguide\u002Fagent-setup","1.guide\u002F14.agent-setup",false,{"title":72,"icon":73,"path":74,"stem":75,"children":76,"page":70},"Reference","i-lucide-library","\u002Freference","2.reference",[77,81,85,89],{"title":78,"path":79,"stem":80},"Architecture","\u002Freference\u002Farchitecture","2.reference\u002F1.architecture",{"title":82,"path":83,"stem":84},"Releases","\u002Freference\u002Freleases","2.reference\u002F2.releases",{"title":86,"path":87,"stem":88},"Compatibility","\u002Freference\u002Fcompatibility","2.reference\u002F3.compatibility",{"title":90,"path":91,"stem":92},"Migration guide","\u002Freference\u002Fmigration","2.reference\u002F4.migration",{"id":94,"title":63,"body":95,"description":1864,"extension":1865,"links":1866,"meta":1867,"navigation":411,"path":64,"seo":1868,"stem":65,"__hash__":1869},"docs\u002F1.guide\u002F13.npm-tooling.md",{"type":96,"value":97,"toc":1852},"minimark",[98,110,150,182,187,197,204,227,238,260,263,280,290,293,302,305,314,317,328,357,369,373,383,482,496,514,520,527,697,705,709,728,751,764,822,846,868,876,885,889,895,928,948,1064,1081,1096,1101,1202,1212,1243,1253,1277,1321,1340,1344,1352,1387,1390,1436,1453,1487,1497,1508,1515,1532,1550,1559,1564,1668,1711,1751,1794,1820,1824,1827,1845,1848],[99,100,101,105,106,109],"p",{},[102,103,104],"code",{},"@yuri4n\u002Fh34s-nuxt"," owns the reusable JavaScript build and development integration. Applications configure their Scala.js modules once, then use its ",[102,107,108],{},"h34s-scala"," CLI and Nuxt module. They do not copy build scripts, source-map loaders, or Nitro plugins.",[99,111,112,125,126,129,130,137,138,145,146,149],{},[113,114,115],"strong",{},[116,117,121,124],"a",{"href":118,"rel":119},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fnpm-v0.2.0-alpha.1",[120],"nofollow",[102,122,123],{},"@yuri4n\u002Fh34s-nuxt@0.2.0-alpha.1"," is published"," in the private GitHub npm registry. Its ",[102,127,128],{},"npm-v0.2.0-alpha.1"," tag is separate from the Maven ",[116,131,134],{"href":132,"rel":133},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fv0.2.0-alpha.1",[120],[102,135,136],{},"v0.2.0-alpha.1"," release; both tags point at the same commit. The older ",[116,139,142],{"href":140,"rel":141},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Freleases\u002Ftag\u002Fnpm-v0.1.0-alpha.1",[120],[102,143,144],{},"@yuri4n\u002Fh34s-nuxt@0.1.0-alpha.1"," stays published for the ",[102,147,148],{},"0.1.0-alpha.1"," libraries.",[99,151,152,155,156,158,159,162,163,165,166,169,170,173,174,177,178,181],{},[113,153,154],{},"Use the package version that matches your Scala libraries."," Install ",[102,157,123],{}," with the ",[102,160,161],{},"0.2.0-alpha.1"," Scala libraries. The Kyo core reads runtime config, storage and the close hook from the package's new Nitro plugin. The ",[102,164,148],{}," package only supplies the development flag, so with it ",[102,167,168],{},"RuntimeConfig",", ",[102,171,172],{},"KHubKv.mount"," and their ZIO versions fail with ",[102,175,176],{},"ConfigError(\"h34s Nitro plugin is not installed\")",", and ",[102,179,180],{},"Shared"," resources are not released when Nitro closes.",[183,184,186],"h2",{"id":185},"install-the-tooling","Install the tooling",[99,188,189,190,193,194,196],{},"The package is a build-time dependency. Keep ",[102,191,192],{},"h3"," as an application runtime dependency and Scala libraries as sbt\u002FMaven dependencies; ",[116,195,82],{"href":83}," documents the latter.",[99,198,199,200,203],{},"Configure the private GitHub npm registry in the application's ",[102,201,202],{},".npmrc",":",[205,206,211],"pre",{"className":207,"code":208,"language":209,"meta":210,"style":210},"language-ini shiki shiki-themes github-light github-light github-dark","@yuri4n:registry=https:\u002F\u002Fnpm.pkg.github.com\n\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=${GITHUB_PACKAGES_TOKEN}\n","ini","",[102,212,213,221],{"__ignoreMap":210},[214,215,218],"span",{"class":216,"line":217},"line",1,[214,219,220],{},"@yuri4n:registry=https:\u002F\u002Fnpm.pkg.github.com\n",[214,222,224],{"class":216,"line":223},2,[214,225,226],{},"\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=${GITHUB_PACKAGES_TOKEN}\n",[99,228,229,230,233,234,237],{},"Provide ",[102,231,232],{},"GITHUB_PACKAGES_TOKEN"," from your shell or secret manager using a classic PAT with ",[102,235,236],{},"read:packages"," and access to the private package. Commit only the environment-variable placeholder. This npm scope mapping does not configure sbt's Maven resolver.",[99,239,240,241,244,245,248,249,251,252,255,256,259],{},"In GitHub Actions, save the token as ",[102,242,243],{},"PACKAGES_READ_TOKEN"," and map ",[102,246,247],{},"${{ secrets.PACKAGES_READ_TOKEN }}"," into the ",[102,250,232],{}," process environment variable. Save the username as ",[102,253,254],{},"PACKAGES_USER"," when the same workflow also resolves Maven artifacts. GitHub reserves ",[102,257,258],{},"GITHUB_"," for saved secret and variable names.",[99,261,262],{},"Install the package and h3 with the version of your Scala libraries:",[205,264,268],{"className":265,"code":266,"language":267,"meta":210,"style":210},"language-sh shiki shiki-themes github-light github-light github-dark","pnpm add -D @yuri4n\u002Fh34s-nuxt@0.2.0-alpha.1\npnpm add h3@1.15.4\n","sh",[102,269,270,275],{"__ignoreMap":210},[214,271,272],{"class":216,"line":217},[214,273,274],{},"pnpm add -D @yuri4n\u002Fh34s-nuxt@0.2.0-alpha.1\n",[214,276,277],{"class":216,"line":223},[214,278,279],{},"pnpm add h3@1.15.4\n",[99,281,282,283,285,286,289],{},"With the older ",[102,284,148],{}," Scala libraries, install the matching package instead: ",[102,287,288],{},"pnpm add -D @yuri4n\u002Fh34s-nuxt@0.1.0-alpha.1",".",[99,291,292],{},"For local source review, run this from the h34s checkout:",[205,294,296],{"className":265,"code":295,"language":267,"meta":210,"style":210},"npm pack .\u002Fpackages\u002Fnuxt --pack-destination \u002Ftmp\n",[102,297,298],{"__ignoreMap":210},[214,299,300],{"class":216,"line":217},[214,301,295],{},[99,303,304],{},"Then install the resulting tarball in a disposable consumer:",[205,306,308],{"className":265,"code":307,"language":267,"meta":210,"style":210},"pnpm add -D \u002Ftmp\u002Fyuri4n-h34s-nuxt-0.2.0-alpha.1.tgz\n",[102,309,310],{"__ignoreMap":210},[214,311,312],{"class":216,"line":217},[214,313,307],{},[99,315,316],{},"The repository example uses the local package. A packed-tarball check verifies that consumers receive the runtime plugin and helpers without referencing files outside the package. A local tarball path is a review setup; use the pinned registry dependency for an independently installable application.",[99,318,319,320,323,324,327],{},"Run ",[102,321,322],{},"pnpm test:package"," after installing the repository dependencies to verify the archive in an isolated consumer and a real Nuxt development\u002Fproduction server. The HTTP check covers development diagnostics, Scala source maps, relinking, routes mounted from the route manifest (typed, and added while Nuxt runs), and a production bundle that runs without the original generated files. It also builds the consumer with ",[102,325,326],{},"scalaPrerender: 'stub'",": the prerender bundle must get the stub, the server output must keep the linked code, and a prerendered route that calls a Scala.js route must stop the build. ",[99,329,330,331,333,334,339,340,344,345,348,349,356],{},"For ",[102,332,161],{},", the ",[116,335,338],{"href":336,"rel":337},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F39144809255",[120],"successful npm release workflow"," downloaded the published archive with registry authentication, compared its bytes with the tested tarball, and installed that download offline in a clean consumer. It checked the CLI and all three JavaScript entry points without installing Nuxt as a peer. The ",[116,341,343],{"href":118,"rel":342},[120],"release"," attaches the tarball and ",[102,346,347],{},"registry.json",", which records its stable registry URL and integrity. The ",[116,350,353,355],{"href":351,"rel":352},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Factions\u002Fruns\u002F38937318206",[120],[102,354,148],{}," workflow"," ran the same checks for that version.",[99,358,359,360,362,363,365,366,368],{},"Nuxt 4.3.1 passes the packed-package development and production HTTP checks in CI, including the ",[102,361,161],{}," release workflow. Nuxt 4.4.2 passed the same checks locally on Linux x86_64 with Node 24.19.0 for ",[102,364,148],{},"; h34s's own checks have not repeated that profile for ",[102,367,161],{},". Package-level tests also cover Node 22.18.0 and 24. These results establish those explicit profiles, not every Nuxt 4.x version or a Nix\u002FNixOS build.",[183,370,372],{"id":371},"configure-the-scalajs-outputs","Configure the Scala.js outputs",[99,374,375,376,379,380,203],{},"Create ",[102,377,378],{},"h34s.config.mjs"," beside the application's ",[102,381,382],{},"package.json",[205,384,388],{"className":385,"code":386,"language":387,"meta":210,"style":210},"language-js shiki shiki-themes github-light github-light github-dark","import { defineConfig } from '@yuri4n\u002Fh34s-nuxt\u002Fbuild'\n\nexport default defineConfig({\n  modules: [\n    {\n      project: 'server',\n      output: 'server\u002F.scala',\n    },\n  ],\n})\n","js",[102,389,390,407,413,429,435,441,453,464,470,476],{"__ignoreMap":210},[214,391,392,396,400,403],{"class":216,"line":217},[214,393,395],{"class":394},"s8jYJ","import",[214,397,399],{"class":398},"sxrX7"," { defineConfig } ",[214,401,402],{"class":394},"from",[214,404,406],{"class":405},"sIIMD"," '@yuri4n\u002Fh34s-nuxt\u002Fbuild'\n",[214,408,409],{"class":216,"line":223},[214,410,412],{"emptyLinePlaceholder":411},true,"\n",[214,414,416,419,422,426],{"class":216,"line":415},3,[214,417,418],{"class":394},"export",[214,420,421],{"class":394}," default",[214,423,425],{"class":424},"snPdu"," defineConfig",[214,427,428],{"class":398},"({\n",[214,430,432],{"class":216,"line":431},4,[214,433,434],{"class":398},"  modules: [\n",[214,436,438],{"class":216,"line":437},5,[214,439,440],{"class":398},"    {\n",[214,442,444,447,450],{"class":216,"line":443},6,[214,445,446],{"class":398},"      project: ",[214,448,449],{"class":405},"'server'",[214,451,452],{"class":398},",\n",[214,454,456,459,462],{"class":216,"line":455},7,[214,457,458],{"class":398},"      output: ",[214,460,461],{"class":405},"'server\u002F.scala'",[214,463,452],{"class":398},[214,465,467],{"class":216,"line":466},8,[214,468,469],{"class":398},"    },\n",[214,471,473],{"class":216,"line":472},9,[214,474,475],{"class":398},"  ],\n",[214,477,479],{"class":216,"line":478},10,[214,480,481],{"class":398},"})\n",[99,483,484,487,488,491,492,495],{},[102,485,486],{},"project"," is the sbt project ID, not a filesystem directory. Omit it for a root-project task such as ",[102,489,490],{},"fullLinkJS",". ",[102,493,494],{},"output"," is the generated directory relative to the application root. Add another module for an independent Kyo application if needed. Each module needs its own generated output directory.",[99,497,498,501,502,505,506,509,510,513],{},[102,499,500],{},"entries"," is optional. Without it, an output must contain at least one h34s handler (a default export from ",[102,503,504],{},"KHandler.define"," or ",[102,507,508],{},"ZHandler.define","). List ",[102,511,512],{},"entries: ['notes-get.js']"," when an output has only modules that you mount with route files; the CLI then checks that linking produced each file.",[99,515,516,517,519],{},"Keep only generated files in these directories: the production command removes previous output before linking. Do not point ",[102,518,494],{}," at a source directory or an application root.",[99,521,522,523,526],{},"The package does not change ",[102,524,525],{},"build.sbt",". Configure both linking modes to emit into the same directory and enable development source maps. For an sbt server project, these settings are relative to the root sbt build:",[205,528,532],{"className":529,"code":530,"language":531,"meta":210,"style":210},"language-scala shiki shiki-themes github-light github-light github-dark","import org.scalajs.linker.interface.ModuleKind\n\n\u002F\u002F Inside the Scala.js server project's .settings(...):\nscalaJSLinkerConfig ~= (_.withModuleKind(ModuleKind.ESModule)),\nCompile \u002F fastLinkJS \u002F scalaJSLinkerConfig ~= (_.withSourceMap(true)),\nCompile \u002F fastLinkJS \u002F scalaJSLinkerOutputDirectory :=\n  (LocalRootProject \u002F baseDirectory).value \u002F \"server\" \u002F \".scala\",\nCompile \u002F fullLinkJS \u002F scalaJSLinkerOutputDirectory :=\n  (LocalRootProject \u002F baseDirectory).value \u002F \"server\" \u002F \".scala\",\n","scala",[102,533,534,561,565,571,593,621,637,662,677],{"__ignoreMap":210},[214,535,536,538,541,543,546,548,551,553,556,558],{"class":216,"line":217},[214,537,395],{"class":394},[214,539,540],{"class":424}," org",[214,542,289],{"class":398},[214,544,545],{"class":424},"scalajs",[214,547,289],{"class":398},[214,549,550],{"class":424},"linker",[214,552,289],{"class":398},[214,554,555],{"class":424},"interface",[214,557,289],{"class":398},[214,559,560],{"class":424},"ModuleKind\n",[214,562,563],{"class":216,"line":223},[214,564,412],{"emptyLinePlaceholder":411},[214,566,567],{"class":216,"line":415},[214,568,570],{"class":569},"sCsY4","\u002F\u002F Inside the Scala.js server project's .settings(...):\n",[214,572,573,576,579,582,585,587,590],{"class":216,"line":431},[214,574,575],{"class":398},"scalaJSLinkerConfig ",[214,577,578],{"class":394},"~=",[214,580,581],{"class":398}," (_.withModuleKind(",[214,583,584],{"class":424},"ModuleKind",[214,586,289],{"class":398},[214,588,589],{"class":424},"ESModule",[214,591,592],{"class":398},")),\n",[214,594,595,598,601,604,607,610,612,615,619],{"class":216,"line":437},[214,596,597],{"class":424},"Compile",[214,599,600],{"class":394}," \u002F",[214,602,603],{"class":398}," fastLinkJS ",[214,605,606],{"class":394},"\u002F",[214,608,609],{"class":398}," scalaJSLinkerConfig ",[214,611,578],{"class":394},[214,613,614],{"class":398}," (_.withSourceMap(",[214,616,618],{"class":617},"sBjJW","true",[214,620,592],{"class":398},[214,622,623,625,627,629,631,634],{"class":216,"line":443},[214,624,597],{"class":424},[214,626,600],{"class":394},[214,628,603],{"class":398},[214,630,606],{"class":394},[214,632,633],{"class":398}," scalaJSLinkerOutputDirectory ",[214,635,636],{"class":394},":=\n",[214,638,639,642,645,647,650,652,655,657,660],{"class":216,"line":455},[214,640,641],{"class":398},"  (",[214,643,644],{"class":424},"LocalRootProject",[214,646,600],{"class":394},[214,648,649],{"class":398}," baseDirectory).value ",[214,651,606],{"class":394},[214,653,654],{"class":405}," \"server\"",[214,656,600],{"class":394},[214,658,659],{"class":405}," \".scala\"",[214,661,452],{"class":398},[214,663,664,666,668,671,673,675],{"class":216,"line":466},[214,665,597],{"class":424},[214,667,600],{"class":394},[214,669,670],{"class":398}," fullLinkJS ",[214,672,606],{"class":394},[214,674,633],{"class":398},[214,676,636],{"class":394},[214,678,679,681,683,685,687,689,691,693,695],{"class":216,"line":472},[214,680,641],{"class":398},[214,682,644],{"class":424},[214,684,600],{"class":394},[214,686,649],{"class":398},[214,688,606],{"class":394},[214,690,654],{"class":405},[214,692,600],{"class":394},[214,694,659],{"class":405},[214,696,452],{"class":398},[99,698,699,700,704],{},"The npm package requires Node 22.18 or later and Nuxt 4.3.1 or 4.4.2. These are explicit compatibility profiles; other Nuxt versions need validation. Use the compiler, linker, and JDK versions from the ",[116,701,703],{"href":702},"\u002Freference\u002Freleases#toolchain","toolchain profile","; the combined repository profile uses Node 24. The package does not install Java or sbt.",[192,706,708],{"id":707},"point-the-cli-at-your-sbt-build","Point the CLI at your sbt build",[99,710,711,714,715,718,719,714,721,724,725,727],{},[113,712,713],{},"Status."," ",[102,716,717],{},"sbtRoot"," is new in ",[102,720,104],{},[102,722,723],{},"0.3.0-alpha.1",", which is not released yet. ",[102,726,161],{}," ignores the key and runs sbt in the application root.",[99,729,730,732,733,735,736,738,739,741,742,745,746,748,749,289],{},[102,731,717],{}," is optional. It names the directory of your sbt build, where ",[102,734,108],{}," runs sbt. A relative path is relative to the directory of ",[102,737,378],{},"; an absolute path also works. Use ",[102,740,606],{}," as the separator, so the config works on every platform. The default, ",[102,743,744],{},"'.'",", is that directory, so a config next to ",[102,747,525],{}," needs no ",[102,750,717],{},[99,752,753,754,756,757,760,761,203],{},"Set ",[102,755,717],{}," when the Nuxt app is not at the root of your sbt build. For a Nuxt app in ",[102,758,759],{},"web\u002F"," below the sbt build, write ",[102,762,763],{},"web\u002Fh34s.config.mjs",[205,765,767],{"className":385,"code":766,"language":387,"meta":210,"style":210},"import { defineConfig } from '@yuri4n\u002Fh34s-nuxt\u002Fbuild'\n\nexport default defineConfig({\n  sbtRoot: '..',\n  modules: [{ project: 'server', output: 'server\u002F.scala' }],\n})\n",[102,768,769,779,783,793,803,818],{"__ignoreMap":210},[214,770,771,773,775,777],{"class":216,"line":217},[214,772,395],{"class":394},[214,774,399],{"class":398},[214,776,402],{"class":394},[214,778,406],{"class":405},[214,780,781],{"class":216,"line":223},[214,782,412],{"emptyLinePlaceholder":411},[214,784,785,787,789,791],{"class":216,"line":415},[214,786,418],{"class":394},[214,788,421],{"class":394},[214,790,425],{"class":424},[214,792,428],{"class":398},[214,794,795,798,801],{"class":216,"line":431},[214,796,797],{"class":398},"  sbtRoot: ",[214,799,800],{"class":405},"'..'",[214,802,452],{"class":398},[214,804,805,808,810,813,815],{"class":216,"line":437},[214,806,807],{"class":398},"  modules: [{ project: ",[214,809,449],{"class":405},[214,811,812],{"class":398},", output: ",[214,814,461],{"class":405},[214,816,817],{"class":398}," }],\n",[214,819,820],{"class":216,"line":443},[214,821,481],{"class":398},[99,823,824,825,828,829,832,833,835,836,839,840,842,843,845],{},"For an sbt build next to the app, for example in ",[102,826,827],{},"..\u002Fscala-server",", write ",[102,830,831],{},"sbtRoot: '..\u002Fscala-server'",". The ",[102,834,494],{}," paths stay relative to the application root, and the outputs must stay inside it. Point the linker of your sbt build at them, for example ",[102,837,838],{},"(LocalRootProject \u002F baseDirectory).value \u002F \"web\" \u002F \"server\" \u002F \".scala\""," for the app in ",[102,841,759],{},". In development, the module embeds the Scala sources from both the application root and ",[102,844,717],{}," in the source maps.",[99,847,848,849,851,852,854,855,858,859,861,862,864,865,867],{},"Before it starts sbt or removes any output, the CLI checks that ",[102,850,717],{}," is a directory with ",[102,853,525],{}," or a ",[102,856,857],{},"project\u002F"," directory, the files that sbt looks for. Otherwise it stops with an error that names ",[102,860,717],{},", the resolved directory and the config file. For example, a config in ",[102,863,759],{}," without ",[102,866,717],{}," gives:",[205,869,874],{"className":870,"code":872,"language":873,"meta":210},[871],"language-text","[h34s] sbtRoot is not set, so the sbt build is the config file's directory, \u002Fhome\u002Fyou\u002Fshop\u002Fweb, which has no build.sbt and no project\u002F directory. Set sbtRoot in \u002Fhome\u002Fyou\u002Fshop\u002Fweb\u002Fh34s.config.mjs to the directory of your sbt build, relative to that file, for example '..'.\n","text",[102,875,872],{"__ignoreMap":210},[99,877,878,879,881,882,884],{},"The CLI also stops, with an error that names the output, when ",[102,880,717],{}," is an ",[102,883,494],{}," directory or lies inside one: a production build removes the outputs, so it would remove your sbt build too.",[183,886,888],{"id":887},"add-the-nuxt-module-and-scripts","Add the Nuxt module and scripts",[99,890,891,892,203],{},"In ",[102,893,894],{},"nuxt.config.ts",[205,896,900],{"className":897,"code":898,"language":899,"meta":210,"style":210},"language-ts shiki shiki-themes github-light github-light github-dark","export default defineNuxtConfig({\n  modules: ['@yuri4n\u002Fh34s-nuxt'],\n})\n","ts",[102,901,902,913,924],{"__ignoreMap":210},[214,903,904,906,908,911],{"class":216,"line":217},[214,905,418],{"class":394},[214,907,421],{"class":394},[214,909,910],{"class":424}," defineNuxtConfig",[214,912,428],{"class":398},[214,914,915,918,921],{"class":216,"line":223},[214,916,917],{"class":398},"  modules: [",[214,919,920],{"class":405},"'@yuri4n\u002Fh34s-nuxt'",[214,922,923],{"class":398},"],\n",[214,925,926],{"class":216,"line":415},[214,927,481],{"class":398},[99,929,930,931,934,935,939,940,943,944,947],{},"The module reads the same config, maps ",[102,932,933],{},"#h34s\u002Fmodels"," to the generated models (see ",[116,936,938],{"href":937},"\u002Fguide\u002Froutes#use-the-models-in-your-app","use the models in your app","), mounts the routes of each output's route manifest (",[102,941,942],{},"h34s-routes.json",") as lazy Nitro handlers, watches the generated output, installs the development loader\u002Fsource-map integration, and registers the h34s Nitro plugin (",[102,945,946],{},"runtime\u002Fh34s.mjs","). The plugin gives your Scala handlers, through internal records that requests cannot change: ",[949,950,951,964],"table",{},[952,953,954],"thead",{},[955,956,957,961],"tr",{},[958,959,960],"th",{},"Record entry",[958,962,963],{},"Used by",[965,966,967,983,1001,1021,1042],"tbody",{},[955,968,969,980],{},[970,971,972,975,976,979],"td",{},[102,973,974],{},"development"," (Nitro's ",[102,977,978],{},"import.meta.dev",")",[970,981,982],{},"Development diagnostics",[955,984,985,995],{},[970,986,987,990,991,994],{},[102,988,989],{},"debug"," (",[102,992,993],{},"runtimeConfig.h34s.debug",", read once at startup)",[970,996,997,998],{},"Debug diagnostics; see ",[116,999,1000],{"href":60},"debugging",[955,1002,1003,1009],{},[970,1004,1005,1008],{},[102,1006,1007],{},"runtimeConfig"," (per request and at startup)",[970,1010,1011,1013,1014,1017,1018],{},[102,1012,168],{}," \u002F ",[102,1015,1016],{},"ZRuntimeConfig","; see ",[116,1019,1020],{"href":32},"configuration",[955,1022,1023,1032],{},[970,1024,1025,1028,1029,979],{},[102,1026,1027],{},"storage(base)"," (Nitro ",[102,1030,1031],{},"useStorage",[970,1033,1034,1013,1036,1017,1039],{},[102,1035,172],{},[102,1037,1038],{},"ZHubKv.mount",[116,1040,1041],{"href":56},"Nitro storage",[955,1043,1044,1053],{},[970,1045,1046,975,1049,1052],{},[102,1047,1048],{},"onClose",[102,1050,1051],{},"close"," hook)",[970,1054,1055,1013,1057,1060,1061],{},[102,1056,180],{},[102,1058,1059],{},"ZShared"," release; see ",[116,1062,1063],{"href":36},"lifetimes",[99,1065,1066,1067,1070,1071,1074,1075,1077,1078,1080],{},"The module also declares ",[102,1068,1069],{},"runtimeConfig.h34s.debug: false",", so ",[102,1072,1073],{},"NUXT_H34S_DEBUG=true"," can turn on diagnostics at runtime. A value your ",[102,1076,894],{}," already sets wins. Nuxt's own ",[102,1079,989],{}," option does not turn them on. Keep it off in production.",[99,1082,1083,1084,1087,1088,1091,1092,1095],{},"Remove copied versions of those hooks and the old ",[102,1085,1086],{},"h34s-development"," plugin when adopting the module. If you listed ",[102,1089,1090],{},"runtime\u002Fdevelopment.mjs"," in ",[102,1093,1094],{},"nitro.plugins"," yourself, remove that entry: the module registers the new plugin, and the old file only re-exports it for one release.",[99,1097,1098,1099,203],{},"Add these scripts to ",[102,1100,382],{},[205,1102,1106],{"className":1103,"code":1104,"language":1105,"meta":210,"style":210},"language-json shiki shiki-themes github-light github-light github-dark","{\n  \"scripts\": {\n    \"scala:fast\": \"h34s-scala dev\",\n    \"scala:watch\": \"h34s-scala watch\",\n    \"scala:full\": \"h34s-scala build\",\n    \"dev\": \"node --enable-source-maps node_modules\u002Fnuxt\u002Fbin\u002Fnuxt.mjs dev\",\n    \"dev:scala\": \"pnpm run scala:fast && pnpm run dev\",\n    \"build\": \"pnpm run scala:full && nuxt build\"\n  }\n}\n","json",[102,1107,1108,1113,1121,1134,1146,1158,1170,1182,1192,1197],{"__ignoreMap":210},[214,1109,1110],{"class":216,"line":217},[214,1111,1112],{"class":398},"{\n",[214,1114,1115,1118],{"class":216,"line":223},[214,1116,1117],{"class":617},"  \"scripts\"",[214,1119,1120],{"class":398},": {\n",[214,1122,1123,1126,1129,1132],{"class":216,"line":415},[214,1124,1125],{"class":617},"    \"scala:fast\"",[214,1127,1128],{"class":398},": ",[214,1130,1131],{"class":405},"\"h34s-scala dev\"",[214,1133,452],{"class":398},[214,1135,1136,1139,1141,1144],{"class":216,"line":431},[214,1137,1138],{"class":617},"    \"scala:watch\"",[214,1140,1128],{"class":398},[214,1142,1143],{"class":405},"\"h34s-scala watch\"",[214,1145,452],{"class":398},[214,1147,1148,1151,1153,1156],{"class":216,"line":437},[214,1149,1150],{"class":617},"    \"scala:full\"",[214,1152,1128],{"class":398},[214,1154,1155],{"class":405},"\"h34s-scala build\"",[214,1157,452],{"class":398},[214,1159,1160,1163,1165,1168],{"class":216,"line":443},[214,1161,1162],{"class":617},"    \"dev\"",[214,1164,1128],{"class":398},[214,1166,1167],{"class":405},"\"node --enable-source-maps node_modules\u002Fnuxt\u002Fbin\u002Fnuxt.mjs dev\"",[214,1169,452],{"class":398},[214,1171,1172,1175,1177,1180],{"class":216,"line":455},[214,1173,1174],{"class":617},"    \"dev:scala\"",[214,1176,1128],{"class":398},[214,1178,1179],{"class":405},"\"pnpm run scala:fast && pnpm run dev\"",[214,1181,452],{"class":398},[214,1183,1184,1187,1189],{"class":216,"line":466},[214,1185,1186],{"class":617},"    \"build\"",[214,1188,1128],{"class":398},[214,1190,1191],{"class":405},"\"pnpm run scala:full && nuxt build\"\n",[214,1193,1194],{"class":216,"line":472},[214,1195,1196],{"class":398},"  }\n",[214,1198,1199],{"class":216,"line":478},[214,1200,1201],{"class":398},"}\n",[99,1203,319,1204,1207,1208,1211],{},[102,1205,1206],{},"pnpm dev:scala"," for the first link and Nuxt startup. Keep ",[102,1209,1210],{},"pnpm scala:watch"," in a second terminal while editing Scala. The watcher runs sbt's continuous linking task and collects the routes again after each link; it does not start Nuxt. Wait for linking and Nitro's worker restart before requesting edited code. When the list of routes changes, Nuxt reloads its server routes without a restart.",[99,1213,1214,1215,169,1218,1221,1222,1225,1226,1228,1229,1232,1233,1236,1237,491],{},"After each link, ",[102,1216,1217],{},"dev",[102,1219,1220],{},"build"," and ",[102,1223,1224],{},"watch"," load the linked modules in a separate Node process, read the route and response types of each h34s handler, and write ",[102,1227,942],{},", one ",[102,1230,1231],{},".d.ts"," per handler module and ",[102,1234,1235],{},"h34s-models.d.ts",", the named models that the routes return, into the output directory. The command prints the number of routes and models. See ",[116,1238,1239,1240],{"href":20},"routes and typed ",[102,1241,1242],{},"$fetch",[99,1244,1245,1246,1249,1250,1252],{},"For production, ",[102,1247,1248],{},"pnpm build"," clears each generated output directory, runs ",[102,1251,490],{},", verifies the configured entry files, writes the route manifests and declarations, and only then starts the Nuxt build. A linker failure, a missing entry, an output without handlers, or two handlers for the same route stops the command. The Nuxt module alone does not run a production link; keep that ordering in the application build script.",[99,1254,1255,1256,1259,1260,1263,1264,1267,1268,1273,1274,491],{},"The CLI accepts ",[102,1257,1258],{},"--root \u003Cdirectory>",", the application root (default: the current directory), and ",[102,1261,1262],{},"--config \u003Cfile>",", relative to that root. Configure an alternate file in Nuxt with ",[102,1265,1266],{},"modules: [['@yuri4n\u002Fh34s-nuxt', { configFile: 'custom.mjs' }]]",". Keep the Nuxt integration and CLI pointed at the same application configuration. To run sbt in another directory, set ",[116,1269,1271],{"href":1270},"#point-the-cli-at-your-sbt-build",[102,1272,717],{}," instead of these flags. sbt must be available on ",[102,1275,1276],{},"PATH",[99,1278,1279,1280,1283,1284,169,1287,169,1290,169,1293,169,1296,1299,1300,1303,1304,1307,1308,169,1311,1221,1314,1317,1318,1320],{},"The ",[102,1281,1282],{},".\u002Fbuild"," entry point also exports ",[102,1285,1286],{},"loadConfig",[102,1288,1289],{},"buildScala",[102,1291,1292],{},"linkScala",[102,1294,1295],{},"watchScala",[102,1297,1298],{},"writeRoutes"," (collect routes and write the manifests and declarations after your own link step) and ",[102,1301,1302],{},"readRoutes"," for custom orchestration. The ",[102,1305,1306],{},".\u002Frollup"," entry point exports ",[102,1309,1310],{},"scalaDevModules",[102,1312,1313],{},"scalaSourceMaps",[102,1315,1316],{},"scalaPrerenderStub"," (the plugin behind ",[102,1319,326],{},") for custom integrations. Ordinary Nuxt applications use the module above; they do not need to wire these helpers individually. ",[99,1322,1323,1324,1326,1327,1330,1331,1334,1335,491],{},"Large linked outputs make Nitro's production bundling memory-hungry. When your application prerenders a route, Nitro 2.13.1 bundles the linked Scala.js twice in one build process: once for its prerenderer and once for the server output. The repository demo, which links a Kyo and a ZIO application, sets the ",[102,1325,326],{}," option below and still runs ",[102,1328,1329],{},"nuxt build"," with ",[102,1332,1333],{},"node --max-old-space-size=8192",". If your build stops with a JavaScript heap error, raise the limit the same way, try the option, or remove one of the causes in the ",[116,1336,1339],{"href":1337,"rel":1338},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fblob\u002Fmain\u002Fdocs\u002Fdevelopment.md#production-build",[120],"development guide",[192,1341,1343],{"id":1342},"keep-scalajs-out-of-the-prerender-bundle","Keep Scala.js out of the prerender bundle",[99,1345,1346,1347,1091,1349,1351],{},"Set the module option ",[102,1348,326],{},[102,1350,894],{}," when you prerender routes and none of them needs Scala.js: ",[205,1353,1355],{"className":897,"code":1354,"language":899,"meta":210,"style":210},"export default defineNuxtConfig({\n  modules: [['@yuri4n\u002Fh34s-nuxt', { scalaPrerender: 'stub' }]],\n})\n",[102,1356,1357,1367,1383],{"__ignoreMap":210},[214,1358,1359,1361,1363,1365],{"class":216,"line":217},[214,1360,418],{"class":394},[214,1362,421],{"class":394},[214,1364,910],{"class":424},[214,1366,428],{"class":398},[214,1368,1369,1372,1374,1377,1380],{"class":216,"line":223},[214,1370,1371],{"class":398},"  modules: [[",[214,1373,920],{"class":405},[214,1375,1376],{"class":398},", { scalaPrerender: ",[214,1378,1379],{"class":405},"'stub'",[214,1381,1382],{"class":398}," }]],\n",[214,1384,1385],{"class":216,"line":415},[214,1386,481],{"class":398},[99,1388,1389],{},"The option decides what Nitro's prerender bundle gets from your Scala.js outputs in a production build: ",[949,1391,1392,1409],{},[952,1393,1394],{},[955,1395,1396,1399,1402],{},[958,1397,1398],{},"Value",[958,1400,1401],{},"Prerender bundle",[958,1403,1404,1405,1408],{},"Server output (",[102,1406,1407],{},".output\u002Fserver",") ",[965,1410,1411,1425],{},[955,1412,1413,1419,1422],{},[970,1414,1415,1418],{},[102,1416,1417],{},"'bundle'"," (the default)",[970,1420,1421],{},"The linked Scala.js",[970,1423,1424],{},"The linked Scala.js ",[955,1426,1427,1431,1434],{},[970,1428,1429],{},[102,1430,1379],{},[970,1432,1433],{},"One stub that answers 501",[970,1435,1424],{},[99,1437,1438,1439,1441,1442,1445,1446,1449,1450,1452],{},"With ",[102,1440,1379],{},", every import of a file in a configured output directory resolves to the stub while Nitro builds its prerenderer. Every export that your code imports from it is an h3 event handler that throws a 501 error with the status message ",[102,1443,1444],{},"Scala.js is not bundled for prerendering (h34s scalaPrerender: 'stub')",". h3 treats it as a handled error, so Nitro does not log it as unhandled. The option changes nothing when no route is prerendered, in ",[102,1447,1448],{},"nuxt dev",", or in the server output. The stub covers the output directories in ",[102,1451,378],{},"; Scala.js that your code imports from another directory is still bundled. ",[99,1454,1455,1456,1458,1459,1462,1463,1465,1466,1469,1470,1221,1472,1475,1476,1479,1480,1483,1484,1486],{},"For example, Nuxt Content prerenders its database dump, which runs no Scala.js code, so the demo sets ",[102,1457,1379],{},". Keep the default when a prerendered page fetches data from a Scala.js route. While Nuxt prerenders that page, the request answers 501 instead of running your handler, and h34s prints a ",[102,1460,1461],{},"[h34s]"," warning that names the request by its method and path; it leaves out the query string and fragment, which can hold tokens. After prerendering, the build stops with an error that lists these requests: each one once, sorted, at most 20, and then the number of the others. The ",[102,1464,1461],{}," warnings name every request. Without that error, a page that catches the 501, as ",[102,1467,1468],{},"useFetch"," does, would be saved with its error state and the build would pass. Nuxt 4 shares ",[102,1471,1468],{},[102,1473,1474],{},"useAsyncData"," results, failed ones too, between the pages it prerenders (",[102,1477,1478],{},"experimental.sharedPrerenderData","), so other pages that use the same data, for example through a shared layout or component, may hold the same error; check every prerendered page that renders a listed call. When Nitro stops the build itself, because a prerendered route answered with an error, h34s logs the list as an error and Nitro shows its own summary of the failed routes. With ",[102,1481,1482],{},"nitro.prerender.failOnError: false"," (Nuxt sets it to ",[102,1485,618],{},"), h34s only warns, and those pages keep their error state. ",[99,1488,1489,1490,1493,1494,1496],{},"A Nitro plugin that calls Scala.js code at startup gets the stub in the prerenderer too. The stub then throws while Nitro loads the prerender bundle, before any page is prerendered, so the build stops with the stub's own message, not with the list of requests. ",[102,1491,1492],{},"nuxt generate"," prerenders every page that it finds by following links from ",[102,1495,606],{},", so check those pages before you turn the option on. ",[99,1498,1499,1500,1503,1504,1507],{},"Any other value stops Nuxt with a ",[102,1501,1502],{},"TypeError"," that names the option. The option removes the second copy of the Scala.js, not every heap problem. In the demo on a 15.7 GiB cloud VM, a build with the option passed with a 4096 MiB heap limit, and prerendering took 3.6 seconds instead of 47 to 59. At Node's default limit on that VM, 2240 MiB, a build with an equivalent temporary hook still ran out of memory while it built the server output. The ",[116,1505,1339],{"href":1337,"rel":1506},[120]," has the measurements. ",[183,1509,1511,1512],{"id":1510},"set-up-a-project-with-h34s-scala-init","Set up a project with ",[102,1513,1514],{},"h34s-scala init",[99,1516,1517,714,1519,718,1522,714,1524,724,1526,1528,1529,289],{},[113,1518,713],{},[102,1520,1521],{},"init",[102,1523,104],{},[102,1525,723],{},[102,1527,161],{}," does not have it. Until the release, set up your project by hand with the ",[116,1530,1531],{"href":16},"adoption guide",[99,1533,1534,1537,1538,1541,1542,1545,1546,1549],{},[102,1535,1536],{},"h34s-scala init [directory]"," sets up h34s once in a project. You run it without installing anything first, after the ",[102,1539,1540],{},"@yuri4n"," scope and its token line are in your ",[102,1543,1544],{},"~\u002F.npmrc"," (see ",[116,1547,186],{"href":1548},"#install-the-tooling","):",[205,1551,1553],{"className":265,"code":1552,"language":267,"meta":210,"style":210},"pnpm dlx @yuri4n\u002Fh34s-nuxt@\u003Cversion> init my-app\n",[102,1554,1555],{"__ignoreMap":210},[214,1556,1557],{"class":216,"line":217},[214,1558,1552],{},[99,1560,1561,1563],{},[102,1562,1521],{}," finds the adoption path from the files in the directory. The directory defaults to the current one. The first row that matches wins:",[949,1565,1566,1582],{},[952,1567,1568],{},[955,1569,1570,1573,1576],{},[958,1571,1572],{},"Files in the directory",[958,1574,1575],{},"Path",[958,1577,1578,1579,1581],{},"What ",[102,1580,1521],{}," writes",[965,1583,1584,1617,1643,1654],{},[955,1585,1586,1598,1601],{},[970,1587,1588,1591,1592,1594,1595],{},[102,1589,1590],{},"nuxt.config.*",", or a ",[102,1593,382],{}," that lists ",[102,1596,1597],{},"nuxt",[970,1599,1600],{},"An existing Nuxt app",[970,1602,1603,1604,1606,1607,1610,1611,1613,1614,1616],{},"The sbt build at the Nuxt root: ",[102,1605,525],{},", or ",[102,1608,1609],{},"h34s.sbt"," next to an existing ",[102,1612,525],{},". It merges the scripts and dependencies into ",[102,1615,382],{}," and adds the module.",[955,1618,1619,1623,1626],{},[970,1620,1621],{},[102,1622,525],{},[970,1624,1625],{},"An existing sbt build",[970,1627,1628,1629,1330,1631,177,1634,1636,1637,1639,1640,1642],{},"A new Nuxt app in ",[102,1630,759],{},[102,1632,1633],{},"sbtRoot: '..'",[102,1635,1609],{}," next to your ",[102,1638,525],{},", which ",[102,1641,1521],{}," does not edit.",[955,1644,1645,1648,1651],{},[970,1646,1647],{},"Nothing yet",[970,1649,1650],{},"A new project",[970,1652,1653],{},"A minimal Nuxt app, pinned to Nuxt 4.3.1, and its sbt build.",[955,1655,1656,1659,1662],{},[970,1657,1658],{},"Other files",[970,1660,1661],{},"None",[970,1663,1664,1665,1667],{},"Nothing. ",[102,1666,1521],{}," stops and asks you to run it in your Nuxt app or sbt build, or with a new directory.",[99,1669,1670,1671,169,1674,169,1677,169,1680,1683,1684,1686,1687,1689,1690,1692,1693,1696,1697,1699,1700,1091,1702,1704,1705,1707,1708,1710],{},"\"Nothing yet\" means that the directory is missing, empty, or holds only repository files: ",[102,1672,1673],{},".git",[102,1675,1676],{},".gitignore",[102,1678,1679],{},".gitattributes",[102,1681,1682],{},".editorconfig",", a README and a license. So you can run ",[102,1685,1521],{}," in a fresh clone. When the parent directory has a ",[102,1688,525],{},", a Nuxt app or a directory with nothing yet is the Nuxt app of that sbt build, with ",[102,1691,1633],{},". So ",[102,1694,1695],{},"init web"," in your sbt build gives the same result as ",[102,1698,1521],{},", and so does ",[102,1701,1521],{},[102,1703,759],{},". When ",[102,1706,378],{}," exists in the directory, in its Nuxt app or in its sbt build, ",[102,1709,1521],{}," prints \"Already set up\" and changes nothing: it runs once per project.",[99,1712,1713,1714,1716,1717,1091,1720,1723,1724,169,1727,1730,1731,1733,1734,1736,1737,1739,1740,1742,1743,1746,1747,1750],{},"Every path gets ",[102,1715,378],{},", the sbt project ",[102,1718,1719],{},"server",[102,1721,1722],{},"scala-server\u002F"," with one hello handler for ",[102,1725,1726],{},"GET \u002Fapi\u002Fhello",[102,1728,1729],{},".jvmopts"," and the ",[102,1732,857],{}," files when they are missing, the ",[102,1735,202],{}," lines and the ",[102,1738,1676],{}," entries. The dependency versions are the version of the package that runs ",[102,1741,1521],{},", so the npm and Maven versions match. Kyo is the default API; add ",[102,1744,1745],{},"--zio"," for ZIO. Add ",[102,1748,1749],{},"--dry-run"," to print the plan and write nothing.",[99,1752,1753,1755,1756,1221,1758,1760,1761,1763,1764,1766,1767,1091,1770,1773,1774,1221,1776,1778,1779,1781,1782,1221,1784,177,1787,1789,1790,1793],{},[102,1754,1521],{}," checks every file before it writes any. It creates missing files only and never overwrites a file. It changes an existing file only in these ways: it appends lines to ",[102,1757,1676],{},[102,1759,202],{},", merges scripts and dependencies into ",[102,1762,382],{},", and adds ",[102,1765,920],{}," to ",[102,1768,1769],{},"modules",[102,1771,1772],{},"nuxt.config",". When it cannot make that edit safely, it prints the line to add. It keeps your own ",[102,1775,1217],{},[102,1777,1220],{}," scripts and prints the values to set. On a conflict, for example a file that it would create or a script of the same name with another value, it lists the conflicts, writes nothing and exits with status 1. It installs no packages and runs no sbt. It writes no token: ",[102,1780,202],{}," and the sbt build only name ",[102,1783,232],{},[102,1785,1786],{},"GITHUB_PACKAGES_USER",[102,1788,1521],{}," prints only whether they are set. Run ",[102,1791,1792],{},"h34s-scala init --help"," for the options.",[99,1795,1796,1799,1800,1802,1803,1805,1806,1808,1809,1811,1812,1814,1815,289],{},[113,1797,1798],{},"What is verified."," The unit tests of ",[102,1801,104],{}," run ",[102,1804,1521],{}," on each path from clean temporary directories, without sbt and without a package install, and the packed-package check runs it from the packed tarball. A test checks that the files ",[102,1807,1521],{}," writes match the blocks of this guide and the ",[116,1810,1531],{"href":16},". A project that ",[102,1813,1521],{}," wrote has not yet been built with real sbt and the published packages; that end-to-end check is the next step of ",[116,1816,1819],{"href":1817,"rel":1818},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Fh34s\u002Fissues\u002F54",[120],"issue #54",[183,1821,1823],{"id":1822},"keep-application-policy-in-the-application","Keep application policy in the application",[99,1825,1826],{},"The npm package owns build orchestration, development loading, source maps, and the Nitro plugin. It has no dependency on a particular effect API.",[99,1828,1829,1830,1832,1833,1836,1837,1840,1841,1844],{},"Configure your own ",[102,1831,525],{}," and Maven credentials. Define models and services in your application, compose their environment in an optional ",[102,1834,1835],{},"AppHandler"," wrapper, and configure any database resources, migrations, secrets, and deployment policy there. Declare each route in Scala with ",[102,1838,1839],{},".at(Route...)",". A one-line route file (",[102,1842,1843],{},"export { default } from '..\u002F.scala\u002Fnotes-get.js'",") still works when you prefer Nuxt's file layout for a route.",[99,1846,1847],{},"Schema remains optional. Adopting the npm package does not add ZIO, Kyo, or Schema to an application's Scala dependency graph. Nix and other future build profiles should call the same CLI pipeline. Windows, Nix\u002FNixOS, and additional deployment targets still need their own validation.",[1849,1850,1851],"style",{},"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 .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":210,"searchDepth":223,"depth":223,"links":1853},[1854,1855,1858,1861,1863],{"id":185,"depth":223,"text":186},{"id":371,"depth":223,"text":372,"children":1856},[1857],{"id":707,"depth":415,"text":708},{"id":887,"depth":223,"text":888,"children":1859},[1860],{"id":1342,"depth":415,"text":1343},{"id":1510,"depth":223,"text":1862},"Set up a project with h34s-scala init",{"id":1822,"depth":223,"text":1823},"Configure the shared Scala.js CLI and Nuxt module, including the Nitro plugin that supplies config, storage and shutdown to Scala.","md",null,{},{"title":63,"description":1864},"VJlnE7sd6ROrGlLL1HXOYORFuUGakwsK-Mhmu8RKw5Q",[1871,1873],{"title":59,"path":60,"stem":61,"description":1872,"children":-1},"See error causes in development or debug mode, keep production opaque, and map Nitro's JavaScript back to Scala.",{"title":67,"path":68,"stem":69,"description":1874,"children":-1},"A prompt that a coding assistant follows to add h34s to a new project, an existing Nuxt app, or an existing Scala.js project.",1792533383165]