[{"data":1,"prerenderedAt":584},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-publishing":153,"-getting-started-publishing-surround":579},[4,35,50,59,144],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Local Development","\u002Fgetting-started\u002Flocal-development","1.getting-started\u002F3.local-development","i-lucide-terminal",{"title":21,"path":22,"stem":23,"icon":24},"Publishing Packages","\u002Fgetting-started\u002Fpublishing","1.getting-started\u002F4.publishing","i-lucide-package-check",{"title":26,"path":27,"stem":28,"icon":29},"Writing a Module","\u002Fgetting-started\u002Fwriting-a-module","1.getting-started\u002F5.writing-a-module","i-lucide-puzzle",{"title":31,"path":32,"stem":33,"icon":34},"UX Patterns","\u002Fgetting-started\u002Fux-patterns","1.getting-started\u002F6.ux-patterns","i-lucide-layout-template",{"title":36,"path":37,"stem":38,"children":39},"Applications","\u002Fapplications","2.applications",[40,45],{"title":41,"path":42,"stem":43,"icon":44},"Website","\u002Fapplications\u002Fwebsite","2.applications\u002F1.website","i-lucide-layout-dashboard",{"title":46,"path":47,"stem":48,"icon":49},"Docs","\u002Fapplications\u002Fdocs","2.applications\u002F2.docs","i-lucide-book-open",{"title":51,"path":52,"stem":53,"children":54},"Layers","\u002Flayers","3.layers",[55],{"title":56,"path":57,"stem":58},"Base Layer","\u002Flayers\u002Fbase","3.layers\u002F1.base",{"title":60,"path":61,"stem":62,"children":63},"Modules","\u002Fmodules","4.modules",[64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140],{"title":65,"path":66,"stem":67},"Account","\u002Fmodules\u002Faccount","4.modules\u002F01.account",{"title":69,"path":70,"stem":71},"Admin","\u002Fmodules\u002Fadmin","4.modules\u002F02.admin",{"title":73,"path":74,"stem":75},"Auth","\u002Fmodules\u002Fauth","4.modules\u002F03.auth",{"title":77,"path":78,"stem":79},"Authorization","\u002Fmodules\u002Fauthorization","4.modules\u002F04.authorization",{"title":81,"path":82,"stem":83},"Cookie Consent","\u002Fmodules\u002Fcookie-consent","4.modules\u002F05.cookie-consent",{"title":85,"path":86,"stem":87},"Events","\u002Fmodules\u002Fevents","4.modules\u002F06.events",{"title":89,"path":90,"stem":91},"Forms","\u002Fmodules\u002Fforms","4.modules\u002F07.forms",{"title":93,"path":94,"stem":95},"MCP","\u002Fmodules\u002Fmcp","4.modules\u002F08.mcp",{"title":97,"path":98,"stem":99},"Menu","\u002Fmodules\u002Fmenu","4.modules\u002F09.menu",{"title":101,"path":102,"stem":103},"Module Kit","\u002Fmodules\u002Fmodule-kit","4.modules\u002F10.module-kit",{"title":105,"path":106,"stem":107},"Notify","\u002Fmodules\u002Fnotify","4.modules\u002F11.notify",{"title":109,"path":110,"stem":111},"OAuth Server","\u002Fmodules\u002Foauth-server","4.modules\u002F12.oauth-server",{"title":113,"path":114,"stem":115},"Payments","\u002Fmodules\u002Fpayments","4.modules\u002F13.payments",{"title":117,"path":118,"stem":119},"Preferences","\u002Fmodules\u002Fpreferences","4.modules\u002F14.preferences",{"title":121,"path":122,"stem":123},"Stripe","\u002Fmodules\u002Fstripe","4.modules\u002F15.stripe",{"title":125,"path":126,"stem":127},"Subscriptions","\u002Fmodules\u002Fsubscriptions","4.modules\u002F16.subscriptions",{"title":129,"path":130,"stem":131},"UI","\u002Fmodules\u002Fui","4.modules\u002F17.ui",{"title":133,"path":134,"stem":135},"Users","\u002Fmodules\u002Fusers","4.modules\u002F18.users",{"title":137,"path":138,"stem":139},"Widget","\u002Fmodules\u002Fwidget","4.modules\u002F19.widget",{"title":141,"path":142,"stem":143},"Email Templates","\u002Fmodules\u002Femail-templates","4.modules\u002F20.email-templates",{"title":145,"path":146,"stem":147,"children":148},"Packages","\u002Fpackages","5.packages",[149],{"title":150,"path":151,"stem":152},"CLI","\u002Fpackages\u002Fcli","5.packages\u002F4.cli",{"id":154,"title":21,"body":155,"description":572,"extension":573,"links":574,"meta":575,"navigation":576,"path":22,"seo":577,"stem":23,"__hash__":578},"docs\u002F1.getting-started\u002F4.publishing.md",{"type":156,"value":157,"toc":565},"minimark",[158,191,196,223,227,230,326,339,342,354,365,369,381,454,457,478,481,484,505,530,534,561],[159,160,161,162,166,167,170,171,174,175,178,179,182,183,186,187,190],"p",{},"Every published package under ",[163,164,165],"code",{},"packages\u002F**"," has a ",[163,168,169],{},".release-it.json",". A release bumps the version, commits, tags as\n",[163,172,173],{},"\u003Cpackage>@\u003Cversion>",", pushes, creates the GitHub release and publishes to npm. ",[163,176,177],{},"@frigear-nu\u002Fbase"," is published as source (a Nuxt layer has no build step, so its release-it config has no\n",[163,180,181],{},"after:bump"," hook). ",[163,184,185],{},"@frigear-nu\u002Feslint-config"," is published as plain ESM source too. ",[163,188,189],{},"@frigear-nu\u002Fcli"," is private and not published.",[192,193,195],"h2",{"id":194},"requirements","Requirements",[197,198,199,208,215],"ul",{},[200,201,202,203,207],"li",{},"Node.js and pnpm as in ",[204,205,206],"a",{"href":17},"Local development",".",[200,209,210,211,214],{},"Push access to the repository, and a clean working tree (",[163,212,213],{},"requireCleanWorkingDir"," is on).",[200,216,217,218,222],{},"A package that is registered for npm Trusted Publishing (see ",[204,219,221],{"href":220},"#trusted-publishing","Trusted publishing",").",[192,224,226],{"id":225},"release-a-package","Release a package",[159,228,229],{},"Run from the repository root:",[231,232,237],"pre",{"className":233,"code":234,"language":235,"meta":236,"style":236},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm install\ncd packages\u002F\u003Cyour-package>\npnpm exec release-it \u003Cpatch|minor|major|premajor|preminor|prepatch|prerelease>\n","bash","",[163,238,239,252,276],{"__ignoreMap":236},[240,241,244,248],"span",{"class":242,"line":243},"line",1,[240,245,247],{"class":246},"sBMFI","pnpm",[240,249,251],{"class":250},"sfazB"," install\n",[240,253,255,259,262,266,269,273],{"class":242,"line":254},2,[240,256,258],{"class":257},"s2Zo4","cd",[240,260,261],{"class":250}," packages\u002F",[240,263,265],{"class":264},"sMK4o","\u003C",[240,267,268],{"class":250},"your-packag",[240,270,272],{"class":271},"sTEyZ","e",[240,274,275],{"class":264},">\n",[240,277,279,281,284,287,290,293,296,299,301,304,306,309,311,314,316,319,321,324],{"class":242,"line":278},3,[240,280,247],{"class":246},[240,282,283],{"class":250}," exec",[240,285,286],{"class":250}," release-it",[240,288,289],{"class":264}," \u003C",[240,291,292],{"class":250},"patch",[240,294,295],{"class":264},"|",[240,297,298],{"class":246},"minor",[240,300,295],{"class":264},[240,302,303],{"class":246},"major",[240,305,295],{"class":264},[240,307,308],{"class":246},"premajor",[240,310,295],{"class":264},[240,312,313],{"class":246},"preminor",[240,315,295],{"class":264},[240,317,318],{"class":246},"prepatch",[240,320,295],{"class":264},[240,322,323],{"class":246},"prerelease",[240,325,275],{"class":271},[159,327,328,329,331,332,335,336,222],{},"The package's release-it config builds after the bump (",[163,330,181],{},") and then runs ",[163,333,334],{},"scripts\u002Fnpm-publish.sh"," once the\nGitHub release exists (",[163,337,338],{},"after:release",[159,340,341],{},"If the release fails because of authentication, the version commit and tag are already pushed. Resume only the npm\npublish:",[231,343,345],{"className":233,"code":344,"language":235,"meta":236,"style":236},"bash ..\u002F..\u002Fscripts\u002Fnpm-publish.sh\n",[163,346,347],{"__ignoreMap":236},[240,348,349,351],{"class":242,"line":243},[240,350,235],{"class":246},[240,352,353],{"class":250}," ..\u002F..\u002Fscripts\u002Fnpm-publish.sh\n",[159,355,356,357,360,361,364],{},"The packages also have a ",[163,358,359],{},"release"," npm script (changelogen and ",[163,362,363],{},"npm publish",") left over from the module starter. This\nguide uses release-it instead.",[192,366,368],{"id":367},"release-from-github-actions","Release from GitHub Actions",[159,370,371,372,376,377,380],{},"The ",[373,374,375],"strong",{},"Release"," workflow (",[163,378,379],{},".github\u002Fworkflows\u002Frelease.yml",") does the same from the Actions tab. It takes two inputs:",[382,383,384,400],"table",{},[385,386,387],"thead",{},[388,389,390,394,397],"tr",{},[391,392,393],"th",{},"Input",[391,395,396],{},"Values",[391,398,399],{},"Purpose",[401,402,403,426],"tbody",{},[388,404,405,411,420],{},[406,407,408],"td",{},[163,409,410],{},"package",[406,412,413,416,417],{},[163,414,415],{},"all"," or a folder under ",[163,418,419],{},"packages\u002F",[406,421,422,423,425],{},"What to release. ",[163,424,415],{}," releases every package in the workflow's list with the same increment.",[388,427,428,433,451],{},[406,429,430],{},[163,431,432],{},"increment",[406,434,435,437,438,437,440,442,443,437,445,437,447,437,449],{},[163,436,303],{},", ",[163,439,298],{},[163,441,292],{}," (default), ",[163,444,308],{},[163,446,313],{},[163,448,318],{},[163,450,323],{},[406,452,453],{},"Passed to release-it.",[159,455,456],{},"The jobs run in this order:",[458,459,460,466],"ol",{},[200,461,462,465],{},[373,463,464],{},"verify"," builds the package's workspace dependencies and runs its tests, one runner per package, in parallel.\nNothing is pushed or published.",[200,467,468,470,471,474,475,222],{},[373,469,359],{}," versions the packages that passed one at a time (each pushes a commit and tag to the branch), using\n",[163,472,473],{},"scripts\u002Frelease-package.sh"," with release-it's hooks off. It then builds them once and publishes them to npm up to four\nat a time (",[163,476,477],{},"scripts\u002Fpublish-released.sh",[159,479,480],{},"A failing package does not stop the others but fails the run. If a version was tagged but never reached npm, running the\nworkflow again publishes it without cutting a new version. Only one release runs at a time.",[192,482,221],{"id":483},"trusted-publishing",[159,485,486,487,493,494,496,497,500,501,504],{},"Publishing uses npm ",[204,488,492],{"href":489,"rel":490},"https:\u002F\u002Fdocs.npmjs.com\u002Ftrusted-publishers",[491],"nofollow","Trusted Publishing"," (OIDC), so no npm token is stored.\nThe workflow's ",[163,495,359],{}," job has ",[163,498,499],{},"id-token: write"," to mint the token. Each package must have the repository and the\n",[163,502,503],{},"release.yml"," workflow registered as a trusted publisher on npmjs.com.",[159,506,507,509,510,513,514,517,518,521,522,525,526,529],{},[163,508,334],{}," packs the package with ",[163,511,512],{},"pnpm pack",", so ",[163,515,516],{},"workspace:*"," dependencies become real version ranges,\nthen publishes the tarball with ",[163,519,520],{},"npm publish --provenance --access public",". It uses the ",[163,523,524],{},"npm"," CLI because pnpm does not\nimplement Trusted Publishing yet, and ",[163,527,528],{},"--provenance"," is needed because npm's token exchange otherwise fails for scoped\nmonorepo packages.",[192,531,533],{"id":532},"add-a-new-package","Add a new package",[458,535,536,542,558],{},[200,537,538,539,541],{},"Give it a ",[163,540,169],{},": copy a sibling's and change the package name and tag.",[200,543,544,545,547,548,550,551,554,555,557],{},"Add it to the ",[163,546,410],{}," choices and to the ",[163,549,415],{}," list in the ",[163,552,553],{},"prepare"," job of ",[163,556,503],{},". Keep the two in sync.",[200,559,560],{},"Register it as a trusted publisher on npmjs.com.",[562,563,564],"style",{},"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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);}",{"title":236,"searchDepth":254,"depth":254,"links":566},[567,568,569,570,571],{"id":194,"depth":254,"text":195},{"id":225,"depth":254,"text":226},{"id":367,"depth":254,"text":368},{"id":483,"depth":254,"text":221},{"id":532,"depth":254,"text":533},"Release a workspace package to npm with release-it or the Release workflow, and resume an interrupted publish.","md",null,{},{"icon":24},{"title":21,"description":572},"M3fGMkLVjW8OOI2zOoqu8FmNXNhbIekGuSGVzjgR_Nc",[580,582],{"title":16,"path":17,"stem":18,"description":581,"icon":19,"children":-1},"Install the Frigear workspace, configure the environment and run, build and validate its Nuxt applications.",{"title":26,"path":27,"stem":28,"description":583,"icon":29,"children":-1},"Scaffold a new Frigear Nuxt module, wire it into the workspace with module-kit, give it a database table, test it and release it.",1792824485286]