@heycys/gallery 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/assets/preview/runtime.js +156 -0
- package/assets/preview/shell.html +107 -0
- package/assets/writing-preferences.md +1 -1
- package/browser/editor/components/divider/index.mjs +1 -1
- package/browser/editor/page/annotate/card.mjs +6 -0
- package/browser/editor/page/annotate/index.mjs +22 -2
- package/browser/editor/page/columns/index.mjs +1 -1
- package/browser/editor/page/conflicts.mjs +1 -1
- package/browser/editor/page/drag/index.mjs +1 -1
- package/browser/editor/page/editor.mjs +39 -3
- package/browser/editor/page/focus.mjs +104 -0
- package/browser/editor/page/handle/index.mjs +14 -2
- package/browser/editor/page/links/index.mjs +2 -2
- package/browser/editor/page/quiet.mjs +3 -3
- package/browser/editor/page/resize/index.mjs +1 -1
- package/browser/editor/page/session.mjs +4 -1
- package/browser/editor/page/ui.mjs +1 -1
- package/browser/shared/annotations.mjs +22 -3
- package/browser/shared/block-packs.mjs +13 -4
- package/browser/shared/document-look.mjs +14 -0
- package/browser/shared/drafts.mjs +1 -1
- package/browser/shared/extension-manifest.mjs +40 -12
- package/browser/shared/favorite-merge.mjs +17 -0
- package/browser/shared/favorites.mjs +77 -0
- package/browser/shared/i18n/en.mjs +123 -24
- package/browser/shared/outline-ops.mjs +109 -0
- package/browser/shared/outline.mjs +6 -0
- package/browser/shared/pages.mjs +20 -8
- package/browser/shared/paths.mjs +5 -2
- package/browser/shared/preference-documents.mjs +137 -0
- package/browser/shared/presence.mjs +94 -0
- package/browser/shared/preview-server.mjs +8 -5
- package/browser/shared/qa-levels.mjs +9 -1
- package/browser/shared/session.mjs +4 -0
- package/browser/shared/shipped-blocks.mjs +22 -4
- package/browser/shared/startup.mjs +101 -0
- package/browser/shared/workspace-columns.mjs +1 -1
- package/browser/shared/workspace-look.mjs +21 -8
- package/browser/shared/workspace-registry.mjs +6 -3
- package/browser/shared/workspace.mjs +37 -10
- package/browser/shared/writing-preferences.mjs +2 -42
- package/dist/chunk-25LYSMAE.mjs +2 -0
- package/dist/chunk-2I6ZVC5O.mjs +2 -0
- package/dist/{chunk-M4NRDYI5.mjs → chunk-2MYTOOP6.mjs} +1 -1
- package/dist/chunk-2VNENLER.mjs +2 -0
- package/dist/chunk-3FERXZF5.mjs +4 -0
- package/dist/chunk-3M6SBBGU.mjs +2 -0
- package/dist/chunk-3VCAAF34.mjs +2 -0
- package/dist/{chunk-WD4U6XXT.mjs → chunk-3ZTRLGSA.mjs} +1 -1
- package/dist/chunk-4FRA5AUE.mjs +2 -0
- package/dist/chunk-4LR2QEC2.mjs +4 -0
- package/dist/chunk-56SVJENP.mjs +966 -0
- package/dist/chunk-5CQISL2G.mjs +4 -0
- package/dist/{chunk-RRKJMHNX.mjs → chunk-5I5ZDDWC.mjs} +5 -5
- package/dist/chunk-5IHDLEB4.mjs +10 -0
- package/dist/chunk-5LRDMV7O.mjs +2 -0
- package/dist/chunk-5MVUYRKG.mjs +5 -0
- package/dist/chunk-5TLLIZT7.mjs +2 -0
- package/dist/chunk-6ILJWFYW.mjs +4 -0
- package/dist/chunk-6N25CJ6Y.mjs +3 -0
- package/dist/{chunk-SQ6Y2ZMA.mjs → chunk-7DTINW6U.mjs} +2 -2
- package/dist/chunk-7KWAGKIK.mjs +2 -0
- package/dist/chunk-7WNUOAFK.mjs +2 -0
- package/dist/chunk-7XCRW5RC.mjs +2 -0
- package/dist/{chunk-BYNPEUDS.mjs → chunk-7XSDTILF.mjs} +1 -1
- package/dist/chunk-ABKYFOVR.mjs +2 -0
- package/dist/chunk-AMUF7PUN.mjs +2 -0
- package/dist/{chunk-FJLM7YE7.mjs → chunk-B2EIMERT.mjs} +2 -2
- package/dist/{chunk-QNECWMGR.mjs → chunk-B45IAAU6.mjs} +1 -1
- package/dist/chunk-B6RAGF4R.mjs +2 -0
- package/dist/chunk-BSJKFE7I.mjs +4 -0
- package/dist/chunk-C72EEVLK.mjs +2 -0
- package/dist/chunk-CRAUKZ23.mjs +4 -0
- package/dist/chunk-F4CT35KL.mjs +2 -0
- package/dist/chunk-F63BNJLG.mjs +2 -0
- package/dist/chunk-FBKUPS44.mjs +2 -0
- package/dist/chunk-FL52ZL5Z.mjs +15 -0
- package/dist/chunk-FOZCU4VW.mjs +2 -0
- package/dist/chunk-G5HV7BC3.mjs +2 -0
- package/dist/{chunk-ERLAIBOA.mjs → chunk-GB5SOYQJ.mjs} +2 -2
- package/dist/chunk-GN3SG3IF.mjs +2 -0
- package/dist/{chunk-6QWQXHAV.mjs → chunk-HFTBVEZK.mjs} +1 -1
- package/dist/chunk-IOW5HLRK.mjs +2 -0
- package/dist/chunk-IQ3GJNTI.mjs +6 -0
- package/dist/chunk-K6SPFBUJ.mjs +2 -0
- package/dist/chunk-K7Y7SPTS.mjs +2 -0
- package/dist/chunk-L2IJCEUH.mjs +2 -0
- package/dist/{chunk-GPIWQ4X4.mjs → chunk-L3VT6LM4.mjs} +1 -1
- package/dist/chunk-L4WLQYFC.mjs +5 -0
- package/dist/{chunk-NLDF35P5.mjs → chunk-LAMCAGK6.mjs} +1 -1
- package/dist/chunk-LHGKPMTI.mjs +2 -0
- package/dist/chunk-LJZIYVNA.mjs +3 -0
- package/dist/chunk-LSVCTLS2.mjs +2 -0
- package/dist/chunk-LZY74XTP.mjs +2 -0
- package/dist/chunk-MC4LRSVH.mjs +2 -0
- package/dist/chunk-MCEXN4G5.mjs +2 -0
- package/dist/chunk-MTLAOCFF.mjs +181 -0
- package/dist/chunk-MZ66LN3B.mjs +2 -0
- package/dist/chunk-N5QWJRRI.mjs +2 -0
- package/dist/chunk-NF4MMOUB.mjs +2 -0
- package/dist/chunk-NHJYAJ73.mjs +3 -0
- package/dist/chunk-NRSD7SVY.mjs +2 -0
- package/dist/chunk-NT23I4XW.mjs +2 -0
- package/dist/chunk-NUALABIS.mjs +3 -0
- package/dist/chunk-NW6LAU22.mjs +2 -0
- package/dist/chunk-NWWHDGKF.mjs +5 -0
- package/dist/chunk-OFRCVMSJ.mjs +2 -0
- package/dist/chunk-OKVQQ3CX.mjs +4 -0
- package/dist/chunk-OM24O4KR.mjs +8 -0
- package/dist/{chunk-4B2TB5K2.mjs → chunk-PBMOC7KA.mjs} +2 -2
- package/dist/chunk-PVTCP43W.mjs +2 -0
- package/dist/chunk-Q62HZAJS.mjs +2 -0
- package/dist/chunk-QBJWIR3Q.mjs +2 -0
- package/dist/chunk-QDSEZX7Z.mjs +6 -0
- package/dist/chunk-QR4V4A2Z.mjs +15 -0
- package/dist/{chunk-QVGOPHOF.mjs → chunk-QRLVVZ3R.mjs} +1 -1
- package/dist/chunk-QW3QG67J.mjs +2 -0
- package/dist/chunk-R2T2EVWY.mjs +8 -0
- package/dist/{chunk-JJNHKGTD.mjs → chunk-R5RERE6G.mjs} +1 -1
- package/dist/chunk-RFHEWT3Y.mjs +5 -0
- package/dist/chunk-RS2Z2JQP.mjs +2 -0
- package/dist/chunk-S6YEC4GE.mjs +16 -0
- package/dist/chunk-SHZLMGGW.mjs +2 -0
- package/dist/chunk-TALJQM2O.mjs +2 -0
- package/dist/chunk-TLNJWEFY.mjs +22 -0
- package/dist/{chunk-ZLS2FRS6.mjs → chunk-TQZU7D7C.mjs} +1 -1
- package/dist/chunk-UTKNWYBA.mjs +2 -0
- package/dist/chunk-V3TM3TEN.mjs +2 -0
- package/dist/chunk-V3XROSP5.mjs +7 -0
- package/dist/{chunk-6QBHU4DF.mjs → chunk-V5JTW2LH.mjs} +1 -1
- package/dist/chunk-VAXLSISW.mjs +4 -0
- package/dist/chunk-VBHI3RG6.mjs +2 -0
- package/dist/{chunk-CRDG6EF2.mjs → chunk-VKZJRGDR.mjs} +1 -1
- package/dist/chunk-VZXZM7NS.mjs +2 -0
- package/dist/chunk-WDS6HEPE.mjs +2 -0
- package/dist/chunk-WHGANNEY.mjs +13 -0
- package/dist/chunk-WMJWC4QY.mjs +56 -0
- package/dist/{chunk-UTMAY3WK.mjs → chunk-WWONJJQS.mjs} +1 -1
- package/dist/chunk-X4WNLFIK.mjs +2 -0
- package/dist/chunk-XNNCQROX.mjs +11 -0
- package/dist/chunk-XRYECF23.mjs +170 -0
- package/dist/{chunk-225ALKYI.mjs → chunk-Z4NEXXFK.mjs} +1 -1
- package/dist/{chunk-PKVK6WFC.mjs → chunk-ZFVF2YPV.mjs} +2 -2
- package/dist/chunk-ZM2IX3R2.mjs +2 -0
- package/dist/chunk-ZNGGDUZI.mjs +2 -0
- package/dist/chunk-ZOEJQOKT.mjs +2 -0
- package/dist/cli.mjs +1 -1
- package/dist/server.mjs +1 -1
- package/dist/update-fetch.mjs +1 -1
- package/dist/worker.mjs +1 -1
- package/package.json +1 -1
- package/release.json +3 -3
- package/skill/SKILL.md +54 -148
- package/skill/references/building-blocks.md +4 -4
- package/skill/references/charts-and-figures.md +73 -0
- package/skill/references/extensions.md +47 -4
- package/skill/references/pages-and-data.md +22 -3
- package/skill/references/preference-files.md +7 -0
- package/skill/references/previews.md +17 -0
- package/skill/references/writing-html.md +21 -82
- package/web/assets/index-B4uUluLM.js +15 -0
- package/web/assets/index-C3vHT8sH.css +1 -0
- package/web/index.html +2 -2
- package/dist/chunk-2HS7ZBPU.mjs +0 -2
- package/dist/chunk-3F57LEN5.mjs +0 -2
- package/dist/chunk-4OZWXZE5.mjs +0 -5
- package/dist/chunk-5GK7HS62.mjs +0 -2
- package/dist/chunk-6GV3CBB2.mjs +0 -2
- package/dist/chunk-6NLXUKAY.mjs +0 -4
- package/dist/chunk-6XD6U3QA.mjs +0 -5
- package/dist/chunk-6Y3HYOBM.mjs +0 -2
- package/dist/chunk-7EFHNQ5B.mjs +0 -3
- package/dist/chunk-7M2BQQGZ.mjs +0 -2
- package/dist/chunk-7UZUQQ7Q.mjs +0 -554
- package/dist/chunk-ALZ6ZENZ.mjs +0 -3
- package/dist/chunk-BX5AKINW.mjs +0 -15
- package/dist/chunk-DR73Y2UJ.mjs +0 -3
- package/dist/chunk-EURLTOTZ.mjs +0 -4
- package/dist/chunk-F4ZA6JRZ.mjs +0 -3
- package/dist/chunk-FNCCVGKX.mjs +0 -2
- package/dist/chunk-FOJ3K5Z3.mjs +0 -6
- package/dist/chunk-FQ72LZHB.mjs +0 -2
- package/dist/chunk-G7N7YFVD.mjs +0 -2
- package/dist/chunk-GIRXJBGC.mjs +0 -2
- package/dist/chunk-GKOBB6DH.mjs +0 -2
- package/dist/chunk-GMJD7ID3.mjs +0 -2
- package/dist/chunk-GQJMVSSN.mjs +0 -2
- package/dist/chunk-HX4DLE3J.mjs +0 -10
- package/dist/chunk-IS7N3N6Q.mjs +0 -168
- package/dist/chunk-JEUK3ZO7.mjs +0 -2
- package/dist/chunk-JPG2LBQM.mjs +0 -11
- package/dist/chunk-JYK5WJPM.mjs +0 -2
- package/dist/chunk-KLQP46Y3.mjs +0 -4
- package/dist/chunk-L55NOXBE.mjs +0 -4
- package/dist/chunk-LCB6MARS.mjs +0 -5
- package/dist/chunk-LJLVCU6W.mjs +0 -16
- package/dist/chunk-LMUZQK5O.mjs +0 -2
- package/dist/chunk-NMF3IPYA.mjs +0 -13
- package/dist/chunk-ONKC4BCC.mjs +0 -2
- package/dist/chunk-OU6ZZVBX.mjs +0 -5
- package/dist/chunk-PUOQ65NC.mjs +0 -2
- package/dist/chunk-QJAVCTY7.mjs +0 -2
- package/dist/chunk-QP7BOHE4.mjs +0 -2
- package/dist/chunk-S3SX3COT.mjs +0 -20
- package/dist/chunk-SQ3FQCCN.mjs +0 -8
- package/dist/chunk-T4Y2ZSVX.mjs +0 -4
- package/dist/chunk-TANZRINB.mjs +0 -2
- package/dist/chunk-UGWMMEJ5.mjs +0 -15
- package/dist/chunk-UTF7GBQU.mjs +0 -4
- package/dist/chunk-V4ZHRALW.mjs +0 -170
- package/dist/chunk-XBNFXWAW.mjs +0 -6
- package/dist/chunk-XZV72SQ4.mjs +0 -2
- package/dist/chunk-YFJB534W.mjs +0 -2
- package/dist/chunk-Z6OKLRHC.mjs +0 -2
- package/dist/chunk-ZMHUDYLV.mjs +0 -2
- package/web/assets/index-D8P8uhDW.js +0 -15
- package/web/assets/index-FLb9jCfl.css +0 -1
- /package/dist/{chunk-PAREWQGB.mjs → chunk-NOGQX56R.mjs} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
-
import{c as l,d as g}from"./chunk-
|
|
2
|
+
import{c as l,d as g}from"./chunk-VAXLSISW.mjs";import{k as p,l as d}from"./chunk-PBMOC7KA.mjs";import{u as f}from"./chunk-BSJKFE7I.mjs";import{b as h,f as u}from"./chunk-L4WLQYFC.mjs";import b from"node:fs/promises";import j from"node:path";import{reportsDirectory as x}from"../browser/shared/paths.mjs";import{sameDirectory as i}from"../browser/shared/preview-server.mjs";import{copyOldDocuments as v,defaultWorkspace as k,ensureWorkspace as D,layoutOf as G}from"../browser/shared/workspace.mjs";import{nameProblem as O,writeWorkspaceName as C}from"../browser/shared/workspace-name.mjs";import{registerQuietly as N}from"../browser/shared/workspace-registry.mjs";var $=(o,t)=>`${o} ${t}${o===1?"":"s"}`;function W(o,t,r){let{preferences:s}=G(r);return[o.copied.length?`Copied ${$(o.copied.length,"document")} from ${t}: ${o.copied.join(", ")}`:`Copied no documents from ${t}.`,...o.skipped.length?[`Skipped (the slug is taken here, or the folder's name is no slug): ${o.skipped.join(", ")}`]:[],...o.kept.length?[`Left behind (a name a workspace keeps for itself, for its custom blocks here, which no new document takes): ${o.kept.join(", ")}`]:[],...o.preferences==="copied"?[`\u5199\u4F5C\u504F\u597D\uFF1Acopied (${s})`]:o.preferences==="kept"?[`\u5199\u4F5C\u504F\u597D\uFF1Akept the workspace's (${s}); the old one was not copied`]:[],...o.outline?[`Sidebar order: ${o.outline}`]:[],...o.page?[`\u5199\u4F5C\u504F\u597D's page: ${o.page==="copied"?"copied":"kept the workspace's"}`]:[],...o.emoji?[`Emoji library: ${o.emoji} added`]:[],...o.history?[`Recent versions: ${$(o.history,"document")}`]:[],...o.packages.length?[`Custom blocks: ${o.packages.join(", ")}`]:[]]}async function q(o){let{values:t}=u({values:["--from","--name"],argv:o}),r=x,s=t.get("--name"),c=s===void 0?null:O(s);if(c)throw new h(c);let m;try{let{made:e,ours:a,reads:y}=await D(r,{state:i(r,k())});a||(console.error(g(r,y)),process.exit(1)),m=e}catch(e){if(!e.code)throw e;console.error(l(r,e.code)),process.exit(1)}if(console.log(`\u5DE5\u4F5C\u533A\uFF1A${r}\uFF08${m?"\u65B0\u5EFA":"\u5DF2\u6709"}\uFF09`),s!==void 0)try{let e=await C(r,s);console.log(`\u540D\u5B57\uFF1A${e.name}${e.before&&e.before!==e.name?` (it was "${e.before}")`:""}`)}catch(e){console.error(e.code?l(r,e.code):e.message),process.exit(1)}if(await N(r),t.has("--from")){let e=j.resolve(t.get("--from"));await b.stat(e).then(a=>a.isDirectory(),()=>!1)||(console.error(`No such folder: ${e} (--from names an older Gallery's reports/ folder).`),process.exit(1)),i(e,r)&&(console.error(`${e} is this workspace: --from names another folder (an older Gallery's reports/).`),process.exit(1));for(let a of W(await v({from:e,to:r}),e,r))console.log(a)}if(!i(r,k())){console.log('\u4E0B\u4E00\u6B65\uFF1Agallery new <slug> "<title>" makes a document; gallery open opens Gallery.');return}let w=await f(r);for(let e of w.packs)e.failed?console.warn(`\u5757\u5305\uFF1AGallery's pack ${e.id} was not installed (${e.failed}); a later start tries again.`):e.first&&console.log(`\u5757\u5305\uFF1A${e.name.zh} (${e.id} ${e.version}, ${e.added.length+e.same.length+e.updated.length} blocks)${e.id==="gallery-soft"?", switched off: \u8BBE\u7F6E \u203A \u7EC4\u4EF6\u5217\u8868 turns it on":""}`);let n=await p(r);n.did==="made"?console.log(`\u9996\u9875\uFF1A${n.file} (the home page, its cards Gallery's today and note; the workbench opens it first)`):n.did==="failed"&&console.warn(`\u9996\u9875\uFF1A${d(n)}`),console.log('\u4E0B\u4E00\u6B65\uFF1Agallery new <slug> "<title>" makes a document; gallery open opens the workbench.')}export{W as a,q as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{spawn as O}from"node:child_process";import{existsSync as I}from"node:fs";import C from"node:fs/promises";import _ from"node:os";import q from"node:path";import{APART as M}from"../browser/editor/components/registry.mjs";var B=6e4,P=600,N=["A4","A3","Letter","Legal","Tabloid"];function F(){if(process.env.GALLERY_BROWSER)return process.env.GALLERY_BROWSER;let{PROGRAMFILES:o="","PROGRAMFILES(X86)":e="",LOCALAPPDATA:r="",HOME:i=""}=process.env;return({win32:[`${o}\\Google\\Chrome\\Application\\chrome.exe`,`${e}\\Google\\Chrome\\Application\\chrome.exe`,`${r}\\Google\\Chrome\\Application\\chrome.exe`,`${e}\\Microsoft\\Edge\\Application\\msedge.exe`,`${o}\\Microsoft\\Edge\\Application\\msedge.exe`],darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Chromium.app/Contents/MacOS/Chromium",...i?[`${i}/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`,`${i}/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge`,`${i}/Applications/Chromium.app/Contents/MacOS/Chromium`]:[]],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/opt/google/chrome/chrome","/usr/bin/microsoft-edge","/usr/bin/microsoft-edge-stable","/opt/microsoft/msedge/msedge","/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"]}[process.platform]??[]).find(n=>n&&I(n))??null}var $=()=>process.getuid?.()===0?["--no-sandbox"]:[],te=()=>["--no-first-run","--no-default-browser-check","--disable-extensions","--hide-scrollbars","--lang=zh-CN",...$()];function oe(o,e,r=[]){let i=o.location()?.url??"";return!/^Failed to load resource|^Refused to |Content Security Policy/.test(o.text())&&(!i||i.startsWith(e)||r.includes(i))}var re=o=>o.evaluateOnNewDocument(()=>{globalThis.__qaViolations=[],document.addEventListener("securitypolicyviolation",e=>{globalThis.__qaViolations.push({url:e.blockedURI,directive:e.effectiveDirective||e.violatedDirective,source:e.sourceFile,line:e.lineNumber})})}),V=3e4,W=5e3;function ie(o,e=W){let r=0,i=new Promise(c=>{r=setTimeout(c,e)});return Promise.race([Promise.resolve(o).catch(()=>{}),i]).finally(()=>clearTimeout(r))}var T=o=>new Promise(e=>setTimeout(e,o).unref()),D=o=>String(o??"").replace(/\s+/g," ").trim(),L=o=>{let e=o.split(/\r?\n/).map(D).filter(Boolean).at(-1);return e?`: ${e.slice(0,200)}`:""};async function ne({executablePath:o,args:e=[],attempts:r=2,start:i=H}){let c=[];for(let n=0;n<r;n+=1){let s=await C.mkdtemp(q.join(_.tmpdir(),"gallery-browser-")),t=()=>C.rm(s,{recursive:!0,force:!0,maxRetries:5,retryDelay:200}).catch(()=>{});try{let{browser:a,stop:l}=await i({executablePath:o,args:e,profile:s});return{browser:a,failures:c,close:async()=>{await l().catch(()=>{}),await t()}}}catch(a){c.push(D(a?.message??a)),await t()}}throw Object.assign(new Error(c.at(-1)??"the browser did not start"),{failures:c})}async function H({executablePath:o,args:e,profile:r,starting:i=V}){let{default:c}=await import("./chunk-GB5SOYQJ.mjs"),n=await c.defaultArgs({headless:!0,userDataDir:r,args:[...e,"--remote-debugging-port=0"]}),s=process.platform!=="win32",t=O(o,n,{stdio:["ignore","ignore","pipe"],windowsHide:!0,detached:s}),a=!1;t.on("error",()=>a||=t.pid===void 0);let l=()=>a||t.exitCode!==null||t.signalCode!==null,u=new Promise(f=>t.once("exit",f)),m=()=>{if(!l())try{s?process.kill(-t.pid,"SIGKILL"):t.kill()}catch{try{t.kill("SIGKILL")}catch{}}};process.once("exit",m);let p="",d=new Promise((f,g)=>{let y=setTimeout(()=>g(new Error(`it said nothing of its DevTools port in ${i/1e3}s${L(p)}`)),i);t.stderr.setEncoding("utf8"),t.stderr.on("data",h=>{p=`${p}${h}`.slice(-4e3);let b=/DevTools listening on (ws:\/\/\S+)/.exec(p);b&&(clearTimeout(y),f(b[1]))}),t.once("error",h=>(clearTimeout(y),g(h))),t.once("exit",(h,b)=>(clearTimeout(y),g(new Error(`it stopped (${b??`exit ${h}`}) before it opened its DevTools port${L(p)}`))))}),A=async()=>{try{l()||await Promise.race([u,T(5e3)]),m(),l()||await Promise.race([u,T(3e3)])}finally{process.off("exit",m)}},E;try{let f=await d,g=0,y=new Promise((b,G)=>{g=setTimeout(()=>G(new Error(`it opened its DevTools port and did not answer in ${i/1e3}s`)),i)}),h=c.connect({browserWSEndpoint:f,defaultViewport:{width:800,height:600}});h.catch(()=>{}),E=await Promise.race([h,y]).finally(()=>clearTimeout(g))}catch(f){throw m(),await A(),f}return{browser:E,stop:async()=>{await Promise.race([E.close().catch(()=>{}),T(5e3)]),await A()}}}var w=null,S=0,x=0;async function K(){let o=F();if(!o)throw Object.assign(new Error("\u6CA1\u6709\u627E\u5230 Chrome \u6216 Edge\uFF1A\u5BFC\u51FA PDF \u9700\u8981\u7535\u8111\u4E0A\u88C5\u6709\u5176\u4E2D\u4E00\u4E2A\u6D4F\u89C8\u5668"),{reason:"browser"});let{default:e}=await import("./chunk-GB5SOYQJ.mjs");return e.launch({executablePath:o,headless:!0,args:["--no-first-run","--no-default-browser-check","--disable-extensions",...$()]})}async function se(){if(x>0)return;clearTimeout(S);let o=w;w=null,(await o?.catch(()=>null))?.close().catch(()=>{})}async function R(o,e){clearTimeout(S),x+=1,w??=K().catch(i=>{throw w=null,i});let r=await(await w).newPage();try{return await r.emulateMediaFeatures([{name:"prefers-reduced-motion",value:"reduce"},{name:"prefers-color-scheme",value:"light"}]),await r.setViewport({width:1200,height:900}),await r.setContent(o,{waitUntil:"load",timeout:6e4}),await v(r,{changing:P}),await e(r)}finally{await r.close().catch(()=>{}),x-=1,x===0&&(S=setTimeout(async()=>{let i=w;w=null,(await i?.catch(()=>null))?.close().catch(()=>{})},B))}}async function v(o,{timeout:e=15e3,changing:r=e}={}){let i=[],c=(s,t,a=e)=>{t!==!0&&i.push(`${s} (${t===!1?`not in ${a/1e3}s`:t})`)},n=(s,t=e)=>o.evaluate(s,t).catch(a=>a.message);return c("the fonts loaded",await n(s=>Promise.race([Promise.resolve(document.fonts?.ready).then(()=>!0),new Promise(t=>setTimeout(()=>t(!1),s))]))),c("the kit's first drawing done (data-doc-drawn)",await n(s=>new Promise(t=>{let a=Date.now(),l=()=>{!globalThis.DocKit||document.documentElement.hasAttribute("data-doc-drawn")?(globalThis.DocCode?.colorAll?.(),t(!0)):Date.now()-a>s?t(!1):setTimeout(l,50)};l()}))),c("the page done changing",await n(s=>new Promise(t=>{let a=()=>[document.documentElement.scrollHeight,...[...document.querySelectorAll("[style]")].map(d=>d.getAttribute("style")),...[...document.adoptedStyleSheets??[]].flatMap(d=>[...d.cssRules].map(A=>A.cssText)),...[...document.querySelectorAll("svg, canvas")].map(d=>d.outerHTML.length),[...document.images].filter(d=>d.complete).length].join("|"),l=Date.now(),u=a(),m=0,p=()=>{let d=a();m=d===u?m+1:0,u=d,m>=3?t(!0):Date.now()-l>s?t(!1):setTimeout(p,100)};setTimeout(p,100)}),r),r),i}async function k(o){await o.evaluate(()=>{document.documentElement.setAttribute("data-doc-theme","light");for(let e of document.querySelectorAll("[data-doc-sheets]")){let r=e.querySelector(":scope > .doc-sheet-tabs");if(r){for(let i of r.querySelectorAll(":scope > .doc-sheet-tab")){let c=i.getAttribute("data-sheet-tab"),n=[...e.querySelectorAll(":scope > [data-doc-sheet]")].find(a=>a.getAttribute("data-doc-sheet")===c);if(!n)continue;n.hidden=!1,n.removeAttribute("aria-hidden"),n.style.setProperty("display","block","important");let s=r.cloneNode(!1);s.removeAttribute("id"),s.removeAttribute("role"),s.style.setProperty("break-after","avoid");let t=i.cloneNode(!0);t.removeAttribute("id"),t.setAttribute("aria-selected","true"),t.classList.add("is-active"),s.append(t),n.before(s)}r.style.setProperty("display","none","important")}}for(let e of document.querySelectorAll("details"))e.open=!0;window.dispatchEvent(new Event("resize"))}),await v(o,{changing:P})}var j={A4:793.7,A3:1122.5,Letter:816,Legal:816,Tabloid:1056},z=96;async function U(o,e){await o.emulateMediaType("print");let r=await o.evaluate(()=>Math.max(0,innerWidth-document.documentElement.clientWidth));await o.setViewport({width:Math.floor(e)+r,height:900}),await v(o,{changing:P})}function ae(o,{paper:e="A4",scale:r=1}={}){let i=N.includes(e)?e:"A4",c=Math.min(2,Math.max(.1,r));return R(o,async n=>(await k(n),await U(n,(j[i]-2*z)/c),Buffer.from(await n.pdf({format:i,scale:c,printBackground:!0,margin:{top:"1in",right:"1in",bottom:"1in",left:"1in"}}))))}function ce(o){return R(o,async e=>{await k(e);let r=e.viewport(),i=await e.$$("main figure.doc-figure"),c=[];for(let n of i){let s=0;try{s=await n.evaluate(async(t,a)=>{let l=[];for(let u=t.closest(a);u;u=u.parentElement.closest(a))l.unshift(u);for(let u of l)u.style.setProperty("height","auto"),u.style.setProperty("max-height","calc(100dvh - (2 * var(--doc-dialog-margin)))"),u.showModal();return await new Promise(u=>requestAnimationFrame(()=>requestAnimationFrame(u))),l.length?Math.ceil(t.getBoundingClientRect().height):0},M),s&&(await e.setViewport({...r,height:r.height+s}),await v(e,{changing:P})),await n.evaluate(t=>t.scrollIntoView({block:"center"})),c.push(Buffer.from(await n.screenshot({type:"png"})))}catch{c.push(null)}await n.evaluate((t,a)=>{for(let l=t.closest(a);l;l=l.parentElement.closest(a))l.close(),l.style.removeProperty("height"),l.style.removeProperty("max-height"),l.getAttribute("style")||l.removeAttribute("style")},M).catch(()=>{}),s&&await e.setViewport(r).catch(()=>{})}return c})}export{N as a,F as b,$ as c,te as d,oe as e,re as f,W as g,ie as h,ne as i,H as j,se as k,v as l,ae as m,ce as n};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{a as q,b as B}from"./chunk-IA4PSIMD.mjs";import{b as W}from"./chunk-ZTHICSSF.mjs";import j from"node:fs/promises";import _ from"node:path";import{MENTION as U}from"../browser/shared/components/mention.mjs";import{writeAtomic as Q}from"../browser/shared/files.mjs";import{reportLines as V}from"../browser/shared/search.mjs";import{countWords as Y}from"../browser/shared/words.mjs";import{FACT_KINDS as G,QUERY_KINDS as X,SNAPSHOT_LIMITS as y,queryOptions as Z}from"../browser/shared/workspace-query.mjs";import{documentDirectory as T,documentFiles as A,layoutOf as tt,listDocumentSlugs as z,listTrash as et}from"../browser/shared/workspace.mjs";var ht=f=>c=>f.readTaken(c,{wait:0}),H=({todos:f})=>{let c=new Map,g=d=>JSON.stringify([d.text,d.path]);for(let d of f)c.set(g(d),(c.get(g(d))??0)+1);return f.some(d=>!d.block&&c.get(g(d))>1)},nt=(f,c)=>({hash:B(f),words:Y(c),todos:q(c)});function st(f){let c=new Date(f);return c.setHours(0,0,0,0),c.setDate(c.getDate()-(c.getDay()+6)%7),c.getTime()}function wt({root:f,read:c,draw:g=u=>u,activity:d=null,now:I=()=>new Date}){let u=new Map,m=new Map,b=t=>j.stat(t).then(({mtimeMs:e})=>e,()=>null);async function J(t,e=null){let o=A(T(t,f)),[a,n]=await Promise.all([b(o.html),b(o.json)]);if(a===null)return null;let s=e??await c(t);if(!s)return null;let r={};try{r=JSON.parse(await j.readFile(o.json,"utf8"))??{}}catch{}let{title:i,icon:h}=r,w={slug:t,title:typeof i=="string"&&i.trim()?i:t,icon:typeof h=="string"&&h?h:null,edited:Math.round(a),...nt(s.source,s.text)};return u.set(t,{html:a,json:n,facts:w,held:s.held===!0}),m.has(t)||m.set(t,w),w}async function O(t){let e=u.get(t);if(e&&!e.held){let o=A(T(t,f)),[a,n]=await Promise.all([b(o.html),b(o.json)]);if(a===e.html&&n===e.json)return e.facts}return J(t)}async function K(){let t=await z(f);for(let e of u.keys())t.includes(e)||u.delete(e);for(let e of m.keys())t.includes(e)||m.delete(e);return(await Promise.all(t.map(e=>O(e).catch(()=>null)))).filter(Boolean)}let k=null;async function $(){let t=k??=K();try{return[...await t]}finally{k===t&&(k=null)}}let P={async todos({done:t,slugs:e,limit:o}){let a=(await $()).filter(s=>!e||e.includes(s.slug)).sort((s,r)=>r.edited-s.edited||s.slug.localeCompare(r.slug)),n=[];for(let{slug:s,title:r,icon:i,todos:h,hash:w}of a)for(let l of h)if(!(t!==void 0&&l.done!==t)){if(n.length>=o)return n;n.push({ref:{slug:s,block:l.block,text:l.text,path:l.path,nth:l.nth,version:w},text:l.text,done:l.done,slug:s,title:r,icon:i,path:l.path})}return n},async recent({limit:t}){return(await $()).sort((e,o)=>o.edited-e.edited||e.slug.localeCompare(o.slug)).slice(0,t).map(({slug:e,title:o,icon:a,edited:n})=>({slug:e,title:o,icon:a,edited:new Date(n).toISOString()}))},async stats(){let t=await $(),e=st(I()),o=t.flatMap(a=>a.todos);return{documents:t.length,todos:{done:o.filter(a=>a.done).length,total:o.length},words:t.reduce((a,n)=>a+n.words,0),editedThisWeek:t.filter(a=>a.edited>=e).length}},async activity({days:t}){return d?(await d.load(),await x,d.days(t)):[]},async table({slug:t,key:e,where:o,limit:a},{words:n=!1}={}){let s=await O(t).catch(()=>null),r=u.get(t);if(!s||!r)return S(404,"missing",`no document "${t}"`);if(r.tables??=new Map,!r.tables.has(e)){let l=await c(t);if(!l)return S(404,"missing",`no document "${t}"`);r.tables.set(e,W(l.text,e,t))}let i=r.tables.get(e);if(i.error==="missing")return S(404,"missing",`"${t}" holds no table whose frame carries data-doc-chart-source="${e}"`);if(i.error)return S(422,"missing",`the table "${e}" of "${t}" has merged cells, which no view reads: write each value in its own cell`);let h=Object.keys(o).filter(l=>!i.columns.includes(l));if(h.length>0)return S(400,"options",`table: the table "${e}" of "${t}" has no column ${h.map(l=>JSON.stringify(l)).join(", ")} (its columns: ${i.columns.map(l=>JSON.stringify(l)).join(", ")})`);let w=i.rows.filter(l=>Object.entries(o).every(([v,M])=>l.words[v]===M.replace(/\s+/g," ").trim()));return{columns:[...i.columns],rows:w.slice(0,a).map(({values:l,links:v,words:M})=>({values:{...l},links:v.map(R=>({...R})),...n?{words:{...M}}:{}})),total:w.length}}},S=(t,e,o)=>{throw Object.assign(new Error(o),{refusal:[t,{ok:!1,reason:e,message:o}]})},p=new Map,N=t=>_.join(tt(f).gallery,"cache","workspace",`${t}.json`),F=async t=>{if(!p.has(t)){let e=[];try{let o=JSON.parse(await j.readFile(N(t),"utf8"));Array.isArray(o?.tables)&&(e=o.tables.filter(a=>typeof a=="string").slice(-y.tables))}catch{}p.has(t)||p.set(t,e)}return p.get(t)},D=Promise.resolve(),L=async(t,e)=>{let o=await F(t);if(o.at(-1)===e)return;let a=[...o.filter(n=>n!==e),e].slice(-y.tables);p.set(t,a),D=D.then(async()=>{await j.mkdir(_.dirname(N(t)),{recursive:!0}),await Q(N(t),`${JSON.stringify({tables:p.get(t)})}
|
|
3
|
+
`)}).catch(()=>{})},E=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,x=Promise.resolve(),C={facts:O,all:$,async lines(t,e){let o=u.get(t);if(!await O(t))return null;let n=u.get(t);if(n!==o||!n.lines||n.lines.titles!==null&&n.lines.titles!==e){let s=await c(t);if(!s)return null;n.lines={titles:s.text.includes(U)?e:null,value:V(g(s.text,t))}}return n.lines.value},async query(t,e,{doc:o=null}={}){if(!X.includes(t))return[400,{ok:!1,reason:"kind",message:`no kind "${t}": todos, recent, stats, activity or table`}];let{problem:a,options:n}=Z(t,e);if(a)return[400,{ok:!1,reason:"options",message:`${t}: ${a}`}];let s;try{s=await P[t](n)}catch(r){if(r.refusal)return r.refusal;throw r}return t==="table"&&typeof o=="string"&&E.test(o)&&await L(o,`${n.slug}#${n.key}`),[200,{ok:!0,kind:t,data:s,at:new Date(I()).toISOString()}]},async snapshot(t){let e=async(n,s)=>{let[r,i]=await C.query(n,s);return r===200?i.data:null},o={todos:await e("todos",{limit:y.todos}),recent:await e("recent",{limit:y.recent}),stats:await e("stats"),activity:await e("activity",{days:y.activity})},a={};for(let n of E.test(t)?await F(t):[]){let[s,r]=n.split("#"),i=await P.table({slug:s,key:r,where:{},limit:y.rows},{words:!0}).catch(()=>null);i&&(a[n]=i)}return Object.keys(a).length>0&&(o.tables=a),Object.fromEntries(Object.entries(o).filter(([,n])=>n!==null))},stored:()=>D,async changed(t,{source:e=null,text:o=null,by:a="agent"}={}){k=null;let n=m.get(t)??u.get(t)?.facts??null;u.delete(t);let s=e===null?null:await J(t,{source:e,text:o??e}).catch(()=>null);s?m.set(t,s):m.delete(t);let r=new Set;if(!!n!=!!s)for(let i of["todos","recent","stats","table"])r.add(i);return n&&s&&n.hash!==s.hash&&r.add("table"),n&&s&&n.hash!==s.hash&&(H(n)||H(s))&&r.add("todos"),n&&s&&((n.title!==s.title||JSON.stringify(n.todos)!==JSON.stringify(s.todos))&&r.add("todos"),(n.title!==s.title||n.icon!==s.icon||n.edited!==s.edited)&&r.add("recent"),(n.words!==s.words||n.todos.length!==s.todos.length||n.todos.filter(i=>i.done).length!==s.todos.filter(i=>i.done).length||n.edited!==s.edited)&&r.add("stats")),!n&&s&&r.add("recent"),d&&s&&(await d.load(),await x,d.record(t,{hash:s.hash,words:s.words,mtime:s.edited,by:a})&&r.add("activity")),G.filter(i=>r.has(i))},start(){return d?(x=(async()=>{await d.load();let t=await z(f),e=(await Promise.all(t.map(async a=>({slug:a,mtime:await b(A(T(a,f)).html)})))).filter(({mtime:a})=>a!==null),o=(await et(f).catch(()=>[])).map(a=>a.slug);return d.catchUp(e.map(({slug:a,mtime:n})=>({slug:a,mtime:Math.round(n)})),O,{kept:o})})().catch(()=>0),x):Promise.resolve(0)},forget(t){k=null,u.delete(t),m.delete(t)}};return C}export{ht as a,wt as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{a as F}from"./chunk-F63BNJLG.mjs";import{a as w,h as E,i as g,k as I,l as O,m as P,p as b}from"./chunk-B6RAGF4R.mjs";import{a as h,b as A}from"./chunk-5TLLIZT7.mjs";import{d as C,e as H,g as R,v as q}from"./chunk-OM24O4KR.mjs";import{b as D,f as L,g as N}from"./chunk-L4WLQYFC.mjs";import{b as S}from"./chunk-NOGQX56R.mjs";import{existsSync as y}from"node:fs";import i from"node:path";import{reportsDirectory as f}from"../browser/shared/paths.mjs";import{idHolder as B,isDocSlug as G,keptName as J,layoutOf as U,listTrash as K}from"../browser/shared/workspace.mjs";import{parentIn as Q}from"../browser/shared/outline.mjs";import{joinDefaultTree as V,joinedLine as W}from"../browser/shared/drafts.mjs";var Y="\u65B0\u6587\u6863";async function M(t,r=f){if(J(t))return`"${t}" is a name the workspace keeps for itself: choose another slug.`;if(y(i.join(U(r).preferencesPage,t)))return`"${t}" is the \u5199\u4F5C\u504F\u597D page's slug: choose another slug.`;if(y(i.join(U(r).customPages,t)))return`"${t}" is a custom page's slug (documents and custom pages share one set of names: gallery page list lists them): choose another slug.`;if(y(i.join(r,t)))return`Document already exists: ${h(i.join(r,t))}`;if((await K(r)).some(s=>s.slug===t))return`"${t}" is the slug of something in the trash: choose another slug.`;if(G(t)){let s=await B(t,r);if(s)return`"${t}" would have the page id (${t.slice(4)}) of "${s}" in this workspace, and two documents may not share an address: choose another slug.`}return null}async function de(t){let{positional:r,options:s,values:X}=L({options:["--no-preview","--no-browser","--first"],values:["--under","--after","--column"],argv:t}),[o,$,x=Y]=r;if(r.length<2||r.length>3||!o||!$?.trim()||!x.trim())throw new D("Name the slug and the title (then a description, if you choose one), each quoted when it has spaces.");N(o);let n=P(X,s,{top:!1}),v=await M(o);v&&(console.error(v),process.exit(1));let _=n.under!==void 0||n.after!==void 0||n.first||n.column!==void 0,d=null;if(_){let e=await w(),a=async(l,z)=>{let p=await E(l,z,e);return p.refused&&(console.error(`${p.refused} Nothing made.`),process.exit(1)),p.slug},c=n.under!==void 0?await a(n.under,"--under"):void 0;if(n.column!==void 0){let l=b(e,n.column);l.refused&&(console.error(`${l.refused} Nothing made.`),process.exit(1)),c=l.top}let m=n.after!==void 0?await a(n.after,"--after"):null;m!==null&&c!==void 0&&Q(e.children,m)!==c&&(console.error(`${g(e,o,"level",{parent:c,after:m})} Nothing made.`),process.exit(1)),d={parent:c,after:m,first:n.first}}try{await S(o,$,x)}catch(e){if(e.code!=="EEXIST")throw e;console.error(await M(o)??`Document already exists: ${h(i.join(f,o))}`),process.exit(1)}if(await import("./chunk-UTKNWYBA.mjs").then(({noteNew:e})=>e(o)),console.log(`Created ${h(i.join(f,o,"doc.html"))} and doc.json`),d){let e=await I(o,d),a=await w();e.ok?console.log(`Placed it ${O(a,e)}.`):(console.log(`\u95EE\u9898\uFF1ANot placed (${g(a,o,e.reason,{...d,message:e.message})}): it is at the top level, last; gallery move ${o} puts it where it goes.`),process.exitCode=1)}let j=W(await V(f,o));j&&console.log(j);for(let e of await A())console.log(e);let k=F(f);k&&console.log(k);let u=await q(o,{skipped:R(s),command:`gallery new ${o}`});console.log(C(u,"replace the starter section with the document's skeleton (each section's heading) as soon as you can outline it, then write it a section at a time, as ordinary HTML, so that the user watches it grow (gallery check fails while the starter section remains).")),console.log(`\u63D0\u793A\uFF1Awhen it is written, hand it in: gallery export ${o}, then gallery qa ${o}`);let T=await H(u,s);T&&console.log(T);for(let e of u)console.log(e)}export{Y as a,M as b,de as c};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{spawn as d}from"node:child_process";import{existsSync as a,readFileSync as c}from"node:fs";import i from"node:path";var m=r=>!["","0",void 0].includes(r),p=(r,n)=>(n.PATH??"").split(i.delimiter).some(e=>e&&a(i.join(e,r))),u=()=>{try{return process.platform==="linux"&&/microsoft/i.test(c("/proc/version","utf8"))}catch{return!1}};function l(r,{platform:n=process.platform,env:e=process.env,wsl:t=u()}={}){let o=encodeURI(r);return m(e.GALLERY_NO_BROWSER)?{skip:"GALLERY_NO_BROWSER is set"}:n==="win32"?{command:i.join(e.SystemRoot||e.windir||"C:\\Windows","System32","rundll32.exe"),args:["url.dll,FileProtocolHandler",o]}:n==="darwin"?{command:"open",args:[o]}:t?{command:"cmd.exe",args:["/c","start",'""',o.replace(/[&^]/g,"^$&")]}:!e.DISPLAY&&!e.WAYLAND_DISPLAY?{skip:"no display here (neither DISPLAY nor WAYLAND_DISPLAY is set)"}:p("xdg-open",e)?{command:"xdg-open",args:[o]}:{skip:"xdg-open is not installed"}}var f="Opened it in the default browser (if that is not Chrome or Edge, open the address there to edit).",y=r=>r.opened?f:`Not opened in a browser: ${r.why}.`;async function x(r,n){let e=l(r,n);return e.skip?{opened:!1,why:e.skip}:new Promise(t=>{let o;try{o=d(e.command,e.args,{detached:!0,stdio:"ignore",windowsHide:!0})}catch(s){return t({opened:!1,why:`${i.basename(e.command)} did not start (${s.code??s.message})`})}o.once("error",s=>t({opened:!1,why:`${i.basename(e.command)} did not start (${s.code??s.message})`})),o.once("spawn",()=>{o.unref(),t({opened:!0})})})}export{y as a,x as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{a}from"./chunk-MTLAOCFF.mjs";import"./chunk-5MVUYRKG.mjs";import"./chunk-MZ66LN3B.mjs";import"./chunk-2MYTOOP6.mjs";import"./chunk-LHGKPMTI.mjs";import"./chunk-R5RERE6G.mjs";import"./chunk-2VNENLER.mjs";import"./chunk-HFTBVEZK.mjs";import"./chunk-TLNJWEFY.mjs";import"./chunk-ZOEJQOKT.mjs";import"./chunk-XNNCQROX.mjs";import"./chunk-LJZIYVNA.mjs";import"./chunk-IA4PSIMD.mjs";import"./chunk-QR4V4A2Z.mjs";import"./chunk-ZTHICSSF.mjs";import"./chunk-TQZU7D7C.mjs";import"./chunk-5IHDLEB4.mjs";import"./chunk-B2EIMERT.mjs";import"./chunk-2OHANJ6Q.mjs";import"./chunk-6N25CJ6Y.mjs";import"./chunk-F4CT35KL.mjs";import"./chunk-BFJGHSQN.mjs";import"./chunk-U5XL7D6A.mjs";import"./chunk-6ILJWFYW.mjs";import"./chunk-VRPVVMRB.mjs";import"./chunk-HYMEEXKN.mjs";import"./chunk-PBMOC7KA.mjs";import"./chunk-BSJKFE7I.mjs";import"./chunk-NOGQX56R.mjs";import"./chunk-UMHUSOPJ.mjs";import"./chunk-W5NPH5UA.mjs";import"./chunk-ECZBLQKK.mjs";import"./chunk-E7656LR7.mjs";import"./chunk-TKWEX4FD.mjs";import"./chunk-A55HN5OK.mjs";import"./chunk-5L7RYZCL.mjs";export{a as startProductionServer};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import"./chunk-5L7RYZCL.mjs";var e=()=>{throw new Error("vite is not in the release: Gallery 0.2.4 calls it only in a source checkout")},t=e,o=e,r=e,n=e,i=new Proxy({},{get:e});export{t as build,o as createServer,i as default,r as defineConfig,n as preview};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{a as Re,c as zn,d as Bn,e as Gn,f as Kn,h as Jn}from"./chunk-5MVUYRKG.mjs";import{b as Pt,c as Hn}from"./chunk-MZ66LN3B.mjs";import{b as Un}from"./chunk-2MYTOOP6.mjs";import{a as Wn}from"./chunk-R5RERE6G.mjs";import{a as Dn}from"./chunk-2VNENLER.mjs";import{h as xn,i as $n}from"./chunk-TLNJWEFY.mjs";import{a as _n,b as jn,c as Pn}from"./chunk-XNNCQROX.mjs";import{a as On,b as Cn}from"./chunk-LJZIYVNA.mjs";import{b as Rn,d as Xe,e as Fn,f as An,g as st,i as Ln,m as In,p as Nn,q as Mn}from"./chunk-QR4V4A2Z.mjs";import{k as it}from"./chunk-TQZU7D7C.mjs";import{e as Sn,f as We,g as tt,h as jt,k as En,p as nt}from"./chunk-B2EIMERT.mjs";import{a as gn,b as et,d as wn,e as yn,f as kn,g as vn}from"./chunk-F4CT35KL.mjs";import{i as ot,j as at,k as rt}from"./chunk-BFJGHSQN.mjs";import{d as Tn}from"./chunk-U5XL7D6A.mjs";import{a as bn}from"./chunk-HYMEEXKN.mjs";import{b as Ot,f as dn,h as Ct,i as fn,k as mn,l as un}from"./chunk-PBMOC7KA.mjs";import{d as rn,l as sn,m as cn,u as ln}from"./chunk-BSJKFE7I.mjs";import{b as pn,c as hn}from"./chunk-NOGQX56R.mjs";import{a as Je}from"./chunk-E7656LR7.mjs";import{g as pe,j as nn,p as on,q as an,w as _t}from"./chunk-TKWEX4FD.mjs";import $t from"node:fs";import Rs from"node:fs/promises";import Fs from"node:http";import{kitPublicDirectory as As,release as Ls,releaseFile as bt,vendorDirectory as Is,workbenchDirectory as Ns}from"../browser/shared/paths.mjs";import{serviceLocation as Ms}from"../browser/shared/service-location.mjs";import{serve as la}from"../browser/shared/http.mjs";import{defaultWorkspace as Ws,ensureWorkspace as Ds,layoutOf as Us}from"../browser/shared/workspace.mjs";import Xn from"node:fs";import Fe from"node:fs/promises";import Oe from"node:path";import pa from"node:http";import eo from"node:net";import{spawn as Yn}from"node:child_process";import{EventEmitter as ha}from"node:events";import ga from"node:os";import{extensionDirectory as Tt,extensionFile as ct,listCapabilities as Ce,setExtensionEnabled as wa}from"../browser/shared/extension-manifest.mjs";import{serviceLocation as Rt}from"../browser/shared/service-location.mjs";import{sendJson as Y,serve as Vn}from"../browser/shared/http.mjs";var lt=new ha,ve=e=>lt.emit("change",e);function ya(e,n=100*1024*1024){if(typeof e!="string"||e.length%4!==0||e.length>Math.ceil(n/3)*4||!/^[A-Za-z0-9+/]*={0,2}$/.test(e))throw new Error("ZIP \u6570\u636E\u65E0\u6548\u6216\u8D85\u8FC7 100MB");let t=Buffer.from(e,"base64");if(t.length>n)throw new Error("\u6269\u5C55 ZIP \u8D85\u8FC7 100MB");return t}var Zn=e=>new Promise(n=>setTimeout(n,e)),ka=()=>new Promise((e,n)=>{let t=eo.createServer();t.once("error",n),t.listen(0,"127.0.0.1",()=>{let{port:a}=t.address();t.close(()=>e(a))})}),Qn=e=>new Promise(n=>{let t=eo.connect(e,"127.0.0.1");t.setTimeout(250),t.once("connect",()=>{t.destroy(),n(!0)}),t.once("error",()=>n(!1)),t.once("timeout",()=>{t.destroy(),n(!1)})}),qn={".js":"text/javascript",".mjs":"text/javascript",".css":"text/css",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif",".woff2":"font/woff2"};function to({edits:e}){let n=new Map,t=new Map,a=Promise.resolve(),f=Promise.resolve(),u=0,d=r=>{u++;let s=a.then(async()=>(await f,r()));return a=s.catch(()=>{}),s.finally(()=>{u--})},g=!1,c=!1,y=async r=>{let s=n.get(r);s&&(await N(s),n.get(r)===s&&n.delete(r),ve(r))},j=setInterval(()=>{if(g||u||c||!n.size)return;c=!0;let r=[...n.values()];f=Ce({ids:r.map(s=>s.id)}).then(async s=>{if(!g)for(let w of r){if(n.get(w.id)!==w)continue;let F=s.find(W=>W.id===w.id);!F?.enabled||F.manifest.revision!==w.revision?(await y(w.id),F?.enabled&&F.manifest.server&&!g&&!u&&await i(F).catch(()=>{})):w.state==="starting"&&w.child?.exitCode===null&&!w.child.signalCode&&await Qn(w.port)&&(w.state="running",ve(w.id))}}).catch(()=>{}).finally(()=>{c=!1})},1e3);j.unref();function N(r){return r.stopping??=_(r)}async function _(r){r.stopped=!0,clearTimeout(r.timer),await r.starting?.catch(()=>{});let s=r.child;s&&s.exitCode===null&&s.signalCode===null&&(process.platform==="win32"?await new Promise(w=>{let F=Yn("taskkill",["/pid",String(s.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"});F.once("error",w),F.once("exit",w)}):(s.kill("SIGTERM"),await Promise.race([new Promise(w=>s.once("exit",w)),Zn(1500)]),s.exitCode===null&&s.kill("SIGKILL"))),r.log?.end()}async function L(r){if(g||r.stopped)return;let s=(await Ce({ids:[r.id]}))[0];if(!s?.enabled||s.manifest.revision!==r.revision){r.stopped=!0,r.log.end(),n.get(r.id)===r&&n.delete(r.id);return}if(r.port=await ka(),g||r.stopped)return;let[w,...F]=s.manifest.server.command,W=Yn(w==="node"?process.execPath:w,F,{cwd:s.folder,windowsHide:!0,shell:!1,env:{...process.env,PORT:String(r.port),GALLERY_EXTENSION_PORT:String(r.port),GALLERY_EXTENSION_HOST:"127.0.0.1",GALLERY_EXTENSION_ID:r.id},stdio:["ignore","pipe","pipe"]});r.child=W,r.state="starting",r.retryAt=null,ve(r.id);let v=Date.now();W.stdout?.pipe(r.log,{end:!1}),W.stderr?.pipe(r.log,{end:!1});let z=!1,G=(B,h=null)=>{if(z||(z=!0,r.log.write(`[${new Date().toISOString()}] ${B?.message??"Backend exited"}
|
|
3
|
+
`),g||r.stopped))return;r.exitCode=h,r.state="retrying",r.failures=Date.now()-v>3e4?0:r.failures+1;let S=Math.min(3e4,500*2**Math.min(r.failures,6));r.retryAt=Date.now()+S,ve(r.id),r.timer=setTimeout(()=>{r.starting=L(r).finally(()=>{r.starting=null}),r.starting.catch(M=>r.log.write(M.message+`
|
|
4
|
+
`))},S),r.timer.unref()};W.once("error",G),W.once("exit",B=>G(null,B))}async function i(r,s=Date.now()+1e4){if(u||g)throw new Error("\u6269\u5C55\u6B63\u5728\u66F4\u65B0\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");let w=n.get(r.id);if(w&&w.revision!==r.manifest.revision&&(await N(w),n.delete(r.id),w=null),u||g)throw new Error("\u6269\u5C55\u6B63\u5728\u66F4\u65B0\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");if(!w){let F=Oe.join(Rt().data,"logs","extensions",`${r.id}.log`);Xn.mkdirSync(Oe.dirname(F),{recursive:!0}),w={id:r.id,revision:r.manifest.revision,failures:0,stopped:!1,state:"starting",exitCode:null,retryAt:null,log:Xn.createWriteStream(F,{flags:"a"})},w.log.on("error",()=>{}),n.set(r.id,w),w.starting=L(w).finally(()=>{w.starting=null})}for(await w.starting;!g&&!w.stopped&&Date.now()<s;){if(w.child?.exitCode===null&&!w.child.signalCode&&await Qn(w.port))return w.state!=="running"&&(w.state="running",ve(w.id)),w.port;await Zn(100)}if(w.stopped&&!g&&!u&&Date.now()<s){let F=(await Ce({ids:[r.id]}))[0];if(F?.enabled&&F.manifest.server)return i(F,s)}throw new Error("\u6269\u5C55\u540E\u53F0\u6682\u672A\u5C31\u7EEA\uFF0C\u8BF7\u67E5\u770B\u6269\u5C55\u65E5\u5FD7")}async function P(r,s){let w=new URL(r.url,"http://localhost");if(w.pathname==="/__gallery/reveal"){let W=await e.check(r,1024);if(W.error)return Y(s,...W.error),!0;try{let{id:v,kind:z}=W.body,G=Tt(v),B=await Fe.lstat(G);if(!B.isDirectory()||B.isSymbolicLink())throw new Error("\u6269\u5C55\u6587\u4EF6\u5939\u4E0D\u6B63\u786E");let h=z==="extension-agent"?(await Ce({ids:[v]}))[0]:null,S=z==="extension"?G:z==="sidebar"?await ct(G,"sidebar.json"):z==="extension-agent"&&h?.manifest?.agent?await ct(G,h.manifest.agent):z==="extension-log"?Oe.join(Rt().data,"logs","extensions",`${v}.log`):null;if(!S||!await Fe.stat(S).catch(()=>null))throw new Error("\u627E\u4E0D\u5230\u8FD9\u4E2A\u6587\u4EF6\u6216\u6587\u4EF6\u5939");Y(s,200,{ok:!0,path:S,...await _n(S)})}catch(v){Y(s,400,{ok:!1,message:v.message})}return!0}if(!w.pathname.startsWith("/__gallery/extensions"))return!1;let F=`127.0.0.1:${r.socket.localPort}`;if(r.headers.host!==F)return Y(s,403,{ok:!1,reason:"host"}),!0;try{if(w.pathname==="/__gallery/extensions"&&r.method==="GET"){let m,x;do m=a,await m,x=await Ce();while(m!==a);return Y(s,200,{ok:!0,extensions:x.map($=>{let A=n.get($.id),E=t.get($.id);return{...$,workbenchError:E&&E.revision===$.manifest?.revision?E.message:null,backend:{state:A?.state??"idle",exitCode:A?.exitCode??null,retryAt:A?.retryAt??null,log:Oe.join(Rt().data,"logs","extensions",`${$.id}.log`)}}})}),!0}if(w.pathname==="/__gallery/extensions/workbench-error"&&r.method==="POST"){let m=await e.check(r,16384);if(m.error)return Y(s,...m.error),!0;let{id:x,revision:$,message:A}=m.body;if(typeof x!="string"||typeof $!="string"||typeof A!="string")throw new Error("\u6269\u5C55\u9519\u8BEF\u8BB0\u5F55\u65E0\u6548");let E=(await Ce({ids:[x]}))[0];if(!E?.enabled||$!==E.manifest?.revision)return Y(s,200,{ok:!0}),!0;let C=t.get(x);return A?t.set(x,{revision:$,message:A.slice(0,12e3)}):t.delete(x),C?.message!==(A||void 0)&&ve(x),Y(s,200,{ok:!0}),!0}let W=/^\/__gallery\/extensions\/(install|remove)$/.exec(w.pathname)?.[1];if(W){let m=await e.check(r,W==="install"?146800640:65536);if(m.error)Y(s,...m.error);else if(W==="install"){let x=await d(async()=>{let $=m.body;if(typeof $.path=="string"==(typeof $.zip=="string"))throw new Error("\u8BF7\u9009\u62E9\u6269\u5C55\u8DEF\u5F84\u6216 ZIP");if($.path)return Pt($.path,{inService:!0,beforeReplace:y,enable:$.enable??!1});let A=ya($.zip),E=await Fe.mkdtemp(Oe.join(ga.tmpdir(),"gallery-extension-")),C=typeof $.filename=="string"&&/^[a-z0-9-]+\.zip$/i.test($.filename)?$.filename:"extension.zip";try{let U=Oe.join(E,C);return await Fe.writeFile(U,A),await Pt(U,{inService:!0,beforeReplace:y,enable:$.enable??!1})}finally{await Fe.rm(E,{recursive:!0,force:!0})}});ve(x.id),Y(s,200,{ok:!0,installed:x})}else await d(()=>Hn(m.body.id,{inService:!0,beforeReplace:y})),ve(m.body.id),Y(s,200,{ok:!0});return!0}if(w.pathname==="/__gallery/extensions"&&r.method==="POST"){let m=await e.check(r,65536);return m.error?Y(s,...m.error):(await d(async()=>{await wa(m.body),m.body.enabled||await y(m.body.id)}),ve(m.body.id),Y(s,200,{ok:!0})),!0}let v=/^\/__gallery\/extensions\/([^/]+)\/icon$/.exec(w.pathname);if(v){let m=(await Ce({ids:[v[1]]}))[0],x=m?.manifest?.icon;if(!x||!/\.(?:png|jpe?g|webp|gif|svg)$/i.test(x))return Y(s,404,{ok:!1}),!0;let $=await ct(Tt(m.id),x);return Vn(s,{type:qn[Oe.extname($).toLowerCase()]??"application/octet-stream",headers:{"X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"},body:await Fe.readFile($)}),!0}let z=/^\/__gallery\/extensions\/([^/]+)\/(files|api)\/(.*)$/.exec(w.pathname);if(!z)return Y(s,404,{ok:!1}),!0;if(u||g)return Y(s,503,{ok:!1,message:"\u6269\u5C55\u6B63\u5728\u66F4\u65B0\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5"}),!0;let[,G,B,h]=z,S=(await Ce({ids:[G]}))[0];if(!S?.enabled)return Y(s,403,{ok:!1,reason:"disabled"}),!0;if(B==="files"){if(r.method!=="GET"&&r.method!=="HEAD")return Y(s,405,{ok:!1}),!0;let m=await ct(Tt(G),decodeURIComponent(h).replace(/^@revision\/[a-f0-9]+\//,""));return Vn(s,{type:qn[Oe.extname(m)]??"application/octet-stream",headers:{"X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"},body:r.method==="HEAD"?void 0:await Fe.readFile(m)}),!0}let M={...r.headers};if(!M.origin&&["GET","HEAD"].includes(r.method))try{M.origin=new URL(M.referer).origin}catch{}let O=e.checkHeaders({method:"POST",headers:M,socket:r.socket});if(O)return Y(s,...O),!0;if(!S.manifest.server)return Y(s,404,{ok:!1,reason:"backend"}),!0;let J=await i(S),re={...r.headers,host:`127.0.0.1:${J}`};delete re["x-gallery-token"],delete re.cookie;let k=pa.request({host:"127.0.0.1",port:J,method:r.method,path:"/"+h+w.search,headers:re},m=>{let x={...m.headers};delete x["access-control-allow-origin"],delete x["set-cookie"],s.writeHead(m.statusCode,x),m.pipe(s)});return k.setTimeout(S.manifest.server.timeout??3e4,()=>k.destroy(new Error("\u6269\u5C55\u540E\u53F0\u8BF7\u6C42\u8D85\u65F6"))),k.once("error",m=>{s.headersSent?s.destroy():Y(s,502,{ok:!1,message:m.message})}),s.once("close",()=>k.destroy()),r.pipe(k),!0}catch(W){return Y(s,400,{ok:!1,message:W.message}),!0}}return{handle:P,async close(){g=!0,clearInterval(j),await a,await f,await Promise.all([...n.values()].map(N)),n.clear()}}}import xt from"node:fs";import{serviceLocation as ks}from"../browser/shared/service-location.mjs";import ge from"node:fs/promises";import K from"node:path";import{assetFile as va,referencedFile as no}from"../browser/shared/media.mjs";import{pageAssetAddress as xa}from"../browser/shared/pages.mjs";function Ft(e,n){if(!/assets\//i.test(e))return e;let t=at(e,a=>no(a)!==null);return ot(e,rt(t,a=>{let f=no(a.value);return va(f)?`${xa(n,f)}${/[?#].*$/.exec(a.value.trim())?.[0]??""}`:null}))}function oo(e,{reportsDirectory:n,kit:t,slug:a=null}={}){let{html:f,packages:u}=An(a?Ft(e,a):e,{reportsDirectory:n,kit:t,page:!0});return{html:f,packages:u}}import{Z as $a}from"../browser/shared/layers.mjs";import{escapeMarkup as At}from"../browser/shared/escape.mjs";import{layoutNotesScript as ba}from"../browser/shared/qa-levels.mjs";var dt=30,Sa=`
|
|
5
|
+
[data-doc-dev].doc-checks { position: fixed; z-index: ${$a.checks}; left: 12px; bottom: 12px; max-width: min(520px, calc(100vw - 24px));
|
|
6
|
+
font: 13px/1.5 system-ui, sans-serif; color: light-dark(#37352f, #e3e2e0); }
|
|
7
|
+
[data-doc-dev].doc-checks[hidden] { display: none; }
|
|
8
|
+
[data-doc-dev].doc-checks > summary { display: inline-flex; gap: 6px; align-items: center; padding: 4px 10px; border-radius: 999px; cursor: pointer;
|
|
9
|
+
list-style: none; color: light-dark(#a1352b, #f19c92); background: light-dark(#fce9e7, #3b2321);
|
|
10
|
+
box-shadow: 0 0 0 1px light-dark(rgb(161 53 43 / 18%), rgb(241 156 146 / 22%)); user-select: none; }
|
|
11
|
+
[data-doc-dev].doc-checks > summary::-webkit-details-marker { display: none; }
|
|
12
|
+
[data-doc-dev].doc-checks > div { margin-top: 6px; padding: 8px 12px; max-height: 50vh; overflow: auto; border-radius: 10px;
|
|
13
|
+
background: light-dark(#ffffff, #252525); box-shadow: 0 0 0 1px light-dark(rgb(42 28 0 / 7%), #383836), 0 20px 24px light-dark(rgb(25 25 25 / 5%), rgb(0 0 0 / 20%)); }
|
|
14
|
+
[data-doc-dev].doc-checks ul { margin: 0; padding-left: 18px; }
|
|
15
|
+
[data-doc-dev].doc-checks li { margin: 2px 0; overflow-wrap: anywhere; }
|
|
16
|
+
[data-doc-dev].doc-checks p { margin: 6px 0 0; color: light-dark(#787774, #9b9a97); }
|
|
17
|
+
[data-doc-dev].doc-checks .doc-checks-live:not(:first-child) { margin-top: 8px; }
|
|
18
|
+
@media print { [data-doc-dev].doc-checks { display: none; } }`,Ea=`(() => {
|
|
19
|
+
document.currentScript.remove();
|
|
20
|
+
${ba()}
|
|
21
|
+
const panel = document.querySelector("details.doc-checks[data-doc-dev]");
|
|
22
|
+
if (!panel) return;
|
|
23
|
+
const failures = Number(panel.dataset.failures) || 0;
|
|
24
|
+
const live = panel.querySelector(".doc-checks-live ul");
|
|
25
|
+
// The note's words in the UI's language (the root's data-ge-language).
|
|
26
|
+
const english = document.documentElement.getAttribute("data-ge-language") === "en";
|
|
27
|
+
const WORDS = english
|
|
28
|
+
? { card: "Chart card", table: "Table", named: (kind, name) => kind + " \u201C" + name + "\u201D", first: (name) => "Table (first column \u201C" + name + "\u201D)", colon: ": ",
|
|
29
|
+
failing: (count) => "Checks failed \xB7 " + count, more: (count) => count + " more", all: (slug) => "gallery check " + slug + " runs every check (TypeScript too)." }
|
|
30
|
+
: { card: "\u56FE\u8868\u5361\u7247", table: "\u8868\u683C", named: (kind, name) => kind + "\u300C" + name + "\u300D", first: (name) => "\u8868\u683C\uFF08\u9996\u5217\u300C" + name + "\u300D\uFF09", colon: "\uFF1A",
|
|
31
|
+
failing: (count) => "\u68C0\u67E5\u672A\u901A\u8FC7 \xB7 " + count + " \u9879", more: (count) => "\u8FD8\u6709 " + count + " \u9879", all: (slug) => "gallery check " + slug + " \u8DD1\u5168\u90E8\u68C0\u67E5\uFF08\u542B TypeScript\uFF09\u3002" };
|
|
32
|
+
const more = panel.querySelector("[data-more]");
|
|
33
|
+
if (more) more.textContent = WORDS.more(more.dataset.more);
|
|
34
|
+
const all = panel.querySelector("[data-all]");
|
|
35
|
+
if (all) all.textContent = WORDS.all(all.dataset.all);
|
|
36
|
+
const tidy = (node) => (node?.textContent ?? "").replace(/\\s+/g, " ").trim().slice(0, 40);
|
|
37
|
+
const what = (host) => {
|
|
38
|
+
const card = host.closest("figure");
|
|
39
|
+
const title = card?.querySelector(":scope > h3, :scope > figcaption");
|
|
40
|
+
const table = host.closest(".doc-table-wrap, table");
|
|
41
|
+
const caption = table?.querySelector("caption");
|
|
42
|
+
const header = table?.querySelector("th");
|
|
43
|
+
return title ? WORDS.named(WORDS.card, tidy(title)) : card ? WORDS.card : caption && tidy(caption) ? WORDS.named(WORDS.table, tidy(caption)) : header ? WORDS.first(tidy(header)) : host.localName;
|
|
44
|
+
};
|
|
45
|
+
// A chart that drew nothing says why in its card (the kit's line, in the same language): that line, else the note in words.
|
|
46
|
+
const said = (host, name, note) => (name === "data-missing" && tidy(host.querySelector(".doc-chart-message"))) || noteInWords(note, { english });
|
|
47
|
+
let shown = "";
|
|
48
|
+
let frame = 0;
|
|
49
|
+
const draw = () => {
|
|
50
|
+
frame = 0;
|
|
51
|
+
const notes = [...document.querySelectorAll("[data-doc-layout]")].filter((host) => !host.closest("[data-doc-dev]"))
|
|
52
|
+
.flatMap((host) => layoutNotesOf(host.getAttribute("data-doc-layout"), document.documentElement.clientWidth)
|
|
53
|
+
.filter(({ level }) => level === "fail")
|
|
54
|
+
.map(({ note, name }) => ({ line: what(host) + WORDS.colon + said(host, name, note), note })));
|
|
55
|
+
const key = notes.map(({ line }) => line).join("\\n");
|
|
56
|
+
if (key === shown) return;
|
|
57
|
+
shown = key;
|
|
58
|
+
live.replaceChildren(...notes.map(({ line, note }) => Object.assign(document.createElement("li"), { textContent: line, title: note })));
|
|
59
|
+
live.parentElement.hidden = notes.length === 0;
|
|
60
|
+
const failing = failures + notes.length;
|
|
61
|
+
panel.querySelector("summary").textContent = failing ? WORDS.failing(failing) : "";
|
|
62
|
+
panel.hidden = failing === 0;
|
|
63
|
+
};
|
|
64
|
+
const later = (records) => {
|
|
65
|
+
if (!globalThis.document?.defaultView) return; // the page is gone
|
|
66
|
+
if (!frame && records.some((record) => !record.target.closest?.("[data-doc-dev]"))) frame = requestAnimationFrame(draw);
|
|
67
|
+
};
|
|
68
|
+
new MutationObserver(later).observe(document.documentElement, { subtree: true, childList: true, attributes: true, attributeFilter: ["data-doc-layout"] });
|
|
69
|
+
addEventListener("resize", () => { if (!frame) frame = requestAnimationFrame(draw); });
|
|
70
|
+
draw();
|
|
71
|
+
})();`;function ao(e,n,t={},{directory:a}={}){let f=Ln({slug:e,html:n,metadata:t,...a?{directory:a}:{}}),u=f.slice(0,dt).map(y=>`<li>${At(y)}</li>`).join(""),d=f.length>dt?`<p data-more="${f.length-dt}">\u8FD8\u6709 ${f.length-dt} \u9879</p>`:"",g=f.length?`<ul>${u}</ul>${d}<p data-all="${At(e)}">gallery check ${At(e)} \u8DD1\u5168\u90E8\u68C0\u67E5\uFF08\u542B TypeScript\uFF09\u3002</p>`:"";return`<details class="doc-checks" data-doc-dev data-failures="${f.length}"${f.length?"":" hidden"}><summary>${f.length?`\u68C0\u67E5\u672A\u901A\u8FC7 \xB7 ${f.length} \u9879`:""}</summary><div>${g}<div class="doc-checks-live" hidden><ul></ul></div></div><style>${Sa}</style></details>
|
|
72
|
+
<script data-doc-dev>${Ea}</script>`}import{browserDirectory as Nr,kitSourceDirectory as Qo,release as Mr,reportsDirectory as Wr}from"../browser/shared/paths.mjs";import{FRAMED_BY as Dr,sendJson as No,serve as Yt,serveFound as He}from"../browser/shared/http.mjs";import{languageScript as Mo}from"../browser/shared/i18n/index.mjs";import{announcePreviewServer as Ur,galleryVersion as Hr,sameDirectory as zr}from"../browser/shared/preview-server.mjs";import{registerQuietly as Br}from"../browser/shared/workspace-registry.mjs";import{lookWord as Wo}from"../browser/shared/document-look.mjs";import{documentLook as Do,ownLookAt as Gr}from"../browser/shared/workspace-look.mjs";import{slugPattern as Vt}from"../browser/shared/reports.mjs";import{ATTRIBUTE as yt,PACKAGE_ID as Kr}from"../browser/shared/components/installed.mjs";import{COMPONENTS_FOLDER as Uo,DOCUMENT_FOLDERS as Ho,EXTENSIONS_FOLDER as Jr,PAGES_FOLDER as Xr,WORKSPACE_FILE as kt,defaultWorkspace as Ae,documentDirectory as ht,documentFiles as Yr,isDocumentFile as Vr,isDocumentSource as zo,isSlugName as qo,layoutOf as ze,listDocumentSlugs as Zr}from"../browser/shared/workspace.mjs";import{PAGE_FILES as Bo,homeCardsNew as Qr,isBlankPage as qr,isPageFile as es,pageFiles as Go,pageHintShown as ts,pageMetaNow as ns,pageVersion as Ko}from"../browser/shared/pages.mjs";import{LINK_FILE as os}from"../browser/shared/web-links.mjs";import{SIDEBAR_FILE as gt}from"../browser/shared/extension-sidebar.mjs";import{extensionColumnIds as Jo}from"../browser/shared/extensions.mjs";import{isExtensionId as as}from"../browser/shared/outline-shape.mjs";import{listPreferenceDocuments as ro,changePreferenceDocuments as _a,preferenceFile as so,GENERAL_PREFERENCE as Oa}from"../browser/shared/preference-documents.mjs";import{createHash as Ca,randomBytes as ja}from"node:crypto";import ee from"node:fs";import Lt from"node:os";import de from"node:path";import{Transform as Pa}from"node:stream";import{pipeline as Ta}from"node:stream/promises";import{writeAtomic as It}from"../browser/shared/files.mjs";import{sendJson as Z}from"../browser/shared/http.mjs";import{said as Nt,saying as Ra}from"../browser/shared/i18n/index.mjs";import{IMPORT_LIMIT as io}from"../browser/shared/import-types.mjs";import{mediaUrl as Fa}from"../browser/shared/media.mjs";import{fullAddress as Aa}from"../browser/shared/page-address.mjs";import{documentLinks as La,slugPattern as Mt}from"../browser/shared/reports.mjs";import{documentDirectory as Ia,documentFiles as co,newDocSlug as Na,pageSlug as Ma}from"../browser/shared/workspace.mjs";import{saysAnything as Wa,unshownLines as Da}from"../browser/shared/writing-preferences.mjs";var Ua=3600*1e3,Wt=new Set,lo=!1,Ha=e=>{Wt.add(e),!lo&&(lo=!0,process.once("exit",()=>{for(let n of Wt)try{ee.rmSync(n,{recursive:!0,force:!0})}catch{}}))},za=/^u-[a-f0-9]{16}$/;function fo({edits:e,workspace:n,reports:t,reportsDirectory:a,offline:f}){let u=null,d=()=>u??=ee.promises.mkdtemp(de.join(Lt.tmpdir(),"gallery-uploads-")).then(k=>(Ha(k),k)),g=new Map,c=(k,m,x)=>[k,{ok:!1,reason:m,...Ra(x)}],y=k=>ee.promises.access(k).then(()=>!0,()=>!1),j=k=>Ia(k,a),N=k=>co(j(k)),_=Kn(a);function L(k){if(k.method!=="POST")return[405,{ok:!1,reason:"method"}];let m=k.headers.host??"",x=k.socket.localPort;return m!==`127.0.0.1:${x}`&&m!==`localhost:${x}`?[403,{ok:!1,reason:"host"}]:k.headers.origin!==`http://${m}`?[403,{ok:!1,reason:"origin"}]:k.headers["x-gallery-token"]!==e.token?[403,{ok:!1,reason:"token"}]:/^application\/octet-stream\b/i.test(k.headers["content-type"]??"")?Number(k.headers["content-length"]??0)>io?c(413,"size","\u6587\u4EF6\u592A\u5927\uFF08\u6700\u591A 5GB\uFF09"):null:[415,{ok:!1,reason:"type"}]}async function i(){for(let[k,m]of g)Date.now()-m.at<Ua||(g.delete(k),await ee.promises.rm(m.file,{force:!0}).catch(()=>{}))}async function P(k,m){let x=L(k);if(x)return k.resume(),Z(m,...x);let $=new URL(k.url,"http://localhost").searchParams.get("name")?.replace(/[\u0000-\u001f]/g,"").trim()??"";if(!$||$.length>255)return k.resume(),Z(m,...c(400,"name","\u6587\u4EF6\u540D\u4E0D\u5BF9"));await i();let A=`u-${ja(8).toString("hex")}`,E=de.join(await d(),A),C=0,U=new Pa({transform(H,oe,X){C+=H.length,X(C>io?Object.assign(new Error("too-large"),{reason:"size"}):null,H)}});try{await Ta(k,U,ee.createWriteStream(E))}catch(H){return await ee.promises.rm(E,{force:!0}).catch(()=>{}),H.reason==="size"?Z(m,...c(413,"size","\u6587\u4EF6\u592A\u5927\uFF08\u6700\u591A 5GB\uFF09")):Z(m,...c(400,"body","\u6587\u4EF6\u6CA1\u6709\u4F20\u5B8C"))}return g.set(A,{file:E,name:$,at:Date.now()}),Z(m,200,{ok:!0,id:A})}async function r(k,m){let x=await e.check(k);if(x.error)return Z(m,...x.error);let{slug:$,options:A}=x.body??{};if(typeof $!="string"||!Mt.test($)||!await y(N($).html))return Z(m,...c(404,"missing","\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"));if(!zn(A))return Z(m,...c(400,"options","\u5BFC\u51FA\u9009\u9879\u4E0D\u5BF9"));try{let E=await f(),C=new Map,U=D=>(C.has(D)||C.set(D,e.handIn(D,{reader:!0}).then(V=>{if(!V.ok)throw Object.assign(new Error(V.message??V.reason),{reason:V.reason});if(V.repeated.length)throw Object.assign(new Error("check"),{reason:"check",slug:D,failures:st(V.repeated)})})),C.get(D)),H=new Map,oe=Gn({reportsDirectory:a,titleOf:_,outline:()=>n.outline(),render:E,format:A.format,ready:U,made:H}),{name:X,type:Q,data:te}=await Bn($,A,oe);H.size&&await(await it([...H.keys()],a)).keep([...H.keys()],H),m.writeHead(200,{"Content-Type":Q,"Content-Length":te.length,"Content-Disposition":`attachment; filename*=UTF-8''${encodeURIComponent(X)}`,"X-File-Name":encodeURIComponent(X),"Cache-Control":"no-store"}),m.end(te)}catch(E){if(E.reason==="check"){let C=await _(E.slug),U=E.component?Nt("\u300C{0}\u300D\u91CC\u7684\u7EC4\u4EF6 {1} \u6709\u9519\u8BEF\uFF0C\u6CA1\u6709\u751F\u6210\u6587\u4EF6\uFF1A\u53EF\u4EE5\u8BA9 AI \u68C0\u67E5\u8FD9\u4EFD\u6587\u6863\u5E76\u4FEE\u597D",C,E.component):E.failures.length>1?Nt("\u300C{0}\u300D\u6CA1\u6709\u901A\u8FC7\u5BFC\u51FA\u524D\u7684\u68C0\u67E5\uFF0C\u6CA1\u6709\u751F\u6210\u6587\u4EF6\uFF1A{1}\uFF08\u5171 {2} \u5904\uFF1A\u53EF\u4EE5\u8BA9 AI \u68C0\u67E5\u8FD9\u4EFD\u6587\u6863\uFF0C\u5217\u51FA\u5168\u90E8\u5E76\u4FEE\u597D\uFF09",C,E.failures[0],E.failures.length):Nt("\u300C{0}\u300D\u6CA1\u6709\u901A\u8FC7\u5BFC\u51FA\u524D\u7684\u68C0\u67E5\uFF0C\u6CA1\u6709\u751F\u6210\u6587\u4EF6\uFF1A{1}",C,E.failures[0]);return Z(m,...c(422,"check",U))}Z(m,...c(E.reason==="browser"?422:E.reason==="busy"?409:E.reason==="missing"?404:500,E.reason??"export",E))}}async function s(k,m){let x=await e.check(k);if(x.error)return Z(m,...x.error);let{slug:$}=x.body??{},A=(await e.readTaken($,{wait:0}))?.text??null;if(A===null)return Z(m,...c(404,"missing","\u627E\u4E0D\u5230\u8FD9\u4EFD\u6587\u6863"));let E=`http://${k.headers.host}`,{named:C}=await La(a),U=Rn(Xe(A,{slug:$,mode:"words",reportsDirectory:a}),$,Q=>Q.slug&&Aa(E,Q,C),C),{text:H,files:oe}=await Re("markdown",{source:U,title:await _($),pictures:!1}),X=H.replace(/\u0000F(\d+)\u0000/g,(Q,te)=>{let{src:D,kind:V}=oe[Number(te)];return encodeURI(`${E}${Fa(V==="image"?"asset":"file",$,D)}`)});return Z(m,200,{ok:!0,text:X})}let w=async k=>{let m=await e.readTaken(k,{wait:0});return{source:m?.text??"",version:m?.version??null}},F=async(k,m=null)=>{let{source:x,version:$}=m??await w(k),A=await v(k),E=A?.preference&&A.title||"\u5199\u4F5C\u504F\u597D",{text:C,files:U}=await Re("markdown",{source:x,title:E,pictures:!1}),H=C.split(`
|
|
73
|
+
`).slice(1).join(`
|
|
74
|
+
`).replace(/^[\s>]*(?:```.*|\d+\.|- \[x\])/gm,"").replace(/<\/?aside>/g,"");if(!/[\p{L}\p{N}]|\u0000F\d+\u0000/u.test(H))return{markdown:`# ${E}
|
|
75
|
+
`,empty:!0,version:$};let oe=de.relative(de.join(a,"preferences"),j(k)).split(de.sep).join("/");return{markdown:`${C.replace(/\u0000F(\d+)\u0000/g,(X,Q)=>encodeURI(`${oe}/${U[Number(Q)].src}`))}
|
|
76
|
+
`,empty:!1,version:$}},W=k=>N(k).json,v=async k=>{try{let m=JSON.parse(await ee.promises.readFile(W(k),"utf8"));return m&&typeof m=="object"?m:null}catch{return null}},z=k=>Ca("sha256").update(k).digest("hex").slice(0,16);async function G(k,m,x,$){let A=await v(k);if(!A||x===null)return;let{synced:E,...C}=A,U={file:z(m),page:x,unshown:$},H=A.madeSame;E===void 0&&H?.file===U.file&&H?.page===U.page&&JSON.stringify(H?.unshown)===JSON.stringify($)||await It(W(k),`${JSON.stringify({...C,madeSame:U},null,2)}
|
|
77
|
+
`)}async function B(k,m){let x=await ee.promises.mkdtemp(de.join(Lt.tmpdir(),"gallery-preferences-"));try{let A=(await Re("import",{uploads:[{file:m,name:"preferences.md"}],scratch:x})).pages[0]??{nodes:[],raws:[],files:[],icon:null,lang:null},E=j(k),C=await v(k)??{},U=co(E).html,H=await ee.promises.readFile(U,"utf8").catch(()=>""),oe=/<html\b[^>]*\slang="([^"]*)"/i.exec(H)?.[1]??null,{html:X}=await hn(k,C.title||"\u5199\u4F5C\u504F\u597D",C.description||"",{blank:!0,lang:oe}),Q=typeof C.icon=="string"&&C.icon?C.icon:null,te=await Re("fill",{source:X,nodes:A.nodes,icon:Q,raws:A.raws,lang:A.lang});A.files.length&&await ee.promises.mkdir(de.join(E,"assets"),{recursive:!0});for(let{from:V,name:q}of A.files){let me=de.join(E,"assets",q);await y(me)||await ee.promises.copyFile(V,me)}let D=await ee.promises.readFile(U,"utf8").catch(()=>null);D!==null&&e.keepVersion?.(k,D),await It(U,nt(te))}finally{await ee.promises.rm(x,{recursive:!0,force:!0}).catch(()=>{})}}async function h(k,m){let x=await e.check(k);if(x.error)return Z(m,...x.error);let $=x.body?.opening===!0,A=await ro(),E=x.body?.preference??A[0]?.id,C=x.body?.slug??await Ma(a,E);if(!C)return Z(m,...c(404,"missing","\u8FD8\u6CA1\u6709\u5199\u4F5C\u504F\u597D"));let U=null,H=E,oe=(X,Q)=>[200,{ok:!0,path:de.resolve(U),remade:X,unshown:Q,...x.body?.slug?{preference:H}:{}}];return e.respond(async()=>{let X,Q=typeof C=="string"&&Mt.test(C)?await v(C):null;if(!Q?.instructions||Q.preference===null)return c(404,"missing","\u627E\u4E0D\u5230\u5199\u4F5C\u504F\u597D");H=Q.preference??Oa,U=await so(H),X=await ee.promises.readFile(U,"utf8");let te=await w(C),D=(await v(C))?.madeSame??null,V=D===null||D.page===te.version,q=D!==null&&V&&D.file===z(X);if($&&q&&Array.isArray(D.unshown))return oe(!1,D.unshown);let[me,Ie,Ne,we]=[X,"",te.version,!1];if($&&!V)await B(C,U),{markdown:Ie,version:Ne}=await F(C),we=!0;else{let ye=await F(C,te),Pe=X.trim()===ye.markdown.trim()||ye.empty&&!Wa(X);if(Ie=ye.markdown,$)!Pe&&!q&&(await B(C,U),{markdown:Ie,version:Ne}=await F(C),we=!0);else{if(D&&D.file!==z(X)&&!Pe)return c(409,"stale","\u504F\u597D\u6587\u4EF6\u5DF2\u88AB\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u540E\u518D\u8BD5");let Te=(await v(C))?.title;if(Te&&Te!==de.basename(H,".md")){let Me=(await ro()).find(St=>St.id===H),Ge=await _a({action:"rename",id:H,name:Te,revision:Me?.revision});H=Ge.selected,U=await so(Ge.selected)}Pe||(await It(U,ye.markdown),me=ye.markdown)}}let Ze=Da(me,Ie);return await G(C,me,Ne,Ze),oe(we,Ze)})(k,m)}async function S(k,m){let x=await e.check(k);if(x.error)return Z(m,...x.error);let{uploads:$,parent:A="",from:E,language:C}=x.body??{},U={said:typeof E=="string"&&E.includes("{0}")&&E.length<=60?E:"\u5BFC\u5165\u81EA {0}",lang:C==="en"?"en":null};if(!Array.isArray($)||$.length===0||$.length>1e3||!$.every(D=>typeof D=="string"&&za.test(D)))return Z(m,...c(400,"body"));let H=$.map(D=>g.get(D)).filter(Boolean);if(H.length!==$.length)return Z(m,...c(410,"gone","\u4E0A\u4F20\u7684\u6587\u4EF6\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u5BFC\u5165"));for(let D of $)g.delete(D);let oe=typeof A=="string"&&Mt.test(A)&&await y(de.join(a,A))?A:"",X=await ee.promises.mkdtemp(de.join(Lt.tmpdir(),"gallery-import-")),Q=()=>Promise.all([ee.promises.rm(X,{recursive:!0,force:!0}),...H.map(({file:D})=>ee.promises.rm(D,{force:!0}))]).catch(()=>{}),te;try{te=await Re("import",{uploads:H.map(({file:D,name:V})=>({file:D,name:V})),scratch:X})}catch(D){return await Q(),Z(m,...c(500,"convert",D))}return e.respond(async()=>{try{let{made:D,top:V}=await Wn(te.pages,{create:t.create,slugOf:()=>Na(a),folderOf:j,fill:q=>Re("fill",q),place:n.place,under:oe,...U});return[200,{ok:!0,pages:D.length,reports:V,skipped:te.skipped,missing:M(te.pages)}]}finally{await Q()}})(k,m)}let M=k=>[...new Set(k.flatMap(function m(x){return[...(x.notes??[]).filter($=>$.kind==="picture-missing").map($=>$.name),...x.children.flatMap(m)]}))],O={export:r,markdown:s,upload:P,import:S,preferences:h};function J(k,m,x){return Object.hasOwn(O,x)?O[x](k,m).catch($=>{m.headersSent||Z(m,...c(500,"transfer",$))}):Z(m,404,{ok:!1,reason:"unknown"})}async function re(){let k=u;u=null,g.clear();let m=await k?.catch(()=>null);m&&(Wt.delete(m),await ee.promises.rm(m,{recursive:!0,force:!0}).catch(()=>{}))}return{handle:J,close:re}}import{invalidateExtension as Xo}from"../browser/shared/extension-manifest.mjs";import{FACT_KINDS as rs,QUERY_ROUTE as ss,WORKSPACE_GLOBAL as is}from"../browser/shared/workspace-query.mjs";function mo({settled:e,tell:n,delay:t=120,recheck:a=1e3}){let f=new Map,u=(d,g=t)=>{clearTimeout(f.get(d));let c=setTimeout(async()=>{let y=await e(d).catch(()=>({source:null,held:!1,wait:0}));if(f.get(d)===c){if(y.held)return u(d,Math.min(Math.max(y.wait,50),a));if(y.wait>0)return u(d,y.wait);await n(d,y)}},g);f.set(d,c)};return u}import he from"node:fs";import xe from"node:path";import{isExtensionId as Ba}from"../browser/shared/outline-shape.mjs";import{DOCUMENT_FOLDERS as uo,isSlugName as Dt,layoutOf as po}from"../browser/shared/workspace.mjs";function Ga(e,n=!1,t=!1){let{components:a,gallery:f,preferencesPage:u,customPages:d,extensions:g}=po(e),c=(i,P)=>{try{return he.readdirSync(i,{withFileTypes:!0}).filter(r=>r.isDirectory()&&!r.isSymbolicLink()&&P(r.name)).map(r=>xe.join(i,r.name))}catch{return[]}},y=i=>[i,...c(i,P=>!P.startsWith(".")&&P!=="node_modules").flatMap(y)],j=c(g,i=>Ba(i)&&!uo.includes(i)).flatMap(y);if(n){let i=xe.dirname(e);for(;!he.existsSync(i)&&xe.dirname(i)!==i;)i=xe.dirname(i);return[i,e,...t?[f]:[],g,...j].filter(P=>he.existsSync(P))}let N=[...c(e,i=>Dt(i)),...c(u,i=>Dt(i))],_=i=>[i,...c(i,P=>!P.startsWith(".")).flatMap(_)],L=c(d,i=>Dt(i)&&!uo.includes(i));return[...new Set([e,...[f,u,d,g,xe.join(e,"preferences")].filter(i=>he.existsSync(i)),...L,...j,...N,...N.map(i=>xe.join(i,"assets")).filter(i=>he.existsSync(i)),...he.existsSync(a)?_(a):[]])]}function De(e,n,{folders:t=process.platform==="linux",extensionsOnly:a=!1,outline:f=!1}={}){let u=Ut(e),d=(_,L)=>{!(f&&L===po(e).outline)&&(u(L)||xe.basename(L).startsWith("."))||he.stat(L,(P,r)=>{if(P)return n(P.code==="ENOENT"?"unlink":"change",L);let s=r.isDirectory();n(_==="rename"?s?"addDir":"add":s?"addDir":"change",L)})},g=()=>{};if(!t&&!a)try{let _=he.watch(e,{recursive:!0},(L,i)=>i?d(L,xe.join(e,i.toString())):n("reset",e));return _.on("error",g),{close:()=>_.close()}}catch(_){if(_.code!=="ERR_FEATURE_UNAVAILABLE_ON_PLATFORM")throw _}let c=new Map,y=null,j=()=>{let _=new Map(Ga(e,a,f).flatMap(L=>{try{let i=he.statSync(L);return[[L,`${i.dev}:${i.ino}`]]}catch{return[]}}));for(let[L,i]of c)_.get(L)!==i.identity&&(i.watcher.close(),c.delete(L));for(let[L,i]of _)if(!c.has(L))try{let P=he.watch(L,(r,s)=>{if(!s)return n("reset",L);r==="rename"&&N(),d(r,xe.join(L,s.toString()))});P.on("error",g),c.set(L,{watcher:P,identity:i})}catch{}},N=()=>{y??=setTimeout(()=>{y=null,j()},50)};return j(),{close(){clearTimeout(y);for(let{watcher:_}of c.values())_.close();c.clear()},get folders(){return[...c.keys()]}}}import Ka from"node:fs/promises";import{packageScript as Ja}from"../browser/shared/export-wrap.mjs";import{serveFound as Xa}from"../browser/shared/http.mjs";import{extensionOf as Ya,mediaTypeOf as Va}from"../browser/shared/media.mjs";var Za="/__gallery/components/",Qa=/^\/__gallery\/components\/([a-z0-9][a-z0-9-]*\/[a-z0-9][a-z0-9-]*)\/(.+)$/,qa={js:"text/javascript; charset=utf-8",mjs:"text/javascript; charset=utf-8",css:"text/css; charset=utf-8",wasm:"application/wasm"};async function ho(e,n,t,{root:a}){if(!e.startsWith(Za))return!1;let[,f,u]=Qa.exec(e)??[],d=f?pe(a).packages.get(f):null,g=d?.files.includes(u)?on(d,u):null,c=g?await Ka.readFile(g).catch(()=>null):null,y=c&&u==="kit.js"?Buffer.from(Ja(c.toString("utf8").replace(/^\uFEFF/,""))):c,j=y&&n===d.stamp&&n===an(d);return Xa(t,y,{type:y?qa[Ya(u)]??Va(u):void 0,headers:{"X-Content-Type-Options":"nosniff","Cache-Control":j?"max-age=31536000, immutable":"no-store"}}),!0}import er from"node:path";import{reportsDirectory as tr}from"../browser/shared/paths.mjs";import{layoutOf as nr}from"../browser/shared/workspace.mjs";async function go(e,n,{root:t=tr,workspace:a=null}={}){let{exports:f}=nr(t),u=er.join(f,`${n}.html`),d=await it([n],t),g=await e.handInReport(n,{reader:!0});if(!g.ok)return{problems:[],refused:{reason:g.reason,message:g.message},file:u};if(g.repeated.length)return{problems:st(g.repeated),file:u};let{exported:c,failures:y}=await Mn([n],{workspace:a,directory:t});return await d.keep(c.map(j=>j.slug)),{problems:y.get(n)??[],file:u}}import wo from"node:fs/promises";import yo from"node:path";import{MEDIA_ROUTES as ko,assetFile as or,extensionOf as ar,imageFile as rr,mediaTypeOf as sr}from"../browser/shared/media.mjs";import{serveFound as vo}from"../browser/shared/http.mjs";import{slugPattern as xo}from"../browser/shared/reports.mjs";import{pageFiles as ir}from"../browser/shared/pages.mjs";import{documentDirectory as cr}from"../browser/shared/workspace.mjs";var Ht={asset:e=>({"Content-Type":sr(e),"Cache-Control":"no-cache"}),file:()=>({"Content-Type":"application/octet-stream","Content-Disposition":"attachment","X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}),embed:e=>/\.pdf$/i.test(e)?{"Content-Type":"application/pdf","X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}:{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":"sandbox allow-scripts allow-popups allow-forms allow-modals","X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}},lr=new RegExp(`^/__gallery/edit/(${Object.keys(ko).join("|")})/([^/]+)/(assets/[^/]+)$`);async function $o(e,n,{reportsDirectory:t}){let[,a,f,u]=lr.exec(e)??[];if(!a)return!1;let d=xo.test(f)&&ko[a](u)?await wo.readFile(yo.join(cr(f,t),u)).catch(()=>null):null;return vo(n,d,{headers:Ht[a](u)}),!0}var dr={css:"text/css; charset=utf-8",js:"text/javascript; charset=utf-8",mjs:"text/javascript; charset=utf-8"},fr=/^\/pages\/([^/]+)\/(assets\/[^/]+)$/;async function bo(e,n,{reportsDirectory:t}){let[,a,f]=fr.exec(e)??[];if(!a)return!1;let u=xo.test(a)&&or(f)?await wo.readFile(yo.join(ir(a,t).folder,f)).catch(()=>null):null,d=dr[ar(f??"")];return vo(n,u,{headers:d?{"Content-Type":d,"X-Content-Type-Options":"nosniff","Cache-Control":"no-cache"}:(rr(f)?Ht.asset:Ht.file)(f)}),!0}import mr from"node:dns";import{sendJson as Ue}from"../browser/shared/http.mjs";import{createNetCache as ur,dataOf as pr}from"../browser/shared/net-cache.mjs";import{readKeys as hr}from"../browser/shared/net-keys.mjs";import{addressKind as mt,addressOf as To,hostIn as So,keptHere as Eo,keyIn as _o,mapsHere as gr,netHostsOf as wr,proxyHere as yr,withKey as kr}from"../browser/shared/net-policy.mjs";import{galleryVersion as vr}from"../browser/shared/preview-server.mjs";var ft=512*1024,xr=6e4,Oo=20,Co=5,jo=1e4,$r=16*1024,br=new Set([301,302,303,307,308]),Sr=/^(?:application\/(?:[\w.-]+\+)?json|text\/[\w.+-]+)$/i,$e=(e,n={})=>({ok:!1,code:e,...n}),ae=(e,n={},t)=>Object.assign(new Error(e),{refusal:$e(e,n),...t===void 0?{}:{detail:t}});function Er(e,n){let t;try{t=new URL(e,n)}catch{return{code:"url",why:"a redirect to an address that does not parse"}}let a=To(t.href);return a.code?{code:"url",why:`a redirect to ${t.host?`${t.protocol}//${t.host}`:t.protocol}: ${a.why}`}:a}function Po(e,n){let t=[...new Set([n,encodeURIComponent(n)])].filter(Boolean),a=f=>typeof f=="string"?t.reduce((u,d)=>u.split(d).join("{key}"),f):f;return Object.fromEntries(Object.entries(e).map(([f,u])=>[f,a(u)]))}var _r=e=>mr.promises.lookup(e,{all:!0,verbatim:!0}),zt=e=>URL.parse(e)?.host||"?",Bt=e=>mt(e)==="fake-ip"?"an address a fake-ip proxy's DNS gives":"an address of this computer or of a private network";async function Or(e,{resolve:n,proxy:t}){let a=e.hostname,f=yr(t),u=i=>{let P=mt(i);return P==="public"||P==="fake-ip"&&f},d=a.replace(/^\[|\]$/g,"");if(mt(d)!=="none"){if(u(d))return{address:d};throw ae("private",{host:a,address:d,why:`${d} is ${Bt(d)}`})}let g;try{g=(await n(a)).map(i=>typeof i=="string"?i:i.address)}catch(i){throw ae("offline",{why:`${a} did not resolve (${i.code??i.message})`})}if(g.length===0)throw ae("offline",{why:`${a} did not resolve`});let c=g.filter(i=>!u(i));if(c.length===0)return{address:g[0]};let y=c.filter(i=>!gr(i)),j=y.length?y:c,N=j.find(i=>!i.includes(":"))??j[0],_=`${a} resolved to ${N}, ${Bt(N)}`,L=Eo(a)?"and its name is one kept for this computer (localhost)":t?f?e.protocol!=="https:"?"and an http address is never handed to a proxy by its name (no TLS to check the site)":y.length?"and a private network's address is never handed to a proxy by its name (that network's own machines are there)":null:"and the proxy it goes through is not on this computer":"and no proxy of this computer goes between to reach it by its name";if(L===null)return{address:null,resolved:N,said:_};throw ae("private",{host:a,address:N,why:`${_}, ${L}`},f||!t||Eo(a)?void 0:`${_}, and the proxy it goes through (${zt(t)}) is not on this computer`)}var Cr=({resolve:e=_r,proxyFor:n=gn,connect:t,ca:a}={})=>async(f,{headers:u,signal:d})=>{let g=await n(f.href),c=await Or(f,{resolve:e,proxy:g}),{address:y}=c,j={...t?{connect:t}:{},...a?{ca:a}:{}};try{return await et(f,{address:y,proxy:g,headers:u,signal:d,...j})}catch(N){if(!(g&&N.proxyFailed&&(y!==null||N.code==="ECONNREFUSED")))throw y===null&&!d?.aborted?ae("offline",{why:`${c.said}, and no site the proxy of this computer reached by its name proved to be it`},`${c.said}, handed by its name to the proxy (${zt(g)}): ${N.code??N.message}`):N;let _=i=>`and the proxy of this computer that would reach it${i?` (${zt(g)})`:""} is not running`,L=y===null?c.said:`${f.hostname.replace(/^\[|\]$/g,"")===y?y:`${f.hostname} resolved to ${y}`}, ${Bt(y)}`;if(y===null||mt(y)!=="public")throw ae("private",{host:f.hostname,address:y??c.resolved,why:`${L}, ${_(!1)}`},`${L}, ${_(!0)}`);return et(f,{address:y,proxy:null,headers:u,signal:d,...j})}},Ro=e=>(n,{headers:t,signal:a})=>et(new URL(`http://127.0.0.1:${e}/${n.protocol.slice(0,-1)}/${n.host}${n.pathname}${n.search}`),{address:"127.0.0.1",headers:t,signal:a});async function jr(e){let n=0,t=[];for await(let a of e){if(n+=a.length,n>$r)throw Object.assign(new Error("too-large"),{status:413});t.push(a)}return JSON.parse(Buffer.concat(t).toString("utf8"))}function Pr(e,n){let t=/;\s*charset="?([^";]+)"?/i.exec(n)?.[1];try{return new TextDecoder(t||"utf-8").decode(e)}catch{return new TextDecoder("utf-8").decode(e)}}function Fo({root:e,catalog:n=()=>pe(e),hop:t=null,now:a=Date.now,cache:f=ur(e),log:u=()=>{}}){let d=t??Cr(),g=new Map,c=i=>{let P=a(),r=(g.get(i)??[]).filter(s=>P-s<6e4);return r.length>=Oo?(g.set(i,r),!1):(g.set(i,[...r,P]),!0)},y={accept:"application/json, text/plain;q=0.9, text/*;q=0.8","user-agent":`Gallery/${vr} (a custom block's card)`};async function j(i,{hosts:P,allowed:r,key:s}){let w=AbortSignal.timeout(jo),F=i;for(let W=0;;W++){let v;try{v=await d(s===void 0?F:new URL(kr(F.href,s)),{headers:y,signal:w})}catch(h){throw h.refusal?h:ae("offline",{why:w.aborted?`no answer within ${jo/1e3} s`:String(h.code??h.message)})}if(br.has(v.status)&&v.headers.get("location")){if(v.body?.cancel().catch(()=>{}),W>=Co)throw ae("status",{status:v.status,why:`more than ${Co} redirects`});let h=Er(v.headers.get("location"),F);if(h.code)throw ae("url",{why:h.why});let S=So(h.url.hostname,P);if(!S)throw ae("host",{host:h.url.hostname,why:`a redirect to ${h.url.hostname}, which the block's needs do not name`});if(!r.includes(S))throw ae("consent",{hosts:P.filter(M=>!r.includes(M))});F=h.url,s=_o(F.href)?s:void 0;continue}if(v.status<200||v.status>299)throw v.body?.cancel().catch(()=>{}),ae("status",{status:v.status});let z=v.headers.get("content-type")??"",G=z.split(";")[0].trim();if(G&&!Sr.test(G))throw v.body?.cancel().catch(()=>{}),ae("type",{type:G});if(Number(v.headers.get("content-length"))>ft)throw v.body?.cancel().catch(()=>{}),ae("too-large",{limit:ft});let B;try{B=v.body?await wn(v,ft):Buffer.alloc(0)}catch(h){throw ae("offline",{why:String(h.code??h.message)})}if(B===null)throw ae("too-large",{limit:ft});return{type:G||"text/plain",text:Pr(B,z)}}}let N=(i,P,r)=>{let s=pr(i,P);return s===void 0?$e("type",{why:"the answer is no JSON"}):{ok:!0,data:s,at:i.at,cached:r}};async function _(i){let{block:P,url:r,as:s="json",doc:w=null}=i??{},F=typeof P=="string"?n().packages.get(P):null;if(!F)return $e("missing",{why:"no custom block of that id loads in this workspace"});let W=wr(F.needs);if(s!=="json"&&s!=="text")return $e("url",{why:'as is "json" or "text"'});let v=To(r);if(v.code)return $e("url",{why:v.why});let{url:z}=v,G=So(z.hostname,W);if(!G)return $e("host",{host:z.hostname,why:W.length?`its needs name ${W.join(", ")}`:"its needs name no host of the net"});let B=n().settings.net?.[P]??[];if(!B.includes(G))return $e("consent",{hosts:W.filter(O=>!B.includes(O))});let h;if(_o(z.href)){let O=hr(e);if(h=O[z.hostname]??O[G],h===void 0)return $e("key",{host:z.hostname})}let S=z.href,M=f.get(S);if(f.used(S,w,s),M&&a()-Date.parse(M.at)<xr)return N(M,s,!0);if(!c(P))return M?N(M,s,!0):$e("rate",{why:`more than ${Oo} fetches in a minute`});try{let{type:O,text:J}=await j(z,{hosts:W,allowed:B,key:h});return N(f.put(S,{type:O,text:J,at:new Date(a()).toISOString()}),s,!1)}catch(O){if(!O.refusal)throw O;if(M&&O.refusal.code!=="consent")return N(M,s,!0);let J=h===void 0?O.refusal:Po(O.refusal,h),re=O.detail===void 0?J.why:h===void 0?O.detail:Po({why:O.detail},h).why;return(J.code!=="offline"||O.detail!==void 0)&&u(`${P}: ${z.hostname} refused (${J.code}${re?`: ${re}`:""})`),J}}async function L(i,P){if(i.method!=="POST")return Ue(P,405,{ok:!1,reason:"method"});if(i.headers.origin!==`http://${i.headers.host}`)return Ue(P,403,{ok:!1,reason:"origin"});if(!/^application\/json\b/i.test(i.headers["content-type"]??""))return Ue(P,415,{ok:!1,reason:"type"});let r;try{r=await jr(i)}catch(s){return Ue(P,s.status??400,{ok:!1,reason:"body"})}try{return Ue(P,200,await _(r))}catch(s){return Ue(P,500,{ok:!1,code:"offline",why:s.message})}}return{handle:L,answer:_,cache:f}}import{walk as Tr,attr as Gt}from"../browser/shared/html-tree.mjs";import{workspaceAddress as Kt}from"../browser/shared/workspace-address.mjs";function ut(e,n){if(!n)return e;let t=bn(e),a=at(e,d=>Kt(d,n)!==d,t),f=rt(a,d=>Kt(d.value,n)),u=d=>d.replace(/(["'`])(\/(?:__gallery\/(?:edit\/(?:v\/[a-f0-9]{16}\/)?src\/|components\/)|__gallery\/|generated\/|pages\/))/g,(g,c,y)=>c+Kt(y,n));return Tr(t,d=>{if(d.tagName==="script"&&(Gt(d,"data-doc-dev")!==void 0||Gt(d,"data-doc-package")!==void 0)&&!Gt(d,"src")){let g=d.sourceCodeLocation?.startTag?.endOffset,c=d.sourceCodeLocation?.endTag?.startOffset;g!==void 0&&c!==void 0&&f.push({start:g,end:c,text:u(e.slice(g,c))})}}),ot(e,f)}function Ao({max:e=20}={}){let n=new Map;return{get(t,a,f){let u=`${t} ${a}`,d=n.get(u);return!d||d.text!==f?null:(n.delete(u),n.set(u,d),d.page)},set(t,a,f,u){let d=`${t} ${a}`;for(n.delete(d),n.set(d,{slug:t,text:f,page:u});n.size>e;)n.delete(n.keys().next().value)},clear(){n.clear()},forget(t){for(let[a,f]of n)f.slug===t&&n.delete(a)},get size(){return n.size}}}import{createHash as Rr}from"node:crypto";import{readFileSync as Fr}from"node:fs";import Lo from"node:fs/promises";import Ar from"node:path";import{release as Lr,releaseFile as Ir}from"../browser/shared/paths.mjs";async function pt(e){let n=await Promise.all(e.map(a=>Lo.stat(a).then(({mtimeMs:f,size:u})=>`${f} ${u}`,()=>"none"))),t=Rr("sha256");return e.forEach((a,f)=>t.update(`${a}\0${n[f]}
|
|
78
|
+
`)),t.digest("hex").slice(0,16)}function Io(e,n){let t=null,a=async()=>(await Promise.all(e.map(async f=>(await Lo.readdir(f,{recursive:!0,withFileTypes:!0}).catch(()=>[])).filter(d=>d.isFile()).map(d=>Ar.join(d.parentPath,d.name))))).flat().filter(n).sort();return{files:()=>t??=a(),changed:()=>{t=null}}}var Jt=Lr?JSON.parse(Fr(Ir,"utf8")).stamps:null;var vt=Vt.source.slice(1,-1),cs=new RegExp(`^/generated/(${vt})\\.html$`),ls=new RegExp(`^/(${vt})/(?:doc|report)\\.html$`),ds=new RegExp(`^/pages/(${vt})$`),fs=new RegExp(`^/__gallery/pages/(${vt})/(cards|library|hint)$`),Zt="/__gallery/events",Le=Nr,ea=/^\/__gallery\/edit\/(v\/[a-f0-9]{16}\/)?src\/((?:shared(?:\/components|\/emoji|\/i18n)?\/|editor\/(?:page|components)(?:\/[a-z]+(?:-[a-z]+)*){0,2}\/(?!files?\.mjs))[a-z]+(?:-[a-z]+)*\.mjs)$/,ms=/^\/__gallery\/edit\/(?:v\/[a-f0-9]{16}\/)?src\/(shared\/emoji\/data\/[a-z]+(?:-[a-z]+)*\.(json|bin))$/,wt=[K.join(Le,"editor","page"),K.join(Le,"editor","components"),K.join(Le,"shared")],us=e=>ea.test(`/__gallery/edit/src/${K.relative(Le,e).split(K.sep).join("/")}`);var ps=[Qo,K.join(Le,"shared","components")],jl=[Qo,...wt],Ye={"Cache-Control":"no-store"},Yo={"Cache-Control":"max-age=31536000, immutable"},Xt=(e,n,t)=>Yt(e,{type:n,headers:{...Ye,...Dr},body:t});function hs(e){let n=e.headers?.host??"",t=e.socket?.localPort;return!!t&&(n===`127.0.0.1:${t}`||n===`localhost:${t}`)}function gs(e){if(e.method!=="GET"&&e.method!=="HEAD")return null;let n=e.socket?.localPort;if(!n||e.headers?.host!==`localhost:${n}`)return null;let t=new URL(e.url||"/","http://localhost");return t.pathname==="/"||t.pathname==="/index.html"?`http://127.0.0.1:${n}${t.pathname}${t.search}`:null}var ta=`window.addEventListener("doc-net-fetch", (event) => {
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
event.detail.answer(fetch("/__gallery/net", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(event.detail.ask) }).then((response) => response.json()));
|
|
81
|
+
});`,na=`let lost = false;
|
|
82
|
+
events.onerror = () => { lost = true; };
|
|
83
|
+
events.onopen = () => {
|
|
84
|
+
if (!lost) return;
|
|
85
|
+
lost = false;
|
|
86
|
+
for (const kind of ${JSON.stringify(rs)}) window.dispatchEvent(new CustomEvent("doc-workspace-change", { detail: kind }));
|
|
87
|
+
};`,ws=(e,n,t)=>`<script data-doc-dev>
|
|
88
|
+
(() => {
|
|
89
|
+
document.currentScript.remove();
|
|
90
|
+
${ta}
|
|
91
|
+
const solo = new URLSearchParams(location.search).has("solo");
|
|
92
|
+
let catalog = "${t}";
|
|
93
|
+
const holds = (ids) => document.querySelector(ids === undefined ? "[${yt}]" : ids.split(",").map((id) => '[${yt}="' + id + '"]').join());
|
|
94
|
+
let events = null, connected = false;
|
|
95
|
+
const receive = (event) => {
|
|
96
|
+
const [kind, next, ids, more, consents, unlisted, packs] = event.data.split(" ");
|
|
97
|
+
if (kind === "notes") return void window.dispatchEvent(new CustomEvent("doc-annotations-changed", { detail: { version: next ?? "" } }));
|
|
98
|
+
if (kind === "changes") return void window.dispatchEvent(new CustomEvent("doc-changes-changed", { detail: { stamp: next ?? "" } }));
|
|
99
|
+
if (kind === "look") return void window.dispatchEvent(new CustomEvent("doc-look-request", { detail: { look: Object.fromEntries(new URLSearchParams(next ?? "")), from: "file" } }));
|
|
100
|
+
if (kind === "settings") return void window.dispatchEvent(new CustomEvent("doc-settings-changed", { detail: { hidden: next ? next.split(",") : [], disabled: ids ? ids.split(",") : [], shown: more ? more.split(",") : [], net: consents ? consents.split(",") : [], unlisted: unlisted ? unlisted.split(",") : [], packsOff: packs ? packs.split(",") : [] } }));
|
|
101
|
+
if (kind === "data") return void window.dispatchEvent(new CustomEvent("doc-workspace-change", { detail: next ?? "" }));
|
|
102
|
+
if (kind !== "report" && kind !== "assets" && kind !== "components") return;
|
|
103
|
+
if (kind === "components") {
|
|
104
|
+
if (document.readyState === "loading") return void document.addEventListener("DOMContentLoaded", () => receive(event), { once: true });
|
|
105
|
+
if (solo || next === catalog) return;
|
|
106
|
+
catalog = next;
|
|
107
|
+
if (!holds(ids)) return void window.dispatchEvent(new CustomEvent("doc-catalog-changed", { detail: { ids: ids === undefined ? null : ids.split(",").filter(Boolean) } }));
|
|
108
|
+
}
|
|
109
|
+
if (window.__galleryEditBusy) {
|
|
110
|
+
window.dispatchEvent(new CustomEvent({ report: "doc-source-changed", assets: "doc-assets-changed", components: "doc-components-changed" }[kind], { detail: { version: next ?? null } }));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (kind === "report" && next === "${n}") return;
|
|
114
|
+
if (window.__galleryEditReload) return window.__galleryEditReload(); // in a workbench: swapped in, no reload seen
|
|
115
|
+
location.reload();
|
|
116
|
+
};
|
|
117
|
+
const follow = (active) => {
|
|
118
|
+
if (!active) { events?.close(); events = null; return; }
|
|
119
|
+
if (events) return;
|
|
120
|
+
events = new EventSource("${Zt}?slug=${e}" + (connected ? "&resume=1" : ""));
|
|
121
|
+
connected = true;
|
|
122
|
+
${na}
|
|
123
|
+
events.onmessage = receive;
|
|
124
|
+
};
|
|
125
|
+
// Mounted hidden editors keep drafts, but must not consume an HTTP connection each.
|
|
126
|
+
window.addEventListener("doc-live-active", event => follow(event.detail !== false));
|
|
127
|
+
follow(window.frameElement?.dataset.liveActive !== "false");
|
|
128
|
+
window.addEventListener("pagehide", () => follow(false), { once: true });
|
|
129
|
+
})();
|
|
130
|
+
</script>`,ys=(e,n,t)=>`<script>
|
|
131
|
+
(() => {
|
|
132
|
+
document.currentScript.remove();
|
|
133
|
+
${ta}
|
|
134
|
+
let catalog = "${t}";
|
|
135
|
+
const holds = (ids) => {
|
|
136
|
+
const named = ids === undefined ? "[${yt}]" : ids.split(",").filter(Boolean).map((id) => '[${yt}="' + id + '"]').join() || ":not(*)";
|
|
137
|
+
return Boolean(document.querySelector(named)) || [...document.querySelectorAll("template[data-ge-held]")].some((held) => held.content.querySelector(named));
|
|
138
|
+
};
|
|
139
|
+
const again = () => (window.__galleryEditReload ? window.__galleryEditReload() : location.reload());
|
|
140
|
+
const events = new EventSource("${Zt}?page=${e}");
|
|
141
|
+
${na}
|
|
142
|
+
events.onmessage = (event) => {
|
|
143
|
+
const [kind, next, ids, more, consents, unlisted, packs] = event.data.split(" ");
|
|
144
|
+
if (kind === "page") return void (window.__galleryPageChanged ? window.__galleryPageChanged(next) : next !== "${n}" && again());
|
|
145
|
+
if (kind === "assets") return void again();
|
|
146
|
+
if (kind === "settings") return void window.dispatchEvent(new CustomEvent("doc-settings-changed", { detail: { hidden: next ? next.split(",") : [], disabled: ids ? ids.split(",") : [], shown: more ? more.split(",") : [], net: consents ? consents.split(",") : [], unlisted: unlisted ? unlisted.split(",") : [], packsOff: packs ? packs.split(",") : [] } }));
|
|
147
|
+
if (kind === "data") return void window.dispatchEvent(new CustomEvent("doc-workspace-change", { detail: next ?? "" }));
|
|
148
|
+
if (kind !== "components") return;
|
|
149
|
+
if (document.readyState === "loading") return void document.addEventListener("DOMContentLoaded", () => events.onmessage(event), { once: true });
|
|
150
|
+
if (next === catalog) return;
|
|
151
|
+
catalog = next;
|
|
152
|
+
if (holds(ids)) again();
|
|
153
|
+
};
|
|
154
|
+
})();
|
|
155
|
+
</script>`;function Vo(e,n){let t=K.relative(e,n).split(K.sep);if(t[0]===".."||K.isAbsolute(t[0])||t[0]==="")return null;if(t.length===1&&t[0]===kt)return{slug:null,name:kt,packages:!0};let a=c=>process.platform==="win32"?c.toLowerCase():c;if(a(t[0])===Jr&&t.length>=2&&as(t[1])&&!Ho.includes(t[1])){let c=t.slice(2);return c.some(y=>y.startsWith("."))?null:{extension:t[1],name:c.length===1?c[0]:null}}if(a(t[0])===Xr&&t.length>=2&&qo(t[1])&&!Ho.includes(t[1])){let c=t.slice(2);return c.some(y=>y.startsWith("."))?null:{page:t[1],name:c.length===1?c[0]:null}}let f=t[0]===".gallery"&&t[1]==="pages"&&t.length>=3,[u,...d]=f?t.slice(2):t,g=!f&&a(u)===Uo;return!(g||Vt.test(u))||u==="exports"||d.some(c=>c.startsWith("."))?null:{slug:g?Uo:u,name:d.length===1?d[0]:null,...g?{packages:g}:{}}}function Ut(e){let n=N=>process.platform==="win32"?K.resolve(N).toLowerCase():K.resolve(N),{gallery:t,preferencesPage:a,exports:f,extensions:u}=ze(e),[d,g,c,y]=[n(t),n(a),n(f),n(u)],j=(N,_)=>N===_||N.startsWith(_+K.sep);return N=>{let _=n(N);return j(_,y)&&_!==y&&_.slice(y.length+1).split(K.sep).some((L,i)=>i>0&&(L==="node_modules"||L===".git"))?!0:j(_,d)&&_!==d&&!j(_,g)||j(_,c)}}var Zo=`<script data-doc-dev>document.currentScript.remove(); globalThis.${is} = ${JSON.stringify(ss)};</script>`,fe=(e,n,t)=>new RegExp(`</${n}>`,"i").test(e)?e.replace(new RegExp(`</${n}>`,"i"),()=>` ${t}
|
|
156
|
+
</${n}>`):`${e}
|
|
157
|
+
${t}`;function Qt({token:e=null,unified:n=!1,base:t="",reportsDirectory:a=Wr,stateDirectory:f=ze(a).state,projects:u=void 0,onWorkspaceChange:d=()=>{},announceServer:g=!0,logger:c=console,kind:y="dev",workbenchPage:j=null,presence:N=void 0,closeServer:_=async()=>{},exit:L=()=>process.exit(0)}={}){let i=new Set,P=o=>{for(let l of i)l.workspace&&l.response.write(`data: extensions ${o}
|
|
158
|
+
|
|
159
|
+
`)};t||lt.on("change",P);let r=(o,l="",T="report")=>{for(let p of i)(!o||p.slug===o)&&p.response.write(`data: ${o?`${T} ${l}`:"assets"}
|
|
160
|
+
|
|
161
|
+
`)},s=(o,l)=>{for(let T of i)T.page===o&&T.response.write(`data: page ${l}
|
|
162
|
+
|
|
163
|
+
`)},w=()=>{q("workspace",()=>{for(let o of i)o.workspace&&o.response.write(`data: workspace ${Date.now()}
|
|
164
|
+
|
|
165
|
+
`)})},F=()=>{w(),d(a)},W=o=>r(o,String(Date.now()),"changes"),v=$n({base:t,token:e,reportsDirectory:a,stateDirectory:f,finish:nt,log:o=>c.info?.(`[gallery] ${o}`),onChanges:W}),z=(o,l,T,{lang:p=null,page:I=!1}={})=>pn(o,l,T,{directory:a,blank:!0,lang:p,page:I}),G=f?Jn({file:K.join(f,"activity.json")}):null,B=Cn({root:a,read:On(v),activity:G,draw:(o,l)=>Xe(o,{slug:l,mode:"words",reportsDirectory:a})}),h=new Set,S=o=>{for(let l of o)h.add(l);h.size!==0&&q("data",()=>{let l=[...h];h.clear();for(let T of i)if(T.slug||T.page)for(let p of l)T.response.write(`data: data ${p}
|
|
166
|
+
|
|
167
|
+
`)})},M=o=>K.resolve(K.dirname(ht(o,a)))===K.resolve(a),O=null,J=null,re=process.env.GALLERY_SANDBOX,k=()=>J??=(async()=>{for(let l of i)l.response.end();i.clear();let o=_().catch(()=>{});re?await o:await Promise.race([o,new Promise(l=>setTimeout(l,3e3))]),await G?.close(),await O?.().catch(()=>{}),await x.close(),L()})(),m=Pn({reportsDirectory:a,projects:u,unified:n,presence:N,server:{kind:y,version:Hr,stop:k,sandbox:re},edits:v,reports:{create:z,export:o=>go(v,o,{root:a,workspace:l=>B.snapshot(l)}),words:(o,l)=>Xe(o,{slug:l,mode:"words",reportsDirectory:a})},components:Dn({root:Ae(),taken:()=>we.taken()}),changed:F,index:B,web:{frameable:yn,title:kn,icon:o=>vn(o)}}),x=fo({edits:v,workspace:m,reports:{create:z},reportsDirectory:a,offline:o=>Nn({...o,directory:a,workspace:l=>B.snapshot(l)})}),$=Fo({root:Ae(),hop:process.env.GALLERY_TEST_NET?Ro(Number(process.env.GALLERY_TEST_NET)):null,log:o=>c.info?.(`[gallery] ${o}`)}),A=fn({root:Ae(),edits:v,stateDirectory:ze(Ae()).state,catalogTaken:()=>we.taken(),log:o=>c.info?.(`[gallery] ${o}`),shown:(o,l)=>ut(Ft(o,l),t)}),E=(o,l,{present:T=!1,editorModule:p,kit:I}={})=>{let b=l,se="",ne="",ie=!0;try{T||({html:b,snippet:se,head:ne}=v.preview(o,l,{editor:p,kitTags:le=>En(le,I)}))}catch(le){ie=!1,c.warn(`[gallery] text editing unavailable for ${o}: ${le.message}`)}if({html:b}=Fn(b,{slug:o,mode:"preview",reportsDirectory:a,kit:I}),b=fe(b,"head",ws(o,Je(l),pe().stamp)),b=fe(b,"head",`<script data-doc-dev>${Mo()}</script>`),b=fe(b,"head",Zo),ne&&(b=fe(b,"head",ne)),T)return{html:fe(b,"head",`<style data-doc-present>.doc-display { display: none !important; }</style>
|
|
168
|
+
<script type="module" src="/__gallery/edit/src/editor/page/present-links.mjs" data-doc-dev></script>`),whole:ie};let ke="";try{ke=ao(o,l,{},{directory:ht(o,a)})}catch(le){ie=!1,c.warn(`[gallery] checks unavailable for ${o}: ${le.message}`)}return ke&&(b=fe(b,"body",ke)),{html:se?fe(b,"body",se):b,whole:ie}},C=Ao(),U=Io(wt,us),H=o=>{let l=ht(o,a);return[l,K.join(l,"assets")]},oe=()=>Jt?.editor??U.files().then(pt),X=o=>Jt?.kit?.[o.id]??pt([jt(o)]),Q=async(o,l,{present:T})=>{let[p,I,b]=await Promise.all([T?"":oe(),Promise.all(We.map(X)),pt(H(o))]),se=[T?"present":p,...I,b,pe().stamp,`look:${Wo(Do(o,a))}`].join(" "),ne=C.get(o,se,l);if(ne!==null)return T||v.opened(l),ne;let ie=new Map(We.map((ue,Se)=>[ue,I[Se]])),ke=T?void 0:`/__gallery/edit/v/${p}/src/editor/page/editor.mjs`,{html:le,whole:ce}=E(o,l,{present:T,editorModule:ke,kit:ue=>`${tt(ue)}?v=${ie.get(ue)}`}),be=ut(le,t);return ce&&C.set(o,se,l,be),be},te=async o=>{let l=Go(o,a),[T,p]=await Promise.all([ge.readFile(l.html,"utf8").catch(()=>null),ge.readFile(l.json,"utf8").catch(()=>"")]);if(T===null)return null;let[I,b]=await Promise.all([oe(),Promise.all(We.map(X))]),se=new Map(We.map((R,_e)=>[R,b[_e]])),ne=pe(),ie=Ko(T,p),ke=dn(T,{blockOf:R=>Ct(ne,R)}),le=Object.fromEntries([...new Set(Ot(T).cards.map(({block:R})=>R).filter(Boolean))].map(R=>[R,Ct(ne,R)])),{html:ce}=oo(ke,{reportsDirectory:a,slug:o,kit:R=>`${tt(R)}?v=${se.get(R)}`}),be=ns(o,a),ue=ts(o,a),Se=be?.defaultCards===!0,Qe=qr(T),qe=R=>ne.packages.get(R)?.name??rn().find(_e=>_e.id===R)?.title??null,Ee=Se?Qr(a,Ot(T).cards.map(({block:R})=>R)).map(R=>({block:R,name:qe(R)})):[],Ke=JSON.stringify({slug:o,title:be?.title??o,token:v.token,version:ie,blocks:le,...ue?{hint:ue}:{},...Se?{defaults:Se}:{},...Ee.length?{news:Ee}:{},...Qe?{blank:Qe}:{}}).replace(/</g,"\\u003c");return ce=fe(ce,"head",`<script type="application/json" data-ge-page data-doc-dev>${Ke}</script>`),ce=fe(ce,"head",ys(o,ie,ne.stamp)),ce=fe(ce,"head",`<script data-doc-dev>${Mo()}</script>`),ce=fe(ce,"head",Zo),fe(ce,"head",`<script type="module" src="/__gallery/edit/v/${I}/src/editor/page/custom-page.mjs" data-doc-dev></script>`)};async function D(o,l,T){try{if(!hs(o))return No(l,403,{ok:!1,reason:"host"});let p=gs(o);if(p)return Yt(l,{status:302,headers:{Location:p,...Ye}});let I=new URL(o.url||"/","http://localhost"),b=decodeURI(I.pathname);if(b===Zt){l.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-store",Connection:"keep-alive"}),l.write(`retry: 3000
|
|
169
|
+
|
|
170
|
+
`);let R={slug:I.searchParams.get("slug"),page:I.searchParams.get("page"),workspace:I.searchParams.has("workspace"),response:l};i.add(R);let{stamp:_e,settings:ua}=pe();if(l.write(`data: components ${_e}
|
|
171
|
+
|
|
172
|
+
`),l.write(`data: ${_t(ua)}
|
|
173
|
+
|
|
174
|
+
`),o.on("close",()=>i.delete(R)),I.searchParams.has("resume")&&Vt.test(R.slug??"")){let tn=await v.readTaken(R.slug,{wait:0}).catch(()=>null);tn&&!l.destroyed&&l.write(`data: report ${tn.version}
|
|
175
|
+
|
|
176
|
+
`)}return}if(b==="/__gallery/net")return $.handle(o,l);if(b==="/__gallery/edit/commit")return v.commit(o,l);if(b==="/__gallery/edit/reverted")return v.reverted(o,l);if(b==="/__gallery/edit/hand-in")return v.handInRequest(o,l);if(b==="/__gallery/edit/settle")return v.settleRequest(o,l);if(b==="/__gallery/edit/round")return v.roundRequest(o,l);if(b==="/__gallery/edit/upload")return v.upload(o,l);if(b==="/__gallery/edit/unfurl")return v.unfurl(o,l);if(b==="/__gallery/edit/emoji-library"){if(o.method==="POST")return v.addEmoji(o,l);let[R,_e]=await v.listEmojis();return No(l,R,_e)}if(b==="/__gallery/edit/icon"){let R=Tn({value:I.searchParams.get("value")??"",slug:I.searchParams.get("slug"),tab:I.searchParams.has("tab")});return He(l,R?.body,{type:R?.type,headers:{"Cache-Control":"max-age=31536000, immutable"}})}if(await $o(b,l,{reportsDirectory:a})||await bo(b,l,{reportsDirectory:a})||await ho(b,I.searchParams.get("v"),l,{root:Ae()}))return;let se=b.match(/^\/__gallery\/edit\/emoji-library\/([^/]+)$/)?.[1];if(se){let R=await v.readEmoji(se);return He(l,R?.body,{type:R?.type,headers:{"Cache-Control":"no-cache"}})}if(b==="/__gallery/edit/frameable")return v.frameable(o,l);if(b==="/__gallery/edit/annotations")return v.annotations(o,l);if(b==="/__gallery/edit/changes")return v.changes(o,l);if(b==="/__gallery/edit/history")return v.history(o,l);let ne=b.match(/^\/__gallery\/transfer\/([a-z]+)$/)?.[1];if(ne)return x.handle(o,l,ne);let[,ie,ke]=b.match(fs)??[];if(ie)return A.handle(o,l,ie,ke);let le=b.match(/^\/__gallery\/workspace\/([a-z]+(?:-[a-z]+)*)$/)?.[1];if(le)return m.handle(o,l,le);let[,ce,be]=b.match(ea)??[];if(be){let R=await ge.readFile(K.join(Le,be),"utf8").catch(()=>null);return He(l,R,{type:"text/javascript; charset=utf-8",headers:ce?Yo:Ye})}let ue=I.searchParams.has("v")&&We.find(R=>tt(R)===b);if(ue){let R=await ge.readFile(jt(ue)).catch(()=>null);return He(l,R,{type:b.endsWith(".css")?"text/css; charset=utf-8":"text/javascript; charset=utf-8",headers:Yo})}if(b==="/__gallery/edit/mhchem.js"){let R=await ge.readFile(Sn).catch(()=>null);return He(l,R,{type:"text/javascript; charset=utf-8",headers:Ye})}let[,Se,Qe]=b.match(ms)??[];if(Se){let R=await ge.readFile(K.join(Le,Se)).catch(()=>null);return He(l,R,{type:Qe==="json"?"application/json; charset=utf-8":"application/octet-stream",headers:{"Cache-Control":"max-age=86400"}})}if(j&&(b==="/"||b==="/index.html"))return Xt(l,"text/html; charset=utf-8",await j(I.pathname,o));let qe=b.match(ds)?.[1];if(qe){let R=await te(qe);return R===null?T():Xt(l,"text/html; charset=utf-8",ut(R,t))}let Ee=b.match(cs)?.[1];if(!Ee){let R=b.match(ls)?.[1];return qo(R)&&await ge.access(Yr(ht(R,a)).html).then(()=>!0,()=>!1)?Yt(l,{status:302,headers:{Location:`${t}/generated/${R}.html${I.search}`,...Ye}}):T()}let Ke=await v.readTaken(Ee);if(Ke===null)return T();I.searchParams.has("present")||v.noteTaken(Ee,Ke.source).then(R=>R&&W(Ee),()=>{}),Xt(l,"text/html; charset=utf-8",await Q(Ee,Ke.text,{present:I.searchParams.has("present")}))}catch(p){T(p)}}let V=new Map,q=(o,l)=>{clearTimeout(V.get(o)),V.set(o,setTimeout(l,120))},me=o=>{Gr(o,a).reads&&r(o,Wo(Do(o,a)),"look")},Ie=mo({settled:v.settled,async tell(o,l){let T=await v.read(o,l.source).catch(p=>(c.error(`[gallery] ${o}: ${p.message}`),{version:Je(l.source??"")}));if(r(o,T?.version??Je("")),M(o)){let p=v.writerOf(o,l.source)??"agent";B.changed(o,{source:l.source??null,text:T?.text??null,by:p}).then(S,I=>c.error(`[gallery] ${o}: its facts not read: ${I.message}`))}v.noteTaken(o,l.source).then(p=>p&&W(o),p=>c.error(`[gallery] ${o}: the Agent's changes not kept: ${p.message}`)),v.checkAnnotations(o).catch(p=>c.error(`[gallery] ${o}: annotations not checked: ${p.message}`))}}),Ne=({id:o,problem:l,off:T})=>T||c.warn(`[gallery] custom block ${o} does not load: ${nn("en",l)}`),we=Un({root:Ae(),tell({stamp:o,problems:l,settings:T},p){for(let I of p)l.has(I)&&Ne(l.get(I));for(let{response:I}of i)I.write(`data: components ${o} ${p.filter(b=>Kr.test(b)).join(",")}
|
|
177
|
+
|
|
178
|
+
`),I.write(`data: ${_t(T)}
|
|
179
|
+
|
|
180
|
+
`)}});for(let o of pe().problems.values())Ne(o);B.start().then(o=>o>0&&S(["activity"])),Zr(a).then(o=>v.takeAll(o)).catch(o=>c.error(`[gallery] the documents not taken as the server starts: ${o.message}`));let Ze=Ut(a),ye=Jo(a).then(o=>o.join("/"),()=>""),Pe=!1,Te=o=>{Pe||=o===gt,q("extensions",async()=>{let l=Pe;Pe=!1;let T=await ye;ye=Jo(a).then(p=>p.join("/"),()=>T),(l||await ye!==T)&&F()})},Me=Ae(),Ge=ze(Me).extensions,St=t?null:De(Me,(o,l)=>{if(zr(l,ze(Me).outline)){F();return}let T=K.relative(l,Ge);if(o==="reset"||T===""||!T.startsWith("..")&&!K.isAbsolute(T)){Te(gt);return}let p=Vo(Me,l);p?.extension&&(Xo(K.join(Ge,p.extension)),q(`extension:${p.extension}`,()=>P(p.extension))),p?.extension&&(p.name===gt||p.name===null)&&Te(p.name)},{extensionsOnly:!0,outline:!0}),Et=(o,l)=>!Mr&&l.some(T=>o.startsWith(T+K.sep));function da(o,l){if(o==="reset"){C.clear(),U.changed(),we.changed(),F();return}if(Ze(l))return;let T=K.relative(a,l).split(K.sep).join("/");(T==="preferences.md"||T==="preferences"||T.startsWith("preferences/"))&&F();let p=Vo(a,l);if(p?.page){let{page:I,name:b}=p;b&&es(b)&&q(`page:${I}`,async()=>{let se=Go(I,a),[ne,ie]=await Promise.all([ge.readFile(se.html,"utf8").catch(()=>null),ge.readFile(se.json,"utf8").catch(()=>"")]);ne!==null&&s(I,Ko(ne,ie))}),(b===Bo.json||b===Bo.html&&/^(add|unlink)$/.test(o)||b===null&&/^(add|unlink)Dir$/.test(o))&&F();return}if(p?.extension){t||(Xo(K.join(ze(a).extensions,p.extension)),q(`extension:${p.extension}`,()=>P(p.extension))),(p.name===gt||p.name===null)&&Te(p.name);return}if(p?.packages&&we.changed(),p?.name===kt&&p.slug===null&&q("look:*",()=>new Set([...i].map(({slug:I})=>I).filter(Boolean)).forEach(me)),p?.name===kt&&p.slug===null&&F(),p?.slug&&!(p.name&&Vr(p.name))&&C.forget(p.slug),p&&(/^(doc|report)\.json$/.test(p.name??"")||/^(add|unlink)Dir$/.test(o)&&p.name===null)&&C.clear(),p?.slug&&!p.packages&&p.name===null&&/^(add|unlink)Dir$/.test(o)&&M(p.slug)&&(B.forget(p.slug),S(["todos","recent","stats"])),p?.slug&&!(p.packages&&p.name===null)&&(/^(doc|report)\.json$/.test(p.name??"")||/^(add|unlink)Dir$/.test(o)&&p.name===null||/^(add|unlink)$/.test(o)&&zo(p.name??""))&&F(),p?.slug&&!p.packages&&p.name===os&&F(),/^(add|unlink)(Dir)?$/.test(o)&&Et(l,wt)&&U.changed(),p?.name&&(zo(p.name)||/^(doc|report)\.json$/.test(p.name))){if(Ie(p.slug),/^(doc|report)\.json$/.test(p.name)){let{slug:I}=p;q(`look:${I}`,()=>me(I))}}else if(p?.name==="annotations.json"){let{slug:I}=p;q(`notes:${I}`,async()=>{let b=await ge.readFile(l,"utf8").catch(()=>null);r(I,b===null?"":Je(b),"notes")})}else Et(l,ps)?q("kit",async()=>{try{await In({fresh:!0}),r()}catch(I){c.error(`[gallery] shared kit rebuild failed: ${I.message}`)}}):Et(l,wt)&&q("editor",()=>r())}async function fa(o){g&&(O=await Ur({home:a,port:o,token:v.token,kind:y})),await Br(a)}async function ma(){t||lt.off("change",P);for(let o of i)o.response.end();i.clear(),St?.close();for(let o of V.values())clearTimeout(o);we.close(),await G?.close(),await O?.().catch(()=>{}),O=null,await x.close(),await v.drain()}return{handle:D,changed:da,listening:fa,close:ma,stop:k,edits:v,workspace:m,transfer:x,refresh:w,appearanceChanged(){C.clear(),new Set([...i].map(({slug:o})=>o).filter(Boolean)).forEach(me),F()},get listeners(){return i.size},get workbenchListeners(){return[...i].filter(o=>o.workspace).length}}}import{forgetSnapshot as vs,idsOf as qt}from"../browser/shared/workspace-columns.mjs";import{isWorkspace as oa,readRegistry as xs,registryFile as aa,workspaceId as $s,workspaceKey as Ve}from"../browser/shared/workspace-registry.mjs";import{layoutOf as bs}from"../browser/shared/workspace.mjs";import{projectBase as ra,projectOfPath as Ss,localPath as Es}from"../browser/shared/workspace-address.mjs";import{sendJson as je}from"../browser/shared/http.mjs";import{startup as en}from"../browser/shared/startup.mjs";import{globalLookFile as _s}from"../browser/shared/workspace-look.mjs";function sa({reportsDirectory:e,watch:n=!0,...t}){let a=xn(ks().data),f=jn(),u=new Map,d=new Map,g=new Map,c=!1,y=Ve(e),j=_s(),N=()=>{for(let h of u.values())h.appearanceChanged()},_=h=>{vs(h);for(let S of u.values())S.refresh()},L=new Map,i=new Map,P={touch:h=>{let S=qt();for(let M of h.values())w(M,S).catch(O=>t.logger?.warn?.(`[gallery] ${O.message}`))},indexOf:async(h,S)=>(await w(h,S))?.workspace.index??null},r=Qt({...t,token:a,presence:f,reportsDirectory:e,unified:!0,projects:P,onWorkspaceChange:_,closeServer:async()=>{await G(),await t.closeServer?.()}}),s=to({edits:r.edits});r.base="",u.set(y,r);async function w(h,S=null){if(c)return null;let M=$s(h),O=Ve(h);if(O!==y){let J=(S??qt()).get(M);if(!oa(h)||J?.length!==1||Ve(J[0])!==O)return null}return L.set(O,Date.now()),u.has(O)?u.get(O):(d.has(O)||d.set(O,(async()=>{let J=Qt({...t,token:a,presence:f,reportsDirectory:h,stateDirectory:bs(h).state,base:ra(M),projects:P,onWorkspaceChange:_,announceServer:!1,workbenchPage:null});return J.base=ra(M),c?(await J.close(),null):(u.set(O,J),n&&g.set(O,De(h,J.changed)),J)})().finally(()=>d.delete(O))),d.get(O))}let F=null;function W(){return c?Promise.resolve():F??=(async()=>{let h=xs().workspaces.map(({root:M})=>M),S=new Set([y,...h.filter(oa).map(M=>Ve(M))]);for(let[M,O]of u)S.has(M)||(u.delete(M),g.get(M)?.close(),g.delete(M),await O.close())})().catch(h=>t.logger?.warn?.(`[gallery] ${h.message}`)).finally(()=>{F=null})}async function v(h,S,M){try{if(c)return je(S,503,{ok:!1,reason:"closing"});let O=new URL(h.url??"/","http://localhost");if(O.pathname==="/__gallery/startup"){if(h.headers.host!==`127.0.0.1:${h.socket.localPort}`)return je(S,403,{ok:!1,reason:"host"});if(h.method==="GET")return je(S,200,{ok:!0,...await en().status()});if(h.method!=="POST")return je(S,405,{ok:!1});let E=await r.edits.check(h,1024);if(E.error)return je(S,...E.error);try{return je(S,200,{ok:!0,...await en().set(E.body.enabled)})}catch(C){return je(S,400,{ok:!1,message:C.message})}}if(await s.handle(h,S))return;let J=Ss(O.pathname);if(!J)return r.handle(h,S,M);let re=qt(),k=re.get(J),m=k?.length===1?await w(k[0],re):null;if(!m)return je(S,404,{ok:!1,reason:"workspace"});let x=Es(O.pathname);if(m===r||/^\/pages(?:\/|$)|^\/__gallery\/(?:pages?|components|net)(?:\/|$)|^\/__gallery\/workspace\/(?:stop|head|new-page|instructions|extension-edit|components)(?:\/|$)/.test(x)){S.writeHead(307,{Location:x+O.search}),S.end();return}let A=Ve(k[0]);return i.set(A,(i.get(A)??0)+1),S.once("close",()=>{i.set(A,i.get(A)-1),L.set(A,Date.now())}),h.url=x+O.search,m.handle(h,S,E=>{h.url=O.pathname+O.search,M(E)})}catch(O){M(O)}}let z=setInterval(()=>{for(let[h,S]of u)h!==y&&!r.workbenchListeners&&!i.get(h)&&!S.listeners&&Date.now()-L.get(h)>12e4&&(u.delete(h),g.get(h)?.close(),g.delete(h),L.delete(h),i.delete(h),S.close().catch(M=>t.logger?.warn?.(`[gallery] ${M.message}`)))},3e4);z.unref();async function G(){if(!c){c=!0,clearInterval(z),xt.unwatchFile(aa(),B),xt.unwatchFile(j,N),await s.close();for(let h of g.values())h?.close();await Promise.all([...d.values()]),await Promise.all([...u.values()].map(h=>h.close())),u.clear()}}let B=()=>{_(e),W()};return{handle:v,resolve:w,edits:r.edits,workspace:r.workspace,stop:r.stop,changed(h,S){for(let M of u.values())M.changed(h,S)},async listening(h){await r.listening(h),await en().sync().catch(S=>t.logger?.warn?.(`[gallery] login startup: ${S.message}`)),await W(),xt.watchFile(aa(),{interval:500,persistent:!1},B),xt.watchFile(j,{interval:250,persistent:!1},N)},close:G}}import Os from"node:fs/promises";import Be from"node:path";import{FRAMED_BY as Cs,serve as ia}from"../browser/shared/http.mjs";var js={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json; charset=utf-8",".map":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2",".woff":"font/woff",".ttf":"font/ttf",".txt":"text/plain; charset=utf-8"},Ps=e=>js[Be.extname(e).toLowerCase()]??"application/octet-stream";function Ts(e,n){if(/%(?:2f|5c|00)/i.test(n)||/[\\\0]/.test(n))return null;let t;try{t=decodeURIComponent(n)}catch{return null}let a=t.split("/");if(a.some(d=>d===""||d==="."||d===".."||/[\\\0:]/.test(d)))return null;let f=Be.resolve(e,...a),u=Be.relative(e,f);return u&&!u.startsWith("..")&&!Be.isAbsolute(u)?f:null}async function ca(e,n,{web:t,kit:a,vendor:f}){if(e.method!=="GET"&&e.method!=="HEAD")return!1;let u=new URL(e.url||"/","http://localhost").pathname,d=null,g=null;if(u==="/"||u==="/index.html"){if(!t)return!1;[d,g]=[Be.join(t,"index.html"),{"Cache-Control":"no-store",...Cs}]}else{let j=[["/assets/",t&&Be.join(t,"assets"),"max-age=31536000, immutable"],["/kit/",a,"no-cache"],["/vendor/",f,"no-cache"]].find(([N,_])=>_&&u.startsWith(N));if(!j)return!1;d=Ts(j[1],u.slice(j[0].length)),g={"Cache-Control":j[2]}}let c=d?await Os.readFile(d).catch(()=>null):null;return c?(ia(n,{type:Ps(d),headers:{...g,"X-Content-Type-Options":"nosniff"},body:e.method==="HEAD"?void 0:c}),!0):(ia(n,{status:404}),!0)}async function fd({reportsDirectory:e=Ws(),port:n,web:t=Ns,kind:a=process.env.GALLERY_SERVER_KIND==="dev"?"dev":"cli",stateDirectory:f=Us(e).state,exit:u=(y=0)=>process.exit(y),watch:d=!0,signals:g=!0,log:c=console}={}){await Ds(e),await ln(e,{log:s=>c.log(`[gallery] ${new Date().toISOString()} ${s}`)}),cn(e,s=>c.log(`[gallery] ${new Date().toISOString()} ${s}`)),sn(e);let y=await mn(e,{stateDirectory:f});y.did==="made"?c.log(`[gallery] ${new Date().toISOString()} the default home page made: ${y.file} (${y.cards.length} cards)`):y.did==="failed"&&c.warn(`[gallery] ${new Date().toISOString()} ${un(y)}`);let j=null,N=null,_=null,L=Ms(),i=async()=>{N?.close(),_&&$t.unwatchFile(bt,_),await Rs.writeFile(L.lastPortFile,`${n}
|
|
181
|
+
`).catch(()=>{}),await new Promise(s=>{j.close(()=>s()),j.closeAllConnections()})},r=sa({reportsDirectory:e,watch:d,stateDirectory:f,logger:{info:s=>c.log(s),warn:s=>c.warn(s),error:s=>c.error(s)},kind:a,closeServer:i,exit:()=>u(0)});j=Fs.createServer((s,w)=>{r.handle(s,w,async F=>{if(F){c.error(`[gallery] ${s.method} ${s.url}: ${F.stack??F.message}`),w.headersSent?w.end():la(w,{status:500});return}try{if(await ca(s,w,{web:t,kit:As,vendor:Is}))return}catch(W){c.error(`[gallery] ${s.url}: ${W.message}`)}w.headersSent||la(w,{status:404})})}),j.keepAliveTimeout=5e3,await new Promise((s,w)=>{j.once("error",w),j.listen(n,"127.0.0.1",()=>{j.off("error",w),s()})}),n=j.address().port;try{await r.listening(n)}catch(s){throw await i(),await r.close(),s}if(d&&(N=De(e,r.changed)),Ls){let s=$t.readFileSync(bt,"utf8");_=()=>{let w=null;try{w=$t.readFileSync(bt,"utf8")}catch{}w!==s&&(c.log("[gallery] The package was replaced (another version installed): this server stops; the next gallery command starts the new one."),r.stop())},$t.watchFile(bt,{interval:3e3,persistent:!1},_)}if(g)for(let s of["SIGINT","SIGTERM","SIGHUP"])process.once(s,()=>r.stop());return{server:j,port:n,routes:r,async close(){await i(),await r.close()}}}export{fd as a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{d as L}from"./chunk-2OHANJ6Q.mjs";import t from"node:fs/promises";import s from"node:path";import{randomBytes as B}from"node:crypto";import{defaultWorkspace as j,layoutOf as C}from"../browser/shared/workspace.mjs";import{withOutlineLock as $}from"../browser/shared/outline.mjs";import{extensionDirectory as z,extensionPath as S,forgetExtensionGrant as D,readManifest as M,setExtensionEnabled as A,listCapabilities as _}from"../browser/shared/extension-manifest.mjs";import{answerOf as G,readAnnouncement as W}from"../browser/shared/preview-server.mjs";import{createHash as X}from"node:crypto";var O=100*1024*1024,J=1e4;async function I(e,l){let o=await W();if(!o)return null;if(await G(o)!=="yes")throw new Error("Gallery \u670D\u52A1\u6682\u65F6\u65E0\u6CD5\u54CD\u5E94\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6269\u5C55\u64CD\u4F5C");let r=`http://127.0.0.1:${o.port}`,w=await fetch(`${r}/__gallery/extensions${e?`/${e}`:""}`,{method:"POST",headers:{Origin:r,"Content-Type":"application/json","X-Gallery-Token":o.token},body:JSON.stringify(l),signal:AbortSignal.timeout(3e4)}),n=await w.json();if(!w.ok)throw new Error(n.message??"\u6269\u5C55\u64CD\u4F5C\u5931\u8D25");return n}async function P(e){let l=X("sha256");async function o(r,w=""){for(let n of(await t.readdir(r,{withFileTypes:!0})).sort((m,y)=>m.name.localeCompare(y.name))){let m=w+n.name,y=s.join(r,n.name);if(l.update(JSON.stringify([m,n.isDirectory()?"d":"f"])),n.isDirectory())await o(y,m+"/");else if(n.isFile())l.update(await t.readFile(y));else throw new Error("\u6269\u5C55\u53EA\u80FD\u5305\u542B\u666E\u901A\u6587\u4EF6\u548C\u6587\u4EF6\u5939")}}return await o(e),l.digest("hex")}async function tt(e,{inService:l=!1,beforeReplace:o=async()=>{},enable:r=!1}={}){if(e=s.resolve(e),typeof r!="boolean")throw new Error("enable \u5FC5\u987B\u662F\u5E03\u5C14\u503C");if(!l){let c=await I("install",{path:e,enable:r});if(c)return c.installed}let w=C(j()).extensions;if(await t.mkdir(w,{recursive:!0}),(await t.lstat(w)).isSymbolicLink())throw new Error("\u6269\u5C55\u76EE\u5F55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5");let n=await t.mkdtemp(s.join(w,".install-")),m=0,y=0,x=c=>{if(m+=c,++y>J||m>O)throw new Error("\u6269\u5C55\u8D85\u8FC7 100MB \u6216 10000 \u4E2A\u6587\u4EF6")};try{let c=await t.lstat(e);if(c.isSymbolicLink())throw new Error("\u5B89\u88C5\u6E90\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5");if(c.isDirectory()){let i=async(d,g)=>{for(let f of await t.readdir(d,{withFileTypes:!0})){S(f.name);let a=s.join(d,f.name),u=s.join(g,f.name);if(f.isDirectory())x(0),await t.mkdir(u),await i(a,u);else if(f.isFile())x((await t.stat(a)).size),await t.copyFile(a,u);else throw new Error("\u6269\u5C55\u53EA\u80FD\u5305\u542B\u666E\u901A\u6587\u4EF6\u548C\u6587\u4EF6\u5939")}};await i(e,n)}else if(c.isFile()&&e.toLowerCase().endsWith(".zip")){if(c.size>O)throw new Error("\u6269\u5C55 ZIP \u8D85\u8FC7 100MB");let i=L(e);try{let d=new Set,g=i.entries.find(a=>a.name==="extension.json")??i.entries.find(a=>/^[^/]+\/extension.json$/.test(a.name));if(!g)throw new Error("ZIP \u4E2D\u6CA1\u6709 extension.json");let f=g.name.slice(0,-14);for(let a of i.entries){if(S(a.name),!a.name.startsWith(f))throw new Error("ZIP \u7684\u6587\u4EF6\u5FC5\u987B\u5728\u540C\u4E00\u4E2A\u6269\u5C55\u6587\u4EF6\u5939\u5185");let u=a.name.slice(f.length),Z=S(u),v=u.toLowerCase();if(d.has(v))throw new Error("ZIP \u4E2D\u5B58\u5728\u91CD\u540D\u6587\u4EF6");d.add(v),x(a.size);let F=s.join(n,...Z);await t.mkdir(s.dirname(F),{recursive:!0}),await i.extract(a,F)}}finally{i.close()}}else throw new Error("\u8BF7\u9009\u62E9\u6269\u5C55\u6587\u4EF6\u5939\u6216 ZIP");let E=await M(n),h=E.id??s.basename(e).replace(/\.zip$/i,""),p=z(h),b=s.join(w,`.old-${B(8).toString("hex")}`),k;await $(j(),async()=>{let i=await t.lstat(p).catch(()=>null);if(i?.isSymbolicLink())throw new Error("\u5DF2\u5B89\u88C5\u7684\u6269\u5C55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5");if(i&&await P(n)===await P(p)){k="unchanged";return}k=i?"updated":"installed",await o(h),i&&await t.rename(p,b);try{await t.rename(n,p)}catch(d){throw i&&await t.rename(b,p),d}i&&await t.rm(b,{recursive:!0,force:!0})}),r&&await A({id:h,enabled:!0});let T=(await _()).find(i=>i.id===h);return{id:h,name:E.name??h,version:E.version??null,folder:p,agent:E.agent?s.join(p,E.agent):null,enabled:!!T?.enabled,did:k}}finally{await t.rm(n,{recursive:!0,force:!0})}}async function et(e,{inService:l=!1,beforeReplace:o=async()=>{}}={}){if(!l&&await I("remove",{id:e}))return;let r=z(e);if((await t.lstat(s.dirname(r))).isSymbolicLink())throw new Error("\u6269\u5C55\u76EE\u5F55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5");await o(e),await $(j(),async()=>{if((await t.lstat(r)).isSymbolicLink())throw new Error("\u6269\u5C55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5");await D(e),await t.rm(r,{recursive:!0})})}export{I as a,tt as b,et as c};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{b as r,f}from"./chunk-L4WLQYFC.mjs";import"./chunk-5L7RYZCL.mjs";import{findPreviewServer as p}from"../browser/shared/preview-server.mjs";var $=o=>o<5?"\u521A\u521A":o<60?`${o} \u79D2\u524D`:o<3600?`${Math.round(o/60)} \u5206\u949F\u524D`:`${Math.round(o/3600)} \u5C0F\u65F6\u524D`,a={saved:"\u5DF2\u4FDD\u5B58",pending:"\u6709\u4FEE\u6539\u8FD8\u6CA1\u4FDD\u5B58",conflict:o=>`\u6709\u51B2\u7A81\uFF08${o.conflicts} \u5904\uFF09\u6CA1\u5904\u7406`,offline:"\u6CA1\u8FDE\u4E0A Gallery \u7684\u670D\u52A1\uFF0C\u4FEE\u6539\u6682\u5B58\u5728\u6D4F\u89C8\u5668\u91CC"},g=o=>typeof a[o.save]=="function"?a[o.save](o):a[o.save]??o.save,u=o=>`\u300C${o}\u300D`,h=o=>o.visible&&o.focused?"\u6B63\u5728\u770B":o.visible?"\u6807\u7B7E\u9875\u663E\u793A\u7740\uFF0C\u7A97\u53E3\u6CA1\u6709\u7126\u70B9":"\u6807\u7B7E\u9875\u5728\u540E\u53F0";function d(o){let n=o.kind==="page"?`\u81EA\u5B9A\u4E49\u9875 ${o.slug}`:o.slug;return o.save==="conflict"?`${n} \u6709 ${o.conflicts} \u5904\u51B2\u7A81\uFF0C\u7528\u6237\u8FD8\u6CA1\u5904\u7406\uFF1A\u5148\u8BA9\u7528\u6237\u5728\u9875\u9762\u4E0A\u5904\u7406\uFF0C\u518D\u6539\u6587\u4EF6\uFF0C\u5426\u5219\u4ED6\u90A3\u8FB9\u4F1A\u518D\u5F39\u51B2\u7A81\u3002`:o.save==="pending"?`${n} \u6709\u4FEE\u6539\u8FD8\u6CA1\u4FDD\u5B58\uFF1A\u5148\u8BA9\u7528\u6237\u5904\u7406\uFF08\u7B49\u9875\u9762\u663E\u793A\u5DF2\u4FDD\u5B58\uFF09\uFF0C\u518D\u6539\u6587\u4EF6\uFF0C\u5426\u5219\u4ED6\u90A3\u8FB9\u4F1A\u5F39\u51B2\u7A81\u3002`:o.save==="offline"?`${n} \u7684\u4FEE\u6539\u6682\u5B58\u5728\u6D4F\u89C8\u5668\u91CC\uFF0C\u6CA1\u8FDE\u4E0A Gallery \u7684\u670D\u52A1\uFF1A\u5148\u8BA9\u7528\u6237\u5904\u7406\uFF0C\u518D\u6539\u6587\u4EF6\u3002`:null}function k(o,n,t){let e=[`${n+1}. ${o.kind==="page"?"@":""}${o.slug}\uFF08${o.title||"\u672A\u547D\u540D"}\uFF09${o.kind==="page"?" \u81EA\u5B9A\u4E49\u9875":""}${t?" \u6700\u8FD1\u7528\u7684":""}`,` ${h(o)}\uFF0C${$(o.idle)}\u6709\u64CD\u4F5C`];if(o.file&&e.push(` \u6587\u4EF6\uFF1A${o.file}`),o.selection){let s=o.selection.blocks.length?`\uFF08\u5757 ${o.selection.blocks.join("\u3001")}${o.selection.kind==="blocks"?"\uFF0C\u6574\u5757\u9009\u4E2D":""}\uFF09`:"";e.push(` \u9009\u4E2D\uFF1A${u(o.selection.text)}${o.selection.truncated?"\u2026":""}${s}`)}else o.caret&&e.push(` \u5149\u6807\u5728${o.caret.block?`\u5757 ${o.caret.block}`:"\u4E00\u4E2A\u6587\u4EF6\u91CC\u8FD8\u6CA1\u6709 id \u7684\u5757"}${o.caret.text?`\uFF1A${u(o.caret.text)}`:"\uFF08\u7A7A\u7684\uFF09"}`);return e.push(` \u4FDD\u5B58\uFF1A${g(o)}`),o.notes&&e.push(` \u6279\u6CE8\uFF1A${o.notes} \u6761`),e}function m(o,n){let t=o.open??[];if(t.length===0)return[`Gallery \u5728\u8FD0\u884C\uFF08\u7AEF\u53E3 ${n}\uFF09\uFF0C\u6D4F\u89C8\u5668\u91CC\u6CA1\u6709\u6253\u5F00\u7684\u6587\u6863\u3002`];let i=[`Gallery \u5728\u8FD0\u884C\uFF08\u7AEF\u53E3 ${n}\uFF09\uFF0C\u6D4F\u89C8\u5668\u91CC\u5F00\u7740 ${t.length} \u4E2A\u6587\u6863\u6216\u9875\u9762\uFF08\u6700\u8FD1\u7528\u7684\u5728\u6700\u524D\uFF09\uFF1A`];t.forEach((s,l)=>i.push(...k(s,l,l===0)));for(let s of t){let l=d(s);l&&i.push(`\u95EE\u9898\uFF1A${l}`)}let e=t[0];return e&&(e.selection||e.caret?.block)&&e.file&&i.push(`\u63D0\u793A\uFF1A\u7528\u6237\u8BF4\u300C\u8FD9\u4E00\u6BB5\u300D\u300C\u8FD9\u91CC\u300D\u300C\u8FD9\u7BC7\u300D\uFF0C\u6307\u7684\u591A\u534A\u662F\u7B2C\u4E00\u4E2A\uFF1A\u9009\u4E2D\u7684\u5B57\u6240\u5728\u7684\u5757\uFF0C\u6CA1\u6709\u9009\u4E2D\u5C31\u662F\u5149\u6807\u6240\u5728\u7684\u5757\uFF1B\u5728 ${e.file} \u91CC\u6309 data-block-id \u627E\u5230\u5B83\u3002`),i}async function v(o){let{positional:n,options:t}=f({options:["--json"],argv:o});if(n.length>0)throw new r("gallery status takes no document: it says what the reader has open (gallery list shows the documents).");let i=t.has("--json"),e=await p({answering:!0,timeout:3e3});if(!e){console.log(i?JSON.stringify({running:!1,open:[]},null,2):"Gallery \u6CA1\u5728\u8FD0\u884C\uFF0C\u6D4F\u89C8\u5668\u91CC\u6CA1\u6709\u6253\u5F00\u7684\u6587\u6863\u3002");return}let s=null,l=null;try{let c=await fetch(`http://127.0.0.1:${e.port}/__gallery/workspace/status`,{headers:{"X-Gallery-Token":e.token},signal:AbortSignal.timeout(1e4)});s=await c.json().catch(()=>null),s?.ok||(l=s?.reason==="unknown"?"\u8FD0\u884C\u7740\u7684 Gallery \u8FD8\u4E0D\u4F1A\u62A5\u544A\u8FD9\u4E2A\uFF08\u5B83\u662F\u65E7\u7248\u672C\uFF09\uFF1A\u8FD0\u884C gallery stop\uFF0C\u518D\u8FD0\u884C gallery open \u6362\u6210\u65B0\u7684\u3002":`Gallery \u7684\u670D\u52A1\u6CA1\u6709\u7ED9\u51FA\u7ED3\u679C\uFF08${s?.reason??`HTTP ${c.status}`}\uFF09\u3002`)}catch(c){l=`\u8FDE\u4E0D\u4E0A Gallery \u7684\u670D\u52A1\uFF08\u7AEF\u53E3 ${e.port}\uFF09\uFF1A${c.message}`}if(l){console.error(`\u95EE\u9898\uFF1A${l}`),process.exitCode=1;return}if(i)console.log(JSON.stringify({running:!0,port:e.port,open:s.open??[],last:s.last??null},null,2));else for(let c of m(s,e.port))console.log(c)}export{d as problemOf,v as run,m as statusLines};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{b as T}from"./chunk-ZNGGDUZI.mjs";import{a as f,b as g,c as $,e as N,f as b,g as y,h as C,n as p}from"./chunk-B6RAGF4R.mjs";import{b as c,f as h}from"./chunk-L4WLQYFC.mjs";import k from"node:path";import{isTop as D}from"../browser/shared/outline-shape.mjs";import{pageLinks as M,pageOfLink as W}from"../browser/shared/page-links.mjs";import{listPages as E,readPageMeta as I}from"../browser/shared/pages.mjs";import{reportsDirectory as u}from"../browser/shared/paths.mjs";import{defaultWorkspace as d,listTrash as L}from"../browser/shared/workspace.mjs";import{workspaceKey as O}from"../browser/shared/workspace-registry.mjs";var A=(e,s)=>O(e)===O(s),m=e=>String(e).replace(/\s+/g," ").trim(),v={document:"document",page:"custom page",link:"web link"};async function P(e,s){if(e.startsWith("~"))return{refused:`${e} is a document of another workspace: trash it in that workspace (gallery trash <slug> --workspace <its path>; gallery workspaces lists them).`};let o=await I(e,d()).catch(()=>null);if(o)return{kind:"page",slug:o.slug,title:o.title};let n=[...s.documents.values()].filter(({url:i})=>i!==void 0),t=W(M(n),e.replace(/^.*#/,""));if(t&&s.documents.get(t)?.url!==void 0)return{kind:"link",slug:t,title:s.documents.get(t).title};let r=null;try{let i=await C(e,"the document to trash",s);return i.refused?{refused:i.refused}:{kind:"document",slug:i.slug,title:s.documents.get(i.slug).title}}catch(i){if(!(i instanceof c))throw i;r=/ in the trash/.test(i.message)?new c(`${e} is in the trash already: gallery trash restore ${e} puts it back where it was; gallery trash empty ${e} deletes it for good (only when the user asks).`):i}let l=m(e).toLowerCase(),a=[...[...s.documents.values()].filter(({slug:i})=>!i.startsWith("~")).map(({slug:i,title:w,url:S})=>({kind:S!==void 0?"link":"document",slug:i,title:w})),...(await E(d()).catch(()=>[])).map(({slug:i,title:w})=>({kind:"page",slug:i,title:w}))].filter(({title:i})=>m(i).toLowerCase()===l);if(a.length===1)return a[0];if(a.length>1)return{refused:`More than one entry is called "${e}" (${a.map(({slug:i})=>i).join(", ")}): name one by its slug.`};throw r}var q=e=>e==="page"?d():u;async function J({kind:e,slug:s}){let o=await p("trash",{slug:s,kind:e},{root:q(e)});return o?.ok?o.entry:{refused:o?.message??o?.reason??"no answer"}}async function x(){let e=(await L(u)).map(o=>({...o,root:u})),s=A(u,d())?[]:(await L(d())).filter(({kind:o})=>o==="page").map(o=>({...o,root:d()}));return[...e,...s].sort((o,n)=>n.at-o.at)}function K(e,s){if(s.kind==="page")return{text:"custom page",parent:null,column:null};let o=s.parent??"";if(D(o)){let n=$(e,o);return{text:n?o===""?"top level":`top of the ${g(n)} column`:"top level (its column is gone)",parent:null,column:n?g(n):null}}if(e.documents.has(o)){let n=$(e,b(e,o));return{text:`under ${N(e,o)}`,parent:o,column:n?g(n):null}}return{text:"top level (the entry it was under is gone)",parent:null,column:null}}function j(e,s){let o=e.filter(t=>t.id===s||t.slug===s),n=o.length?o:e.filter(t=>m(t.title).toLowerCase()===m(s).toLowerCase());return n.length===1?n[0]:n.length>1?{refused:`More than one item of the trash is called "${s}": name one by its id (${n.map(t=>t.id).join(", ")}).`}:{refused:`No item "${s}" in the trash: gallery trash list shows what it holds, with their ids.`}}async function R(e){if(e.length===0)throw new c("Name what to move to the trash: a document, a custom page or a web link.");let s=await f(),o=[];for(let t of e){let r=await P(t,s);r.refused&&(console.error(`${r.refused} Nothing moved to the trash.`),process.exit(1)),!o.some(({slug:l})=>l===r.slug)&&o.push(r)}let n=!1;for(let t of o){let r=t.kind==="document"?s.children[t.slug]??[]:[],l=y(s,t.slug),a=await J(t);if(a.refused){console.error(`Not moved to the trash: ${t.slug} (${t.title}): ${a.refused}.`),n=!0;continue}console.log(`Moved the ${v[t.kind]} ${t.slug} (${t.title}) to the trash (id ${a.id}).`),t.kind!=="page"&&console.log(` It ${l==="\u4F4D\u7F6E\uFF1A\u9876\u5C42"?"was at the top level":`was ${l.replace("\u4F4D\u7F6E\uFF1A","in ")}`}${r.length?`; the ${r.length} document${r.length===1?"":"s"} under it moved up there: ${r.join(", ")}`:""}.`)}console.log("\u63D0\u793A\uFF1Agallery trash restore <slug or id> puts an item back where it was; gallery trash list shows the trash. Nothing is deleted for good until gallery trash empty, which only the user's own request allows."),n&&(process.exitCode=1)}async function U(e){let s=await f(),n=(await x()).map(t=>{let r=K(s,t);return{id:t.id,kind:t.kind,slug:t.slug,title:t.title,trashed:new Date(t.at).toISOString(),at:t.at,parent:r.parent,column:r.column,place:r.text,workspace:k.resolve(t.root)}});if(e)return void console.log(JSON.stringify({workspace:k.resolve(u),items:n},null,2));if(console.log(`\u5DE5\u4F5C\u533A\uFF1A${k.resolve(u)}`),!n.length)return void console.log("The trash is empty.");console.log(`The trash holds ${n.length} item${n.length===1?"":"s"}, the one moved last first:`);for(let t of n)console.log(`- ${t.id} ${v[t.kind]} ${t.slug} ${t.title}`),console.log(` It was ${t.place}; moved ${T(t.at)}.`);console.log("gallery trash restore <slug or id>\u2026 puts items back; gallery trash empty [<slug or id>\u2026] deletes for good (only when the user asks).")}async function z(e){if(e.length===0)throw new c("Name what to restore: its slug, its title or its id (gallery trash list shows them).");let s=await x(),o=[];for(let t of e){let r=j(s,t);r.refused&&(console.error(`${r.refused} Nothing restored.`),process.exit(1)),o.includes(r)||o.push(r)}let n=!1;for(let t of o){let r=await p("restore",{id:t.id},{root:t.root});if(!r?.ok){console.error(`Not restored: ${t.slug} (${t.title}): ${r?.message??r?.reason??"no answer"}.`),n=!0;continue}let l=r.entry?.slug??t.slug;if(console.log(`Restored the ${v[t.kind]} ${l} (${t.title})${l!==t.slug?`; ${t.slug} was taken meanwhile`:""}.`),t.kind!=="page"){let a=await f();console.log(y(a,l))}}n&&(process.exitCode=1)}async function B(e){let s=await x(),o=[];for(let l of e){let a=j(s,l);a.refused&&(console.error(`${a.refused} Nothing deleted.`),process.exit(1)),o.includes(a)||o.push(a)}let n=e.length?o:s;if(!n.length)return void console.log("The trash is empty: nothing to delete.");let t=!1,r=[];for(let l of n){let a=await p("destroy",{id:l.id},{root:l.root});if(!a?.ok){console.error(`Not deleted: ${l.slug} (${l.title}): ${a?.message??a?.reason??"no answer"}.`),t=!0;continue}r.push(`${l.slug} (${l.title})`)}r.length&&console.log(`Deleted for good from the trash (${r.length}): ${r.join(", ")}. This cannot be undone.`),t&&(process.exitCode=1)}async function et(e){let[s,...o]=e;if(s==="list"){let{positional:n,options:t}=h({options:["--json"],argv:o});if(n.length)throw new c("gallery trash list takes nothing else.");return U(t.has("--json"))}return s==="restore"?z(h({argv:o}).positional):s==="empty"?B(h({argv:o}).positional):R(h({argv:e}).positional)}export{P as a,J as b,et as c};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{b as t,f as i}from"./chunk-L4WLQYFC.mjs";import"./chunk-5L7RYZCL.mjs";import{changePreferenceDocuments as d,listPreferenceDocuments as a}from"../browser/shared/preference-documents.mjs";async function u(c){let{positional:f,options:r}=i({argv:c,options:["--json","--all"]}),[l="list",n,...m]=f;if(l==="list"){if(n)throw new t("gallery preferences list [--json] [--all]");let e=(await a()).filter(o=>r.has("--all")||o.enabled);if(r.has("--json"))return void console.log(JSON.stringify(e,null,2));if(!e.length)return void console.log("\u5199\u4F5C\u504F\u597D\uFF1A\u5168\u90E8\u5DF2\u505C\u7528\u3002\u6309\u672C\u6B21\u7528\u6237\u8981\u6C42\u5199\u4F5C\u3002");console.log("\u5199\u4F5C\u504F\u597D\uFF1A\u6309\u6807\u9898\u548C\u5185\u5BB9\u9009\u62E9\u672C\u6B21\u4EFB\u52A1\u9002\u7528\u7684\u542F\u7528\u6587\u6863\uFF1B\u51B2\u7A81\u65F6\u7528\u6237\u8981\u6C42\u4F18\u5148\uFF0C\u5176\u6B21\u6309\u6B64\u987A\u5E8F\u7684\u9002\u7528\u504F\u597D\uFF0C\u6700\u540E\u662F skill\u3002");for(let o of e)console.log(`${o.enabled?"":"[\u5DF2\u505C\u7528] "}${o.name}
|
|
3
|
+
${o.file}`);return}if(!["on","off"].includes(l)||!n||m.length||r.size)throw new t("gallery preferences on|off <name>");let g=await a(),s=g.filter(e=>e.id===n||e.name===n||e.file===n);if(s.length!==1)throw new t("Name one preference shown by gallery preferences list --all.");await d({action:"enabled",id:s[0].id,enabled:l==="on"}),console.log(`${l==="on"?"\u5DF2\u542F\u7528":"\u5DF2\u505C\u7528"} ${s[0].name}`)}export{u as run};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{A,B,C,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}from"./chunk-4LR2QEC2.mjs";import"./chunk-Q4UEPUWF.mjs";import"./chunk-5L7RYZCL.mjs";export{d as CACHE_FILE,e as FRESH,c as NEWER_LINE,a as PACKAGE,f as RETRY,b as SKILL_LINE,g as TIMEOUT,B as attentionNotes,j as cacheDirectory,h as checkOff,r as claimCheck,v as galleryRun,o as latestUrl,x as newerLine,l as npmSettings,A as npmStatus,k as parseNpmrc,p as readCache,s as refreshCache,n as refreshEnv,m as registryOf,u as skillFolders,w as skillLine,z as skillLines,y as skillStates,q as stale,t as startRefresh,C as versionNotes,i as viaNpx};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{$ as ha,A as I,B as J,C as K,D as L,E as M,F as N,G as O,H as P,I as Q,J as R,K as S,L as T,M as U,N as V,O as W,P as X,Q as Y,R as Z,S as _,T as $,U as aa,V as ba,W as ca,X as da,Y as ea,Z as fa,_ as ga,a as i,aa as ia,b as j,ba as ja,c as k,ca as ka,d as l,da as la,e as m,ea as ma,f as n,fa as na,g as o,ga as oa,h as p,ha as pa,i as q,ia as qa,j as r,k as s,l as t,m as u,n as v,o as w,p as x,q as y,r as z,s as A,t as B,u as C,v as D,w as E,x as F,y as G,z as H}from"./chunk-V3XROSP5.mjs";import"./chunk-342HXE3Q.mjs";import"./chunk-OKVQQ3CX.mjs";import"./chunk-X4WNLFIK.mjs";import"./chunk-LHGKPMTI.mjs";import"./chunk-TLNJWEFY.mjs";import"./chunk-ZOEJQOKT.mjs";import"./chunk-IA4PSIMD.mjs";import"./chunk-QR4V4A2Z.mjs";import"./chunk-ZTHICSSF.mjs";import{a,b,c,f as d,g as e,h as f,k as g,l as h}from"./chunk-TQZU7D7C.mjs";import"./chunk-5IHDLEB4.mjs";import"./chunk-B2EIMERT.mjs";import"./chunk-6N25CJ6Y.mjs";import"./chunk-F4CT35KL.mjs";import"./chunk-BFJGHSQN.mjs";import"./chunk-U5XL7D6A.mjs";import"./chunk-6ILJWFYW.mjs";import"./chunk-VRPVVMRB.mjs";import"./chunk-HYMEEXKN.mjs";import"./chunk-L4WLQYFC.mjs";import"./chunk-NOGQX56R.mjs";import"./chunk-UMHUSOPJ.mjs";import"./chunk-W5NPH5UA.mjs";import"./chunk-ECZBLQKK.mjs";import"./chunk-E7656LR7.mjs";import"./chunk-TKWEX4FD.mjs";import"./chunk-A55HN5OK.mjs";import"./chunk-5L7RYZCL.mjs";export{ea as ADVICE,t as BLOCK_PICTURES,u as CHANGED_PICTURES,fa as CODE_SIDEWAYS,ba as HAND_OVER,v as INK_MARGIN,i as KINDS,j as LEVELS,k as LOOKS,ca as LOOK_YOURSELF,aa as MORE_PICTURES,N as MOSTLY_CHANGED,z as MOVED_PART,y as MOVED_WHOLE,x as NEIGHBOUR_EDGE,p as PICTURED_INFO,W as RUNS_KEPT,ia as SCROLLS,w as SCROLL_FRAMES,s as SCROLL_SLACK,ha as WARNED,l as WIDE,m as WIDTHS,f as adoptIdless,ga as adviceOf,e as baselineOf,M as baselineSaid,b as blocksOf,O as blocksToPicture,_ as checklistSaid,ja as describeLooks,T as disclosuresSaid,Z as endRun,g as exportBaselines,H as exportOf,ma as exportingFirst,R as findingKey,q as findingLevel,P as inkOf,Q as inventory,n as layoutNotesOf,o as levelOf,S as lookAt,K as missedWidths,$ as morePictures,I as movedBlocks,A as movedClips,na as namedBlocks,J as nextBaseline,ka as notPicturedLine,c as pageOf,r as picturedAt,U as picturesSaid,E as placeOf,h as previewBaseline,a as rankOf,d as readBaseline,qa as run,X as runName,L as seenOf,D as sourceIndex,G as staleExport,da as startFailure,Y as startRun,F as timeOf,oa as unknownBlocks,pa as unknownBlocksSaid,V as unopenedSaid,B as urlName,la as verdictOf,C as wordsOf};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __galleryRequire } from "node:module"; import { fileURLToPath as __galleryPath } from "node:url"; const require = __galleryRequire(import.meta.url); const __filename = __galleryPath(import.meta.url); const __dirname = __galleryPath(new URL(".", import.meta.url));
|
|
2
|
+
import{j as V}from"./chunk-B6RAGF4R.mjs";import{a as m}from"./chunk-5TLLIZT7.mjs";import{c as Q}from"./chunk-XNNCQROX.mjs";import"./chunk-LJZIYVNA.mjs";import"./chunk-IA4PSIMD.mjs";import"./chunk-ZTHICSSF.mjs";import{b as K}from"./chunk-6N25CJ6Y.mjs";import{g as H}from"./chunk-F4CT35KL.mjs";import{c as X}from"./chunk-U5XL7D6A.mjs";import"./chunk-6ILJWFYW.mjs";import{f as G}from"./chunk-VRPVVMRB.mjs";import"./chunk-HYMEEXKN.mjs";import{b as h,f as T,i as U}from"./chunk-L4WLQYFC.mjs";import{a as q}from"./chunk-UMHUSOPJ.mjs";import"./chunk-W5NPH5UA.mjs";import"./chunk-ECZBLQKK.mjs";import"./chunk-E7656LR7.mjs";import"./chunk-TKWEX4FD.mjs";import"./chunk-A55HN5OK.mjs";import"./chunk-5L7RYZCL.mjs";import{existsSync as Y}from"node:fs";import P from"node:fs/promises";import p from"node:path";import{LOOK as ie,effectiveLook as le,fullLook as B,ownLookOf as C}from"../browser/shared/document-look.mjs";import{iconKind as Z}from"../browser/shared/emoji/icon-value.mjs";import{writeAtomic as ee}from"../browser/shared/files.mjs";import{reportsDirectory as j}from"../browser/shared/paths.mjs";import{findPreviewServer as ce}from"../browser/shared/preview-server.mjs";import{roleOf as fe}from"../browser/shared/reports.mjs";import{documentDirectory as me,documentFiles as de,pageSlug as ue}from"../browser/shared/workspace.mjs";import{workspaceLook as he}from"../browser/shared/workspace-look.mjs";var te=o=>o.replace(/\s+/g," ").trim(),pe=o=>o.replace(/^[a-z]:\/(?:[^/]+\/)*?(?=icons\/(?:tabler\/)?[^/]+$)/i,"/"),O=o=>o===null?"none":JSON.stringify(o),J={"--font":"font","--size":"size","--spacing":"spacing","--width":"width","--full":"full"},se={on:"full",off:"default"},oe=o=>o==="--full"?Object.keys(se):ie[J[o]],L=(o,r)=>o==="full"?r==="full"?"on":"off":r;async function ne(o,r){let w=await ce(),n=w?await V(w,r,o):null;if(n)return n;let[,N]=await Q({edits:{},reports:{},reportsDirectory:j,web:{icon:g=>H(g)}}).run(o,r);return N}async function we(o){let r=o.replace(/^:(.+):$/,"$1");if(!/^[\p{Ll}\p{Lo}\d_-]{1,49}$/u.test(r))return null;let[,{list:w}]=await K({reportsDirectory:j}).listEmojis();return w.find(n=>n.name===r)??null}async function Ke(o){let{positional:r,options:w,values:n}=T({options:["--all"],values:["--title","--icon","--description",...Object.keys(J)],argv:o});if(r.length!==1)throw new h("Name one document, then what to set: --title, --icon, --description, --font, --size, --spacing, --width, --full.");let N=Object.keys(J).filter(e=>n.has(e));if(!["--title","--icon","--description"].some(e=>n.has(e))&&N.length===0&&!w.has("--all"))throw new h('Say what to set: --title "<title>", --icon <emoji|none|\u2026>, --description "<text>", --font/--size/--spacing/--width <value>, --full on|off, or --all.');for(let e of N)if(!oe(e).includes(n.get(e)))throw new h(`${e} takes ${oe(e).join(", ")}, not ${n.get(e)}.`);let g=N.map(e=>[J[e],e==="--full"?se[n.get(e)]:n.get(e)]),c=n.has("--title")?te(n.get("--title")):void 0,y=n.has("--description")?te(n.get("--description")):void 0;if(c==="")throw new h("--title takes the words of the title: a document's title is never empty.");if(y==="")throw new h("--description takes words: a document's description is never empty.");let i,d=null;if(n.has("--icon")){let e=pe(n.get("--icon").trim()),t=e==="none"?"none":Z(e);if(!t&&!/["<>&]/.test(e)&&(d=await we(e)),!t&&!d||/["<>&]/.test(e))throw new h(`Not a page icon: ${e} (an emoji, none, an icon of the \u56FE\u6807 tab as /icons/<name>_<color>.svg, a picture of the document's assets/, or the name of a custom emoji: gallery emoji list lists them).`);if(t==="glyph"&&!X(e))throw new h(`No such icon of the \u56FE\u6807 tab: ${e}.`);i=t==="none"?null:d?void 0:e}let{slug:$}=await U(r[0]),S=me($,j);($===await ue(j)||await fe(S)==="instructions")&&(console.error(`${r[0]} is the \u5199\u4F5C\u504F\u597D page: only the user changes it.`),process.exit(1));let{html:u,json:a}=de(S);if(Y(u)||(console.error(`No document "${r[0]}": ${m(u)} does not exist (gallery list lists those there are).`),process.exit(1)),d){let[,e]=await K({reportsDirectory:j}).upload({slug:$,library:d.id});e?.ok||(console.error(`Could not copy the custom emoji ${d.name} into ${m(S)}: ${e?.message??e?.reason??"no answer"}.`),process.exit(1)),i=e.path}i&&Z(i)==="image"&&!Y(p.join(S,...i.split("/")))&&(console.error(`No picture ${i} in ${m(S)}: put it in its assets/ first.`),process.exit(1));let f;try{if(f=JSON.parse(await P.readFile(a,"utf8")),!f||typeof f!="object"||Array.isArray(f))throw new Error("not an object")}catch(e){console.error(`${m(a)} does not read (${e.code??e.message}): mend it first.`),process.exit(1)}let A=null,z=!1;for(let e=1;c!==void 0||i!==void 0;e++){let t=await P.readFile(u,"utf8"),s=q(t),b=G(s,{title:c,icon:i});if(b.missing&&(console.error(`${m(u)} has no title to ${c!==void 0?"set":"put the icon before"}: write it as an h1.doc-title in the page's header (writing-html.md, "The page").`),process.exit(1)),A=b.before,b.text===s)break;if(await ee(u,b.text,{expect:t})){z=!0;break}e===3&&(console.error(`${m(u)} kept changing while it was being written (the page saving, or an Agent writing it?): nothing written. Run gallery set again.`),process.exit(1))}let l={...f};c!==void 0&&(l.title=c),y!==void 0&&(l.description=y),i===null?delete l.icon:i!==void 0&&(l.icon=i);let F=JSON.stringify(l)!==JSON.stringify(f);F&&await ee(a,`${JSON.stringify(l,null,2)}
|
|
3
|
+
`);let E=B(le(l.look,he(j))),W=E;for(let[e,t]of g){let s=await ne("look",{slug:$,field:e,value:t});s?.ok||(console.error(`Not set: ${s?.message??s?.reason??"no answer"}.`),process.exit(1)),W=B(s.report?.look)}let I=C(l.look);g.length>0&&(I=C(JSON.parse(await P.readFile(a,"utf8").catch(()=>"{}")).look));let v=null;if(w.has("--all")){let e=await ne("looks",{slug:$});e?.ok||(console.error(`Not applied to all documents: ${e?.message??e?.reason??"no answer"}.`),process.exit(1)),v=B(e.look)}let _=p.basename(u),k=[];c!==void 0&&k.push(` title: ${O(A.title)} \u2192 ${O(c)} (${_}'s h1 and <title>, ${p.basename(a)})`),i!==void 0&&k.push(` icon: ${O(A.icon)} \u2192 ${O(i)} (${_}'s header, ${p.basename(a)}${d?`; the custom emoji ${d.name}`:""})`),y!==void 0&&k.push(` description: ${O(typeof f.description=="string"?f.description:null)} \u2192 ${O(y)} (${p.basename(a)})`);let re=C(l.look),M=g.filter(([e])=>re[e]!==I[e]);for(let[e,t]of g){let s=e==="full"?"full width":e;M.some(([b])=>b===e)&&(E[e]!==W[e]?k.push(` ${s}: ${L(e,E[e])} \u2192 ${L(e,W[e])} (${p.basename(a)}'s look.${e})`):k.push(` ${s}: ${L(e,t)} kept as the document's own choice (${p.basename(a)}'s look.${e}; the page already showed it)`))}if(v){let e=Object.entries(v).filter(([t,s])=>s!==ie[t][0]).map(([t,s])=>`${t==="full"?"full width":t} ${L(t,s)}`);k.push(` all documents: ${e.length?e.join(", "):"the system's defaults"} (the look every document shows that has no choice of its own for it; kept with the user's settings, no document's file; documents with their own choices keep them)`)}let D=M.length>0,x=[...z?[m(u)]:[],...F||D?[m(a)]:[]];if(x.length===0&&!v){let e=[c,i,y].filter(t=>t!==void 0).length+g.length;console.log(`Nothing to change: ${$} has ${e===1?"that already":"those already"}.`);return}console.log(`Set ${$}:`);for(let e of k)console.log(e);if(x.length===0)return;let ae=x.length===1,R=["title","icon","description"].filter(e=>JSON.stringify(l[e])!==JSON.stringify(f[e]));D&&R.push("look"),console.log(`\u91CD\u8BFB\uFF1A${x.join("\u3001")}\uFF08\u6539\u4E4B\u524D\u5148\u91CD\u8BFB\uFF1Agallery set \u5199\u4E86${ae?"\u5B83":"\u5B83\u4EEC"}\u2014\u2014${[...z?[`${_}\uFF1A\u9875\u7709`]:[],...F||D?[`${p.basename(a)}\uFF1A${R.join(", ")}`]:[]].join("\uFF1B")}\uFF09`)}export{Ke as run};
|