ryugi-artifacts 1.5.3 → 1.6.1
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/bin/ryugi-artifacts.cjs +53 -0
- package/dist/runtime/robots.txt +9 -0
- package/dist/server.cjs +1138 -76
- package/dist/start-server.sh +279 -0
- package/dist/viewer/CloudDocument-Ba6KrnqA.js +1 -0
- package/dist/viewer/{DocumentPage-C-Vsy2RN.js → DocumentEditor-BS16Wb_Z.js} +161 -161
- package/dist/viewer/DocumentPage-DQmrD0th.js +1 -0
- package/dist/viewer/{abnfDiagram-VCTEODGH-BLJIRjn7.js → abnfDiagram-VCTEODGH-DuJfhZTl.js} +1 -1
- package/dist/viewer/app-icon-6WJOuhLx.svg +1 -0
- package/dist/viewer/app-icon-Bm9-i4yr.png +0 -0
- package/dist/viewer/{ar-SA-G6X2FPQ2-CQuCKRcV.js → ar-SA-G6X2FPQ2-CVlRFGvR.js} +1 -1
- package/dist/viewer/{architecture-7GRP2DOG-BklKKRgi.js → architecture-7GRP2DOG-BTLY6ygE.js} +1 -1
- package/dist/viewer/{architectureDiagram-5GKGNRK7-CuWNKZ7q.js → architectureDiagram-5GKGNRK7-Ca-sK1k9.js} +1 -1
- package/dist/viewer/{az-AZ-76LH7QW2-Y3fxvy40.js → az-AZ-76LH7QW2-CzO5U4tE.js} +1 -1
- package/dist/viewer/{bg-BG-XCXSNQG7-BfP7dTZX.js → bg-BG-XCXSNQG7-DLheLFGn.js} +1 -1
- package/dist/viewer/{blockDiagram-I7D4REHJ-BZ26PCCJ.js → blockDiagram-I7D4REHJ-CVWXNFVb.js} +1 -1
- package/dist/viewer/{bn-BD-2XOGV67Q-bmGdMzsN.js → bn-BD-2XOGV67Q-DvnFf2ym.js} +1 -1
- package/dist/viewer/{c4Diagram-7LVT6UL2-CquTlTpN.js → c4Diagram-7LVT6UL2-CddHgiim.js} +1 -1
- package/dist/viewer/{ca-ES-6MX7JW3Y-DizVDMBY.js → ca-ES-6MX7JW3Y-1SQM_Wxy.js} +1 -1
- package/dist/viewer/channel-C7FdHgA5.js +1 -0
- package/dist/viewer/{chunk-4HAMMTFA-Dmwx5_4O.js → chunk-4HAMMTFA-B7k7y3et.js} +1 -1
- package/dist/viewer/{chunk-75Z2AOVW-xTyaS-ou.js → chunk-75Z2AOVW-Dmt3SQH3.js} +1 -1
- package/dist/viewer/{chunk-DU6HZSFF-BnNI-hjm.js → chunk-DU6HZSFF-C0GRIO4w.js} +1 -1
- package/dist/viewer/{chunk-EIO257PC-oIxmEOae.js → chunk-EIO257PC-CNxgWaGL.js} +1 -1
- package/dist/viewer/{chunk-F27PBJKO-PNrLZNah.js → chunk-F27PBJKO-cC_G0fXX.js} +1 -1
- package/dist/viewer/{chunk-GMAD6QVW-Bl5zAM7P.js → chunk-GMAD6QVW-Do0Tih79.js} +1 -1
- package/dist/viewer/{chunk-GVQU2GXP-DwvDSBCB.js → chunk-GVQU2GXP-C9mWLYpa.js} +1 -1
- package/dist/viewer/{chunk-IMKFNOWR-CtbwO3Bc.js → chunk-IMKFNOWR-BqsuylOZ.js} +1 -1
- package/dist/viewer/{chunk-L3NEJ4N5-CVXJJIZF.js → chunk-L3NEJ4N5-D_AVAMEp.js} +1 -1
- package/dist/viewer/chunk-OSK3NFVY-BKczRUt9.js +10 -0
- package/dist/viewer/{chunk-P2QGCYS3-BM06KU7a.js → chunk-P2QGCYS3-BVqK-Rk9.js} +1 -1
- package/dist/viewer/{chunk-POPQ4Y6H-ap38DGDn.js → chunk-POPQ4Y6H-4s63FXj5.js} +1 -1
- package/dist/viewer/chunk-PWAF6VOD-CcIRMiiP.js +1 -0
- package/dist/viewer/{chunk-SHT3W25Y-D5QrkRRX.js → chunk-SHT3W25Y-D8R29R_u.js} +1 -1
- package/dist/viewer/{chunk-SVP7TREG-BCHFbEr7.js → chunk-SVP7TREG-DvPbOdMe.js} +1 -1
- package/dist/viewer/{chunk-TICWLB2K-C4S-7oYg.js → chunk-TICWLB2K-v1pSr6BB.js} +1 -1
- package/dist/viewer/classDiagram-ZZMXUADV-BJqflR68.js +1 -0
- package/dist/viewer/classDiagram-v2-VYDZK3BY-BJqflR68.js +1 -0
- package/dist/viewer/{cs-CZ-2BRQDIVT-Cx1vKlJK.js → cs-CZ-2BRQDIVT-CuIWOyM9.js} +1 -1
- package/dist/viewer/{cynefin-OW5HDTMX-DkcNTZzB.js → cynefin-OW5HDTMX-Bn02xX14.js} +1 -1
- package/dist/viewer/{cynefinDiagram-5FMLGOSQ-D5_O_uxk.js → cynefinDiagram-5FMLGOSQ-CarHaJWA.js} +1 -1
- package/dist/viewer/{da-DK-5WZEPLOC-CfT7RoAf.js → da-DK-5WZEPLOC-BNpk9O4Z.js} +1 -1
- package/dist/viewer/{dagre-GXQ25YYZ-DoEstiXx.js → dagre-GXQ25YYZ-jKxlutMc.js} +1 -1
- package/dist/viewer/{de-DE-XR44H4JA-BpI68YsU.js → de-DE-XR44H4JA-DeRYYEYN.js} +1 -1
- package/dist/viewer/{diagram-S7CK7UJ4-prZP2LrK.js → diagram-S7CK7UJ4-BzGz76pK.js} +1 -1
- package/dist/viewer/{diagram-UQ7AKVKN-DXC0KHX5.js → diagram-UQ7AKVKN-DDsoAc73.js} +1 -1
- package/dist/viewer/{diagram-VSXAHHWV-CQKqNVdK.js → diagram-VSXAHHWV-HxtxJg2X.js} +1 -1
- package/dist/viewer/diagram-VX7I27RA-BIeolo3r.js +24 -0
- package/dist/viewer/{diagram-Z3DM3KII-DbDOwCcH.js → diagram-Z3DM3KII-CU7mw2ow.js} +1 -1
- package/dist/viewer/dist-AH0bdIVa.js +1 -0
- package/dist/viewer/dist-BSeJYKLj.js +1 -0
- package/dist/viewer/dist-BbW5iWCe.js +1 -0
- package/dist/viewer/dist-BeULvDu_.js +1 -0
- package/dist/viewer/dist-BgSBKOA3.js +9 -0
- package/dist/viewer/dist-BlXyXxst.js +23 -0
- package/dist/viewer/dist-BppD0RS2.js +1 -0
- package/dist/viewer/dist-Bu_voPaa.js +1 -0
- package/dist/viewer/dist-C-ieEyE1.js +1 -0
- package/dist/viewer/dist-C21gJBBO.js +1 -0
- package/dist/viewer/dist-CHLFapPp.js +1 -0
- package/dist/viewer/dist-CZsxPTNE.js +1 -0
- package/dist/viewer/dist-Cackv1h9.js +1 -0
- package/dist/viewer/dist-CbHHxvP1.js +1 -0
- package/dist/viewer/dist-CddCPamz.js +1 -0
- package/dist/viewer/dist-CgYgXYmt.js +1 -0
- package/dist/viewer/{dist-DPFtpGhO.js → dist-CitzQ6z1.js} +4 -4
- package/dist/viewer/dist-Cu6PLla0.js +1 -0
- package/dist/viewer/dist-CvB831yK.js +1 -0
- package/dist/viewer/dist-DA8TW41P.js +2 -0
- package/dist/viewer/dist-DC1HltnF.js +1 -0
- package/dist/viewer/dist-DX3SNcdm.js +6 -0
- package/dist/viewer/dist-D_Vtqh_s.js +11 -0
- package/dist/viewer/dist-DqbHnPRI.js +1 -0
- package/dist/viewer/{ebnfDiagram-PWID7BFC-C7-pLnHO.js → ebnfDiagram-PWID7BFC-BUmzlASS.js} +1 -1
- package/dist/viewer/{el-GR-BZB4AONW-DxaEOnlq.js → el-GR-BZB4AONW-CU9I6jx_.js} +1 -1
- package/dist/viewer/{en-B4ZKOASM-BpxcP_a1.js → en-B4ZKOASM-DGboqHSv.js} +1 -1
- package/dist/viewer/{erDiagram-RLTQ6QDP-KdBuXErk.js → erDiagram-RLTQ6QDP-DRUmIoEG.js} +1 -1
- package/dist/viewer/{es-ES-U4NZUMDT-CskASecW.js → es-ES-U4NZUMDT-j5HevUjd.js} +1 -1
- package/dist/viewer/{eu-ES-A7QVB2H4-B5_Vk00E.js → eu-ES-A7QVB2H4-FpISoaoc.js} +1 -1
- package/dist/viewer/{eventmodeling-NTZA5JFV-BxSIs5tc.js → eventmodeling-NTZA5JFV-BCi8CKiX.js} +1 -1
- package/dist/viewer/{fa-IR-HGAKTJCU-BmL5yl-8.js → fa-IR-HGAKTJCU-COJsQztN.js} +1 -1
- package/dist/viewer/{fi-FI-Z5N7JZ37-l_h4pxvO.js → fi-FI-Z5N7JZ37-BNHsLnGq.js} +1 -1
- package/dist/viewer/flowDiagram-HODETNUW-BIce5Xbz.js +1 -0
- package/dist/viewer/{fr-FR-RHASNOE6-Bu8k6pSs.js → fr-FR-RHASNOE6-CM9a28Dh.js} +1 -1
- package/dist/viewer/ganttDiagram-EL5Y4UJY-BVcwKFHE.js +292 -0
- package/dist/viewer/{gitGraph-4MIJSDKK-z7Gw08nk.js → gitGraph-4MIJSDKK-DfE6dNnv.js} +1 -1
- package/dist/viewer/{gitGraphDiagram-WWUBYQGX-WHGfcYN_.js → gitGraphDiagram-WWUBYQGX-CZxp-Wm4.js} +1 -1
- package/dist/viewer/{gl-ES-HMX3MZ6V-Darq1hA-.js → gl-ES-HMX3MZ6V-C5aDlPBE.js} +1 -1
- package/dist/viewer/{he-IL-6SHJWFNN-DLmXqqih.js → he-IL-6SHJWFNN-eFs-GSWn.js} +1 -1
- package/dist/viewer/{hi-IN-IWLTKZ5I-EQ32QAW7.js → hi-IN-IWLTKZ5I-O1MAguUp.js} +1 -1
- package/dist/viewer/{hu-HU-A5ZG7DT2-yeW4Jz-6.js → hu-HU-A5ZG7DT2-B3meydQb.js} +1 -1
- package/dist/viewer/{id-ID-SAP4L64H-CQDWRUcN.js → id-ID-SAP4L64H-PHNH2hzW.js} +1 -1
- package/dist/viewer/{image-GAAHSSAO-BvlHLst-.js → image-GAAHSSAO-BJifdIGE.js} +1 -1
- package/dist/viewer/index.css +1 -1062
- package/dist/viewer/index.html +22 -3
- package/dist/viewer/index.js +13 -12
- package/dist/viewer/index2.css +1050 -0
- package/dist/viewer/{info-A6RAGUB7-Cf5to2ar.js → info-A6RAGUB7-CYSfmlLx.js} +1 -1
- package/dist/viewer/{infoDiagram-27XIBGKW-6LhbJJmW.js → infoDiagram-27XIBGKW-D5Ag03ug.js} +1 -1
- package/dist/viewer/{ishikawaDiagram-5VMMS53U-C5Lq_776.js → ishikawaDiagram-5VMMS53U-B9SCwzFe.js} +1 -1
- package/dist/viewer/{it-IT-JPQ66NNP-jQu-_BNJ.js → it-IT-JPQ66NNP-DHOLiY7r.js} +1 -1
- package/dist/viewer/{ja-JP-DBVTYXUO-CSKQyDx2.js → ja-JP-DBVTYXUO-DTOuZQy0.js} +1 -1
- package/dist/viewer/{journeyDiagram-3NMN7TZE-CbDcRZrZ.js → journeyDiagram-3NMN7TZE-CQvvWgCk.js} +7 -7
- package/dist/viewer/{kaa-6HZHGXH3-C5CA-Vy8.js → kaa-6HZHGXH3-1d0tKthK.js} +1 -1
- package/dist/viewer/{kab-KAB-ZGHBKWFO-Ctra6a95.js → kab-KAB-ZGHBKWFO-BaPyqYzR.js} +1 -1
- package/dist/viewer/{kanban-definition-UXKFOSKX-Bhw-ZrMi.js → kanban-definition-UXKFOSKX-Bg-Q4j28.js} +1 -1
- package/dist/viewer/{kk-KZ-P5N5QNE5-BVpiOGdo.js → kk-KZ-P5N5QNE5-BqF9n_h-.js} +1 -1
- package/dist/viewer/{km-KH-HSX4SM5Z-M7GPdvx-.js → km-KH-HSX4SM5Z-DPTb_KDC.js} +1 -1
- package/dist/viewer/{ko-KR-MTYHY66A-JKbluNxg.js → ko-KR-MTYHY66A-DxGidADD.js} +1 -1
- package/dist/viewer/{ku-TR-6OUDTVRD-DvsU-1wn.js → ku-TR-6OUDTVRD-BECmOCof.js} +1 -1
- package/dist/viewer/{lt-LT-XHIRWOB4-VVtPdmIl.js → lt-LT-XHIRWOB4-DKQm4SS0.js} +1 -1
- package/dist/viewer/{lv-LV-5QDEKY6T-DGnwc5hT.js → lv-LV-5QDEKY6T-C4kUM3XE.js} +1 -1
- package/dist/viewer/{mermaid-parser.core-BdSSxVU7.js → mermaid-parser.core-HxZZO7kh.js} +3 -3
- package/dist/viewer/{mindmap-definition-YA3MSWOX-CP7aXe6J.js → mindmap-definition-YA3MSWOX-DRQfDlAQ.js} +1 -1
- package/dist/viewer/{mr-IN-CRQNXWMA-Df0_8CKP.js → mr-IN-CRQNXWMA-CutHorlk.js} +1 -1
- package/dist/viewer/{my-MM-5M5IBNSE-Cw_7NA2h.js → my-MM-5M5IBNSE-BqscH03z.js} +1 -1
- package/dist/viewer/{nb-NO-T6EIAALU-BGz-_e3X.js → nb-NO-T6EIAALU-Dqflwtt9.js} +1 -1
- package/dist/viewer/{nl-NL-IS3SIHDZ-Du9Tl_c8.js → nl-NL-IS3SIHDZ-BFq09PQX.js} +1 -1
- package/dist/viewer/{nn-NO-6E72VCQL-DLVGbFQo.js → nn-NO-6E72VCQL-BNIuUKOs.js} +1 -1
- package/dist/viewer/{oc-FR-POXYY2M6-hS0fTM4h.js → oc-FR-POXYY2M6-Bz0jVYcW.js} +1 -1
- package/dist/viewer/{pa-IN-N4M65BXN-D9Z6Y2WM.js → pa-IN-N4M65BXN-Diu6ZQtk.js} +1 -1
- package/dist/viewer/{packet-AYTQ26CC-usauJtTa.js → packet-AYTQ26CC-DszQqrn-.js} +1 -1
- package/dist/viewer/{pegDiagram-XKGWAZYB-fMGsm9p_.js → pegDiagram-XKGWAZYB-COMSnXOr.js} +1 -1
- package/dist/viewer/percentages-BXMCSKIN-C4UC-sd0.js +1 -0
- package/dist/viewer/{pie-WAS4IAKB-DknaY_2m.js → pie-WAS4IAKB-_7Cjr2yX.js} +1 -1
- package/dist/viewer/pieDiagram-E7YTZNPT-gHe-bm7N.js +39 -0
- package/dist/viewer/{pl-PL-T2D74RX3-C33spiwa.js → pl-PL-T2D74RX3-CCwgP0Tt.js} +1 -1
- package/dist/viewer/{prod-DV2pUnUI.js → prod-iZwju1YX.js} +11 -11
- package/dist/viewer/{pt-BR-5N22H2LF-8EBNAPyI.js → pt-BR-5N22H2LF-CNn18ypM.js} +1 -1
- package/dist/viewer/{pt-PT-UZXXM6DQ-nhnmZVUI.js → pt-PT-UZXXM6DQ-BMoRZ8jH.js} +1 -1
- package/dist/viewer/{quadrantDiagram-AXDQQJYC-ONT0dHqM.js → quadrantDiagram-AXDQQJYC-YkFWTX48.js} +6 -6
- package/dist/viewer/{radar-RG4KPBEZ-Dbo2ldml.js → radar-RG4KPBEZ-DUB0C2uH.js} +1 -1
- package/dist/viewer/{railroad-74A4TZTK-C5ptSrdP.js → railroad-74A4TZTK-BWFq_Uxa.js} +1 -1
- package/dist/viewer/{railroad-abnf-HS5TGJTU-B5-w1gmO.js → railroad-abnf-HS5TGJTU-CXi8H5jA.js} +1 -1
- package/dist/viewer/{railroad-ebnf-LZEXJU2U-DgzWo47b.js → railroad-ebnf-LZEXJU2U-BF6QoeOc.js} +1 -1
- package/dist/viewer/{railroad-peg-WCYAUIDC-Rohr0jWN.js → railroad-peg-WCYAUIDC-DZk9vECQ.js} +1 -1
- package/dist/viewer/{railroadDiagram-O6MQD6OU-C4jGhnq0.js → railroadDiagram-O6MQD6OU-BP58ggYs.js} +1 -1
- package/dist/viewer/{requirementDiagram-BXWQKSXE-BGlgamnH.js → requirementDiagram-BXWQKSXE-B4RcZ6Uz.js} +1 -1
- package/dist/viewer/{ro-RO-JPDTUUEW-CrCMExBP.js → ro-RO-JPDTUUEW-SoalcNvO.js} +1 -1
- package/dist/viewer/robots.txt +9 -0
- package/dist/viewer/{ru-RU-B4JR7IUQ-VupYUzbE.js → ru-RU-B4JR7IUQ-DkWHaRhg.js} +1 -1
- package/dist/viewer/{sankeyDiagram-P5KCCOFB-wkQgztcK.js → sankeyDiagram-P5KCCOFB-D0ehFMRa.js} +1 -1
- package/dist/viewer/{sequenceDiagram-WJ2MYXX4-CJEtVkMz.js → sequenceDiagram-WJ2MYXX4-C5uL0tpK.js} +1 -1
- package/dist/viewer/{si-LK-N5RQ5JYF-C-ybsT13.js → si-LK-N5RQ5JYF-eD68JhLY.js} +1 -1
- package/dist/viewer/{sk-SK-C5VTKIMK-CIZIvbRq.js → sk-SK-C5VTKIMK-EXqkY3Ta.js} +1 -1
- package/dist/viewer/{sl-SI-NN7IZMDC-DPwYNsMr.js → sl-SI-NN7IZMDC-D2V_J_sw.js} +1 -1
- package/dist/viewer/stateDiagram-D77RDMKH-DkyLdU7q.js +1 -0
- package/dist/viewer/stateDiagram-v2-MP3YSRHH-BMCqlN4T.js +1 -0
- package/dist/viewer/subset-shared.chunk-pCVh-jxe.js +1 -0
- package/dist/viewer/{subset-worker.chunk-lSkqst3N.js → subset-worker.chunk-B92dIZyQ.js} +1 -1
- package/dist/viewer/{sv-SE-XGPEYMSR-DYMz35r4.js → sv-SE-XGPEYMSR-Bzbzaslo.js} +1 -1
- package/dist/viewer/{swimlanes-42K2YHIH-DoyFKyRe.js → swimlanes-42K2YHIH-BWEGkPBm.js} +1 -1
- package/dist/viewer/swimlanesDiagram-VR7AAH4N-a8X5vJTG.js +8 -0
- package/dist/viewer/{ta-IN-2NMHFXQM-BOUk1kmY.js → ta-IN-2NMHFXQM-BkRw8Ab-.js} +1 -1
- package/dist/viewer/{th-TH-HPSO5L25-ne8BUjMl.js → th-TH-HPSO5L25-DpxjfRSg.js} +1 -1
- package/dist/viewer/{timeline-definition-24CTP7MA-k9CflLXN.js → timeline-definition-24CTP7MA-BEYELt88.js} +7 -7
- package/dist/viewer/{tr-TR-DEFEU3FU-BcymiGcm.js → tr-TR-DEFEU3FU-CDIHZRzE.js} +1 -1
- package/dist/viewer/{treeView-Q6P3EWNA-CZswEJX-.js → treeView-Q6P3EWNA-DEPHUB4h.js} +1 -1
- package/dist/viewer/{treemap-WGGIJYW6-Bxu2ANKb.js → treemap-WGGIJYW6-fyrd1JXW.js} +1 -1
- package/dist/viewer/{uk-UA-QMV73CPH-DVDtEhfj.js → uk-UA-QMV73CPH-BX8bS5mk.js} +1 -1
- package/dist/viewer/{vennDiagram-4TSXK5OY-xuMu0q3v.js → vennDiagram-4TSXK5OY-CWnDIkB0.js} +1 -1
- package/dist/viewer/{vi-VN-M7AON7JQ-BQ5n6xcG.js → vi-VN-M7AON7JQ-uPTH0PFh.js} +1 -1
- package/dist/viewer/{wardley-WFR3VGLG-B5ClAPZx.js → wardley-WFR3VGLG-w1K3t7u7.js} +1 -1
- package/dist/viewer/{wardleyDiagram-VM6X3IG4-fRgBsCDc.js → wardleyDiagram-VM6X3IG4-DazKGA6Y.js} +1 -1
- package/dist/viewer/{xychartDiagram-S5SC5T6Z-CacHBGCP.js → xychartDiagram-S5SC5T6Z-sQuCm3yV.js} +6 -6
- package/dist/viewer/{zh-CN-LNUGB5OW-CmpmmY6y.js → zh-CN-LNUGB5OW-CSw936pf.js} +1 -1
- package/dist/viewer/{zh-HK-E62DVLB3-DYHb8cWv.js → zh-HK-E62DVLB3-D5pp2ILq.js} +1 -1
- package/dist/viewer/{zh-TW-RAJ6MFWO-C3frxU1n.js → zh-TW-RAJ6MFWO-DUVdEREg.js} +1 -1
- package/package.json +7 -2
- package/dist/viewer/DocumentPage-CWIKqaxW.css +0 -1
- package/dist/viewer/bundle-full-LG8UwIOZ.js +0 -1
- package/dist/viewer/channel-9zFn1XUZ.js +0 -1
- package/dist/viewer/chunk-OSK3NFVY-DlB6rEc3.js +0 -10
- package/dist/viewer/chunk-PWAF6VOD-CexcqZJ5.js +0 -1
- package/dist/viewer/classDiagram-ZZMXUADV-qBMGN6ya.js +0 -1
- package/dist/viewer/classDiagram-v2-VYDZK3BY-qBMGN6ya.js +0 -1
- package/dist/viewer/diagram-VX7I27RA-BsOCGm4u.js +0 -24
- package/dist/viewer/dist-BGNcywdo.js +0 -1
- package/dist/viewer/dist-BOv9ICeU.js +0 -1
- package/dist/viewer/dist-BYU8R0Y_.js +0 -1
- package/dist/viewer/dist-B_fm1aRF.js +0 -1
- package/dist/viewer/dist-Bg9izODJ.js +0 -23
- package/dist/viewer/dist-Bjt-Qs9H.js +0 -1
- package/dist/viewer/dist-BtAhexvS.js +0 -1
- package/dist/viewer/dist-C6QmdT23.js +0 -1
- package/dist/viewer/dist-C7UVEjgl.js +0 -1
- package/dist/viewer/dist-CMpA3hFu.js +0 -1
- package/dist/viewer/dist-CO6__Lt5.js +0 -9
- package/dist/viewer/dist-CUEjXzbm.js +0 -1
- package/dist/viewer/dist-CZfR6QKz.js +0 -11
- package/dist/viewer/dist-CxZq0EQh.js +0 -1
- package/dist/viewer/dist-CyquI9af.js +0 -2
- package/dist/viewer/dist-D1QKy_Kx.js +0 -1
- package/dist/viewer/dist-DJ64CnRA.js +0 -1
- package/dist/viewer/dist-DbHWs1jr.js +0 -1
- package/dist/viewer/dist-Dp0_UVOX.js +0 -1
- package/dist/viewer/dist-Ds2fasds.js +0 -1
- package/dist/viewer/dist-DupuL01b.js +0 -6
- package/dist/viewer/dist-PdfFvqUH.js +0 -1
- package/dist/viewer/dist-bqEHa3x8.js +0 -1
- package/dist/viewer/flowDiagram-HODETNUW-uaq9ResC.js +0 -1
- package/dist/viewer/ganttDiagram-EL5Y4UJY-CAkSxK18.js +0 -292
- package/dist/viewer/percentages-BXMCSKIN-aTnqRVEl.js +0 -1
- package/dist/viewer/pieDiagram-E7YTZNPT-DGkebCUo.js +0 -39
- package/dist/viewer/stateDiagram-D77RDMKH-D0uWS0yJ.js +0 -1
- package/dist/viewer/stateDiagram-v2-MP3YSRHH-BMXPcnfR.js +0 -1
- package/dist/viewer/subset-shared.chunk-Co00nYPN.js +0 -1
- package/dist/viewer/swimlanesDiagram-VR7AAH4N-C0NSZNcr.js +0 -8
package/dist/server.cjs
CHANGED
|
@@ -1563,13 +1563,14 @@ var require_canvas = __commonJS({
|
|
|
1563
1563
|
|
|
1564
1564
|
// src/server/main.ts
|
|
1565
1565
|
var import_node_child_process = require("node:child_process");
|
|
1566
|
-
var
|
|
1567
|
-
var
|
|
1566
|
+
var import_node_fs17 = __toESM(require("node:fs"), 1);
|
|
1567
|
+
var import_node_os = __toESM(require("node:os"), 1);
|
|
1568
|
+
var import_node_path16 = __toESM(require("node:path"), 1);
|
|
1568
1569
|
|
|
1569
1570
|
// src/server/app.ts
|
|
1570
|
-
var
|
|
1571
|
+
var import_node_fs15 = __toESM(require("node:fs"), 1);
|
|
1571
1572
|
var import_node_http = __toESM(require("node:http"), 1);
|
|
1572
|
-
var
|
|
1573
|
+
var import_node_path15 = __toESM(require("node:path"), 1);
|
|
1573
1574
|
|
|
1574
1575
|
// src/shared/types.ts
|
|
1575
1576
|
var ARTIFACT_TYPES = ["artboard", "document", "html"];
|
|
@@ -3113,19 +3114,19 @@ var ElementDOMSlot = class _ElementDOMSlot extends DOMSlot {
|
|
|
3113
3114
|
}
|
|
3114
3115
|
};
|
|
3115
3116
|
function indexPath(root, child) {
|
|
3116
|
-
const
|
|
3117
|
+
const path17 = [];
|
|
3117
3118
|
let node = child;
|
|
3118
3119
|
for (; node !== root && node !== null; node = node.parentNode) {
|
|
3119
3120
|
let i6 = 0;
|
|
3120
3121
|
for (let sibling = node.previousSibling; sibling !== null; sibling = sibling.previousSibling) {
|
|
3121
3122
|
i6++;
|
|
3122
3123
|
}
|
|
3123
|
-
|
|
3124
|
+
path17.push(i6);
|
|
3124
3125
|
}
|
|
3125
3126
|
if (!(node === root)) {
|
|
3126
3127
|
formatDevErrorMessage(`indexPath: root is not a parent of child`);
|
|
3127
3128
|
}
|
|
3128
|
-
return
|
|
3129
|
+
return path17.reverse();
|
|
3129
3130
|
}
|
|
3130
3131
|
// @__NO_SIDE_EFFECTS__
|
|
3131
3132
|
function readLexicalVersion() {
|
|
@@ -17905,9 +17906,9 @@ function getActiveElementDeep(root) {
|
|
|
17905
17906
|
function getComposedEventTarget(event) {
|
|
17906
17907
|
const target = event.target;
|
|
17907
17908
|
if (target !== null && isHTMLElement(target) && target.shadowRoot !== null && typeof event.composedPath === "function") {
|
|
17908
|
-
const
|
|
17909
|
-
if (
|
|
17910
|
-
return
|
|
17909
|
+
const path17 = event.composedPath();
|
|
17910
|
+
if (path17.length > 0) {
|
|
17911
|
+
return path17[0];
|
|
17911
17912
|
}
|
|
17912
17913
|
}
|
|
17913
17914
|
return target;
|
|
@@ -28003,10 +28004,10 @@ function _loadWasmModule(sync, filepath, src, imports2) {
|
|
|
28003
28004
|
var buf = null;
|
|
28004
28005
|
var isNode2 = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
|
|
28005
28006
|
if (filepath && isNode2) {
|
|
28006
|
-
var
|
|
28007
|
-
var
|
|
28007
|
+
var fs20 = null;
|
|
28008
|
+
var path17 = null;
|
|
28008
28009
|
return new Promise((resolve, reject) => {
|
|
28009
|
-
|
|
28010
|
+
fs20.readFile(path17.resolve(__dirname, filepath), (error, buffer) => {
|
|
28010
28011
|
if (error != null) {
|
|
28011
28012
|
reject(error);
|
|
28012
28013
|
} else {
|
|
@@ -29309,10 +29310,10 @@ var LoroDoc = class _LoroDoc {
|
|
|
29309
29310
|
* @param {string} path
|
|
29310
29311
|
* @returns {Value | Container | undefined}
|
|
29311
29312
|
*/
|
|
29312
|
-
getByPath(
|
|
29313
|
+
getByPath(path17) {
|
|
29313
29314
|
try {
|
|
29314
29315
|
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
29315
|
-
const ptr0 = passStringToWasm0(
|
|
29316
|
+
const ptr0 = passStringToWasm0(path17, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
29316
29317
|
const len0 = WASM_VECTOR_LEN;
|
|
29317
29318
|
wasm.lorodoc_getByPath(retptr, this.__wbg_ptr, ptr0, len0);
|
|
29318
29319
|
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
|
@@ -37472,11 +37473,11 @@ var LexicalExtensionNamedSignals_dev_exports = {};
|
|
|
37472
37473
|
__export(LexicalExtensionNamedSignals_dev_exports, {
|
|
37473
37474
|
namedSignals: () => namedSignals
|
|
37474
37475
|
});
|
|
37475
|
-
function namedSignals(
|
|
37476
|
+
function namedSignals(defaults2, opts = {}) {
|
|
37476
37477
|
const initial = {};
|
|
37477
|
-
for (const k5 in
|
|
37478
|
+
for (const k5 in defaults2) {
|
|
37478
37479
|
const v6 = opts[k5];
|
|
37479
|
-
const store = signal(v6 === void 0 ?
|
|
37480
|
+
const store = signal(v6 === void 0 ? defaults2[k5] : v6);
|
|
37480
37481
|
initial[k5] = store;
|
|
37481
37482
|
}
|
|
37482
37483
|
return initial;
|
|
@@ -42282,8 +42283,8 @@ function sequence4($acc, $getOverride) {
|
|
|
42282
42283
|
}
|
|
42283
42284
|
};
|
|
42284
42285
|
}
|
|
42285
|
-
function compilePrerenderKey(prerender, k5,
|
|
42286
|
-
let acc =
|
|
42286
|
+
function compilePrerenderKey(prerender, k5, defaults2, mergeFunction, ignoreNextFunction) {
|
|
42287
|
+
let acc = defaults2[k5];
|
|
42287
42288
|
for (const pair of prerender[k5]) {
|
|
42288
42289
|
if (typeof pair[0] === "function") {
|
|
42289
42290
|
const [$predicate, $override] = pair;
|
|
@@ -42303,7 +42304,7 @@ function compilePrerenderKey(prerender, k5, defaults, mergeFunction, ignoreNextF
|
|
|
42303
42304
|
});
|
|
42304
42305
|
}
|
|
42305
42306
|
}
|
|
42306
|
-
|
|
42307
|
+
defaults2[k5] = acc;
|
|
42307
42308
|
}
|
|
42308
42309
|
function addOverride(prerender, k5, predicateOrTypes, override) {
|
|
42309
42310
|
if (!override) {
|
|
@@ -43182,13 +43183,13 @@ function readElementFormatStyle(el2) {
|
|
|
43182
43183
|
verticalAlign: el2.style.verticalAlign
|
|
43183
43184
|
};
|
|
43184
43185
|
}
|
|
43185
|
-
function mergeStyles(
|
|
43186
|
+
function mergeStyles(defaults2, override) {
|
|
43186
43187
|
return {
|
|
43187
|
-
fontStyle: override.fontStyle ||
|
|
43188
|
-
fontWeight: override.fontWeight ||
|
|
43189
|
-
textDecoration: override.textDecoration ||
|
|
43190
|
-
textTransform: override.textTransform ||
|
|
43191
|
-
verticalAlign: override.verticalAlign ||
|
|
43188
|
+
fontStyle: override.fontStyle || defaults2.fontStyle,
|
|
43189
|
+
fontWeight: override.fontWeight || defaults2.fontWeight,
|
|
43190
|
+
textDecoration: override.textDecoration || defaults2.textDecoration,
|
|
43191
|
+
textTransform: override.textTransform || defaults2.textTransform,
|
|
43192
|
+
verticalAlign: override.verticalAlign || defaults2.verticalAlign
|
|
43192
43193
|
};
|
|
43193
43194
|
}
|
|
43194
43195
|
var FORMAT_BIT_STYLE_PROPS = /* @__PURE__ */ new Set(["font-weight", "font-style", "text-decoration", "text-transform", "vertical-align"]);
|
|
@@ -43726,11 +43727,11 @@ var DefaultHoistRule = {
|
|
|
43726
43727
|
var DOMImportExtension = {
|
|
43727
43728
|
build(editor, config) {
|
|
43728
43729
|
const dispatch2 = compileImportRules(flattenRuleEntries(config.rules));
|
|
43729
|
-
const
|
|
43730
|
+
const defaults2 = contextFromPairs(config.contextDefaults, void 0);
|
|
43730
43731
|
const configPreprocess = config.preprocess;
|
|
43731
43732
|
return {
|
|
43732
43733
|
$generateNodesFromDOM: (dom, options) => {
|
|
43733
|
-
const parentRecord = getContextRecord(DOMImportContextSymbol, editor) ||
|
|
43734
|
+
const parentRecord = getContextRecord(DOMImportContextSymbol, editor) || defaults2;
|
|
43734
43735
|
const fromOpts = options && options.context ? contextFromPairs(options.context, parentRecord) : parentRecord;
|
|
43735
43736
|
const sessionRecord = fromOpts !== void 0 && fromOpts !== parentRecord ? fromOpts : Object.create(parentRecord || null);
|
|
43736
43737
|
const session = new ImportSessionImpl(sessionRecord);
|
|
@@ -43741,7 +43742,7 @@ var DOMImportExtension = {
|
|
|
43741
43742
|
$runPreprocessStack(stack, dom, preprocessCtx);
|
|
43742
43743
|
return /* @__PURE__ */ $withFullContext(DOMImportContextSymbol, sessionRecord, () => $runImport(dispatch2, editor, dom, session), editor);
|
|
43743
43744
|
},
|
|
43744
|
-
defaults
|
|
43745
|
+
defaults: defaults2
|
|
43745
43746
|
};
|
|
43746
43747
|
},
|
|
43747
43748
|
config: {
|
|
@@ -70725,11 +70726,11 @@ var RichQuoteNode = class RichQuoteNode2 extends QuoteNode2 {
|
|
|
70725
70726
|
return false;
|
|
70726
70727
|
}
|
|
70727
70728
|
};
|
|
70728
|
-
function headlessDecorator(type, propKeys,
|
|
70729
|
+
function headlessDecorator(type, propKeys, defaults2, inline = false) {
|
|
70729
70730
|
class Node5 extends DecoratorNode2 {
|
|
70730
70731
|
constructor(key2) {
|
|
70731
70732
|
super(key2);
|
|
70732
|
-
for (const k5 of propKeys) this[`__${k5}`] =
|
|
70733
|
+
for (const k5 of propKeys) this[`__${k5}`] = defaults2[k5];
|
|
70733
70734
|
}
|
|
70734
70735
|
static getType() {
|
|
70735
70736
|
return type;
|
|
@@ -70742,7 +70743,7 @@ function headlessDecorator(type, propKeys, defaults, inline = false) {
|
|
|
70742
70743
|
static importJSON(_json) {
|
|
70743
70744
|
const json = _json;
|
|
70744
70745
|
const node = new Node5();
|
|
70745
|
-
for (const k5 of propKeys) node[`__${k5}`] = json[k5] ??
|
|
70746
|
+
for (const k5 of propKeys) node[`__${k5}`] = json[k5] ?? defaults2[k5];
|
|
70746
70747
|
return node.updateFromJSON(json);
|
|
70747
70748
|
}
|
|
70748
70749
|
exportJSON() {
|
|
@@ -83954,6 +83955,384 @@ function createDocumentRegistry(options) {
|
|
|
83954
83955
|
};
|
|
83955
83956
|
}
|
|
83956
83957
|
|
|
83958
|
+
// src/inspector/runtime.ts
|
|
83959
|
+
function installInspector(win, properties) {
|
|
83960
|
+
const doc = win.document;
|
|
83961
|
+
const session = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
83962
|
+
const ids = /* @__PURE__ */ new WeakMap();
|
|
83963
|
+
const elements = /* @__PURE__ */ new Map();
|
|
83964
|
+
const originals = /* @__PURE__ */ new Map();
|
|
83965
|
+
const ignored2 = /* @__PURE__ */ new Set(["SCRIPT", "STYLE", "META", "LINK", "NOSCRIPT", "HEAD"]);
|
|
83966
|
+
let nextId = 0;
|
|
83967
|
+
let enabled = false;
|
|
83968
|
+
let connection = "";
|
|
83969
|
+
let selected = null;
|
|
83970
|
+
let treeTimer = 0;
|
|
83971
|
+
let geometryFrame = 0;
|
|
83972
|
+
let hovered = null;
|
|
83973
|
+
let selectedRect = null;
|
|
83974
|
+
let hoverRect = null;
|
|
83975
|
+
let dragging = null;
|
|
83976
|
+
let marquee = null;
|
|
83977
|
+
let suppressClick = false;
|
|
83978
|
+
const tracked = /* @__PURE__ */ new Map();
|
|
83979
|
+
const post = (type, data) => win.parent.postMessage({ type: `ryugi:inspect:${type}`, session, connection, ...data }, "*");
|
|
83980
|
+
const idOf = (el2) => {
|
|
83981
|
+
let id2 = ids.get(el2);
|
|
83982
|
+
if (!id2) {
|
|
83983
|
+
id2 = ++nextId;
|
|
83984
|
+
ids.set(el2, id2);
|
|
83985
|
+
}
|
|
83986
|
+
elements.set(id2, el2);
|
|
83987
|
+
return id2;
|
|
83988
|
+
};
|
|
83989
|
+
const label = (el2) => (el2.getAttribute("data-layer-name") || el2.getAttribute("aria-label") || el2.id || (!el2.childElementCount ? el2.textContent?.trim() : "") || "").slice(0, 100);
|
|
83990
|
+
const selector = (el2) => (el2.id ? `#${el2.id}` : el2.tagName.toLowerCase() + Array.from(el2.classList).slice(0, 2).map((name) => `.${name}`).join("")).slice(0, 200);
|
|
83991
|
+
const kind = (el2, style) => {
|
|
83992
|
+
if (/^H[1-6]$/.test(el2.tagName)) return "Title";
|
|
83993
|
+
if (["IMG", "SVG", "CANVAS", "VIDEO"].includes(el2.tagName.toUpperCase())) return "Image";
|
|
83994
|
+
if (["BUTTON", "A", "INPUT", "SELECT", "TEXTAREA"].includes(el2.tagName)) return "Button";
|
|
83995
|
+
if (!el2.childElementCount) return "Text";
|
|
83996
|
+
if (style.display.includes("flex")) return style.flexDirection.startsWith("row") ? "Row" : "Column";
|
|
83997
|
+
return style.display.includes("grid") ? "Grid" : "Frame";
|
|
83998
|
+
};
|
|
83999
|
+
const rectOf = (el2) => {
|
|
84000
|
+
const rect = el2.getBoundingClientRect();
|
|
84001
|
+
return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
|
|
84002
|
+
};
|
|
84003
|
+
const selection = (reason, toggle = false) => {
|
|
84004
|
+
if (!selected?.isConnected) {
|
|
84005
|
+
selected = null;
|
|
84006
|
+
post("selection", { selection: null, reason });
|
|
84007
|
+
return;
|
|
84008
|
+
}
|
|
84009
|
+
const el2 = selected;
|
|
84010
|
+
const style = win.getComputedStyle(el2);
|
|
84011
|
+
const inline = el2.style;
|
|
84012
|
+
const info = {
|
|
84013
|
+
id: idOf(el2),
|
|
84014
|
+
name: label(el2),
|
|
84015
|
+
tag: el2.tagName.toLowerCase(),
|
|
84016
|
+
selector: selector(el2),
|
|
84017
|
+
rect: selectedRect = rectOf(el2),
|
|
84018
|
+
css: Object.fromEntries(properties.map((property) => [property, style.getPropertyValue(property)])),
|
|
84019
|
+
html: el2.outerHTML.slice(0, 2e4),
|
|
84020
|
+
widthMode: inline?.width === "100%" ? "fill" : inline?.width === "max-content" ? "hug" : "fixed",
|
|
84021
|
+
heightMode: inline?.height && inline.height !== "auto" ? "fixed" : "hug"
|
|
84022
|
+
};
|
|
84023
|
+
post("selection", { selection: info, reason, toggle });
|
|
84024
|
+
};
|
|
84025
|
+
const tweaks = () => {
|
|
84026
|
+
const list = [];
|
|
84027
|
+
for (const [el2, changes] of originals) {
|
|
84028
|
+
if (!el2.isConnected) {
|
|
84029
|
+
originals.delete(el2);
|
|
84030
|
+
continue;
|
|
84031
|
+
}
|
|
84032
|
+
for (const [property, saved] of changes) list.push({ id: idOf(el2), name: label(el2) || selector(el2), property, value: saved.applied });
|
|
84033
|
+
}
|
|
84034
|
+
post("tweaks", { tweaks: list });
|
|
84035
|
+
};
|
|
84036
|
+
const tree = () => {
|
|
84037
|
+
if (!enabled || !doc.body) return;
|
|
84038
|
+
elements.clear();
|
|
84039
|
+
const nodes = [];
|
|
84040
|
+
let truncated = false;
|
|
84041
|
+
const visit = (el2, parentId, depth) => {
|
|
84042
|
+
if (ignored2.has(el2.tagName) || el2.hasAttribute("data-ryugi-inspector")) return null;
|
|
84043
|
+
if (nodes.length >= 2500 || depth >= 50) {
|
|
84044
|
+
truncated = true;
|
|
84045
|
+
return null;
|
|
84046
|
+
}
|
|
84047
|
+
const id2 = idOf(el2);
|
|
84048
|
+
const node = { id: id2, parentId, name: label(el2), tag: el2.tagName.toLowerCase(), selector: selector(el2), kind: kind(el2, win.getComputedStyle(el2)), children: [] };
|
|
84049
|
+
nodes.push(node);
|
|
84050
|
+
for (const child of el2.children) {
|
|
84051
|
+
if (nodes.length >= 2500) {
|
|
84052
|
+
truncated = true;
|
|
84053
|
+
break;
|
|
84054
|
+
}
|
|
84055
|
+
const childId = visit(child, id2, depth + 1);
|
|
84056
|
+
if (childId !== null) node.children.push(childId);
|
|
84057
|
+
}
|
|
84058
|
+
return id2;
|
|
84059
|
+
};
|
|
84060
|
+
visit(doc.body, null, 0);
|
|
84061
|
+
post("tree", { nodes, truncated });
|
|
84062
|
+
};
|
|
84063
|
+
const refresh = () => {
|
|
84064
|
+
treeTimer = 0;
|
|
84065
|
+
if (!enabled) return;
|
|
84066
|
+
tree();
|
|
84067
|
+
selection("update");
|
|
84068
|
+
tweaks();
|
|
84069
|
+
};
|
|
84070
|
+
const schedule = () => {
|
|
84071
|
+
if (enabled && !treeTimer) treeTimer = win.setTimeout(refresh, 100);
|
|
84072
|
+
};
|
|
84073
|
+
const observer = new win.MutationObserver(schedule);
|
|
84074
|
+
const sameRect = (a5, b6) => a5 && a5.x === b6.x && a5.y === b6.y && a5.width === b6.width && a5.height === b6.height;
|
|
84075
|
+
const geometry = () => {
|
|
84076
|
+
if (!enabled) return;
|
|
84077
|
+
if (selected?.isConnected) {
|
|
84078
|
+
const rect = rectOf(selected);
|
|
84079
|
+
if (!sameRect(selectedRect, rect)) {
|
|
84080
|
+
selectedRect = rect;
|
|
84081
|
+
post("rect", { id: idOf(selected), rect });
|
|
84082
|
+
}
|
|
84083
|
+
}
|
|
84084
|
+
for (const [id2, previous] of tracked) {
|
|
84085
|
+
const el2 = elements.get(id2);
|
|
84086
|
+
if (!el2?.isConnected) {
|
|
84087
|
+
tracked.delete(id2);
|
|
84088
|
+
continue;
|
|
84089
|
+
}
|
|
84090
|
+
const rect = rectOf(el2);
|
|
84091
|
+
if (!sameRect(previous, rect)) {
|
|
84092
|
+
tracked.set(id2, rect);
|
|
84093
|
+
post("rect", { id: id2, rect });
|
|
84094
|
+
}
|
|
84095
|
+
}
|
|
84096
|
+
if (hovered?.isConnected) {
|
|
84097
|
+
const rect = rectOf(hovered);
|
|
84098
|
+
if (!sameRect(hoverRect, rect)) {
|
|
84099
|
+
hoverRect = rect;
|
|
84100
|
+
post("hover", { rect });
|
|
84101
|
+
}
|
|
84102
|
+
} else if (hoverRect) {
|
|
84103
|
+
hoverRect = null;
|
|
84104
|
+
post("hover", { rect: null });
|
|
84105
|
+
}
|
|
84106
|
+
geometryFrame = win.requestAnimationFrame(geometry);
|
|
84107
|
+
};
|
|
84108
|
+
const ignoredTarget = (el2) => !!el2.closest("[data-ryugi-inspector], script, style, link");
|
|
84109
|
+
const onClick2 = (event) => {
|
|
84110
|
+
if (!enabled || event.button !== 0 || !(event.target instanceof win.Element) || ignoredTarget(event.target)) return;
|
|
84111
|
+
event.preventDefault();
|
|
84112
|
+
event.stopImmediatePropagation();
|
|
84113
|
+
if (suppressClick) {
|
|
84114
|
+
suppressClick = false;
|
|
84115
|
+
return;
|
|
84116
|
+
}
|
|
84117
|
+
selected = event.target.closest("svg") || event.target;
|
|
84118
|
+
selection("user", event.shiftKey || event.metaKey || event.ctrlKey);
|
|
84119
|
+
};
|
|
84120
|
+
const onPointerDown2 = (event) => {
|
|
84121
|
+
if (!enabled) return;
|
|
84122
|
+
if (event.button === 1) {
|
|
84123
|
+
event.preventDefault();
|
|
84124
|
+
event.stopImmediatePropagation();
|
|
84125
|
+
dragging = { x: event.screenX, y: event.screenY, pointer: event.pointerId };
|
|
84126
|
+
doc.documentElement.setPointerCapture?.(event.pointerId);
|
|
84127
|
+
} else if (event.button === 0 && event.target instanceof win.Element) {
|
|
84128
|
+
event.preventDefault();
|
|
84129
|
+
event.stopImmediatePropagation();
|
|
84130
|
+
suppressClick = false;
|
|
84131
|
+
marquee = { x: event.clientX, y: event.clientY, screenX: event.screenX, screenY: event.screenY, pointer: event.pointerId, append: event.shiftKey || event.metaKey || event.ctrlKey, moved: false };
|
|
84132
|
+
event.target.setPointerCapture?.(event.pointerId);
|
|
84133
|
+
post("drag", { phase: "start", x: event.clientX, y: event.clientY, append: marquee.append, id: idOf(event.target.closest("svg") || event.target) });
|
|
84134
|
+
}
|
|
84135
|
+
};
|
|
84136
|
+
const onPointerMove = (event) => {
|
|
84137
|
+
if (!enabled) return;
|
|
84138
|
+
if (dragging) {
|
|
84139
|
+
post("pan", { deltaX: event.screenX - dragging.x, deltaY: event.screenY - dragging.y });
|
|
84140
|
+
dragging.x = event.screenX;
|
|
84141
|
+
dragging.y = event.screenY;
|
|
84142
|
+
return;
|
|
84143
|
+
}
|
|
84144
|
+
if (marquee && event.pointerId === marquee.pointer) {
|
|
84145
|
+
if (Math.hypot(event.screenX - marquee.screenX, event.screenY - marquee.screenY) >= 3) marquee.moved = true;
|
|
84146
|
+
if (marquee.moved) post("drag", { phase: "move", x: event.clientX, y: event.clientY, append: marquee.append });
|
|
84147
|
+
return;
|
|
84148
|
+
}
|
|
84149
|
+
if (!(event.target instanceof win.Element)) return;
|
|
84150
|
+
hovered = ignoredTarget(event.target) ? null : event.target.closest("svg") || event.target;
|
|
84151
|
+
};
|
|
84152
|
+
const endDrag = (event) => {
|
|
84153
|
+
if (marquee) {
|
|
84154
|
+
const pointer = event;
|
|
84155
|
+
post("drag", { phase: event.type === "pointerup" && marquee.moved ? "end" : "cancel", x: pointer.clientX ?? marquee.x, y: pointer.clientY ?? marquee.y, append: marquee.append });
|
|
84156
|
+
suppressClick = marquee.moved;
|
|
84157
|
+
}
|
|
84158
|
+
dragging = null;
|
|
84159
|
+
marquee = null;
|
|
84160
|
+
};
|
|
84161
|
+
const leave = () => {
|
|
84162
|
+
hovered = null;
|
|
84163
|
+
hoverRect = null;
|
|
84164
|
+
if (enabled) post("hover", { rect: null });
|
|
84165
|
+
};
|
|
84166
|
+
const wheel = (event) => {
|
|
84167
|
+
if (!enabled) return;
|
|
84168
|
+
event.preventDefault();
|
|
84169
|
+
event.stopImmediatePropagation();
|
|
84170
|
+
const factor = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? win.innerHeight : 1;
|
|
84171
|
+
post("wheel", { deltaX: event.deltaX * factor, deltaY: event.deltaY * factor, x: event.clientX, y: event.clientY, zoom: event.ctrlKey || event.metaKey });
|
|
84172
|
+
};
|
|
84173
|
+
const key2 = (event) => {
|
|
84174
|
+
if (!enabled || event.composedPath().some((target) => target instanceof win.Element && target.matches("input,textarea,select,[contenteditable]"))) return;
|
|
84175
|
+
if (!["Space", "KeyH", "KeyV", "Escape", "Equal", "Minus", "Digit0", "Digit1"].includes(event.code)) return;
|
|
84176
|
+
event.preventDefault();
|
|
84177
|
+
event.stopImmediatePropagation();
|
|
84178
|
+
post("key", { key: event.key, code: event.code, down: event.type === "keydown", ctrlKey: event.ctrlKey, metaKey: event.metaKey, shiftKey: event.shiftKey, altKey: event.altKey });
|
|
84179
|
+
};
|
|
84180
|
+
const scroll = () => {
|
|
84181
|
+
if (enabled && selected) selection("update");
|
|
84182
|
+
};
|
|
84183
|
+
const disable = () => {
|
|
84184
|
+
endDrag(new win.Event("pointercancel"));
|
|
84185
|
+
enabled = false;
|
|
84186
|
+
observer.disconnect();
|
|
84187
|
+
win.clearTimeout(treeTimer);
|
|
84188
|
+
win.cancelAnimationFrame(geometryFrame);
|
|
84189
|
+
treeTimer = 0;
|
|
84190
|
+
geometryFrame = 0;
|
|
84191
|
+
hovered = null;
|
|
84192
|
+
hoverRect = null;
|
|
84193
|
+
post("hover", { rect: null });
|
|
84194
|
+
};
|
|
84195
|
+
const onMessage = (event) => {
|
|
84196
|
+
if (event.source !== win.parent || event.data?.type !== "ryugi:inspect") return;
|
|
84197
|
+
const data = event.data;
|
|
84198
|
+
if (data.action === "enable") {
|
|
84199
|
+
if (typeof data.connection !== "string" || !data.connection || data.connection.length > 128) return;
|
|
84200
|
+
connection = data.connection;
|
|
84201
|
+
enabled = true;
|
|
84202
|
+
observer.observe(doc.documentElement, { subtree: true, childList: true, characterData: true, attributes: true });
|
|
84203
|
+
win.cancelAnimationFrame(geometryFrame);
|
|
84204
|
+
geometryFrame = win.requestAnimationFrame(geometry);
|
|
84205
|
+
tree();
|
|
84206
|
+
tweaks();
|
|
84207
|
+
if (selected) selection("update");
|
|
84208
|
+
return;
|
|
84209
|
+
}
|
|
84210
|
+
if (data.connection !== connection) return;
|
|
84211
|
+
if (data.action === "disable") {
|
|
84212
|
+
disable();
|
|
84213
|
+
return;
|
|
84214
|
+
}
|
|
84215
|
+
if (!enabled && data.action !== "reset") return;
|
|
84216
|
+
if (data.session !== session) return;
|
|
84217
|
+
if (data.action === "cancel-drag") {
|
|
84218
|
+
endDrag(new win.Event("pointercancel"));
|
|
84219
|
+
return;
|
|
84220
|
+
}
|
|
84221
|
+
if (data.action === "select" && Number.isSafeInteger(data.id)) {
|
|
84222
|
+
const el2 = elements.get(data.id);
|
|
84223
|
+
if (el2?.isConnected) {
|
|
84224
|
+
selected = el2;
|
|
84225
|
+
selection(data.primary === true ? "primary" : "command", data.toggle === true);
|
|
84226
|
+
}
|
|
84227
|
+
} else if (data.action === "track" && Array.isArray(data.ids) && data.ids.length <= 2500 && data.ids.every((id2) => Number.isSafeInteger(id2) && id2 > 0)) {
|
|
84228
|
+
tracked.clear();
|
|
84229
|
+
for (const id2 of data.ids) {
|
|
84230
|
+
const el2 = elements.get(id2);
|
|
84231
|
+
if (el2?.isConnected) tracked.set(id2, rectOf(el2));
|
|
84232
|
+
}
|
|
84233
|
+
} else if (data.action === "marquee" && Number.isSafeInteger(data.request) && data.request > 0) {
|
|
84234
|
+
const r7 = data.rect;
|
|
84235
|
+
if (!r7 || !["x", "y", "width", "height"].every((key3) => typeof r7[key3] === "number" && Number.isFinite(r7[key3]) && Math.abs(r7[key3]) <= 1e8) || r7.width < 0 || r7.height < 0) return;
|
|
84236
|
+
const contained = /* @__PURE__ */ new Set();
|
|
84237
|
+
const targets = [];
|
|
84238
|
+
for (const [id2, el2] of elements) {
|
|
84239
|
+
if (el2 === doc.body || !el2.isConnected) continue;
|
|
84240
|
+
const rect = rectOf(el2);
|
|
84241
|
+
if (rect.width <= 0 || rect.height <= 0 || rect.x < r7.x || rect.y < r7.y || rect.x + rect.width > r7.x + r7.width || rect.y + rect.height > r7.y + r7.height) continue;
|
|
84242
|
+
let parent = el2.parentElement;
|
|
84243
|
+
while (parent && !contained.has(parent)) parent = parent.parentElement;
|
|
84244
|
+
if (parent) continue;
|
|
84245
|
+
contained.add(el2);
|
|
84246
|
+
targets.push({ id: id2, name: label(el2) || selector(el2), rect });
|
|
84247
|
+
}
|
|
84248
|
+
post("targets", { request: data.request, targets });
|
|
84249
|
+
} else if (data.action === "hover") {
|
|
84250
|
+
const el2 = elements.get(data.id);
|
|
84251
|
+
hovered = el2?.isConnected ? el2 : null;
|
|
84252
|
+
hoverRect = hovered ? rectOf(hovered) : null;
|
|
84253
|
+
post("hover", { rect: hoverRect });
|
|
84254
|
+
} else if (data.action === "style" && data.session === session && selected && ids.get(selected) === data.id && properties.includes(data.property) && typeof data.value === "string" && data.value.length <= 300) {
|
|
84255
|
+
const el2 = selected;
|
|
84256
|
+
if (!el2.style || !el2.isConnected) return;
|
|
84257
|
+
const property = data.property;
|
|
84258
|
+
const probe = doc.createElement("div").style;
|
|
84259
|
+
probe.setProperty(property, data.value);
|
|
84260
|
+
const value = probe.getPropertyValue(property);
|
|
84261
|
+
if (!value) return;
|
|
84262
|
+
if (!originals.has(el2)) originals.set(el2, /* @__PURE__ */ new Map());
|
|
84263
|
+
const changes = originals.get(el2);
|
|
84264
|
+
if (!changes.has(property)) {
|
|
84265
|
+
const affected = /* @__PURE__ */ new Set([...Array.from(probe), ...Array.from(el2.style).filter((name) => probe.getPropertyValue(name))]);
|
|
84266
|
+
changes.set(property, { applied: "", declarations: new Map(Array.from(affected, (name) => [name, { value: el2.style.getPropertyValue(name), priority: el2.style.getPropertyPriority(name), applied: "" }])) });
|
|
84267
|
+
}
|
|
84268
|
+
el2.style.setProperty(property, value);
|
|
84269
|
+
const saved = changes.get(property);
|
|
84270
|
+
saved.applied = el2.style.getPropertyValue(property);
|
|
84271
|
+
for (const [name, declaration] of saved.declarations) declaration.applied = el2.style.getPropertyValue(name);
|
|
84272
|
+
selection("update");
|
|
84273
|
+
tweaks();
|
|
84274
|
+
} else if (data.action === "reset") {
|
|
84275
|
+
for (const [el2, changes] of originals) for (const saved of changes.values()) {
|
|
84276
|
+
const owned = Array.from(saved.declarations).filter(([name, declaration]) => el2.style.getPropertyValue(name) === declaration.applied && !el2.style.getPropertyPriority(name));
|
|
84277
|
+
for (const [name, declaration] of owned) {
|
|
84278
|
+
if (declaration.value) el2.style.setProperty(name, declaration.value, declaration.priority);
|
|
84279
|
+
else el2.style.removeProperty(name);
|
|
84280
|
+
}
|
|
84281
|
+
}
|
|
84282
|
+
originals.clear();
|
|
84283
|
+
selection("update");
|
|
84284
|
+
tweaks();
|
|
84285
|
+
}
|
|
84286
|
+
};
|
|
84287
|
+
win.addEventListener("message", onMessage);
|
|
84288
|
+
doc.addEventListener("click", onClick2, true);
|
|
84289
|
+
doc.addEventListener("pointerdown", onPointerDown2, true);
|
|
84290
|
+
doc.addEventListener("pointermove", onPointerMove, true);
|
|
84291
|
+
doc.addEventListener("pointerup", endDrag, true);
|
|
84292
|
+
doc.addEventListener("pointercancel", endDrag, true);
|
|
84293
|
+
doc.addEventListener("pointerleave", leave);
|
|
84294
|
+
doc.addEventListener("wheel", wheel, { passive: false, capture: true });
|
|
84295
|
+
doc.addEventListener("keydown", key2, true);
|
|
84296
|
+
doc.addEventListener("keyup", key2, true);
|
|
84297
|
+
win.addEventListener("scroll", scroll, true);
|
|
84298
|
+
win.addEventListener("blur", endDrag);
|
|
84299
|
+
return () => {
|
|
84300
|
+
disable();
|
|
84301
|
+
win.removeEventListener("message", onMessage);
|
|
84302
|
+
doc.removeEventListener("click", onClick2, true);
|
|
84303
|
+
doc.removeEventListener("pointerdown", onPointerDown2, true);
|
|
84304
|
+
doc.removeEventListener("pointermove", onPointerMove, true);
|
|
84305
|
+
doc.removeEventListener("pointerup", endDrag, true);
|
|
84306
|
+
doc.removeEventListener("pointercancel", endDrag, true);
|
|
84307
|
+
doc.removeEventListener("pointerleave", leave);
|
|
84308
|
+
doc.removeEventListener("wheel", wheel, true);
|
|
84309
|
+
doc.removeEventListener("keydown", key2, true);
|
|
84310
|
+
doc.removeEventListener("keyup", key2, true);
|
|
84311
|
+
win.removeEventListener("scroll", scroll, true);
|
|
84312
|
+
win.removeEventListener("blur", endDrag);
|
|
84313
|
+
};
|
|
84314
|
+
}
|
|
84315
|
+
|
|
84316
|
+
// src/shared/inspector.ts
|
|
84317
|
+
var INSPECTOR_PROPERTIES = [
|
|
84318
|
+
"width",
|
|
84319
|
+
"height",
|
|
84320
|
+
"position",
|
|
84321
|
+
"flex-grow",
|
|
84322
|
+
"display",
|
|
84323
|
+
"flex-direction",
|
|
84324
|
+
"align-items",
|
|
84325
|
+
"gap",
|
|
84326
|
+
"padding",
|
|
84327
|
+
"background-color",
|
|
84328
|
+
"opacity",
|
|
84329
|
+
"border-radius",
|
|
84330
|
+
"border-style",
|
|
84331
|
+
"font-size",
|
|
84332
|
+
"color",
|
|
84333
|
+
"box-shadow"
|
|
84334
|
+
];
|
|
84335
|
+
|
|
83957
84336
|
// src/server/inject.ts
|
|
83958
84337
|
var RUNTIME = `(() => {
|
|
83959
84338
|
const post = (message) => parent.postMessage(message, '*');
|
|
@@ -84063,8 +84442,9 @@ var EMBEDDED_STYLE = "<style>:root{color-scheme:light dark;background:transparen
|
|
|
84063
84442
|
var UI_MARKER = /<ryugi-[a-z0-9-]+(?:\s|>)/i;
|
|
84064
84443
|
var UI_META = /<meta[^>]+name=["']ryugi-ui["'][^>]*>/i;
|
|
84065
84444
|
function injectRuntime(html, options = {}) {
|
|
84066
|
-
const
|
|
84067
|
-
const
|
|
84445
|
+
const inspect = options.inspector ? `;(${installInspector.toString().replace(/\n/g, " ")})(window,${JSON.stringify(INSPECTOR_PROPERTIES)});` : "";
|
|
84446
|
+
const tag = `${options.embedded ? EMBEDDED_STYLE : ""}<script>${inspect || RUNTIME_LINE}</script>`;
|
|
84447
|
+
const ui2 = options.uiRuntimeUrl && !options.inspector && (UI_MARKER.test(html) || UI_META.test(html)) ? `<script defer src="${options.uiRuntimeUrl.replace(/"/g, """)}"></script>` : "";
|
|
84068
84448
|
const head = HEAD.exec(html);
|
|
84069
84449
|
const at7 = head ? head.index + head[0].length : PROLOGUE.exec(html)?.[0].length ?? 0;
|
|
84070
84450
|
return html.slice(0, at7) + tag + ui2 + html.slice(at7);
|
|
@@ -84227,26 +84607,627 @@ function createDynamicBlocks(limits) {
|
|
|
84227
84607
|
};
|
|
84228
84608
|
}
|
|
84229
84609
|
|
|
84230
|
-
// src/server/
|
|
84610
|
+
// src/server/config.ts
|
|
84231
84611
|
var import_node_fs10 = __toESM(require("node:fs"), 1);
|
|
84232
84612
|
var import_node_path10 = __toESM(require("node:path"), 1);
|
|
84233
|
-
|
|
84613
|
+
|
|
84614
|
+
// src/shared/cloud.ts
|
|
84615
|
+
var isVisibility = (value) => value === "private" || value === "public";
|
|
84616
|
+
|
|
84617
|
+
// src/server/config.ts
|
|
84618
|
+
var defaults = () => ({ version: 1, artifacts: {} });
|
|
84619
|
+
function isCloudRecord(value) {
|
|
84620
|
+
if (typeof value !== "object" || value === null) return false;
|
|
84621
|
+
const { id: id2, url, publishedAt, visibility } = value;
|
|
84622
|
+
return typeof id2 === "string" && typeof url === "string" && typeof publishedAt === "string" && isVisibility(visibility);
|
|
84623
|
+
}
|
|
84624
|
+
function normalize(raw) {
|
|
84625
|
+
const config = defaults();
|
|
84626
|
+
if (typeof raw !== "object" || raw === null) return config;
|
|
84627
|
+
const artifacts = raw.artifacts;
|
|
84628
|
+
if (typeof artifacts !== "object" || artifacts === null) return config;
|
|
84629
|
+
for (const [key2, value] of Object.entries(artifacts)) {
|
|
84630
|
+
if (typeof value !== "object" || value === null) continue;
|
|
84631
|
+
const { visibility, cloud } = value;
|
|
84632
|
+
if (visibility !== void 0 && !isVisibility(visibility)) continue;
|
|
84633
|
+
const entry = {};
|
|
84634
|
+
if (visibility) entry.visibility = visibility;
|
|
84635
|
+
if (isCloudRecord(cloud)) entry.cloud = { id: cloud.id, url: cloud.url, publishedAt: cloud.publishedAt, visibility: cloud.visibility };
|
|
84636
|
+
config.artifacts[key2] = entry;
|
|
84637
|
+
}
|
|
84638
|
+
return config;
|
|
84639
|
+
}
|
|
84640
|
+
function readConfig(file) {
|
|
84641
|
+
let text;
|
|
84642
|
+
try {
|
|
84643
|
+
text = import_node_fs10.default.readFileSync(file, "utf8");
|
|
84644
|
+
} catch {
|
|
84645
|
+
return { config: defaults() };
|
|
84646
|
+
}
|
|
84647
|
+
try {
|
|
84648
|
+
return { config: normalize(JSON.parse(text)) };
|
|
84649
|
+
} catch (err) {
|
|
84650
|
+
return { config: defaults(), warning: `config.json is not valid JSON: ${err.message}` };
|
|
84651
|
+
}
|
|
84652
|
+
}
|
|
84653
|
+
function ensureGitignore(dir) {
|
|
84654
|
+
const file = import_node_path10.default.join(dir, ".gitignore");
|
|
84655
|
+
let current = "";
|
|
84656
|
+
try {
|
|
84657
|
+
current = import_node_fs10.default.readFileSync(file, "utf8");
|
|
84658
|
+
} catch {
|
|
84659
|
+
import_node_fs10.default.writeFileSync(file, "config.json\n");
|
|
84660
|
+
return;
|
|
84661
|
+
}
|
|
84662
|
+
if (current.split(/\r?\n/).some((line) => line.trim() === "config.json")) return;
|
|
84663
|
+
import_node_fs10.default.writeFileSync(file, `${current}${current === "" || current.endsWith("\n") ? "" : "\n"}config.json
|
|
84664
|
+
`);
|
|
84665
|
+
}
|
|
84666
|
+
function ensureConfig(file) {
|
|
84667
|
+
import_node_fs10.default.mkdirSync(import_node_path10.default.dirname(file), { recursive: true });
|
|
84668
|
+
ensureGitignore(import_node_path10.default.dirname(file));
|
|
84669
|
+
if (!import_node_fs10.default.existsSync(file)) writeJsonAtomic(file, defaults());
|
|
84670
|
+
}
|
|
84671
|
+
function updateArtifactConfig(file, key2, patch) {
|
|
84672
|
+
const { config, warning } = readConfig(file);
|
|
84673
|
+
if (warning) throw new Error(warning);
|
|
84674
|
+
const entry = { ...config.artifacts[key2] };
|
|
84675
|
+
if (patch.visibility) entry.visibility = patch.visibility;
|
|
84676
|
+
if (patch.cloud === null) delete entry.cloud;
|
|
84677
|
+
else if (patch.cloud) entry.cloud = patch.cloud;
|
|
84678
|
+
config.artifacts[key2] = entry;
|
|
84679
|
+
writeJsonAtomic(file, config);
|
|
84680
|
+
return entry;
|
|
84681
|
+
}
|
|
84682
|
+
|
|
84683
|
+
// src/server/cloud.ts
|
|
84684
|
+
var import_node_crypto3 = __toESM(require("node:crypto"), 1);
|
|
84685
|
+
|
|
84686
|
+
// src/server/callback-page.ts
|
|
84687
|
+
var CALLBACK_PAGE_CSP = "default-src 'none'; style-src 'unsafe-inline'; img-src data:; script-src 'none'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
|
|
84688
|
+
var escapeHtml = (value) => value.replace(/[&<>"']/g, (ch) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[ch]);
|
|
84689
|
+
var GRAIN = "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>";
|
|
84690
|
+
var STYLE2 = `
|
|
84691
|
+
:root {
|
|
84692
|
+
color-scheme: light dark;
|
|
84693
|
+
--paper: #f3ede1;
|
|
84694
|
+
--paper-deep: #e8dfcd;
|
|
84695
|
+
--ink: #1d1a16;
|
|
84696
|
+
--ink-soft: #6b6152;
|
|
84697
|
+
--rule: #cfc3ab;
|
|
84698
|
+
--moon-hi: #fffaf0;
|
|
84699
|
+
--moon-mid: #f1e4c6;
|
|
84700
|
+
--moon-lo: #d6c19b;
|
|
84701
|
+
--halo: rgba(214, 178, 110, 0.35);
|
|
84702
|
+
--accent: #9b3d2a;
|
|
84703
|
+
--serif: "Iowan Old Style", "Songti SC", "STSong", "Noto Serif CJK SC", "Source Han Serif SC", Georgia, serif;
|
|
84704
|
+
--sans: "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", system-ui, sans-serif;
|
|
84705
|
+
--mono: ui-monospace, "SF Mono", Menlo, monospace;
|
|
84706
|
+
}
|
|
84707
|
+
@media (prefers-color-scheme: dark) {
|
|
84708
|
+
:root {
|
|
84709
|
+
--paper: #0e1222;
|
|
84710
|
+
--paper-deep: #070912;
|
|
84711
|
+
--ink: #ece6d8;
|
|
84712
|
+
--ink-soft: #9a96a8;
|
|
84713
|
+
--rule: #2a3050;
|
|
84714
|
+
--moon-hi: #fffdf6;
|
|
84715
|
+
--moon-mid: #e9dfc6;
|
|
84716
|
+
--moon-lo: #b9a985;
|
|
84717
|
+
--halo: rgba(233, 214, 160, 0.28);
|
|
84718
|
+
--accent: #e08a6d;
|
|
84719
|
+
}
|
|
84720
|
+
}
|
|
84721
|
+
* { box-sizing: border-box; }
|
|
84722
|
+
html, body { height: 100%; margin: 0; }
|
|
84723
|
+
body {
|
|
84724
|
+
display: grid;
|
|
84725
|
+
place-items: center;
|
|
84726
|
+
padding: 32px 20px;
|
|
84727
|
+
background: radial-gradient(120% 90% at 18% 20%, var(--paper) 0%, var(--paper-deep) 100%);
|
|
84728
|
+
color: var(--ink);
|
|
84729
|
+
font-family: var(--sans);
|
|
84730
|
+
-webkit-font-smoothing: antialiased;
|
|
84731
|
+
overflow: hidden;
|
|
84732
|
+
}
|
|
84733
|
+
body::before {
|
|
84734
|
+
content: "";
|
|
84735
|
+
position: fixed;
|
|
84736
|
+
inset: 0;
|
|
84737
|
+
background-image: url("${GRAIN}");
|
|
84738
|
+
opacity: 0.07;
|
|
84739
|
+
mix-blend-mode: multiply;
|
|
84740
|
+
pointer-events: none;
|
|
84741
|
+
}
|
|
84742
|
+
main {
|
|
84743
|
+
position: relative;
|
|
84744
|
+
display: grid;
|
|
84745
|
+
grid-template-columns: auto minmax(0, 360px);
|
|
84746
|
+
align-items: center;
|
|
84747
|
+
gap: 56px;
|
|
84748
|
+
max-width: 760px;
|
|
84749
|
+
}
|
|
84750
|
+
.sky { position: relative; width: 220px; height: 220px; }
|
|
84751
|
+
.moon {
|
|
84752
|
+
position: absolute;
|
|
84753
|
+
inset: 0;
|
|
84754
|
+
border-radius: 50%;
|
|
84755
|
+
background:
|
|
84756
|
+
radial-gradient(circle at 64% 30%, rgba(0, 0, 0, 0.06) 0 9%, transparent 10%),
|
|
84757
|
+
radial-gradient(circle at 34% 62%, rgba(0, 0, 0, 0.05) 0 13%, transparent 14%),
|
|
84758
|
+
radial-gradient(circle at 70% 70%, rgba(0, 0, 0, 0.04) 0 6%, transparent 7%),
|
|
84759
|
+
radial-gradient(circle at 35% 32%, var(--moon-hi) 0%, var(--moon-mid) 55%, var(--moon-lo) 100%);
|
|
84760
|
+
box-shadow: 0 0 0 1px var(--halo), 0 0 80px 18px var(--halo);
|
|
84761
|
+
animation: rise 1.1s cubic-bezier(0.2, 0.7, 0.1, 1) both;
|
|
84762
|
+
}
|
|
84763
|
+
.failed .moon {
|
|
84764
|
+
background: transparent;
|
|
84765
|
+
box-shadow: inset 34px -14px 0 0 var(--moon-lo), 0 0 0 1px var(--rule);
|
|
84766
|
+
opacity: 0.85;
|
|
84767
|
+
}
|
|
84768
|
+
.vertical {
|
|
84769
|
+
position: absolute;
|
|
84770
|
+
right: -34px;
|
|
84771
|
+
top: 6px;
|
|
84772
|
+
writing-mode: vertical-rl;
|
|
84773
|
+
font-family: var(--serif);
|
|
84774
|
+
font-size: 15px;
|
|
84775
|
+
letter-spacing: 0.5em;
|
|
84776
|
+
color: var(--ink-soft);
|
|
84777
|
+
animation: fade 1s 0.5s both;
|
|
84778
|
+
}
|
|
84779
|
+
.label {
|
|
84780
|
+
display: flex;
|
|
84781
|
+
align-items: center;
|
|
84782
|
+
gap: 10px;
|
|
84783
|
+
margin: 0 0 18px;
|
|
84784
|
+
font-family: var(--mono);
|
|
84785
|
+
font-size: 11px;
|
|
84786
|
+
letter-spacing: 0.18em;
|
|
84787
|
+
text-transform: uppercase;
|
|
84788
|
+
color: var(--ink-soft);
|
|
84789
|
+
animation: fade 0.8s 0.35s both;
|
|
84790
|
+
}
|
|
84791
|
+
.label::before { content: ""; width: 28px; height: 1px; background: var(--rule); }
|
|
84792
|
+
.failed .label { color: var(--accent); }
|
|
84793
|
+
h1 {
|
|
84794
|
+
margin: 0;
|
|
84795
|
+
font-family: var(--serif);
|
|
84796
|
+
font-weight: 600;
|
|
84797
|
+
font-size: clamp(34px, 6vw, 46px);
|
|
84798
|
+
line-height: 1.15;
|
|
84799
|
+
letter-spacing: 0.01em;
|
|
84800
|
+
animation: fade 0.9s 0.45s both;
|
|
84801
|
+
}
|
|
84802
|
+
h1 em {
|
|
84803
|
+
display: block;
|
|
84804
|
+
font-style: italic;
|
|
84805
|
+
font-weight: 400;
|
|
84806
|
+
color: var(--ink-soft);
|
|
84807
|
+
}
|
|
84808
|
+
p {
|
|
84809
|
+
margin: 22px 0 0;
|
|
84810
|
+
font-size: 15px;
|
|
84811
|
+
line-height: 1.85;
|
|
84812
|
+
color: var(--ink-soft);
|
|
84813
|
+
animation: fade 0.9s 0.6s both;
|
|
84814
|
+
}
|
|
84815
|
+
p strong { color: var(--ink); font-weight: 500; }
|
|
84816
|
+
footer {
|
|
84817
|
+
margin-top: 34px;
|
|
84818
|
+
padding-top: 16px;
|
|
84819
|
+
border-top: 1px solid var(--rule);
|
|
84820
|
+
display: flex;
|
|
84821
|
+
justify-content: space-between;
|
|
84822
|
+
gap: 16px;
|
|
84823
|
+
font-family: var(--mono);
|
|
84824
|
+
font-size: 11px;
|
|
84825
|
+
color: var(--ink-soft);
|
|
84826
|
+
animation: fade 0.9s 0.75s both;
|
|
84827
|
+
}
|
|
84828
|
+
@keyframes rise { from { opacity: 0; transform: translateY(28px) scale(0.96); } to { opacity: 1; transform: none; } }
|
|
84829
|
+
@keyframes fade { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
|
|
84830
|
+
@media (max-width: 640px) {
|
|
84831
|
+
main { grid-template-columns: 1fr; gap: 40px; justify-items: start; }
|
|
84832
|
+
.sky { width: 132px; height: 132px; }
|
|
84833
|
+
.vertical { display: none; }
|
|
84834
|
+
}
|
|
84835
|
+
@media (prefers-reduced-motion: reduce) {
|
|
84836
|
+
*, *::before, *::after { animation: none !important; }
|
|
84837
|
+
}
|
|
84838
|
+
`;
|
|
84839
|
+
function callbackPage(result) {
|
|
84840
|
+
const host = escapeHtml(new URL(result.origin).host);
|
|
84841
|
+
const title = result.ok ? "\u5DF2\u767B\u5F55 Ryugi Cloud" : "\u767B\u5F55\u6CA1\u6709\u5B8C\u6210";
|
|
84842
|
+
const body = result.ok ? `<p class="label">Ryugi Cloud \xB7 \u5DF2\u8FDE\u63A5</p>
|
|
84843
|
+
<h1>\u5DF2\u767B\u5F55<em>${escapeHtml(result.login)}</em></h1>
|
|
84844
|
+
<p>\u8FD9\u53F0\u7535\u8111\u4E0A\u7684 Ryugi \u73B0\u5728\u53EF\u4EE5\u53D1\u5E03 artifact \u4E86\u3002<strong>\u56DE\u5230 Ryugi</strong>\uFF0C\u5206\u4EAB\u9762\u677F\u4F1A\u81EA\u52A8\u5237\u65B0\uFF1B\u5982\u679C\u662F\u8BA9 agent \u53D1\u5E03\u7684\uFF0C\u8BA9\u5B83\u518D\u8FD0\u884C\u4E00\u6B21\u53D1\u5E03\u547D\u4EE4\u3002</p>` : `<p class="label">Ryugi Cloud \xB7 \u672A\u8FDE\u63A5</p>
|
|
84845
|
+
<h1>\u767B\u5F55\u6CA1\u6709\u5B8C\u6210</h1>
|
|
84846
|
+
<p>${escapeHtml(result.detail)}</p>`;
|
|
84847
|
+
return `<!doctype html>
|
|
84848
|
+
<html lang="zh-CN">
|
|
84849
|
+
<head>
|
|
84850
|
+
<meta charset="utf-8">
|
|
84851
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
84852
|
+
<meta name="referrer" content="no-referrer">
|
|
84853
|
+
<meta name="robots" content="noindex, nofollow">
|
|
84854
|
+
<meta name="description" content="Ryugi Cloud \u672C\u5730\u767B\u5F55\u7ED3\u679C\u3002\u5B8C\u6210\u8FDE\u63A5\u540E\uFF0C\u8FD4\u56DE Ryugi \u7EE7\u7EED\u53D1\u5E03\u548C\u5206\u4EAB Artifact\u3002">
|
|
84855
|
+
<title>${title}</title>
|
|
84856
|
+
<style>${STYLE2}</style>
|
|
84857
|
+
</head>
|
|
84858
|
+
<body>
|
|
84859
|
+
<main class="${result.ok ? "signed-in" : "failed"}">
|
|
84860
|
+
<div class="sky" aria-hidden="true"><div class="moon"></div><span class="vertical">\u6D41\u5100</span></div>
|
|
84861
|
+
<section>
|
|
84862
|
+
${body}
|
|
84863
|
+
<footer><span>${result.ok ? "\u53EF\u4EE5\u5173\u95ED\u8FD9\u4E2A\u9875\u9762" : "\u53EF\u4EE5\u5173\u95ED\u8FD9\u4E2A\u9875\u9762\u540E\u91CD\u8BD5"}</span><span>${host}</span></footer>
|
|
84864
|
+
</section>
|
|
84865
|
+
</main>
|
|
84866
|
+
</body>
|
|
84867
|
+
</html>
|
|
84868
|
+
`;
|
|
84869
|
+
}
|
|
84870
|
+
|
|
84871
|
+
// src/server/credentials.ts
|
|
84872
|
+
var import_node_fs11 = __toESM(require("node:fs"), 1);
|
|
84873
|
+
var import_node_path11 = __toESM(require("node:path"), 1);
|
|
84874
|
+
function credentialsFile(env, platform, home) {
|
|
84875
|
+
if (platform === "win32" && env.APPDATA) return import_node_path11.default.join(env.APPDATA, "ryugi", "credentials.json");
|
|
84876
|
+
return import_node_path11.default.join(env.XDG_CONFIG_HOME || import_node_path11.default.join(home, ".config"), "ryugi", "credentials.json");
|
|
84877
|
+
}
|
|
84878
|
+
function readCredentials(file, origin) {
|
|
84879
|
+
let raw;
|
|
84880
|
+
try {
|
|
84881
|
+
raw = JSON.parse(import_node_fs11.default.readFileSync(file, "utf8"));
|
|
84882
|
+
} catch {
|
|
84883
|
+
return null;
|
|
84884
|
+
}
|
|
84885
|
+
if (typeof raw !== "object" || raw === null) return null;
|
|
84886
|
+
const { origin: savedOrigin, token, login } = raw;
|
|
84887
|
+
if (typeof savedOrigin !== "string" || typeof token !== "string" || typeof login !== "string") return null;
|
|
84888
|
+
if (savedOrigin !== origin) return null;
|
|
84889
|
+
return { origin: savedOrigin, token, login };
|
|
84890
|
+
}
|
|
84891
|
+
function writeCredentials(file, credentials) {
|
|
84892
|
+
import_node_fs11.default.mkdirSync(import_node_path11.default.dirname(file), { recursive: true, mode: 448 });
|
|
84893
|
+
writeJsonAtomic(file, credentials);
|
|
84894
|
+
}
|
|
84895
|
+
function clearCredentials(file) {
|
|
84896
|
+
import_node_fs11.default.rmSync(file, { force: true });
|
|
84897
|
+
}
|
|
84898
|
+
|
|
84899
|
+
// src/server/pack.ts
|
|
84900
|
+
var import_node_fs12 = __toESM(require("node:fs"), 1);
|
|
84901
|
+
var import_node_path12 = __toESM(require("node:path"), 1);
|
|
84902
|
+
var MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
|
|
84903
|
+
function formatBytes(bytes) {
|
|
84904
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
84905
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
84906
|
+
return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
|
|
84907
|
+
}
|
|
84908
|
+
var excluded = (type, relative) => type === "document" && relative === "comments.json";
|
|
84909
|
+
function packArtifact(dir, type, { maxBytes = MAX_ARTIFACT_BYTES } = {}) {
|
|
84910
|
+
const rootReal = import_node_fs12.default.realpathSync(dir);
|
|
84911
|
+
const found = [];
|
|
84912
|
+
const visited = /* @__PURE__ */ new Set([rootReal]);
|
|
84913
|
+
let total = 0;
|
|
84914
|
+
const walk = (current) => {
|
|
84915
|
+
for (const entry of import_node_fs12.default.readdirSync(current, { withFileTypes: true })) {
|
|
84916
|
+
if (entry.name.startsWith(".")) continue;
|
|
84917
|
+
const full = import_node_path12.default.join(current, entry.name);
|
|
84918
|
+
let real;
|
|
84919
|
+
try {
|
|
84920
|
+
real = import_node_fs12.default.realpathSync(full);
|
|
84921
|
+
} catch {
|
|
84922
|
+
continue;
|
|
84923
|
+
}
|
|
84924
|
+
if (!real.startsWith(rootReal + import_node_path12.default.sep)) continue;
|
|
84925
|
+
const stat = import_node_fs12.default.statSync(real);
|
|
84926
|
+
if (stat.isDirectory()) {
|
|
84927
|
+
if (visited.has(real)) continue;
|
|
84928
|
+
visited.add(real);
|
|
84929
|
+
walk(full);
|
|
84930
|
+
continue;
|
|
84931
|
+
}
|
|
84932
|
+
if (!stat.isFile()) continue;
|
|
84933
|
+
const relative = import_node_path12.default.relative(dir, full).split(import_node_path12.default.sep).join("/");
|
|
84934
|
+
if (excluded(type, relative)) continue;
|
|
84935
|
+
total += stat.size;
|
|
84936
|
+
found.push({ path: relative, real });
|
|
84937
|
+
}
|
|
84938
|
+
};
|
|
84939
|
+
walk(dir);
|
|
84940
|
+
if (total > maxBytes) {
|
|
84941
|
+
throw new Error(`artifact is ${formatBytes(total)}; the limit is ${formatBytes(maxBytes)}`);
|
|
84942
|
+
}
|
|
84943
|
+
return found.map((file) => ({ path: file.path, data: import_node_fs12.default.readFileSync(file.real) }));
|
|
84944
|
+
}
|
|
84945
|
+
|
|
84946
|
+
// src/server/publish-payload.ts
|
|
84947
|
+
var import_node_fs13 = __toESM(require("node:fs"), 1);
|
|
84948
|
+
var import_node_path13 = __toESM(require("node:path"), 1);
|
|
84949
|
+
var CLOUD_RUNTIME_URL = "/_ryugi/runtime/ryugi-ui.js";
|
|
84950
|
+
function publishPayload(ref, dir, title, payload) {
|
|
84951
|
+
if (ref.type === "artboard") {
|
|
84952
|
+
const { canvas, layout, versions } = payload;
|
|
84953
|
+
return { canvas, layout, versions };
|
|
84954
|
+
}
|
|
84955
|
+
if (ref.type === "document") return { title, state: parseDocument2(import_node_fs13.default.readFileSync(import_node_path13.default.join(dir, "doc.xml"), "utf8")) };
|
|
84956
|
+
return { title };
|
|
84957
|
+
}
|
|
84958
|
+
var isPage = (type, file) => type === "html" ? file === "index.html" : (type === "document" || type === "artboard") && file.endsWith(".html");
|
|
84959
|
+
function withCloudRuntime(type, files) {
|
|
84960
|
+
return files.map(
|
|
84961
|
+
(file) => isPage(type, file.path) ? { path: file.path, data: Buffer.from(injectRuntime(file.data.toString("utf8"), { uiRuntimeUrl: CLOUD_RUNTIME_URL, embedded: type === "document", inspector: type === "artboard" })) } : file
|
|
84962
|
+
);
|
|
84963
|
+
}
|
|
84964
|
+
|
|
84965
|
+
// src/server/cloud.ts
|
|
84966
|
+
var LOGIN_STATE_TTL_MS = 10 * 60 * 1e3;
|
|
84967
|
+
var MAX_JSON_BODY = 4096;
|
|
84968
|
+
var CLOUD_ID = /^[A-Za-z0-9_-]{1,64}$/;
|
|
84969
|
+
var ROUTE = /^\/api\/cloud\/(status|login|logout|artifacts|publish|visibility)(?:\/([^/]+)(?:\/([^/]+))?)?$/;
|
|
84970
|
+
var SignedOut = class extends Error {
|
|
84971
|
+
};
|
|
84972
|
+
var CloudRefused = class extends Error {
|
|
84973
|
+
constructor(status, message) {
|
|
84974
|
+
super(message);
|
|
84975
|
+
this.status = status;
|
|
84976
|
+
}
|
|
84977
|
+
status;
|
|
84978
|
+
};
|
|
84979
|
+
async function readJsonBody(req) {
|
|
84980
|
+
const chunks = [];
|
|
84981
|
+
let size = 0;
|
|
84982
|
+
for await (const chunk of req) {
|
|
84983
|
+
size += chunk.length;
|
|
84984
|
+
if (size > MAX_JSON_BODY) throw new CloudRefused(413, "request body too large");
|
|
84985
|
+
chunks.push(chunk);
|
|
84986
|
+
}
|
|
84987
|
+
try {
|
|
84988
|
+
return JSON.parse(Buffer.concat(chunks).toString("utf8") || "null");
|
|
84989
|
+
} catch {
|
|
84990
|
+
return null;
|
|
84991
|
+
}
|
|
84992
|
+
}
|
|
84993
|
+
async function errorMessage(res) {
|
|
84994
|
+
const text = await res.text().catch(() => "");
|
|
84995
|
+
try {
|
|
84996
|
+
const parsed = JSON.parse(text);
|
|
84997
|
+
return typeof parsed.error === "string" ? parsed.error : text;
|
|
84998
|
+
} catch {
|
|
84999
|
+
return text || res.statusText;
|
|
85000
|
+
}
|
|
85001
|
+
}
|
|
85002
|
+
function createCloudRoutes(options) {
|
|
85003
|
+
const { origin, credentialsFile: credentialsFile2, configFile } = options;
|
|
85004
|
+
const pendingStates = /* @__PURE__ */ new Map();
|
|
85005
|
+
const loginUrl = () => {
|
|
85006
|
+
const now = Date.now();
|
|
85007
|
+
for (const [state2, pending] of pendingStates) if (pending.expires < now) pendingStates.delete(state2);
|
|
85008
|
+
const state = randomToken();
|
|
85009
|
+
const verifier = randomToken();
|
|
85010
|
+
pendingStates.set(state, { expires: now + LOGIN_STATE_TTL_MS, verifier });
|
|
85011
|
+
const challenge = import_node_crypto3.default.createHash("sha256").update(verifier).digest("base64url");
|
|
85012
|
+
return `${origin}/auth/cli?port=${options.port()}&state=${state}&challenge=${challenge}`;
|
|
85013
|
+
};
|
|
85014
|
+
const cloudFetch = async (method, path17, body) => {
|
|
85015
|
+
const credentials = readCredentials(credentialsFile2, origin);
|
|
85016
|
+
if (!credentials) throw new SignedOut();
|
|
85017
|
+
const headers = { Authorization: `Bearer ${credentials.token}` };
|
|
85018
|
+
let payload;
|
|
85019
|
+
if (body instanceof FormData) payload = body;
|
|
85020
|
+
else if (body) {
|
|
85021
|
+
headers["Content-Type"] = "application/json";
|
|
85022
|
+
payload = JSON.stringify(body);
|
|
85023
|
+
}
|
|
85024
|
+
let res;
|
|
85025
|
+
try {
|
|
85026
|
+
res = await fetch(`${origin}${path17}`, { method, headers, body: payload });
|
|
85027
|
+
} catch (err) {
|
|
85028
|
+
throw new CloudRefused(502, `could not reach ${origin}: ${err.message}`);
|
|
85029
|
+
}
|
|
85030
|
+
if (res.status === 401) throw new SignedOut();
|
|
85031
|
+
return res;
|
|
85032
|
+
};
|
|
85033
|
+
const expectOk = async (res) => {
|
|
85034
|
+
if (!res.ok) throw new CloudRefused(502, `cloud refused (${res.status}): ${await errorMessage(res)}`);
|
|
85035
|
+
return res;
|
|
85036
|
+
};
|
|
85037
|
+
const artifactEntry = (key2) => readConfig(configFile).config.artifacts[key2] ?? {};
|
|
85038
|
+
const publish = async (ref, requested) => {
|
|
85039
|
+
const inspected = await options.inspect(ref);
|
|
85040
|
+
if (!inspected) throw new CloudRefused(404, `${ref.type}/${ref.id} not found`);
|
|
85041
|
+
if (inspected.reasons.length > 0 || !inspected.payload) return { status: 409, body: { error: "fix these before publishing", reasons: inspected.reasons } };
|
|
85042
|
+
let files;
|
|
85043
|
+
try {
|
|
85044
|
+
files = withCloudRuntime(ref.type, packArtifact(inspected.dir, ref.type));
|
|
85045
|
+
} catch (err) {
|
|
85046
|
+
throw new CloudRefused(413, err.message);
|
|
85047
|
+
}
|
|
85048
|
+
const key2 = `${ref.type}/${ref.id}`;
|
|
85049
|
+
const entry = artifactEntry(key2);
|
|
85050
|
+
const visibility = requested ?? entry.visibility ?? "private";
|
|
85051
|
+
const form = new FormData();
|
|
85052
|
+
form.set("meta", JSON.stringify({ type: ref.type, title: inspected.title, visibility }));
|
|
85053
|
+
form.set("payload", JSON.stringify(inspected.payload));
|
|
85054
|
+
for (const file of files) form.set(`file:${file.path}`, new Blob([new Uint8Array(file.data)]), file.path);
|
|
85055
|
+
let res = entry.cloud ? await cloudFetch("PUT", `/api/artifacts/${entry.cloud.id}`, form) : null;
|
|
85056
|
+
if (!res || res.status === 404) res = await cloudFetch("POST", "/api/artifacts", form);
|
|
85057
|
+
const published = await (await expectOk(res)).json();
|
|
85058
|
+
updateArtifactConfig(configFile, key2, {
|
|
85059
|
+
visibility,
|
|
85060
|
+
cloud: { id: published.id, url: published.url, publishedAt: published.updatedAt, visibility: published.visibility }
|
|
85061
|
+
});
|
|
85062
|
+
return { status: 200, body: { id: published.id, url: published.url, visibility, publishedAt: published.updatedAt } };
|
|
85063
|
+
};
|
|
85064
|
+
const setVisibility = async (ref, visibility) => {
|
|
85065
|
+
if (!await options.inspect(ref)) throw new CloudRefused(404, `${ref.type}/${ref.id} not found`);
|
|
85066
|
+
const key2 = `${ref.type}/${ref.id}`;
|
|
85067
|
+
const entry = artifactEntry(key2);
|
|
85068
|
+
if (entry.cloud) {
|
|
85069
|
+
const res = await cloudFetch("PATCH", `/api/artifacts/${entry.cloud.id}`, { visibility });
|
|
85070
|
+
if (res.status === 404) updateArtifactConfig(configFile, key2, { cloud: null });
|
|
85071
|
+
else {
|
|
85072
|
+
const updated = await (await expectOk(res)).json();
|
|
85073
|
+
updateArtifactConfig(configFile, key2, { cloud: { ...entry.cloud, visibility: updated.visibility } });
|
|
85074
|
+
}
|
|
85075
|
+
}
|
|
85076
|
+
return updateArtifactConfig(configFile, key2, { visibility });
|
|
85077
|
+
};
|
|
85078
|
+
const deleteCloud = async (cloudId) => {
|
|
85079
|
+
const res = await cloudFetch("DELETE", `/api/artifacts/${cloudId}`);
|
|
85080
|
+
if (res.status !== 404) await expectOk(res);
|
|
85081
|
+
for (const [key2, entry] of Object.entries(readConfig(configFile).config.artifacts)) {
|
|
85082
|
+
if (entry.cloud?.id === cloudId) updateArtifactConfig(configFile, key2, { cloud: null });
|
|
85083
|
+
}
|
|
85084
|
+
};
|
|
85085
|
+
const route = async (req, res, match) => {
|
|
85086
|
+
const [, action, first, second] = match;
|
|
85087
|
+
const method = req.method ?? "GET";
|
|
85088
|
+
const ref = first && second ? artifactKeyOf(`${first}/${second}`) : null;
|
|
85089
|
+
if (action === "status" && method === "GET" && !first) {
|
|
85090
|
+
const credentials = readCredentials(credentialsFile2, origin);
|
|
85091
|
+
const { config, warning } = readConfig(configFile);
|
|
85092
|
+
sendJson(res, 200, { signedIn: !!credentials, login: credentials?.login ?? null, origin, artifacts: config.artifacts, warning: warning ?? null });
|
|
85093
|
+
return;
|
|
85094
|
+
}
|
|
85095
|
+
if (action === "login" && method === "POST" && !first) {
|
|
85096
|
+
sendJson(res, 200, { url: loginUrl() });
|
|
85097
|
+
return;
|
|
85098
|
+
}
|
|
85099
|
+
if (action === "logout" && method === "POST" && !first) {
|
|
85100
|
+
const credentials = readCredentials(credentialsFile2, origin);
|
|
85101
|
+
if (credentials) {
|
|
85102
|
+
await fetch(`${origin}/api/logout`, { method: "POST", headers: { Authorization: `Bearer ${credentials.token}` } }).catch(() => void 0);
|
|
85103
|
+
}
|
|
85104
|
+
clearCredentials(credentialsFile2);
|
|
85105
|
+
sendJson(res, 200, { signedIn: false });
|
|
85106
|
+
return;
|
|
85107
|
+
}
|
|
85108
|
+
if (action === "artifacts" && method === "GET" && !first) {
|
|
85109
|
+
sendJson(res, 200, await (await expectOk(await cloudFetch("GET", "/api/artifacts"))).json());
|
|
85110
|
+
return;
|
|
85111
|
+
}
|
|
85112
|
+
if (action === "artifacts" && method === "DELETE" && first && !second) {
|
|
85113
|
+
if (!CLOUD_ID.test(first)) throw new CloudRefused(400, "not a cloud artifact id");
|
|
85114
|
+
await deleteCloud(first);
|
|
85115
|
+
sendJson(res, 200, { deleted: first });
|
|
85116
|
+
return;
|
|
85117
|
+
}
|
|
85118
|
+
if (action === "publish" && ref && method === "POST") {
|
|
85119
|
+
const body = await readJsonBody(req);
|
|
85120
|
+
if (body?.visibility !== void 0 && !isVisibility(body.visibility)) throw new CloudRefused(400, 'visibility must be "public" or "private"');
|
|
85121
|
+
const result = await publish(ref, body?.visibility);
|
|
85122
|
+
sendJson(res, result.status, result.body);
|
|
85123
|
+
return;
|
|
85124
|
+
}
|
|
85125
|
+
if (action === "publish" && ref && method === "DELETE") {
|
|
85126
|
+
const entry = artifactEntry(`${ref.type}/${ref.id}`);
|
|
85127
|
+
if (entry.cloud) await deleteCloud(entry.cloud.id);
|
|
85128
|
+
sendJson(res, 200, { unpublished: `${ref.type}/${ref.id}` });
|
|
85129
|
+
return;
|
|
85130
|
+
}
|
|
85131
|
+
if (action === "visibility" && ref && method === "POST") {
|
|
85132
|
+
const body = await readJsonBody(req);
|
|
85133
|
+
const visibility = body?.visibility;
|
|
85134
|
+
if (!isVisibility(visibility)) throw new CloudRefused(400, 'visibility must be "public" or "private"');
|
|
85135
|
+
sendJson(res, 200, await setVisibility(ref, visibility));
|
|
85136
|
+
return;
|
|
85137
|
+
}
|
|
85138
|
+
send(res, 404, "Not found");
|
|
85139
|
+
};
|
|
85140
|
+
return {
|
|
85141
|
+
async handleCallback(url, res) {
|
|
85142
|
+
const page = (status, result) => send(res, status, callbackPage({ ...result, origin }), {
|
|
85143
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
85144
|
+
"Content-Security-Policy": CALLBACK_PAGE_CSP
|
|
85145
|
+
});
|
|
85146
|
+
const state = url.searchParams.get("state") ?? "";
|
|
85147
|
+
const pending = pendingStates.get(state);
|
|
85148
|
+
pendingStates.delete(state);
|
|
85149
|
+
const code = url.searchParams.get("code");
|
|
85150
|
+
if (!pending || pending.expires < Date.now() || !code) {
|
|
85151
|
+
page(400, { ok: false, detail: "\u8FD9\u4E2A\u767B\u5F55\u94FE\u63A5\u5DF2\u8FC7\u671F\u6216\u5DF2\u7ECF\u7528\u8FC7\u3002\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u4E00\u6B21\u767B\u5F55\u3002" });
|
|
85152
|
+
return;
|
|
85153
|
+
}
|
|
85154
|
+
let swap;
|
|
85155
|
+
try {
|
|
85156
|
+
swap = await fetch(`${origin}/auth/cli/token`, {
|
|
85157
|
+
method: "POST",
|
|
85158
|
+
headers: { "Content-Type": "application/json" },
|
|
85159
|
+
body: JSON.stringify({ code, verifier: pending.verifier })
|
|
85160
|
+
});
|
|
85161
|
+
} catch (err) {
|
|
85162
|
+
page(502, { ok: false, detail: `\u8FDE\u4E0D\u4E0A ${origin}\uFF08${err.message}\uFF09\u3002\u68C0\u67E5\u7F51\u7EDC\u540E\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u767B\u5F55\u3002` });
|
|
85163
|
+
return;
|
|
85164
|
+
}
|
|
85165
|
+
const issued = await swap.json().catch(() => ({}));
|
|
85166
|
+
if (!swap.ok || typeof issued.token !== "string" || typeof issued.login !== "string") {
|
|
85167
|
+
const reason = typeof issued.error === "string" ? issued.error : `HTTP ${swap.status}`;
|
|
85168
|
+
page(400, { ok: false, detail: `Ryugi Cloud \u6CA1\u6709\u63A5\u53D7\u8FD9\u6B21\u767B\u5F55\uFF08${reason}\uFF09\u3002\u56DE\u5230 Ryugi \u91CD\u65B0\u53D1\u8D77\u767B\u5F55\u3002` });
|
|
85169
|
+
return;
|
|
85170
|
+
}
|
|
85171
|
+
writeCredentials(credentialsFile2, { origin, token: issued.token, login: issued.login });
|
|
85172
|
+
page(200, { ok: true, login: issued.login });
|
|
85173
|
+
},
|
|
85174
|
+
match: (pathname) => ROUTE.exec(pathname),
|
|
85175
|
+
async handle(req, res, match) {
|
|
85176
|
+
try {
|
|
85177
|
+
await route(req, res, match);
|
|
85178
|
+
} catch (err) {
|
|
85179
|
+
if (res.headersSent) return;
|
|
85180
|
+
if (err instanceof SignedOut) {
|
|
85181
|
+
sendJson(res, 401, { error: "not signed in to the Ryugi cloud", loginUrl: loginUrl() });
|
|
85182
|
+
} else if (err instanceof CloudRefused) {
|
|
85183
|
+
sendJson(res, err.status, { error: err.message });
|
|
85184
|
+
} else {
|
|
85185
|
+
sendJson(res, 500, { error: err.message });
|
|
85186
|
+
}
|
|
85187
|
+
}
|
|
85188
|
+
}
|
|
85189
|
+
};
|
|
85190
|
+
}
|
|
85191
|
+
|
|
85192
|
+
// src/server/viewer-page.ts
|
|
85193
|
+
var escapeHtml2 = (value) => value.replace(/[&<>"']/g, (ch) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[ch]);
|
|
85194
|
+
function viewerPage(template, page) {
|
|
85195
|
+
const values = {
|
|
85196
|
+
robots: "noindex, nofollow",
|
|
85197
|
+
description: page.description,
|
|
85198
|
+
"og:title": page.title,
|
|
85199
|
+
"og:description": page.description,
|
|
85200
|
+
"twitter:title": page.title,
|
|
85201
|
+
"twitter:description": page.description
|
|
85202
|
+
};
|
|
85203
|
+
return template.replace(/<title\b[^>]*>[\s\S]*?<\/title>/i, () => `<title>${escapeHtml2(page.title)}</title>`).replace(/(<meta\b[^>]*\b(?:name|property)="([^"]+)"[^>]*\bcontent=")([^"]*)("[^>]*>)/gi, (tag, prefix, name, value, suffix) => {
|
|
85204
|
+
const content = values[name] ?? (name === "og:image" || name === "twitter:image" ? new URL(value, page.url).href : void 0);
|
|
85205
|
+
return content === void 0 ? tag : `${prefix}${escapeHtml2(content)}${suffix}`;
|
|
85206
|
+
}).replace(/<\/head>/i, () => `<link rel="canonical" href="${escapeHtml2(page.url)}">
|
|
85207
|
+
<meta property="og:url" content="${escapeHtml2(page.url)}">
|
|
85208
|
+
</head>`);
|
|
85209
|
+
}
|
|
85210
|
+
|
|
85211
|
+
// src/server/watch.ts
|
|
85212
|
+
var import_node_fs14 = __toESM(require("node:fs"), 1);
|
|
85213
|
+
var import_node_path14 = __toESM(require("node:path"), 1);
|
|
85214
|
+
var toPosix = (file) => file.split(import_node_path14.default.sep).join("/");
|
|
84234
85215
|
var ignored = (file) => file === ".state" || file.startsWith(".state/");
|
|
84235
85216
|
function snapshot(root, dir = root, out = /* @__PURE__ */ new Map()) {
|
|
84236
85217
|
let entries2;
|
|
84237
85218
|
try {
|
|
84238
|
-
entries2 =
|
|
85219
|
+
entries2 = import_node_fs14.default.readdirSync(dir, { withFileTypes: true });
|
|
84239
85220
|
} catch {
|
|
84240
85221
|
return out;
|
|
84241
85222
|
}
|
|
84242
85223
|
for (const entry of entries2) {
|
|
84243
|
-
const full =
|
|
84244
|
-
const rel = toPosix(
|
|
85224
|
+
const full = import_node_path14.default.join(dir, entry.name);
|
|
85225
|
+
const rel = toPosix(import_node_path14.default.relative(root, full));
|
|
84245
85226
|
if (ignored(rel)) continue;
|
|
84246
85227
|
if (entry.isDirectory()) snapshot(root, full, out);
|
|
84247
85228
|
else {
|
|
84248
85229
|
try {
|
|
84249
|
-
out.set(rel,
|
|
85230
|
+
out.set(rel, import_node_fs14.default.statSync(full).mtimeMs);
|
|
84250
85231
|
} catch {
|
|
84251
85232
|
}
|
|
84252
85233
|
}
|
|
@@ -84279,7 +85260,7 @@ function watchTree(root, onChange, debounceMs = 120, backupPollMs = 1e3) {
|
|
|
84279
85260
|
}, debounceMs);
|
|
84280
85261
|
};
|
|
84281
85262
|
try {
|
|
84282
|
-
const watcher =
|
|
85263
|
+
const watcher = import_node_fs14.default.watch(root, { recursive: true }, (_event, filename) => {
|
|
84283
85264
|
if (filename) queue([toPosix(filename.toString())]);
|
|
84284
85265
|
});
|
|
84285
85266
|
watcher.on("error", () => {
|
|
@@ -84304,14 +85285,14 @@ function watchTree(root, onChange, debounceMs = 120, backupPollMs = 1e3) {
|
|
|
84304
85285
|
}
|
|
84305
85286
|
|
|
84306
85287
|
// src/server/ws.ts
|
|
84307
|
-
var
|
|
85288
|
+
var import_node_crypto4 = __toESM(require("node:crypto"), 1);
|
|
84308
85289
|
var WS_MAGIC = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
|
|
84309
85290
|
var OPCODE_TEXT = 1;
|
|
84310
85291
|
var OPCODE_CLOSE = 8;
|
|
84311
85292
|
var OPCODE_PING = 9;
|
|
84312
85293
|
var OPCODE_PONG = 10;
|
|
84313
85294
|
function acceptKey(clientKey) {
|
|
84314
|
-
return
|
|
85295
|
+
return import_node_crypto4.default.createHash("sha1").update(clientKey + WS_MAGIC).digest("base64");
|
|
84315
85296
|
}
|
|
84316
85297
|
function encodeFrame(opcode, payload) {
|
|
84317
85298
|
const len = payload.length;
|
|
@@ -84402,6 +85383,8 @@ var CONTENT_CSP = {
|
|
|
84402
85383
|
};
|
|
84403
85384
|
var SHELL_ROUTE = new RegExp(`^/(?:(${ARTIFACT_TYPES.join("|")})/([^/]+)/?)?$`);
|
|
84404
85385
|
var API_ARTIFACT_ROUTE = /^\/api\/artifacts\/([^/]+)\/([^/]+)$/;
|
|
85386
|
+
var PREVIEW_ROUTE = /^\/preview\/(artboard|document|html)\/([a-z0-9][a-z0-9-]*)\/?$/;
|
|
85387
|
+
var API_PREVIEW_ROUTE = /^\/api\/preview\/([^/]+)\/([^/]+)$/;
|
|
84405
85388
|
var API_DOCUMENT_ROUTE = /^\/api\/document\/([^/]+)\/(state|update|comments)$/;
|
|
84406
85389
|
var MAX_COMMENT_OP = 64 * 1024;
|
|
84407
85390
|
var MAX_DOCUMENT_UPDATE = 8 * 1024 * 1024;
|
|
@@ -84421,16 +85404,17 @@ function titleOf(payload, ref) {
|
|
|
84421
85404
|
return payload.canvas?.title || ref.id;
|
|
84422
85405
|
}
|
|
84423
85406
|
async function startArtifactsServer(options) {
|
|
84424
|
-
const root =
|
|
84425
|
-
const viewerDir =
|
|
84426
|
-
const runtimeDir = options.runtimeDir ?
|
|
84427
|
-
const stateDir =
|
|
84428
|
-
|
|
84429
|
-
|
|
84430
|
-
|
|
84431
|
-
const
|
|
85407
|
+
const root = import_node_path15.default.resolve(options.root);
|
|
85408
|
+
const viewerDir = import_node_path15.default.resolve(options.viewerDir);
|
|
85409
|
+
const runtimeDir = options.runtimeDir ? import_node_path15.default.resolve(options.runtimeDir) : null;
|
|
85410
|
+
const stateDir = import_node_path15.default.join(root, ".state");
|
|
85411
|
+
import_node_fs15.default.mkdirSync(stateDir, { recursive: true, mode: 448 });
|
|
85412
|
+
import_node_fs15.default.writeFileSync(import_node_path15.default.join(stateDir, ".gitignore"), "*\n");
|
|
85413
|
+
if (options.configFile) ensureConfig(options.configFile);
|
|
85414
|
+
const portFile = import_node_path15.default.join(stateDir, ".last-port");
|
|
85415
|
+
const tokenFile = import_node_path15.default.join(stateDir, ".last-token");
|
|
84432
85416
|
const token = readPersisted(tokenFile) || randomToken();
|
|
84433
|
-
|
|
85417
|
+
import_node_fs15.default.writeFileSync(tokenFile, `${token}
|
|
84434
85418
|
`, { mode: 384 });
|
|
84435
85419
|
const contentToken = randomToken();
|
|
84436
85420
|
const runtimeWarnings = /* @__PURE__ */ new Map();
|
|
@@ -84461,6 +85445,27 @@ async function startArtifactsServer(options) {
|
|
|
84461
85445
|
},
|
|
84462
85446
|
log: (line) => console.log(JSON.stringify({ type: "document-log", line }))
|
|
84463
85447
|
});
|
|
85448
|
+
const inspect = async (ref) => {
|
|
85449
|
+
const dir = resolveArtifactDir(root, ref.type, ref.id);
|
|
85450
|
+
if (!dir) return null;
|
|
85451
|
+
const session = ref.type === "document" ? await documents.open(ref.id) : null;
|
|
85452
|
+
await session?.flush();
|
|
85453
|
+
const payload = readArtifact(dir, ref, runtimeOf(ref, dir));
|
|
85454
|
+
const reasons = [...payload.warnings];
|
|
85455
|
+
if ("pending" in payload) reasons.push(...payload.pending.map((board) => `board ${board} is still being written`));
|
|
85456
|
+
if (session?.streaming()) reasons.push("the document is still being written");
|
|
85457
|
+
const title = titleOf(payload, ref);
|
|
85458
|
+
let published = null;
|
|
85459
|
+
if (reasons.length === 0) {
|
|
85460
|
+
try {
|
|
85461
|
+
published = publishPayload(ref, dir, title, payload);
|
|
85462
|
+
} catch (err) {
|
|
85463
|
+
reasons.push(err.message);
|
|
85464
|
+
}
|
|
85465
|
+
}
|
|
85466
|
+
return { dir, title, reasons, payload: published };
|
|
85467
|
+
};
|
|
85468
|
+
const cloud = options.cloud && options.configFile ? createCloudRoutes({ ...options.cloud, configFile: options.configFile, port: () => port, inspect }) : null;
|
|
84464
85469
|
const sameOrigin = (req) => {
|
|
84465
85470
|
const origin2 = req.headers.origin;
|
|
84466
85471
|
const host = req.headers.host ?? "";
|
|
@@ -84568,17 +85573,17 @@ async function startArtifactsServer(options) {
|
|
|
84568
85573
|
send(res, 404, "Not found");
|
|
84569
85574
|
return;
|
|
84570
85575
|
}
|
|
84571
|
-
const page = ref.type === "html" ? relative === "index.html" :
|
|
84572
|
-
const headers = { "Content-Security-Policy": CONTENT_CSP[page ? "html" : ref.type], "Access-Control-Allow-Origin": "*" };
|
|
85576
|
+
const page = ref.type === "html" ? relative === "index.html" : relative.endsWith(".html");
|
|
85577
|
+
const headers = { "Content-Security-Policy": CONTENT_CSP[page && ref.type === "document" ? "html" : ref.type], "Access-Control-Allow-Origin": "*" };
|
|
84573
85578
|
if (!page) {
|
|
84574
85579
|
sendFile(res, target, headers);
|
|
84575
85580
|
return;
|
|
84576
85581
|
}
|
|
84577
|
-
|
|
85582
|
+
import_node_fs15.default.readFile(target, "utf8", (err, source) => {
|
|
84578
85583
|
if (err) send(res, 404, "Not found");
|
|
84579
85584
|
else {
|
|
84580
85585
|
const uiRuntimeUrl = runtimeDir ? `${contentPrefix}runtime/ryugi-ui.js` : void 0;
|
|
84581
|
-
send(res, 200, injectRuntime(source, { uiRuntimeUrl, embedded: ref.type === "document" }), { "Content-Type": "text/html; charset=utf-8", ...headers });
|
|
85586
|
+
send(res, 200, injectRuntime(source, { uiRuntimeUrl, embedded: ref.type === "document", inspector: ref.type === "artboard" }), { "Content-Type": "text/html; charset=utf-8", ...headers });
|
|
84582
85587
|
}
|
|
84583
85588
|
});
|
|
84584
85589
|
};
|
|
@@ -84596,9 +85601,10 @@ async function startArtifactsServer(options) {
|
|
|
84596
85601
|
const summaries = artifacts.map((entry) => ({
|
|
84597
85602
|
type: entry.type,
|
|
84598
85603
|
id: entry.id,
|
|
84599
|
-
title: titleOf(readArtifact(entry.dir, entry), entry)
|
|
85604
|
+
title: titleOf(readArtifact(entry.dir, entry), entry),
|
|
85605
|
+
updatedAt: latestMtime(entry.dir)
|
|
84600
85606
|
}));
|
|
84601
|
-
sendJson(res, 200, { artifacts: summaries, warnings });
|
|
85607
|
+
sendJson(res, 200, { project: import_node_path15.default.basename(import_node_path15.default.dirname(import_node_path15.default.dirname(root))), artifacts: summaries, warnings });
|
|
84602
85608
|
};
|
|
84603
85609
|
function onClientText(text) {
|
|
84604
85610
|
let message;
|
|
@@ -84644,6 +85650,7 @@ async function startArtifactsServer(options) {
|
|
|
84644
85650
|
}
|
|
84645
85651
|
const handleRequest = (req, res) => {
|
|
84646
85652
|
touch();
|
|
85653
|
+
res.setHeader("X-Robots-Tag", "noindex, nofollow");
|
|
84647
85654
|
const url2 = new URL(req.url ?? "/", "http://artifacts.local");
|
|
84648
85655
|
let pathname;
|
|
84649
85656
|
try {
|
|
@@ -84652,11 +85659,21 @@ async function startArtifactsServer(options) {
|
|
|
84652
85659
|
send(res, 400, "Bad request");
|
|
84653
85660
|
return;
|
|
84654
85661
|
}
|
|
85662
|
+
if (pathname === "/robots.txt") {
|
|
85663
|
+
sendFile(res, import_node_path15.default.join(viewerDir, "robots.txt"));
|
|
85664
|
+
return;
|
|
85665
|
+
}
|
|
84655
85666
|
if (pathname.startsWith("/c/")) {
|
|
84656
85667
|
if (!pathname.startsWith(contentPrefix)) send(res, 404, "Not found");
|
|
84657
85668
|
else serveContent(res, pathname.slice(contentPrefix.length));
|
|
84658
85669
|
return;
|
|
84659
85670
|
}
|
|
85671
|
+
if (cloud && pathname === "/api/cloud/callback") {
|
|
85672
|
+
void cloud.handleCallback(url2, res).catch((err) => {
|
|
85673
|
+
if (!res.headersSent) send(res, 500, `Artifacts error: ${err.message}`);
|
|
85674
|
+
});
|
|
85675
|
+
return;
|
|
85676
|
+
}
|
|
84660
85677
|
const key2 = url2.searchParams.get("key");
|
|
84661
85678
|
if (!isAuthorized(req, key2)) {
|
|
84662
85679
|
send(res, 403, "Forbidden: open the full artifact link including ?key=");
|
|
@@ -84666,6 +85683,33 @@ async function startArtifactsServer(options) {
|
|
|
84666
85683
|
serveList(res);
|
|
84667
85684
|
return;
|
|
84668
85685
|
}
|
|
85686
|
+
const previewMatch = API_PREVIEW_ROUTE.exec(pathname);
|
|
85687
|
+
if (previewMatch) {
|
|
85688
|
+
const [, type = "", id2 = ""] = previewMatch;
|
|
85689
|
+
const dir = resolveArtifactDir(root, type, id2);
|
|
85690
|
+
const ref = artifactKeyOf(`${type}/${id2}`);
|
|
85691
|
+
if (!dir || !ref) {
|
|
85692
|
+
sendJson(res, 404, { error: "Artifact not found" });
|
|
85693
|
+
return;
|
|
85694
|
+
}
|
|
85695
|
+
try {
|
|
85696
|
+
const payload = readArtifact(dir, ref);
|
|
85697
|
+
const title = titleOf(payload, ref);
|
|
85698
|
+
sendJson(res, 200, { ...publishPayload(ref, dir, title, payload), title, warnings: payload.warnings, contentBase: `${contentPrefix}${type}/${id2}/` });
|
|
85699
|
+
} catch {
|
|
85700
|
+
sendJson(res, 422, { error: "Preview unavailable" });
|
|
85701
|
+
}
|
|
85702
|
+
return;
|
|
85703
|
+
}
|
|
85704
|
+
const cloudMatch = cloud?.match(pathname);
|
|
85705
|
+
if (cloud && cloudMatch) {
|
|
85706
|
+
if (req.method !== "GET" && !(key2 !== null && safeEqual(key2, token)) && !sameOrigin(req)) {
|
|
85707
|
+
send(res, 403, "Forbidden");
|
|
85708
|
+
return;
|
|
85709
|
+
}
|
|
85710
|
+
void cloud.handle(req, res, cloudMatch);
|
|
85711
|
+
return;
|
|
85712
|
+
}
|
|
84669
85713
|
const documentMatch = API_DOCUMENT_ROUTE.exec(pathname);
|
|
84670
85714
|
if (documentMatch) {
|
|
84671
85715
|
void serveDocumentApi(req, res, documentMatch[1], documentMatch[2]).catch((err) => {
|
|
@@ -84678,10 +85722,19 @@ async function startArtifactsServer(options) {
|
|
|
84678
85722
|
serveArtifactApi(res, apiMatch[1], apiMatch[2]);
|
|
84679
85723
|
return;
|
|
84680
85724
|
}
|
|
84681
|
-
if (SHELL_ROUTE.test(pathname) || pathname === "/index.html") {
|
|
84682
|
-
const
|
|
85725
|
+
if (SHELL_ROUTE.test(pathname) || PREVIEW_ROUTE.test(pathname) || pathname === "/index.html") {
|
|
85726
|
+
const ref = artifactKeyOf(pathname.replace(/^\/(?:preview\/)?/, "").replace(/\/$/, ""));
|
|
85727
|
+
const dir = ref && resolveArtifactDir(root, ref.type, ref.id);
|
|
85728
|
+
const project = import_node_path15.default.basename(import_node_path15.default.dirname(import_node_path15.default.dirname(root)));
|
|
85729
|
+
const title = ref ? dir ? titleOf(readArtifact(dir, ref), ref) : ref.id : `${project} \xB7 Artifacts`;
|
|
85730
|
+
const description = ref ? `\u5728 ${project} \u9879\u76EE\u4E2D\u67E5\u770B ${title}\uFF0C\u8FD9\u662F\u4E00\u4E2A ${ref.type === "artboard" ? "Artboard" : ref.type === "document" ? "Document" : "HTML"} Artifact\u3002` : `\u6D4F\u89C8 ${project} \u9879\u76EE\u7684\u5168\u90E8 Artboard\u3001Document \u548C HTML Artifact\uFF0C\u9884\u89C8\u771F\u5B9E\u5185\u5BB9\uFF0C\u6309\u7C7B\u578B\u3001\u540D\u79F0\u548C\u66F4\u65B0\u65F6\u95F4\u67E5\u627E\u4F5C\u54C1\u3002`;
|
|
85731
|
+
const canonical = `http://${urlHostForHttp(options.urlHost)}:${port}/${ref ? `${ref.type}/${ref.id}` : ""}`;
|
|
85732
|
+
const headers = {
|
|
85733
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
85734
|
+
"Content-Security-Policy": PREVIEW_ROUTE.test(pathname) ? VIEWER_CSP.replace("frame-ancestors 'none'", "frame-ancestors 'self'") : VIEWER_CSP
|
|
85735
|
+
};
|
|
84683
85736
|
if (key2 !== null) headers["Set-Cookie"] = `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`;
|
|
84684
|
-
|
|
85737
|
+
void import_node_fs15.default.promises.readFile(import_node_path15.default.join(viewerDir, "index.html"), "utf8").then((template) => send(res, 200, viewerPage(template, { title, description, url: canonical }), headers)).catch((err) => send(res, err.code === "ENOENT" ? 404 : 500, "Viewer unavailable"));
|
|
84685
85738
|
return;
|
|
84686
85739
|
}
|
|
84687
85740
|
const target = resolveInside(viewerDir, pathname.slice(1));
|
|
@@ -84720,7 +85773,7 @@ async function startArtifactsServer(options) {
|
|
|
84720
85773
|
port = await listen(server, options.host, 0);
|
|
84721
85774
|
}
|
|
84722
85775
|
cookieName = `ryugi_artifacts_${port}`;
|
|
84723
|
-
|
|
85776
|
+
import_node_fs15.default.writeFileSync(portFile, `${port}
|
|
84724
85777
|
`, { mode: 384 });
|
|
84725
85778
|
const origin = `http://${urlHostForHttp(options.urlHost)}:${port}`;
|
|
84726
85779
|
const url = `${origin}/?key=${token}`;
|
|
@@ -84746,7 +85799,7 @@ async function startArtifactsServer(options) {
|
|
|
84746
85799
|
initialChanges.push({ ref: entry, payload, files: [] });
|
|
84747
85800
|
if (entry.type === "document") void documents.open(entry.id);
|
|
84748
85801
|
}
|
|
84749
|
-
writeJsonAtomic(
|
|
85802
|
+
writeJsonAtomic(import_node_path15.default.join(stateDir, "server-info"), { type: "server-started", url, port, root });
|
|
84750
85803
|
const watcher = watchTree(
|
|
84751
85804
|
root,
|
|
84752
85805
|
(files) => {
|
|
@@ -84764,6 +85817,8 @@ async function startArtifactsServer(options) {
|
|
|
84764
85817
|
const dir = resolveArtifactDir(root, ref.type, ref.id);
|
|
84765
85818
|
if (!dir) {
|
|
84766
85819
|
signatures.delete(key2);
|
|
85820
|
+
const frame2 = textFrame(JSON.stringify({ type: "change", artifact: key2, files: changed }));
|
|
85821
|
+
for (const socket of clients) socket.write(frame2);
|
|
84767
85822
|
continue;
|
|
84768
85823
|
}
|
|
84769
85824
|
if (ref.type === "document" && (changed.includes("doc.xml") || changed.length === 0)) documents.fileChanged(ref.id);
|
|
@@ -84801,10 +85856,11 @@ async function startArtifactsServer(options) {
|
|
|
84801
85856
|
}
|
|
84802
85857
|
|
|
84803
85858
|
// src/server/lifecycle.ts
|
|
84804
|
-
var
|
|
85859
|
+
var import_node_fs16 = __toESM(require("node:fs"), 1);
|
|
84805
85860
|
var DEFAULT_IDLE_TIMEOUT_MS = 4 * 60 * 60 * 1e3;
|
|
84806
85861
|
var DEFAULT_LIFECYCLE_CHECK_MS = 60 * 1e3;
|
|
84807
85862
|
var SERVER_ID_ARG = "--artifacts-server-id=";
|
|
85863
|
+
var DEFAULT_CLOUD_ORIGIN = "https://ryugi.innei.dev";
|
|
84808
85864
|
var positive = (value, fallback) => {
|
|
84809
85865
|
const n7 = Number(value);
|
|
84810
85866
|
return Number.isFinite(n7) && n7 > 0 ? n7 : fallback;
|
|
@@ -84825,13 +85881,14 @@ function parseEnv(env, argv = []) {
|
|
|
84825
85881
|
open: env.ARTIFACTS_OPEN !== "0",
|
|
84826
85882
|
openCmd: env.ARTIFACTS_OPEN_CMD || null,
|
|
84827
85883
|
openArtifact: env.ARTIFACTS_OPEN_ARTIFACT || null,
|
|
84828
|
-
serverId: serverIdArg ? serverIdArg.slice(SERVER_ID_ARG.length) : null
|
|
85884
|
+
serverId: serverIdArg ? serverIdArg.slice(SERVER_ID_ARG.length) : null,
|
|
85885
|
+
cloudOrigin: (env.RYUGI_CLOUD_ORIGIN || DEFAULT_CLOUD_ORIGIN).replace(/\/+$/, "")
|
|
84829
85886
|
};
|
|
84830
85887
|
}
|
|
84831
85888
|
function readOwners(file) {
|
|
84832
85889
|
let text;
|
|
84833
85890
|
try {
|
|
84834
|
-
text =
|
|
85891
|
+
text = import_node_fs16.default.readFileSync(file, "utf8");
|
|
84835
85892
|
} catch {
|
|
84836
85893
|
return [];
|
|
84837
85894
|
}
|
|
@@ -84895,14 +85952,16 @@ function openReady(payload) {
|
|
|
84895
85952
|
// src/server/main.ts
|
|
84896
85953
|
async function main() {
|
|
84897
85954
|
const config = parseEnv(process.env, process.argv.slice(2));
|
|
84898
|
-
const root =
|
|
84899
|
-
const stateDir =
|
|
85955
|
+
const root = import_node_path16.default.resolve(config.root);
|
|
85956
|
+
const stateDir = import_node_path16.default.join(root, ".state");
|
|
84900
85957
|
const server = await startArtifactsServer({
|
|
84901
85958
|
root,
|
|
84902
|
-
viewerDir:
|
|
84903
|
-
runtimeDir:
|
|
85959
|
+
viewerDir: import_node_path16.default.join(__dirname, "viewer"),
|
|
85960
|
+
runtimeDir: import_node_path16.default.join(__dirname, "runtime"),
|
|
84904
85961
|
host: config.host,
|
|
84905
|
-
urlHost: config.urlHost
|
|
85962
|
+
urlHost: config.urlHost,
|
|
85963
|
+
configFile: import_node_path16.default.join(import_node_path16.default.dirname(root), "config.json"),
|
|
85964
|
+
cloud: { origin: config.cloudOrigin, credentialsFile: credentialsFile(process.env, process.platform, import_node_os.default.homedir()) }
|
|
84906
85965
|
});
|
|
84907
85966
|
let lastActivity = Date.now();
|
|
84908
85967
|
server.onActivity(() => {
|
|
@@ -84925,14 +85984,17 @@ async function main() {
|
|
|
84925
85984
|
if (launcher) (0, import_node_child_process.execFile)(launcher.bin, launcher.args, () => {
|
|
84926
85985
|
});
|
|
84927
85986
|
});
|
|
85987
|
+
let stopping = false;
|
|
84928
85988
|
const shutdown = async (reason) => {
|
|
85989
|
+
if (stopping) return;
|
|
85990
|
+
stopping = true;
|
|
84929
85991
|
console.log(JSON.stringify({ type: "server-stopped", reason }));
|
|
84930
|
-
|
|
84931
|
-
writeJsonAtomic(
|
|
85992
|
+
import_node_fs17.default.rmSync(import_node_path16.default.join(stateDir, "server-info"), { force: true });
|
|
85993
|
+
writeJsonAtomic(import_node_path16.default.join(stateDir, "server-stopped"), { reason, timestamp: Date.now() });
|
|
84932
85994
|
await server.close();
|
|
84933
85995
|
process.exit(0);
|
|
84934
85996
|
};
|
|
84935
|
-
const ownersFile =
|
|
85997
|
+
const ownersFile = import_node_path16.default.join(stateDir, "owners");
|
|
84936
85998
|
const timer = setInterval(() => {
|
|
84937
85999
|
const owners = readOwners(ownersFile);
|
|
84938
86000
|
const reason = shutdownReason({
|
|
@@ -84946,7 +86008,7 @@ async function main() {
|
|
|
84946
86008
|
timer.unref();
|
|
84947
86009
|
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
84948
86010
|
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
84949
|
-
|
|
86011
|
+
import_node_fs17.default.rmSync(import_node_path16.default.join(stateDir, "server-stopped"), { force: true });
|
|
84950
86012
|
console.log(JSON.stringify({ type: "server-started", url: server.url, port: server.port, root }));
|
|
84951
86013
|
}
|
|
84952
86014
|
main().catch((err) => {
|