@oj-module/cli 0.2.64 → 0.2.67
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/.oj-version +1 -0
- package/bin/oj +4 -0
- package/devkit/README.md +18 -4
- package/devkit/SKILL.md +35 -3
- package/devkit/framework-dev.md +22 -11
- package/devkit/manual.md +161 -68
- package/devkit/menu-rules.md +4 -1
- package/devkit/publish-walkthrough.md +110 -37
- package/devkit/wecom-internal-app.md +7 -2
- package/devkit/wecom-multi-corp-links.md +163 -0
- package/package.json +3 -2
- package/shell-dist/assets/ahooks.2l850ymmh0.js +18 -0
- package/shell-dist/assets/antd-es-locale-zh_CN.1gjjsvxbf0.js +1 -0
- package/shell-dist/assets/antd-img-crop.196rkty480.js +99 -0
- package/shell-dist/assets/antd-locale-en_US.561tozx860.js +1 -0
- package/shell-dist/assets/antd-locale-zh_CN.1cmpmgzh70.js +1 -0
- package/shell-dist/assets/antd.uw1coq15l0.js +348 -0
- package/shell-dist/assets/clsx.jotilrt2e0.js +1 -0
- package/shell-dist/assets/contract-errors.2o17vz9u50.js +1 -0
- package/shell-dist/assets/contract.3h327o3mj0.js +57 -0
- package/shell-dist/assets/cssinjs.atgmhan7m0.js +3 -0
- package/shell-dist/assets/dayjs-plugin-advancedFormat.3vsyd2eis0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-customParseFormat.13xhghv1d0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-isoWeek.1fn1tw82p0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-localeData.2rwbjp9nk0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-quarterOfYear.2oqo1lcx80.js +1 -0
- package/shell-dist/assets/dayjs-plugin-relativeTime.2pqs3et4y0.js +1 -0
- package/shell-dist/assets/dayjs-plugin-weekOfYear.gvn9iph080.js +1 -0
- package/shell-dist/assets/dayjs-plugin-weekYear.2u78l3ex10.js +1 -0
- package/shell-dist/assets/dayjs-plugin-weekday.2d56a4tml0.js +1 -0
- package/shell-dist/assets/dayjs.pa60l6wjo0.js +1 -0
- package/shell-dist/assets/dnd-kit-core.1xyreig6r0.js +5 -0
- package/shell-dist/assets/dnd-kit-sortable.s94qciuft0.js +1 -0
- package/shell-dist/assets/dnd-kit-utilities.1umw4xphb0.js +1 -0
- package/shell-dist/assets/i18next.33zqofapj0.js +1 -0
- package/shell-dist/assets/icons-es-components-Context.365qmflwg0.js +1 -0
- package/shell-dist/assets/icons.159wjwals0.js +57 -0
- package/shell-dist/assets/{index-xZhmujjM.js → index.6alqyx6ae0.js} +21 -1
- package/shell-dist/assets/jsx-dev-runtime.3uibuc82f0.js +14 -0
- package/shell-dist/assets/jsx-runtime.h40xu4o5b0.js +14 -0
- package/shell-dist/assets/keepalive-for-react.xenu5vam70.js +1 -0
- package/shell-dist/assets/kit.37kr8ui390.js +1 -0
- package/shell-dist/assets/ky.1cgch7gu60.js +6 -0
- package/shell-dist/assets/motion-react.pjsxytvjs0.js +12 -0
- package/shell-dist/assets/motion.21tciqutg0.js +4 -0
- package/shell-dist/assets/nprogress.2nz76n9ny0.js +7 -0
- package/shell-dist/assets/ojm-dayjs-locale-zh-cn.3vr3beiyp0.js +9 -0
- package/shell-dist/assets/pinyin-pro.3v0mnxczn0.js +1 -0
- package/shell-dist/assets/pro-components.2kyot1vcl0.js +83 -0
- package/shell-dist/assets/react-countup.2x8idnr8y0.js +10 -0
- package/shell-dist/assets/react-dom-client.ick0v05ob0.js +43 -0
- package/shell-dist/assets/react-dom.2so9uxg3f0.js +22 -0
- package/shell-dist/assets/react-error-boundary.2dncdfj3b0.js +1 -0
- package/shell-dist/assets/react-i18next.auhvjhqv00.js +1 -0
- package/shell-dist/assets/react-jss.1ei6dr9e00.js +29 -0
- package/shell-dist/assets/react-query.3rln45ow00.js +1 -0
- package/shell-dist/assets/react-router-dom.3c6zld8h40.js +44 -0
- package/shell-dist/assets/react-router.2h9rebcv50.js +56 -0
- package/shell-dist/assets/react.1ew63mwts0.js +14 -0
- package/shell-dist/assets/runtime.2dgstpjsu0.js +21702 -0
- package/shell-dist/assets/simplebar-react.2g739uvai0.js +1 -0
- package/shell-dist/assets/spin-delay.yjeyj6iwp0.js +9 -0
- package/shell-dist/assets/tailwind-merge.125ehiqjw0.js +1 -0
- package/shell-dist/assets/use-sync-external-store-shim.1nz1pi9bb0.js +22 -0
- package/shell-dist/assets/zustand-middleware.1xaxjueme0.js +6 -0
- package/shell-dist/assets/zustand-react-shallow.pybayv1hx0.js +1 -0
- package/shell-dist/assets/zustand-react.9fsl9brxy0.js +1 -0
- package/shell-dist/assets/zustand-shallow.6cz0yyv9x0.js +1 -0
- package/shell-dist/assets/zustand-vanilla-shallow.3424monv50.js +1 -0
- package/shell-dist/assets/zustand-vanilla.1mo3ka3g30.js +1 -0
- package/shell-dist/assets/zustand.3gjgzlnqo0.js +1 -0
- package/shell-dist/index.html +67 -118
- package/shell-dist/versions.json +3 -3
- package/src/__tests__/publish-keygen.test.ts +157 -0
- package/src/__tests__/templates-migration-schema-parity.test.ts +540 -0
- package/src/__tests__/templates-schema-columns.test.ts +15 -2
- package/src/__tests__/templates-tenant-scope.test.ts +6 -2
- package/src/bundle.ts +8 -3
- package/src/cli.ts +17 -5
- package/src/dev.ts +15 -10
- package/src/esm-exports.ts +152 -70
- package/src/install.ts +11 -4
- package/src/keygen.ts +54 -0
- package/src/lifecycle/__tests__/bundle.test.ts +21 -3
- package/src/lifecycle/__tests__/fixtures/fixture-valid/api/src/demo-solution/manifest.yaml +1 -1
- package/src/lifecycle/__tests__/fixtures/fixture-valid/api/src/demo-solution/migrations/0001__init.sql +2 -2
- package/src/lifecycle/__tests__/fixtures/fixture-valid/api/src/demo-solution/schema.yaml +5 -2
- package/src/lifecycle/__tests__/fixtures/fixture-valid/manifest.yaml +1 -1
- package/src/lifecycle/__tests__/manifest-contract.test.ts +75 -3
- package/src/lifecycle/__tests__/smoke.test.ts +2 -2
- package/src/manifest-contract.ts +91 -8
- package/src/market/bootstrap.ts +26 -2
- package/src/market/command.ts +1 -0
- package/src/market/publish.ts +5 -1
- package/src/market/walkthrough.ts +24 -8
- package/src/shared-deps.ts +69 -19
- package/src/site-base.ts +4 -0
- package/src/site.ts +2 -0
- package/src/usage.ts +8 -4
- package/src/vendor.ts +5 -1
- package/templates/config.yaml +4 -2
- package/templates/init.include.yaml +8 -3
- package/templates/openapi.json +460 -1
- package/templates/src/app/api/_platform/_lifecycle/compensate.ts +136 -0
- package/templates/src/app/api/_platform/_lifecycle/installer.ts +71 -22
- package/templates/src/app/api/_platform/_lifecycle/lock.ts +23 -0
- package/templates/src/app/api/_platform/_lifecycle/steps/deploy-web.ts +28 -0
- package/templates/src/app/api/_platform/_lifecycle/steps/preflight.ts +46 -0
- package/templates/src/app/api/_platform/_lifecycle/steps/reload.ts +100 -36
- package/templates/src/app/api/_platform/_lifecycle/steps/smoke.ts +7 -15
- package/templates/src/app/api/_platform/_lifecycle/text-edit.ts +71 -19
- package/templates/src/app/api/_platform/_lifecycle/types.ts +26 -2
- package/templates/src/app/api/_platform/_lifecycle/uninstall.ts +93 -14
- package/templates/src/app/api/_platform/_shared/service/domain/settings.ts +8 -4
- package/templates/src/app/api/_platform/manifest.yaml +1 -0
- package/templates/src/app/api/_platform/market/api.ts +235 -10
- package/templates/src/app/api/_platform/migrations/0001__baseline.mysql.sql +178 -0
- package/templates/src/app/api/_platform/migrations/0001__baseline.pg.sql +173 -0
- package/templates/src/app/api/_platform/migrations/0001__baseline.sql +188 -0
- package/templates/src/app/api/_platform/migrations/0002__market_release.mysql.sql +17 -0
- package/templates/src/app/api/_platform/migrations/0002__market_release.pg.sql +16 -0
- package/templates/src/app/api/_platform/migrations/0002__market_release.sql +33 -0
- package/templates/src/app/api/_platform/schema.yaml +18 -0
- package/templates/src/app/api/_platform/seed.mysql.sql +10 -0
- package/templates/src/app/api/_platform/seed.pg.sql +10 -0
- package/templates/src/app/api/auth/_shared/wecom/client.ts +24 -4
- package/templates/src/app/api/home/migrations/0001__create_home_tables.mysql.sql +14 -0
- package/templates/src/app/api/home/migrations/0001__create_home_tables.pg.sql +14 -0
- package/templates/src/app/api/home/migrations/0002__tenant.pg.sql +4 -0
- package/templates/src/app/api/home/seed.mysql.sql +71 -0
- package/templates/src/app/api/home/seed.pg.sql +71 -0
- package/templates/src/app/api/notification/_shared/notify.ts +6 -6
- package/templates/src/app/api/notification/migrations/0001__create_notifications.mysql.sql +11 -0
- package/templates/src/app/api/notification/migrations/0001__create_notifications.pg.sql +11 -0
- package/templates/src/app/api/notification/migrations/0002__notifications_user.mysql.sql +8 -0
- package/templates/src/app/api/notification/migrations/0003__notifications_broadcast.mysql.sql +21 -0
- package/templates/src/app/api/notification/migrations/0003__notifications_broadcast.pg.sql +22 -0
- package/templates/src/app/api/notification/migrations/0004__notifications_broadcast_hidden.mysql.sql +10 -0
- package/templates/src/app/api/notification/migrations/0004__notifications_broadcast_hidden.pg.sql +11 -0
- package/templates/src/app/api/notification/migrations/0005__tenant.pg.sql +6 -0
- package/templates/src/app/api/notification/seed.mysql.sql +8 -0
- package/templates/src/app/api/notification/seed.pg.sql +11 -0
- package/templates/src/app/api/publish/_shared/identity.ts +69 -0
- package/templates/src/app/api/publish/api.ts +349 -0
- package/templates/src/app/api/publish/manifest.yaml +8 -0
- package/templates/src/app/api/publish/migrations/0001__publish_credential.mysql.sql +23 -0
- package/templates/src/app/api/publish/migrations/0001__publish_credential.pg.sql +23 -0
- package/templates/src/app/api/publish/migrations/0001__publish_credential.sql +39 -0
- package/templates/src/app/api/publish/schema.yaml +33 -0
- package/templates/src/app/api/system/login-methods/api.ts +2 -1
- package/templates/src/app/web/_platform/__client/api.schemas.ts +15 -0
- package/templates/src/app/web/_platform/__client/index.ts +25 -1
- package/templates/src/app/web/entry.ts +9 -5
- package/templates/src/app/web/home/pages/components/bar-chart.tsx +5 -3
- package/templates/src/app/web/home/pages/components/echarts-setup.ts +30 -0
- package/templates/src/app/web/home/pages/components/line-chart.tsx +5 -3
- package/templates/src/app/web/home/pages/components/pie-chart.tsx +6 -3
- package/templates/src/app/web/home/pages/index.tsx +3 -2
- package/templates/src/app/web/home/routes.ts +8 -2
- package/templates/src/app/web/login/locales/en-US.json +7 -1
- package/templates/src/app/web/login/locales/zh-CN.json +7 -1
- package/templates/src/app/web/login/pages/login.tsx +79 -86
- package/templates/src/app/web/login/routes.ts +54 -1
- package/templates/src/app/web/personal-center/locales/en-US.json +1 -0
- package/templates/src/app/web/personal-center/locales/zh-CN.json +1 -0
- package/templates/src/app/web/personal-center/pages/my-profile/index.tsx +5 -0
- package/templates/src/app/web/system/__client/api.schemas.ts +2 -1
- package/templates/src/app/web/system/locales/en-US.json +1 -8
- package/templates/src/app/web/system/locales/zh-CN.json +1 -8
- package/templates/src/app/web/system/pages/settings/index.tsx +17 -4
- package/templates/src/app/web/system/routes.ts +0 -6
- package/templates/src/oj-market/web/__tests__/CardGrid.test.tsx +33 -0
- package/templates/src/oj-market/web/__tests__/DetailDrawer.test.tsx +69 -0
- package/templates/src/oj-market/web/__tests__/marketClient.fake.ts +7 -1
- package/templates/src/oj-market/web/api/client.ts +3 -0
- package/templates/src/oj-market/web/api/defaultClient.ts +5 -0
- package/templates/src/oj-market/web/components/CardItem.tsx +44 -1
- package/templates/src/oj-market/web/components/DetailDrawer.tsx +17 -1
- package/templates/src/oj-market/web/entry.ts +31 -2
- package/templates/src/oj-market/web/locales/en-US.json +5 -1
- package/templates/src/oj-market/web/locales/zh-CN.json +5 -1
- package/templates/src/oj-market/web/publish/__client/api.schemas.ts +61 -0
- package/templates/src/oj-market/web/publish/__client/index.ts +164 -0
- package/templates/src/oj-market/web/publish/locales/en-US.json +80 -0
- package/templates/src/oj-market/web/publish/locales/zh-CN.json +80 -0
- package/templates/src/oj-market/web/publish/pages/history.tsx +112 -0
- package/templates/src/oj-market/web/publish/pages/index.tsx +196 -0
- package/templates/src/oj-market/web/publish/pages/model.ts +52 -0
- package/templates/src/oj-market/web/publish/pages/token-modal.tsx +82 -0
- package/templates/src/oj-market/web/publish/routes.ts +41 -0
- package/templates/src/oj-market/web/types.ts +30 -0
- package/templates/tests/lifecycle/compensate.spec.ts +207 -0
- package/templates/tests/lifecycle/deploy-smoke.spec.ts +38 -14
- package/templates/tests/lifecycle/installer.spec.ts +28 -9
- package/templates/tests/lifecycle/market-api.spec.ts +164 -12
- package/templates/tests/lifecycle/preflight.spec.ts +68 -0
- package/templates/tests/lifecycle/role-title-translate.spec.ts +2 -32
- package/templates/tests/lifecycle/text-edit.spec.ts +45 -27
- package/templates/tests/lifecycle/uninstall.spec.ts +36 -0
- package/templates/tests/publish-credential.spec.ts +354 -0
- package/templates/tests/publish-identity.spec.ts +44 -0
- package/templates/tests/wecom-client-timeout.spec.ts +33 -3
- package/templates/tests/wecom-landing.spec.ts +63 -1
- package/templates/tsconfig.paths.json +1 -0
- package/templates/web.config.ts +6 -4
- package/vendor/host-versions.json +3 -3
- package/shell-dist/assets/ahooks.js +0 -6909
- package/shell-dist/assets/antd-es-locale-zh_CN.js +0 -257
- package/shell-dist/assets/antd-img-crop.js +0 -1495
- package/shell-dist/assets/antd-locale-en_US.js +0 -374
- package/shell-dist/assets/antd-locale-zh_CN.js +0 -379
- package/shell-dist/assets/antd.js +0 -106874
- package/shell-dist/assets/clsx.js +0 -33
- package/shell-dist/assets/contract-errors.js +0 -30
- package/shell-dist/assets/contract.js +0 -18900
- package/shell-dist/assets/cssinjs.js +0 -2595
- package/shell-dist/assets/dayjs-plugin-advancedFormat.js +0 -98
- package/shell-dist/assets/dayjs-plugin-customParseFormat.js +0 -173
- package/shell-dist/assets/dayjs-plugin-isoWeek.js +0 -77
- package/shell-dist/assets/dayjs-plugin-localeData.js +0 -126
- package/shell-dist/assets/dayjs-plugin-quarterOfYear.js +0 -77
- package/shell-dist/assets/dayjs-plugin-relativeTime.js +0 -92
- package/shell-dist/assets/dayjs-plugin-weekOfYear.js +0 -73
- package/shell-dist/assets/dayjs-plugin-weekYear.js +0 -63
- package/shell-dist/assets/dayjs-plugin-weekday.js +0 -63
- package/shell-dist/assets/dayjs.js +0 -326
- package/shell-dist/assets/dnd-kit-core.js +0 -3601
- package/shell-dist/assets/dnd-kit-sortable.js +0 -717
- package/shell-dist/assets/dnd-kit-utilities.js +0 -340
- package/shell-dist/assets/i18next.js +0 -2321
- package/shell-dist/assets/icons-es-components-Context.js +0 -20
- package/shell-dist/assets/icons.js +0 -34961
- package/shell-dist/assets/jsx-dev-runtime.js +0 -75
- package/shell-dist/assets/jsx-runtime.js +0 -97
- package/shell-dist/assets/keepalive-for-react.js +0 -283
- package/shell-dist/assets/kit.js +0 -151
- package/shell-dist/assets/ky.js +0 -1427
- package/shell-dist/assets/motion-react.js +0 -13589
- package/shell-dist/assets/motion.js +0 -9959
- package/shell-dist/assets/nprogress.js +0 -314
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-BarsOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CalendarOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretDownFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretDownOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CaretUpOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CheckCircleFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CheckOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ClockCircleOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CloseCircleFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CloseOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-CopyOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DeleteOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DoubleLeftOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DoubleRightOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DownOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-DownloadOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EditOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EllipsisOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EnterOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ExclamationCircleFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EyeInvisibleOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-EyeOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FileOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FileTextOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FilterFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FolderOpenOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-FolderOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-HolderOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-InfoCircleFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-LeftOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-LoadingOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-MinusOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-MinusSquareOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-PaperClipOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-PictureOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-PlusOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-PlusSquareOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-QuestionCircleOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ReloadOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-RightOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-RotateLeftOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-RotateRightOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-SearchOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-StarFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-SwapOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-SwapRightOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-UpOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-VerticalAlignTopOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-WarningFilled.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ZoomInOutlined.js +0 -7
- package/shell-dist/assets/ojm--ant-design-icons-es-icons-ZoomOutOutlined.js +0 -7
- package/shell-dist/assets/ojm-dayjs-locale-zh-cn.js +0 -81
- package/shell-dist/assets/pinyin-pro.js +0 -25175
- package/shell-dist/assets/pro-components.js +0 -44627
- package/shell-dist/assets/react-countup.js +0 -525
- package/shell-dist/assets/react-dom-client.js +0 -12134
- package/shell-dist/assets/react-dom.js +0 -266
- package/shell-dist/assets/react-error-boundary.js +0 -141
- package/shell-dist/assets/react-i18next.js +0 -1773
- package/shell-dist/assets/react-jss.js +0 -4089
- package/shell-dist/assets/react-query.js +0 -3072
- package/shell-dist/assets/react-router-dom.js +0 -9927
- package/shell-dist/assets/react-router.js +0 -14584
- package/shell-dist/assets/react.js +0 -590
- package/shell-dist/assets/runtime.js +0 -28311
- package/shell-dist/assets/simplebar-react.js +0 -1119
- package/shell-dist/assets/spin-delay.js +0 -111
- package/shell-dist/assets/tailwind-merge.js +0 -3364
- package/shell-dist/assets/use-sync-external-store-shim.js +0 -130
- package/shell-dist/assets/zustand-middleware.js +0 -513
- package/shell-dist/assets/zustand-react-shallow.js +0 -27
- package/shell-dist/assets/zustand-react.js +0 -39
- package/shell-dist/assets/zustand-shallow.js +0 -22
- package/shell-dist/assets/zustand-vanilla-shallow.js +0 -71
- package/shell-dist/assets/zustand-vanilla.js +0 -40
- package/shell-dist/assets/zustand.js +0 -32
- package/templates/seed.mysql.sql +0 -6
- package/templates/seed.pg.sql +0 -6
- package/templates/src/app/api/_platform/migrations/0001__create_users.mysql.sql +0 -9
- package/templates/src/app/api/_platform/migrations/0001__create_users.pg.sql +0 -9
- package/templates/src/app/api/_platform/migrations/0001__create_users.sql +0 -7
- package/templates/src/app/api/_platform/migrations/0002__add_users_avatar_base64.mysql.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0002__add_users_avatar_base64.sql +0 -2
- package/templates/src/app/api/_platform/migrations/0003__users_source_display_name.mysql.sql +0 -5
- package/templates/src/app/api/_platform/migrations/0003__users_source_display_name.sql +0 -5
- package/templates/src/app/api/_platform/migrations/0004__sys_rbac.mysql.sql +0 -70
- package/templates/src/app/api/_platform/migrations/0004__sys_rbac.pg.sql +0 -67
- package/templates/src/app/api/_platform/migrations/0004__sys_rbac.sql +0 -67
- package/templates/src/app/api/_platform/migrations/0005__users_must_change.mysql.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0005__users_must_change.sql +0 -2
- package/templates/src/app/api/_platform/migrations/0006__users_is_forbidden.mysql.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0006__users_is_forbidden.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0007__users_email.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0008__sys_refresh_token.mysql.sql +0 -10
- package/templates/src/app/api/_platform/migrations/0008__sys_refresh_token.pg.sql +0 -10
- package/templates/src/app/api/_platform/migrations/0008__sys_refresh_token.sql +0 -11
- package/templates/src/app/api/_platform/migrations/0009__sys_throttle.mysql.sql +0 -12
- package/templates/src/app/api/_platform/migrations/0009__sys_throttle.pg.sql +0 -12
- package/templates/src/app/api/_platform/migrations/0009__sys_throttle.sql +0 -13
- package/templates/src/app/api/_platform/migrations/0010__sys_solution_route.mysql.sql +0 -17
- package/templates/src/app/api/_platform/migrations/0010__sys_solution_route.pg.sql +0 -16
- package/templates/src/app/api/_platform/migrations/0010__sys_solution_route.sql +0 -18
- package/templates/src/app/api/_platform/migrations/0011__sys_setting_group_label.mysql.sql +0 -2
- package/templates/src/app/api/_platform/migrations/0011__sys_setting_group_label.sql +0 -4
- package/templates/src/app/api/_platform/migrations/0012__market_history.mysql.sql +0 -13
- package/templates/src/app/api/_platform/migrations/0012__market_history.pg.sql +0 -12
- package/templates/src/app/api/_platform/migrations/0012__market_history.sql +0 -14
- package/templates/src/app/api/_platform/migrations/0013__users_profile.sql +0 -4
- package/templates/src/app/api/_platform/migrations/0014__reg_source_seq.mysql.sql +0 -9
- package/templates/src/app/api/_platform/migrations/0014__reg_source_seq.pg.sql +0 -7
- package/templates/src/app/api/_platform/migrations/0014__reg_source_seq.sql +0 -8
- package/templates/src/app/api/_platform/migrations/0015__tenant.mysql.sql +0 -12
- package/templates/src/app/api/_platform/migrations/0015__tenant.pg.sql +0 -11
- package/templates/src/app/api/_platform/migrations/0015__tenant.sql +0 -44
- package/templates/src/app/api/_platform/migrations/0016__org.mysql.sql +0 -41
- package/templates/src/app/api/_platform/migrations/0016__org.pg.sql +0 -40
- package/templates/src/app/api/_platform/migrations/0016__org.sql +0 -62
- package/templates/src/app/api/_platform/migrations/0017__users_employee_no.mysql.sql +0 -7
- package/templates/src/app/api/_platform/migrations/0017__users_employee_no.pg.sql +0 -4
- package/templates/src/app/api/_platform/migrations/0017__users_employee_no.sql +0 -8
- package/templates/src/app/api/_platform/migrations/0018__sys_role_title_key.mysql.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0018__sys_role_title_key.pg.sql +0 -3
- package/templates/src/app/api/_platform/migrations/0018__sys_role_title_key.sql +0 -8
- package/templates/src/app/web/system/pages/login-methods/index.tsx +0 -30
- /package/shell-dist/assets/{nprogress-css.js → nprogress-css.1cq2pzkre0.js} +0 -0
- /package/shell-dist/assets/{ojm-antd-es-button.js → ojm-antd-es-button.2uriphio50.js} +0 -0
- /package/shell-dist/assets/{ojm-antd-es-modal.js → ojm-antd-es-modal.bf3tgdh8v0.js} +0 -0
- /package/shell-dist/assets/{ojm-antd-es-slider.js → ojm-antd-es-slider.xyvptuhid0.js} +0 -0
- /package/shell-dist/assets/{ojm-antd-es-upload.js → ojm-antd-es-upload.13gx45e0g0.js} +0 -0
package/bin/.oj-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
v0.1.123
|
package/bin/oj
ADDED
package/devkit/README.md
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
# oj-module DevKit——模块开发手册 + agent skill
|
|
2
2
|
|
|
3
|
+
> **你在哪读这份文件?** 两种视图,内容同一份:
|
|
4
|
+
> - **业务工程里**(`.claude/skills/ojm-module-dev/`):文件是随 `@oj-module/cli` 分发的**副本**,
|
|
5
|
+
> 直接读 `SKILL.md` / `manual.md` / 两本企微手册 / `publish-walkthrough.md` 即可闭环;
|
|
6
|
+
> 下文出现的 `docs/devkit/`、`packages/cli/` 是**框架仓库路径**,只用来解释文件怎么来的,
|
|
7
|
+
> 你本地没有也不影响使用。
|
|
8
|
+
> - **框架仓库里**(`docs/devkit/`):这里才是源文件,改文档只改这一处。
|
|
9
|
+
|
|
3
10
|
面向用 `ojm` 开发前后端一体工程的开发者与 AI agent。本目录是**源文件**,
|
|
4
11
|
发布时由 cli 的 `prepack`(`packages/cli/scripts/sync-devkit.mjs`)把其中
|
|
5
|
-
**ojm 侧的
|
|
12
|
+
**ojm 侧的 11 个文件**同步进 `packages/cli/devkit/`,随 `@oj-module/cli`
|
|
6
13
|
发布,再由 `ojm init` 分发到工程内。
|
|
7
14
|
|
|
8
15
|
整棵树覆盖前后端两侧,但仍是**两套独立分发的 skill**(同名不同物,别混):
|
|
9
16
|
|
|
10
17
|
| 侧 | 本仓位置 | 用户工程里的落点 | 分发链 |
|
|
11
18
|
|---|---|---|---|
|
|
12
|
-
| ojm 模块开发(前端模块、契约、前后端对接) | 本目录顶层
|
|
19
|
+
| ojm 模块开发(前端模块、契约、前后端对接) | 本目录顶层 11 个文件 | `.claude/skills/ojm-module-dev/` | `@oj-module/cli` 包(全部 11 个)→ `ojm init` 第 4b 步(只分发其中 6 个,见下) |
|
|
13
20
|
| oj API 开发(后端 handler、全局对象、配置、测试) | `oj-api-dev/` 子目录(快照) | `.claude/skills/oj-api-dev/` | **oj 二进制自带**(`bin/devkit/`)→ `ojm init` 第 4 步 / `ojm vendor` 装·升后同步(0.2.57 起共用 `syncOjDevkit`,全量 `.md` **覆盖**——文档始终与已装 oj 版本一致) |
|
|
14
21
|
|
|
15
22
|
> **`oj-api-dev/` 子目录是快照,不是本仓维护的文档**:它与本机 oj 的
|
|
@@ -25,13 +32,20 @@
|
|
|
25
32
|
|---|---|
|
|
26
33
|
| `SKILL.md` | Claude Code 等 agent 的 skill 入口:工作流、红线、新模块 checklist、陷阱速查,按章节号引用手册 |
|
|
27
34
|
| `manual.md` | 模块开发手册(14 章):工程结构(module-root 单树 + 两处产物根;含 §1.7 handler 四红线——oj 运行时实测钉出,后端必读;§1.8 `#` 别名与 TS 投影)、写模块、契约与代码生成(含 §3.10 旧 contract.ts 工程迁移指南)、provider 接管(覆盖框架内置功能)、布局、i18n、构建发布、排查、CLI 子命令参考(ojm 原生命令 vs oj 透传命令)、方案包打包与分发(含 §11.1.1 引用式方案)、签名与信任、§13.1.1 web.route_prefix 自定义根路径、**§14 组织架构与通讯录**(内置部门/成员底座 + 共享读面 7 端点 + `scope` 两级门禁 + 归属权四条规则 + 源适配器接点,选人与按部门算人都读它) |
|
|
28
|
-
| `publish-walkthrough.md` | 方案包发布全流程(**新手照做版**):构建打包 → keygen 签名 → `market publish` 落 CDN → build-index → verify/trial 验证 → install + TOFU,含多人各自独立发包纪律与失败速查(手册 §11/§12 的过程版) |
|
|
35
|
+
| `publish-walkthrough.md` | 方案包发布全流程(**新手照做版**):构建打包 → **拿发布身份(「发布管理」申请凭证 → `ojm keygen --credential`;无站点才用离线 `--id`)** → 签名 → `market publish` 落 CDN → build-index → verify/trial 验证 → install + TOFU,含多人各自独立发包纪律与失败速查(手册 §11/§12 的过程版) |
|
|
29
36
|
| `framework-dev.md` | 框架贡献者路线(**仅框架仓库**):改 `packages/runtime`、`packages/cli` 时的入口与红线 |
|
|
30
37
|
| `module-dev-and-cdn-playground.md` | 教学文档:开发态 ≠ 分发态、「怎么安装自己的模块 / 会不会重复」、本地 CDN 市场链路五步跑通(setup → publish → build-index → verify → 安装) |
|
|
31
38
|
| `sql-builder-missing-capabilities-pr.md` | 构造器能力缺口 PR 参考(**仅框架仓库**):7 项诉求的闭环记录 |
|
|
32
39
|
| `menu-rules.md` | 方案菜单归组规则专题:单根模块约定、自定义根路径 `web.route_prefix`、`category` 三值语义、admin 重写与视觉归组(手册 §13 的展开版) |
|
|
33
40
|
| `wecom-daikaifa.md` | 企业微信代开发集成:**凭据清单**(8 项 `vars`,按 Tier A/B/C 分层的来源与必填时序 + 可信域名/可信 IP 备案)、首次开通顺序(含 `suite_ticket` 依赖与引导期死锁的破法)、**用户 / 开发 / 部署三角色手册**、错误文案速查、与自建应用共存的语义变化 |
|
|
34
41
|
| `wecom-internal-app.md` | 企业微信**企业内部应用(自建应用)**集成:5 项 `wecom_corp_*` 凭据 + 2 项复用、回调只填「通讯录同步」一处、「验证并接入」四步自检、可见范围与可信 IP/域名、单企业私有化的边界(自建应用收不到成员变更事件)、共存配置、故障速查 |
|
|
42
|
+
| `wecom-multi-corp-links.md` | **平台运维 / 服务商运营**:一套部署服务 N 家企业的**专属登录链接运维清单**(方案一,运维零代码改动)——前置检查、逐企业接入 6 步、链接格式与参数、员工四入口、逐企业验收打勾、故障速查、日常运维;含企微工作台内早跳透传 `corp`/`agent` 的修复说明 |
|
|
43
|
+
|
|
44
|
+
> 上表 10 项 + 本文件 `README.md` = 顶层 11 个文件,全部随 cli 包发货。
|
|
45
|
+
> `ojm init` 第 4b 步**只分发其中 6 个**给业务工程:`SKILL.md` / `manual.md` / `README.md` /
|
|
46
|
+
> `wecom-daikaifa.md` / `wecom-internal-app.md` / `publish-walkthrough.md`。
|
|
47
|
+
> 其余 5 个(`framework-dev.md`、`menu-rules.md`、`module-dev-and-cdn-playground.md`、
|
|
48
|
+
> `sql-builder-missing-capabilities-pr.md`、`wecom-multi-corp-links.md`)是框架贡献者或专题材料,只在 cli 包内可取。
|
|
35
49
|
|
|
36
50
|
后端 handler 本身的写法(`json` 信封、`db` 查询、`manifest.yaml`、`oj test`)、
|
|
37
51
|
站点挂载(`mounts`)、密钥信封(`secrets`)、vars、cors、schema 校验、broker/tasks/oidc/ws 等
|
|
@@ -115,6 +129,6 @@ flowchart LR
|
|
|
115
129
|
框架贡献者要把本仓快照同步到新版:从 `~/.local/share/oj/devkit/` 整目录覆盖
|
|
116
130
|
`docs/devkit/oj-api-dev/`(oj v0.1.116 起 12 个文件,保持逐字节一致以便对账)。
|
|
117
131
|
|
|
118
|
-
> 本目录顶层
|
|
132
|
+
> 本目录顶层 11 个文件是**自包含**的:业务工程拿到即可读懂,不需要工程仓库里的
|
|
119
133
|
> 其它文档。`oj-api-dev/` 子目录是 oj 侧快照,同样自包含(其自身 README 即索引),
|
|
120
134
|
> 但不随 cli 包发货、仅本仓参考。维护者视角的内容来源整理在 `framework-dev.md`(仅本仓)。
|
package/devkit/SKILL.md
CHANGED
|
@@ -19,7 +19,8 @@ description: 用 ojm 开发前后端一体工程时使用——新增/修改前
|
|
|
19
19
|
接管通知/上传/菜单 → §4;换布局或加插槽 → §5;排查 → §8;
|
|
20
20
|
**组织架构 / 通讯录(选人、按部门算收件人、接 LDAP 等新来源)→ §14**;
|
|
21
21
|
**接通企业微信(代开发 / 企业内部应用 / 两套共存)→ `wecom-daikaifa.md` + `wecom-internal-app.md`**;
|
|
22
|
-
**把方案包发出去(打包/签名/CDN/安装一条链,新手照敲)→ `publish-walkthrough.md
|
|
22
|
+
**把方案包发出去(打包/签名/CDN/安装一条链,新手照敲)→ `publish-walkthrough.md`**
|
|
23
|
+
(发布身份走站点凭证见其 §2.1)。
|
|
23
24
|
2. **建目录**:一个目录 = 一个模块——前端一侧 `src/<模块名>/web/`(`entry.ts` 必备,
|
|
24
25
|
`pages/`、`locales/` 按需),后端一侧 `src/<模块名>/api/`(目录镜像路由的 `api.ts`,
|
|
25
26
|
动词挂 `.schema`)。两侧可只存在一侧。
|
|
@@ -70,8 +71,10 @@ description: 用 ojm 开发前后端一体工程时使用——新增/修改前
|
|
|
70
71
|
- **上传文件**:当前 `ojm api` 的 openapi 流水线不生成 form 通道的前端 client(文件部件不进 JSON Schema),
|
|
71
72
|
惯例走 antd `Upload` **直连**后端(不经 JSON client),handler 用 `http.files` / `http.file(i)` 读字节,
|
|
72
73
|
仅平级声明 `.response`。不要手写 `content-type`(运行时按 boundary 自动补)。
|
|
73
|
-
- **前端模块的 import 只有三类**:`@oj-module/runtime
|
|
74
|
-
|
|
74
|
+
- **前端模块的 import 只有三类**:`@oj-module/runtime`、共享依赖(裸说明符)、自身相对路径。
|
|
75
|
+
共享依赖分两档:**宿主 importmap 单例**(`react` / `antd` / `dayjs` …,模块不得打包副本)
|
|
76
|
+
与**模块自打包**(`echarts` 家族 / `vditor` / `@plane/editor`,宿主不提供、模块自带,
|
|
77
|
+
体积记在模块产物上)。两档都写 `devDependencies`;分档口径与体积控制见手册 §2.6。
|
|
75
78
|
**拿用户/角色等信息:读走 `useUserStore` / `useAuthStore` / `useAccess`(`AccessControl` 门禁),
|
|
76
79
|
写走契约 client(`ojm api` 生成模块自有 `__client`,或复用 runtime 导出的 `api/rbac` / `api/user`),
|
|
77
80
|
绝不 import 框架 `#src/*`**——设计动机与红线见手册 §2.8。
|
|
@@ -138,6 +141,30 @@ description: 用 ojm 开发前后端一体工程时使用——新增/修改前
|
|
|
138
141
|
同步/事件增量与回调解密是**两条独立纪律**:回调必须回 `success`,而事件处理失败**也照样回 `success`**
|
|
139
142
|
(重推补不回已判死的失败,兜底是下一轮全量同步)。
|
|
140
143
|
|
|
144
|
+
## 发布身份(keygen 从哪来)
|
|
145
|
+
|
|
146
|
+
签名前的第一件事是拿到一对 Ed25519 密钥。**两条路,二选一**:
|
|
147
|
+
|
|
148
|
+
| 路径 | 命令 | 何时用 |
|
|
149
|
+
|---|---|---|
|
|
150
|
+
| 站点凭证(推荐) | `ojm keygen --credential <token>` | 站点有「方案市场 → 发布管理」页;key_id 由站点按产品名+账号下发(信任仍需首装核对) |
|
|
151
|
+
| 离线自建(旁路) | `ojm keygen --id <publisher>.<key-name>` | 只在站点没有「发布管理」页(纯自建/离线 CDN)或 CI 临时密钥时用 |
|
|
152
|
+
|
|
153
|
+
站点有「方案市场 → 发布管理」页时**不要自建 key_id**:站点侧没有这条身份记录,产品归属与申请人无从追溯,
|
|
154
|
+
能不能装只能靠超管为陌生指纹手工放行。
|
|
155
|
+
|
|
156
|
+
- 凭证是**一次性兑换令牌**:站点「方案市场 → 发布管理 → 申请发布凭证」填产品名 → 明文只显示一次 →
|
|
157
|
+
本机 `ojm keygen --credential <token>`(或 `OJM_PUBLISH_CREDENTIAL=<token> ojm keygen`,
|
|
158
|
+
免得令牌进 shell 历史)。兑换成功即作废,失败(已用/过期/撤销/网络不通)**不落任何密钥文件**。
|
|
159
|
+
- 站点地址优先级:`--site-url` > `OJM_SITE_URL` > `http://127.0.0.1:9778`;兑换端点匿名可达,
|
|
160
|
+
**不需要 `--user/--pass`**。`--credential` 与 `--id` 互斥(同时给 exit 2)。
|
|
161
|
+
- 下发的 key_id 形如 `<产品名>.<编码后用户名>`(例:`demo-solution.wecom-everpan`),CLI 不做推导;
|
|
162
|
+
它同时是 `~/.ojm/keys/<key_id>/` 的目录名——**不要拿它拼路径或改名**,否则签名侧找不到私钥。
|
|
163
|
+
凭证只解决「身份命名与归属」,**不预置信任**:公钥在本地生成,站点兑换时拿不到,首装照样
|
|
164
|
+
`needs_trust`,仍要核对指纹。
|
|
165
|
+
- 两条路的私钥纪律完全一致:只活在 `~/.ojm/keys/<id>/`、不入仓不入包、一次发布固定一把。
|
|
166
|
+
签名/发布/安装全流程见 `publish-walkthrough.md`(§2 凭证、§2.1 离线旁路、§3 签名起)。
|
|
167
|
+
|
|
141
168
|
## 新模块 checklist
|
|
142
169
|
|
|
143
170
|
- [ ] `src/<模块>/web/entry.ts` 默认导出 `defineModule({ name, version, routes, i18n?, lifecycle? })`
|
|
@@ -208,6 +235,7 @@ description: 用 ojm 开发前后端一体工程时使用——新增/修改前
|
|
|
208
235
|
| `oj build` 报 `#/_platform/...` 找不到模块 | 跨模块别名没在 `manifest.yaml` 的 `deps` 里声明 | 加 `_platform: ^0.1.0`(manual §14.2) |
|
|
209
236
|
| 同步一轮之后本地手建的部门消失了 | 适配器漏了 `origin` 条件(同步与回收都必须只动自己的行) | `markSeen` / `reconcileHidden` 带 `origin`;回收只在「本轮完整零跳过」时执行(manual §14.5) |
|
|
210
237
|
| 组织架构里有这个人,通讯录搜不到 | 他是同步建档(`activated=0`,从没登录过本站),通讯录只出活人 | 正确行为;让他登录一次,或走组织架构读面(manual §14.6) |
|
|
238
|
+
| 以为要外挂 nginx 才有 gzip/br 与长缓存 | `oj serve` 自 0.1.116 内建:br>gzip 协商 + 按文件名哈希判 `immutable`;0.1.118 起明文端口还有 h2c | 零配置即可;但**浏览器连不上 h2c**(只支持 prior knowledge、进程内无 TLS),要让浏览器走 h2 才需要前置 nginx/caddy TLS 终结。CDN 必须按 `Vary: Accept-Encoding` 分键(manual §7) |
|
|
211
239
|
|
|
212
240
|
## 手册
|
|
213
241
|
|
|
@@ -226,3 +254,7 @@ description: 用 ojm 开发前后端一体工程时使用——新增/修改前
|
|
|
226
254
|
五项 `wecom_corp_*` 从哪取、回调为什么只填「通讯录同步」一处、「验证并接入」的四步自检、
|
|
227
255
|
可见范围 / 可信 IP / 可信域名的处置、单企业私有化的边界(自建应用收不到成员变更事件)、
|
|
228
256
|
以及和代开发共存时的配置与页面差异。**接自建应用时先读它**。
|
|
257
|
+
|
|
258
|
+
另有 `publish-walkthrough.md`(同目录):从「代码写完」到「装进站点」的一条命令链——
|
|
259
|
+
构建/打包 → 拿发布身份(凭证或离线)→ 签名 → 落 CDN → 重建索引 → verify/trial → install/TOFU,
|
|
260
|
+
每步带期望输出与通过判据。**第一次发包照着它敲**。
|
package/devkit/framework-dev.md
CHANGED
|
@@ -15,13 +15,19 @@
|
|
|
15
15
|
| 框架开发完整指南(契约层/运行时/宿主/工具链四章) | `docs/prd/framework-development-guide.md` |
|
|
16
16
|
| 端到端可重复验证流程 | `docs/prd/framework-verification-playbook.md` |
|
|
17
17
|
| 某特性的设计与评审记录 | `docs/prd/<日期>-<特性>-design.md` |
|
|
18
|
-
| 各阶段实战记录(骨架→注入→认证→CRUD
|
|
18
|
+
| 各阶段实战记录(骨架→注入→认证→CRUD→发布) | `docs/prd/framework-verification-playbook.md` 附录 A 基线表(playground 已下线) |
|
|
19
19
|
| 后端 handler 写法 | `docs/devkit/oj-api-dev/api-manual.md`(`oj-api-dev` skill 的本仓快照;用户工程侧在 `.claude/skills/oj-api-dev/`,随 oj 二进制分发) |
|
|
20
20
|
|
|
21
|
+
> **路径口径**:上表除 `CLAUDE.md` 与 `docs/devkit/oj-api-dev/` 外,都是**框架仓库内**的路径,
|
|
22
|
+
> 不随 `@oj-module/cli` 发货。本文件只对「能进框架仓库的人」有用——如果你是在 cli 包或
|
|
23
|
+
> 业务工程里读到这里,说明没有仓库上下文,那些链接按设计不可达,**不是坏链**:业务开发
|
|
24
|
+
> 请回 `SKILL.md` + `manual.md`。
|
|
25
|
+
|
|
21
26
|
> ⚠️ 那两份 guide 有**已知陈旧处**,以源码为准:
|
|
22
27
|
> dev 端口实际是 **3333**(guide 写的 5173 已过时;注意与 `ojm dev` 的前端 devServer
|
|
23
28
|
> **5174** 不是一回事——前者是本仓 vite,后者是业务工程 devServer);包版本以
|
|
24
|
-
> `packages/*/package.json`
|
|
29
|
+
> `packages/*/package.json` 为准(本文件随 cli 发布,**不写死包版本号**——版本每轮 lockstep
|
|
30
|
+
> 都会变,写死必然漂移)。
|
|
25
31
|
|
|
26
32
|
## §2 两包结构与依赖方向
|
|
27
33
|
|
|
@@ -38,7 +44,9 @@ pnpm 改写成**精确版本**,不是 `^` 范围)。
|
|
|
38
44
|
- **双入口别搞混**:给模块作者用的加在 `src/index.ts`;框架自己怎么启动看 `src/index.tsx`。
|
|
39
45
|
- `#src/*` alias 指向 `packages/runtime/src/*`(由 `packages/runtime/package.json`
|
|
40
46
|
的 `imports` 字段与 vite alias **双声明**,即「模块仅 import 三类」不变式)。
|
|
41
|
-
-
|
|
47
|
+
- 业务工程**不打包宿主共享依赖**——宿主经 importmap 提供单例。例外是 `shared-deps.ts` 里
|
|
48
|
+
标了 `bundle: true` 的重型依赖(echarts 家族 / vditor / @plane/editor):宿主不提供,
|
|
49
|
+
模块自带,见手册 §2.6。
|
|
42
50
|
|
|
43
51
|
## §3 常用命令
|
|
44
52
|
|
|
@@ -71,8 +79,9 @@ pnpm test tests/shell # 宿主全量
|
|
|
71
79
|
|
|
72
80
|
### 4.1 四条通用红线
|
|
73
81
|
|
|
74
|
-
1.
|
|
82
|
+
1. **宿主共享依赖只能有一个版本**:安装走 `catalog:`,产物走宿主(cli 内置
|
|
75
83
|
`shell-dist`)importmap 单例。私自写死 `react@18` 会导致「双 React」崩溃。
|
|
84
|
+
(`bundle: true` 的自打包档不在其列——它们本就由各模块自带。)
|
|
76
85
|
2. **`packages/runtime/dist`、`packages/cli/shell-dist` 随仓库提交**
|
|
77
86
|
(`.gitignore` 为它们开了例外)。**改了源码必须重建并提交产物**,
|
|
78
87
|
否则本地/CI 跑的是旧产物——历史上多次出现「方法不存在」。
|
|
@@ -139,7 +148,7 @@ pnpm test tests/shell # 宿主全量
|
|
|
139
148
|
**一键发布**:`node scripts/publish-packages.mjs`(lockstep 门禁 → 构建 → 守卫测试 →
|
|
140
149
|
runtime → cli → registry 复核;`--dry-run` 只演练)。下面的手动步骤是它的展开参考。
|
|
141
150
|
|
|
142
|
-
- **两包**同版本号(`@oj-module/runtime` + `@oj-module/cli
|
|
151
|
+
- **两包**同版本号(`@oj-module/runtime` + `@oj-module/cli`,两处 `package.json` 恒等),后续发版保持
|
|
143
152
|
lockstep;`@plane/kit` / `@plane/editor` 不在发布集内(脚本里已注释)。
|
|
144
153
|
- **必须 `pnpm publish`**——用 `npm publish` 会漏出 `workspace:*` / `catalog:` 字面量。
|
|
145
154
|
- **顺序:先 `runtime` 后 `cli`**。`runtime` 未公开时,新 `cli` 的精确依赖会悬空,
|
|
@@ -169,13 +178,14 @@ runtime → cli → registry 复核;`--dry-run` 只演练)。下面的手动
|
|
|
169
178
|
`docs/devkit/` 归置进 cli 包 `packages/cli/devkit/`,随 `@oj-module/cli` 发布
|
|
170
179
|
(`package.json#files` 白名单已含 `devkit`);
|
|
171
180
|
- `packages/cli/src/init.ts` 第 4b 步:从 cli 包内置 devkit 多拷一份到
|
|
172
|
-
工程的 `.claude/skills/ojm-module-dev
|
|
173
|
-
`
|
|
181
|
+
工程的 `.claude/skills/ojm-module-dev/`(连同企微两本手册与发布 walkthrough,共 6 个文件;
|
|
182
|
+
已存在则幂等跳过)。`framework-dev.md` / `menu-rules.md` / 教学文档 / SQL 构造器 PR 记录
|
|
183
|
+
只随 cli 包、不进业务工程——它们是框架贡献者或专题材料,`ojm init` 有意不分发。
|
|
174
184
|
|
|
175
185
|
`packages/cli/devkit/` 是发布副本、由 prepack 生成,已加进 `.gitignore` 不入库;
|
|
176
186
|
源仍是仓库 `docs/devkit/` 顶层,改文档只动那里一处。
|
|
177
187
|
|
|
178
|
-
> `docs/devkit/oj-api-dev/` 是 **oj 侧 devkit 的快照**(
|
|
188
|
+
> `docs/devkit/oj-api-dev/` 是 **oj 侧 devkit 的快照**(12 个文件,与
|
|
179
189
|
> `~/.local/share/oj/devkit/` 逐字节一致),仅供本仓 grep 后端手册,
|
|
180
190
|
> **不随 cli 包发货**(`sync-devkit.mjs` 只同步顶层文件)——用户工程的
|
|
181
191
|
> `oj-api-dev` skill 由 oj 二进制分发。升级本机 oj 后要同步快照:
|
|
@@ -187,9 +197,10 @@ runtime → cli → registry 复核;`--dry-run` 只演练)。下面的手动
|
|
|
187
197
|
|
|
188
198
|
## 附:本 devkit 内容来源(维护者看)
|
|
189
199
|
|
|
190
|
-
`docs/devkit/` 是**自包含**的交付文档(顶层 6
|
|
191
|
-
`sql-builder-missing-capabilities-pr.md` 这份构造器能力缺口 PR
|
|
192
|
-
|
|
200
|
+
`docs/devkit/` 是**自包含**的交付文档(顶层 11 个文件,全部随 cli 包发货,其中 6 个随
|
|
201
|
+
`ojm init` 进业务工程;含 `sql-builder-missing-capabilities-pr.md` 这份构造器能力缺口 PR 参考),
|
|
202
|
+
业务工程拿到即可读懂,不依赖工程仓库里的其它文档。
|
|
203
|
+
另有 `oj-api-dev/` 子目录是 oj 侧 devkit 的快照(oj v0.1.116 起 12 文件,仅本仓参考、不发货),
|
|
193
204
|
结构说明见 `README.md`。
|
|
194
205
|
下面的来源仅用于维护时追溯与同步,不参与交付:
|
|
195
206
|
|
package/devkit/manual.md
CHANGED
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
├── env.d.ts # ImportMeta.env 类型补丁
|
|
36
36
|
├── types/oj-modules.d.ts # `declare module "#*"` 别名兜底(非模块文件的 ambient 声明)
|
|
37
37
|
├── .ojm-api-exempt.json
|
|
38
|
-
├── seed.mysql.sql / seed.pg.sql
|
|
39
38
|
├── vitest.config.ts # 后端 BDD(include tests/**/*.spec.ts)
|
|
40
39
|
├── tests/ # 后端 BDD 测试(node:sqlite 内存库 + 真实迁移建表)
|
|
41
40
|
├── src/
|
|
@@ -60,7 +59,9 @@
|
|
|
60
59
|
│ │ ├── auth/ # 仅 __client(无页面)
|
|
61
60
|
│ │ ├── _platform/ # 仅 __client(oj-market 引用)
|
|
62
61
|
│ │ └── web/ # 仅 __client
|
|
63
|
-
│ ├── oj-market/web/ #
|
|
62
|
+
│ ├── oj-market/web/ # 解决方案市场(独立模块,删目录即下线;单根 /oj-market 挂三个子页)
|
|
63
|
+
│ │ ├── entry.ts # routes 聚合:/oj-market 根(方案清单 index)+ 发布管理/发布历史子路由
|
|
64
|
+
│ │ └── publish/ # 发布管理 + 发布历史(/oj-market/publish、/oj-market/history:routes + pages + locales + __client)
|
|
64
65
|
├── dist/api/ # 后端产物(release 根:<name>-<ver>/ + manifests.yaml + versions.json)—构建后才有
|
|
65
66
|
├── dist/web/ # 站点产物(shell + modules/ + modules.json)—构建后才有
|
|
66
67
|
├── bin/ # oj 二进制 + plugins/ + devkit/(不入库)
|
|
@@ -198,11 +199,25 @@ src/<模块>/api/<路径...>/api.ts → /api/<模块>/<路径...>
|
|
|
198
199
|
| 文件 | 何时生效 |
|
|
199
200
|
|---|---|
|
|
200
201
|
| `migrations/*.sql` | 启动(dev `migrate_on_start: auto`);release 默认 `verify`,账本落后则**拒绝启动** |
|
|
201
|
-
| `seed.sql` |
|
|
202
|
+
| `seed.sql` / `seed.<方言>.sql` | **每次启动都重放**——方言件(`.sqlite` / `.mysql` / `.pg`)存在即胜出、`seed.sql` 兜底、绝不双跑(oj ≥ 0.1.121);必须幂等 |
|
|
202
203
|
| `schema.yaml` | 声明;加可空列 / 加表 reconcile 能收敛,但**改类型与改名必须走 migrations** |
|
|
203
204
|
|
|
204
205
|
> `seed.sql` 按 `;` 朴素切分,**注释里不许出现分号字面量**,否则语法错。
|
|
205
206
|
|
|
207
|
+
> **方言 seed 放好即生效(oj ≥ 0.1.121,已是 `ojm` 最低版本门禁)**:方言件按模块存放
|
|
208
|
+
> (`src/app/api/<模块>/seed.mysql.sql` / `seed.pg.sql`,与基础件同表同条数),启动时按当前库
|
|
209
|
+
> 方言自动选——方言件胜出、`seed.sql` 兜底、**绝不双跑**;成功日志打 `file=` / `dialect=`,
|
|
210
|
+
> 模块只有别的方言件或文件名拼错(如 `seed.postgres.sql`)会 warn,`oj check` 的 seed 检查会报错。
|
|
211
|
+
> 更早的 oj 只认字面 `seed.sql`(会把 sqlite 写法原样下发 mysql/pg → 1064),已低于门禁,
|
|
212
|
+
> `ojm vendor` / `ojm info` 会直接拒绝。工程根**不再**有方言 seed 副本(历史上那份只含部分
|
|
213
|
+
> 设置、且 mysql 侧裸写 `key`,已删除)。
|
|
214
|
+
|
|
215
|
+
> **框架自带 `_platform` 模块的迁移已压平为单条基线**(`0001__baseline.sql` 及
|
|
216
|
+
> `.mysql.sql` / `.pg.sql` 两个方言版):新工程按基线一次建表,不再有 0002…0018 的增量链。
|
|
217
|
+
> 老开发库的迁移账本里记着旧序号,**基线不会被重放**——若库结构落后(例如缺新列),
|
|
218
|
+
> 直接删 `api/db.sqlite` 重启即可(dev 自动重跑迁移 + seed),本项目**不提供兼容 shim**。
|
|
219
|
+
> 基线必须三方言同步:只写 sqlite 版会让同一模块在 mysql/pg 部署上建表失败。
|
|
220
|
+
|
|
206
221
|
### 1.7 handler 四红线(oj 运行时实测钉出,2026-10-16 RBAC 阶段)
|
|
207
222
|
|
|
208
223
|
以下四条都是真机冒烟(`ojm init` + `ojm dev`/`build`)实测钉出的 oj 运行时行为,
|
|
@@ -391,66 +406,113 @@ export default defineModule({
|
|
|
391
406
|
|
|
392
407
|
### 2.6 前端模块能 import 什么
|
|
393
408
|
|
|
394
|
-
|
|
409
|
+
**只有三类来源**:
|
|
395
410
|
|
|
396
411
|
1. `@oj-module/runtime`(含 `/contract`、`/contract/errors` 子路径);
|
|
397
|
-
2.
|
|
412
|
+
2. 共享依赖(写法上都是裸说明符 import,见下表的两个档位);
|
|
398
413
|
3. 自身相对路径。
|
|
399
414
|
|
|
400
|
-
框架内部的 `#src/*`
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
`react-countup
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
415
|
+
框架内部的 `#src/*` 在构建期被拦。
|
|
416
|
+
|
|
417
|
+
共享依赖按**谁出这份 JS** 分两档。两档写法一样,体积责任与失败形态完全不同——
|
|
418
|
+
把它们混为一谈,是「白屏」和「产物莫名变大一倍」的最常见来源:
|
|
419
|
+
|
|
420
|
+
| 档位 | 谁提供 | importmap 有键 | 典型包 |
|
|
421
|
+
| --- | --- | --- | --- |
|
|
422
|
+
| **宿主共享(单例)** | `shell-dist` 预构建资产 | 有 | `react` / `react-dom` / `react-router` / `antd`(含 `locale/*`)/ `@ant-design/icons` / `@ant-design/pro-components` / `i18next` / `react-i18next` / `zustand` / `dayjs` / `motion` / `@dnd-kit/*` / `keepalive-for-react` / `simplebar-react` / `nprogress` / `react-countup` / `ahooks` / `ky` / `clsx` / `tailwind-merge` / `pinyin-pro` |
|
|
423
|
+
| **模块自打包** | 模块自己的产物 | **无** | `echarts` 家族、`vditor`、`@plane/editor` |
|
|
424
|
+
|
|
425
|
+
- 第一档由宿主提供**单例**:模块工程**不得**打包自己的副本(多副本 = 双 store / 双 antd
|
|
426
|
+
context 树),只在 `devDependencies` 里对齐版本供 `tsc` 用。
|
|
427
|
+
- 第二档宿主**不提供**:模块必须自带,体积记在模块产物上。依赖同样放 `devDependencies`
|
|
428
|
+
(构建期能解析即可),但要自己控体积——见下面两节。
|
|
429
|
+
|
|
430
|
+
判定口径:`packages/cli/src/shared-deps.ts` 里带 `bundle: true` 的条目就是第二档。
|
|
431
|
+
版本矩阵查 `pnpm exec ojm info`(宿主 `versions.json`,两档都在里面,故它只回答「钉哪个版本」,
|
|
432
|
+
不回答「谁提供 JS」)。
|
|
433
|
+
|
|
434
|
+
#### vditor(Markdown 编辑器,模块自打包)
|
|
435
|
+
|
|
436
|
+
写法:`import Vditor from "vditor"` + `import "vditor/dist/index.css"`。
|
|
437
|
+
|
|
438
|
+
但这两个说明符**没有 importmap 键**——宿主不预构建 `/assets/vditor.js`,构建时整份打进
|
|
439
|
+
模块产物 `entry.js`(gzip ≈ 700 KiB)。由此有两条推论:
|
|
440
|
+
|
|
441
|
+
- 动态导入**不能**省这笔体积:模块产物是单文件(`codeSplitting: false`),
|
|
442
|
+
`import("vditor")` 会被内联回同一个文件。要把它从首屏摘掉,只能把编辑器页拆成独立模块/方案。
|
|
443
|
+
- 运行期还要按需加载 lute / i18n / 图标 / 主题 CSS(默认走第三方 CDN,宿主 CSP 通常不放行)。
|
|
444
|
+
这部分**不随产物分发**,由模块自行处理(自注入或指向宿主可服务的同源路径);
|
|
445
|
+
直接 `import "vditor/dist/..."` 其它深路径会命中前缀 external 但无 importmap 键,构建期报错。
|
|
446
|
+
|
|
447
|
+
#### echarts(图表,模块自打包 + 必须按需注册)
|
|
448
|
+
|
|
449
|
+
`echarts` / `echarts/charts` / `echarts/features.js` / `echarts-for-react` 同属第二档。
|
|
450
|
+
**默认写法会把整包打进去**:`import ReactECharts from "echarts-for-react"` 内部是
|
|
451
|
+
`import * as echarts from "echarts"`(index 全量),全部图表类型 + 组件 + 渲染器一起进
|
|
452
|
+
`entry.js`。脚手架实测:单文件 1,697,666 B 里 echarts 918 KB + zrender 221 KB,占 **87%**,
|
|
453
|
+
而首页只画折线/柱状/饼图三种。
|
|
454
|
+
|
|
455
|
+
按需注册写法(脚手架 `src/app/web/home/pages/components/echarts-setup.ts` 可整段照抄):
|
|
456
|
+
|
|
457
|
+
```ts
|
|
458
|
+
// echarts-setup.ts —— 注册清单集中一处,新增图表类型只改这里
|
|
459
|
+
import { BarChart, LineChart, PieChart } from "echarts/charts";
|
|
460
|
+
import { GridComponent, LegendComponent, TooltipComponent } from "echarts/components";
|
|
461
|
+
import * as echarts from "echarts/core";
|
|
462
|
+
import { CanvasRenderer } from "echarts/renderers";
|
|
463
|
+
|
|
464
|
+
echarts.use([
|
|
465
|
+
BarChart, LineChart, PieChart,
|
|
466
|
+
GridComponent, LegendComponent, TooltipComponent,
|
|
467
|
+
CanvasRenderer,
|
|
468
|
+
]);
|
|
469
|
+
export { echarts };
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
```tsx
|
|
473
|
+
import ReactEChartsCore from "echarts-for-react/esm/core";
|
|
474
|
+
import { echarts } from "./echarts-setup";
|
|
475
|
+
|
|
476
|
+
// 组件里渲染:把按需注册过的实例传进去(不传就走整包默认实例)
|
|
477
|
+
return <ReactEChartsCore echarts={echarts} option={option} opts={{ height: 320, width: "auto" }} />;
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
同一份页面实测:`entry.js` 1,697,666 → **918,319 B(−45.9%)**。
|
|
481
|
+
|
|
482
|
+
⚠️ 按需注册最容易踩的坑是**静默空白**:少 `use()` 一个图表类型或组件(例如柱状图漏了
|
|
483
|
+
`GridComponent`、图例漏了 `LegendComponent`),echarts 不抛错、只是画不出来。新增图时
|
|
484
|
+
先补注册清单,再用真页面看一眼。
|
|
485
|
+
|
|
486
|
+
### 2.7 共享依赖钉版(快照,以 `ojm info` 为准)
|
|
487
|
+
|
|
488
|
+
版本矩阵的真源是宿主 `versions.json`(`pnpm exec ojm info` 直接打印)。下表是撰写时的快照,
|
|
489
|
+
升级 cli 后会变——**别抄表格当真相**;`档位` 列才是长期有效的信息。
|
|
490
|
+
|
|
491
|
+
| 包 | 钉版 | 档位 |
|
|
492
|
+
| --- | --- | --- |
|
|
493
|
+
| `react` / `react-dom` | 19.2.8 | 宿主 |
|
|
494
|
+
| `react-router` | 7.18.2 | 宿主 |
|
|
495
|
+
| `@tanstack/react-query` | 5.102.8 | 宿主 |
|
|
496
|
+
| `antd` | 6.6.1 | 宿主 |
|
|
497
|
+
| `@ant-design/icons` | 6.3.2 | 宿主 |
|
|
498
|
+
| `@ant-design/pro-components` | 3.1.12-0 | 宿主 |
|
|
499
|
+
| `i18next` / `react-i18next` | 26.4.0 / 17.0.12 | 宿主 |
|
|
500
|
+
| `zustand` | 5.0.15 | 宿主 |
|
|
501
|
+
| `dayjs` | 1.11.23 | 宿主 |
|
|
502
|
+
| `echarts` / `echarts-for-react` | 6.1.0 / 3.0.6 | **自打包** |
|
|
503
|
+
| `motion` | 12.43.0 | 宿主 |
|
|
504
|
+
| `@dnd-kit/core` | 6.3.1 | 宿主 |
|
|
505
|
+
| `keepalive-for-react` | 5.0.11 | 宿主 |
|
|
506
|
+
| `simplebar-react` | 3.3.2 | 宿主 |
|
|
507
|
+
| `nprogress` | 0.2.0 | 宿主 |
|
|
508
|
+
| `react-countup` | 6.5.3 | 宿主 |
|
|
509
|
+
| `ahooks` | 3.9.7 | 宿主 |
|
|
510
|
+
| `ky` | 2.0.2 | 宿主 |
|
|
511
|
+
| `clsx` / `tailwind-merge` | 2.1.1 / 3.6.0 | 宿主 |
|
|
512
|
+
| `pinyin-pro` | 3.29.3 | 宿主 |
|
|
513
|
+
| `vditor` | 4.0.0 | **自打包** |
|
|
514
|
+
|
|
515
|
+
框架包版本:`@oj-module/runtime` / `@oj-module/cli` 为 `0.2.66`(**双包 lockstep**,
|
|
454
516
|
以 `packages/*/package.json` 或 `ojm info` 为准——本表是撰写时快照);
|
|
455
517
|
`@plane/kit` / `@plane/editor` 是独立版本线(当前 `0.1.20`,随宿主 importmap 提供,
|
|
456
518
|
不参与 lockstep)。`oj` 二进制最低版本门禁 `MIN_OJ_VERSION = 0.1.85`——这个版本带来
|
|
@@ -1490,6 +1552,26 @@ flowchart LR
|
|
|
1490
1552
|
例如 `ojm migrate -d api/dist`、`ojm schema diff` 等价于带绝对 `-c` 的 `oj` 调用——
|
|
1491
1553
|
不用再手敲 `-c`。**完整命令参考与「oj 原生命令 vs ojm 透传」的差异区分见 §10。**
|
|
1492
1554
|
|
|
1555
|
+
**静态层与传输(oj ≥ 0.1.116 内建,0.1.118 起支持 h2c)**:单服务部署时 `oj serve` 自己就是
|
|
1556
|
+
静态服务器,压缩与缓存不必靠外挂 nginx,下面四条直接决定首屏体验:
|
|
1557
|
+
|
|
1558
|
+
- **压缩**:默认开,协商 br > gzip,可压资源恒带 `Vary: Accept-Encoding`;压缩产物落
|
|
1559
|
+
`<config_dir>/compress-cache/`(派生数据,可整删重建;只读根设 `compress_cache_dir: ""`
|
|
1560
|
+
走内存直压)。`server.static.brotli_quality` 默认 5(1..=11),q11 能再省约 12% 字节,
|
|
1561
|
+
代价是**每个新版本资产的第一个请求要在线冷压**(实测 antd 单文件 2.2MB 约 1.4s)——
|
|
1562
|
+
流量入口集中、首访敏感就别拉满。
|
|
1563
|
+
- **缓存按文件名判**:stem 末段 ≥8 位且数字字母兼具 → `public, max-age=31536000, immutable`;
|
|
1564
|
+
其余一律 `no-cache` 恒校验(`config-production.js` 这类纯字母词不会被误钉)。**所以产物里的
|
|
1565
|
+
共享资产与入口 chunk 必须内容寻址命名**,否则跨版本要么全量重下、要么全量 304。
|
|
1566
|
+
本仓构建期已强制(`hashifySharedAssets` / `hashifyHostEntry`)。
|
|
1567
|
+
- **传输**:0.1.118 起明文端口上 h2c(HTTP/2 prior knowledge)与 HTTP/1.1 **同端口共存**,
|
|
1568
|
+
零配置;但**只支持 prior knowledge,没有 `Upgrade: h2c` 路径**,且进程内无 TLS 终结——
|
|
1569
|
+
**浏览器连不上 h2c**。要让浏览器走 h2,必须前置 nginx/caddy 做 TLS-ALPN,反代到源站那一跳
|
|
1570
|
+
可选 h2c。WS 握手仍必须走 HTTP/1.1(无 RFC 8441)。
|
|
1571
|
+
- **前置缓存层**:CDN/反代**必须按 `Vary: Accept-Encoding` 分键**;确认不了就让
|
|
1572
|
+
`server.static.compression: false`,压缩交给前置层一家做——两层都压等于白费 CPU 且易出
|
|
1573
|
+
「br 解成乱码」。
|
|
1574
|
+
|
|
1493
1575
|
**按路由注入 HTML(`htmlTransform`,SEO / IM 链接预览)**:SPA 的服务端只有一份
|
|
1494
1576
|
`index.html`——想让 `/issues/<id>` 这类路由带自己的 `<title>`/`og:*`(微信、Slack、飞书预览
|
|
1495
1577
|
与不执行 JS 的爬虫只看服务端 HTML,客户端 `document.title` 无效),在 `web.config.ts` 配:
|
|
@@ -1852,9 +1934,9 @@ module-root 下数据源是「扫描 + `web.config.ts` 登记」并集(未登
|
|
|
1852
1934
|
一个脚手架可放多份用户方案(`ojm new` 逐个生成,各自一份 `src/<name>/solution.yaml`),
|
|
1853
1935
|
`ojm build --bundle` 无参时全部打包、逐个校验独立出包;框架自带方案自动排除(名单见
|
|
1854
1936
|
`src/.ojm-builtin.json`,`ojm info` 默认折叠自带模块)。
|
|
1855
|
-
|
|
1856
|
-
[`publish-walkthrough.md`](./publish-walkthrough.md)
|
|
1857
|
-
|
|
1937
|
+
**从开发到发布的完整过程视角(新手照做版,含签名/私钥纪律与多人各自发包纪律)见本目录
|
|
1938
|
+
[`publish-walkthrough.md`](./publish-walkthrough.md)**——那份文件同样随包分发、自包含,
|
|
1939
|
+
发布链路只读它 + 本章即可闭环。
|
|
1858
1940
|
|
|
1859
1941
|
### 11.1 打包:`ojm build --bundle`
|
|
1860
1942
|
|
|
@@ -2008,16 +2090,26 @@ flowchart LR
|
|
|
2008
2090
|
### 12.1 发布流程(作者侧,三步)
|
|
2009
2091
|
|
|
2010
2092
|
```bash
|
|
2011
|
-
# ①
|
|
2012
|
-
|
|
2093
|
+
# ① 一次性:拿发布身份。站点有「方案市场 → 发布管理」页时,用页面签发的一次性凭证兑换(key_id 由站点算好下发,
|
|
2094
|
+
# CLI 不推导;兑换即作废;失败不落任何密钥文件;与 --id 互斥,同时给 exit 2):
|
|
2095
|
+
ojm keygen --credential <token> [--site-url <站点>]
|
|
2096
|
+
OJM_PUBLISH_CREDENTIAL=<token> ojm keygen
|
|
2097
|
+
|
|
2098
|
+
# ①' 旁路:只在没有「发布管理」页(纯自建/离线 CDN)或 CI 临时密钥时自建 key_id——
|
|
2099
|
+
# 站点侧没有这条身份记录,产品归属与申请人无从追溯,只能靠超管为陌生指纹手工放行:
|
|
2100
|
+
ojm keygen --id <publisher>.<key-name> # 私钥 ~/.ojm/keys/<id>/ 永不出目录;--out 指进工程树须 --yes
|
|
2013
2101
|
|
|
2014
|
-
# ②
|
|
2015
|
-
ojm sign dist/<name>-<version>.tgz --id <
|
|
2102
|
+
# ② 每次发布:签名(--id 填上一步拿到的 key_id;产物 = 同目录 <tgz>.sig;--check 离线自检)
|
|
2103
|
+
ojm sign dist/<name>-<version>.tgz --id <key_id> --check
|
|
2016
2104
|
|
|
2017
2105
|
# ③ 安装/分发:.sig 自动探测随包上传
|
|
2018
2106
|
ojm install dist/<name>-<version>.tgz --site-url <站点> --user superadmin --pass …
|
|
2019
2107
|
```
|
|
2020
2108
|
|
|
2109
|
+
凭证通道的站点地址:`--site-url` > `OJM_SITE_URL` > `http://127.0.0.1:9778`;兑换端点匿名可达,
|
|
2110
|
+
不需要 `--user/--pass`。key_id 形如 `<产品名>.<编码后用户名>`(例:`demo-solution.wecom-everpan`),
|
|
2111
|
+
由站点按申请时的产品名与账号算好。
|
|
2112
|
+
|
|
2021
2113
|
宿主验签六码(失败文案双语,`--locale` 切换):`sig_missing`(缺签)/ `sig_alg`(算法
|
|
2022
2114
|
不受接受)/ `sig_key`(key_id 命名空间违约)/ `tampered`(验签不过)/ `unknown_key`
|
|
2023
2115
|
(信任库无此 key → **needs_trust 第五终态**)/ `sig_format`(.sig 结构违约)。
|
|
@@ -2026,8 +2118,9 @@ ojm install dist/<name>-<version>.tgz --site-url <站点> --user superadmin --pa
|
|
|
2026
2118
|
|
|
2027
2119
|
**TOFU = Trust On First Use(首次使用即信任)**:陌生发布方的第一个包,安装器无法判断
|
|
2028
2120
|
该不该信,于是把公钥指纹摆出来让人核对——核对通过才入库,之后同一 key_id 直接放行。
|
|
2029
|
-
|
|
2030
|
-
|
|
2121
|
+
信任的建立因此有两条路:**模板内置的 oj-market 方案**用内置公钥免核对(§12.3),其余来源
|
|
2122
|
+
(含你自己 keygen 的身份、站点凭证下发的身份)一律走本节的人工核对——凭证只定 key_id 归属,
|
|
2123
|
+
站点在兑换时拿不到你的公钥,无法代为建立信任。
|
|
2031
2124
|
|
|
2032
2125
|
- 信任库 = `.solutions/trusted-keys.yaml`(key_id → 公钥 + added_at;首次绑定不可改,
|
|
2033
2126
|
轮换 = 新增 key_id)。
|
package/devkit/menu-rules.md
CHANGED
|
@@ -278,7 +278,7 @@ export default {
|
|
|
278
278
|
|
|
279
279
|
| 位置 | 动作 | 不配的后果 |
|
|
280
280
|
|---|---|---|
|
|
281
|
-
| `<dist>/index.html` | importmap 映射值、`<script src>`、`<link href>` 统一加 `/oj` 前缀 | HTML 指向 `/assets/react
|
|
281
|
+
| `<dist>/index.html` | importmap 映射值、`<script src>`、`<link href>` 统一加 `/oj` 前缀 | HTML 指向 `/assets/react.<hash>.js`,在 `/oj` 挂载下 404 → 白屏 |
|
|
282
282
|
| `<dist>/index.html` | `<head>` 注入 `<script nonce>window.__OJ_BASE__="/oj/"</script>`(复用 importmap 的 nonce,否则被 CSP 拦掉) | 运行期拿不到真实部署前缀 |
|
|
283
283
|
| 运行期 Router | runtime 与宿主 shell 都经 `resolveSiteBase()` 取 basename,即 `window.__OJ_BASE__` | Router 不剥 `/oj`,`/oj/wiki/...` 匹配不到 `/wiki/...`(深链刷新落 404 页) |
|
|
284
284
|
|
|
@@ -302,6 +302,9 @@ export default {
|
|
|
302
302
|
|
|
303
303
|
实测依据(2026-10-21,站点以 `mounts: [{prefix: /oj, web: web/dist, spa: true}]` 挂起):
|
|
304
304
|
|
|
305
|
+
> 下表的资产文件名是当时的 `/assets/react.js`。当前产物改为内容寻址命名
|
|
306
|
+
> (`/assets/react.<hash>.js`,10 位 base36),**前缀判断逻辑不变**,只是文件名多一段哈希。
|
|
307
|
+
|
|
305
308
|
| 请求 | 结果 | 说明 |
|
|
306
309
|
|---|---|---|
|
|
307
310
|
| `GET /oj/wiki/space/3/doc/12` | `200 text/html` | 深链回落本身是通的,前提是该挂载显式 `spa: true` |
|