@hkyhy/marsun-components-core 0.1.89 → 0.1.98
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/dist/components/Audit/AuditLogList.d.ts +27 -0
- package/dist/components/Audit/AuditLogList.js +272 -0
- package/dist/components/Audit/AuditLogList.js.map +1 -0
- package/dist/components/Audit/formatAuditCurl.d.ts +27 -0
- package/dist/components/Audit/formatAuditCurl.js +115 -0
- package/dist/components/Audit/formatAuditCurl.js.map +1 -0
- package/dist/components/Audit/formatAuditJson.d.ts +15 -0
- package/dist/components/Audit/formatAuditJson.js +135 -0
- package/dist/components/Audit/formatAuditJson.js.map +1 -0
- package/dist/components/Audit/index.d.ts +3 -0
- package/dist/components/Audit/style.module.scss.js +30 -0
- package/dist/components/Audit/style.module.scss.js.map +1 -0
- package/dist/components/Audit/types.d.ts +39 -0
- package/dist/components/Editor/RichTextEditor/RichTextEditor.d.ts +24 -0
- package/dist/components/Editor/RichTextEditor/RichTextEditor.js +93 -0
- package/dist/components/Editor/RichTextEditor/RichTextEditor.js.map +1 -0
- package/dist/components/Editor/RichTextEditor/index.d.ts +2 -0
- package/dist/components/Editor/RichTextEditor/style.module.scss.js +11 -0
- package/dist/components/Editor/RichTextEditor/style.module.scss.js.map +1 -0
- package/dist/components/Editor/VariablePicker.d.ts +19 -0
- package/dist/components/Editor/VariablePicker.js +55 -0
- package/dist/components/Editor/VariablePicker.js.map +1 -0
- package/dist/components/Editor/index.d.ts +7 -0
- package/dist/components/Editor/index.js +21 -0
- package/dist/components/Editor/index.js.map +1 -0
- package/dist/components/Editor/msgVarTokenPlugin.d.ts +13 -0
- package/dist/components/Editor/msgVarTokenPlugin.js +94 -0
- package/dist/components/Editor/msgVarTokenPlugin.js.map +1 -0
- package/dist/components/Editor/variableMention.d.ts +37 -0
- package/dist/components/Editor/variableMention.js +64 -0
- package/dist/components/Editor/variableMention.js.map +1 -0
- package/dist/components/FormInfo/RichTextField/index.d.ts +21 -0
- package/dist/components/FormInfo/RichTextField/index.js +82 -0
- package/dist/components/FormInfo/RichTextField/index.js.map +1 -0
- package/dist/components/FormInfo/RichTextField/style.module.scss.js +9 -0
- package/dist/components/FormInfo/RichTextField/style.module.scss.js.map +1 -0
- package/dist/components/FormInfo/VariableMentionInput/index.d.ts +17 -0
- package/dist/components/FormInfo/VariableMentionInput/index.js +73 -0
- package/dist/components/FormInfo/VariableMentionInput/index.js.map +1 -0
- package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js +11 -0
- package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js.map +1 -0
- package/dist/components/FormInfo/fields.d.ts +5 -0
- package/dist/components/FormInfo/fields.js +32 -23
- package/dist/components/FormInfo/fields.js.map +1 -1
- package/dist/components/FormInfo/index.d.ts +4 -0
- package/dist/components/StateBar/StateBar.d.ts +19 -6
- package/dist/components/StateBar/StateBar.js +87 -50
- package/dist/components/StateBar/StateBar.js.map +1 -1
- package/dist/components/StateBar/style.module.scss.js +13 -10
- package/dist/components/StateBar/style.module.scss.js.map +1 -1
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.d.ts +45 -0
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +156 -0
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -0
- package/dist/components/Tools/Inbox/InboxBell/index.d.ts +2 -0
- package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js +30 -0
- package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js.map +1 -0
- package/dist/components/Tools/Inbox/index.d.ts +2 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.d.ts +8 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.js +56 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.js.map +1 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.d.ts +8 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js +216 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js.map +1 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.d.ts +26 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +190 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/index.d.ts +3 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/style.module.scss.js +12 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/style.module.scss.js.map +1 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.d.ts +76 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.js +26 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.js.map +1 -0
- package/dist/components/Tools/MessageCenter/index.d.ts +3 -0
- package/dist/components/Tools/MessageCenter/utils/templateCode.d.ts +8 -0
- package/dist/components/Tools/MessageCenter/utils/templateCode.js +25 -0
- package/dist/components/Tools/MessageCenter/utils/templateCode.js.map +1 -0
- package/dist/components/Tools/index.d.ts +5 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/editor.d.ts +5 -0
- package/dist/editor.js +21 -0
- package/dist/editor.js.map +1 -0
- package/dist/form-info.js +33 -29
- package/dist/form-info.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +805 -773
- package/dist/index.js.map +1 -1
- package/dist/marsun-components-core.css +4 -1
- package/dist/node_modules/@ckeditor/ckeditor5-basic-styles/dist/index.js +301 -0
- package/dist/node_modules/@ckeditor/ckeditor5-basic-styles/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-clipboard/dist/index.js +1256 -0
- package/dist/node_modules/@ckeditor/ckeditor5-clipboard/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-core/dist/index.js +2107 -0
- package/dist/node_modules/@ckeditor/ckeditor5-core/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-editor-classic/dist/index.js +259 -0
- package/dist/node_modules/@ckeditor/ckeditor5-editor-classic/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-engine/dist/index.js +23990 -0
- package/dist/node_modules/@ckeditor/ckeditor5-engine/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-enter/dist/index.js +249 -0
- package/dist/node_modules/@ckeditor/ckeditor5-enter/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-essentials/dist/index.js +47 -0
- package/dist/node_modules/@ckeditor/ckeditor5-essentials/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-font/dist/index.js +100 -0
- package/dist/node_modules/@ckeditor/ckeditor5-font/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-icons/dist/index.js +31 -0
- package/dist/node_modules/@ckeditor/ckeditor5-icons/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-integrations-common/dist/index.js +194 -0
- package/dist/node_modules/@ckeditor/ckeditor5-integrations-common/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-list/dist/index.js +2042 -0
- package/dist/node_modules/@ckeditor/ckeditor5-list/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-mention/dist/index.js +9 -0
- package/dist/node_modules/@ckeditor/ckeditor5-mention/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-paragraph/dist/index.js +167 -0
- package/dist/node_modules/@ckeditor/ckeditor5-paragraph/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-react/dist/index.js +471 -0
- package/dist/node_modules/@ckeditor/ckeditor5-react/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-select-all/dist/index.js +139 -0
- package/dist/node_modules/@ckeditor/ckeditor5-select-all/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-typing/dist/index.js +755 -0
- package/dist/node_modules/@ckeditor/ckeditor5-typing/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/dist/index.js +7838 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/node_modules/color-convert/conversions.js +422 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/node_modules/color-convert/conversions.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/node_modules/color-convert/index.js +33 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/node_modules/color-convert/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/node_modules/color-convert/route.js +47 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/node_modules/color-convert/route.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/node_modules/color-name/index.js +156 -0
- package/dist/node_modules/@ckeditor/ckeditor5-ui/node_modules/color-name/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-undo/dist/index.js +313 -0
- package/dist/node_modules/@ckeditor/ckeditor5-undo/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-utils/dist/index.js +2942 -0
- package/dist/node_modules/@ckeditor/ckeditor5-utils/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-watchdog/dist/index.js +892 -0
- package/dist/node_modules/@ckeditor/ckeditor5-watchdog/dist/index.js.map +1 -0
- package/dist/node_modules/@ckeditor/ckeditor5-widget/dist/index.js +1047 -0
- package/dist/node_modules/@ckeditor/ckeditor5-widget/dist/index.js.map +1 -0
- package/dist/node_modules/color-parse/node_modules/color-name/index.js +153 -0
- package/dist/node_modules/color-parse/node_modules/color-name/index.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/_internal/globalThis.js +7 -0
- package/dist/node_modules/es-toolkit/dist/_internal/globalThis.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.js +7 -0
- package/dist/node_modules/es-toolkit/dist/_internal/isUnsafeProperty.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/_internal/isUnsafeToWriteProperty.js +7 -0
- package/dist/node_modules/es-toolkit/dist/_internal/isUnsafeToWriteProperty.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/assignValue.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/assignValue.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/getSymbols.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/getSymbols.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/getTag.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/getTag.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/isDeepKey.js +16 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/isDeepKey.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/isIndex.js +15 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/isIndex.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/isKey.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/isKey.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/isPrototype.js +8 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/isPrototype.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/tags.js +30 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/tags.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/toKey.js +8 -0
- package/dist/node_modules/es-toolkit/dist/compat/_internal/toKey.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/function/debounce.js +17 -0
- package/dist/node_modules/es-toolkit/dist/compat/function/debounce.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/function/throttle.js +13 -0
- package/dist/node_modules/es-toolkit/dist/compat/function/throttle.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/assignIn.js +17 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/assignIn.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/clone.js +102 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/clone.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/cloneDeep.js +8 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/cloneDeep.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/cloneDeepWith.js +33 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/cloneDeepWith.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/get.js +39 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/get.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/has.js +21 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/has.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/keysIn.js +33 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/keysIn.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/mapValues.js +10 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/mapValues.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/merge.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/merge.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/mergeWith.js +53 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/mergeWith.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/property.js +10 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/property.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/set.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/set.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/updateWith.js +31 -0
- package/dist/node_modules/es-toolkit/dist/compat/object/updateWith.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isArguments.js +8 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isArguments.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isArray.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isArray.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isArrayLike.js +8 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isArrayLike.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isArrayLikeObject.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isArrayLikeObject.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isElement.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isElement.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isEqualWith.js +15 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isEqualWith.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isFunction.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isFunction.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isMatch.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isMatch.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isMatchWith.js +81 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isMatchWith.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isObject.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isObject.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isObjectLike.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isObjectLike.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isPlainObject.js +16 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isPlainObject.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isString.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isString.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isSymbol.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isSymbol.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isTypedArray.js +8 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/isTypedArray.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/matches.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/matches.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/matchesProperty.js +23 -0
- package/dist/node_modules/es-toolkit/dist/compat/predicate/matchesProperty.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/eq.js +7 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/eq.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/iteratee.js +19 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/iteratee.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/times.js +11 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/times.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toFinite.js +8 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toFinite.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toInteger.js +9 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toInteger.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toNumber.js +8 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toNumber.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toPath.js +37 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toPath.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toString.js +15 -0
- package/dist/node_modules/es-toolkit/dist/compat/util/toString.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/function/after.js +11 -0
- package/dist/node_modules/es-toolkit/dist/function/after.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/function/debounce.js +30 -0
- package/dist/node_modules/es-toolkit/dist/function/debounce.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/function/identity.js +7 -0
- package/dist/node_modules/es-toolkit/dist/function/identity.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/function/noop.js +6 -0
- package/dist/node_modules/es-toolkit/dist/function/noop.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/object/clone.js +27 -0
- package/dist/node_modules/es-toolkit/dist/object/clone.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/object/cloneDeep.js +8 -0
- package/dist/node_modules/es-toolkit/dist/object/cloneDeep.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/object/cloneDeepWith.js +121 -0
- package/dist/node_modules/es-toolkit/dist/object/cloneDeepWith.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/object/mapValues.js +12 -0
- package/dist/node_modules/es-toolkit/dist/object/mapValues.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isBuffer.js +8 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isBuffer.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isEqual.js +9 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isEqual.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isEqualWith.js +110 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isEqualWith.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isLength.js +7 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isLength.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isPlainObject.js +9 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isPlainObject.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isPrimitive.js +7 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isPrimitive.js.map +1 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isTypedArray.js +7 -0
- package/dist/node_modules/es-toolkit/dist/predicate/isTypedArray.js.map +1 -0
- package/dist/styles/global.css +4 -1
- package/dist/utils/copyText.d.ts +4 -0
- package/dist/utils/copyText.js +21 -0
- package/dist/utils/copyText.js.map +1 -0
- package/package.json +9 -2
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { AuditEventDetail, AuditEventListItem, AuditStep } from './types';
|
|
3
|
+
export type AuditLogListMode = 'app' | 'platform';
|
|
4
|
+
export type AuditLogListProps = {
|
|
5
|
+
mode?: AuditLogListMode;
|
|
6
|
+
dataSource: AuditEventListItem[];
|
|
7
|
+
loading?: boolean;
|
|
8
|
+
/** 点击行(进详情页) */
|
|
9
|
+
onRowClick?: (row: AuditEventListItem) => void;
|
|
10
|
+
filterSlot?: React.ReactNode;
|
|
11
|
+
pagination?: false | object;
|
|
12
|
+
className?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const AuditStepContent: React.FC<{
|
|
15
|
+
step: AuditStep;
|
|
16
|
+
}>;
|
|
17
|
+
/** 审计事件详情:InfoPage + CommonDescriptions + Flow */
|
|
18
|
+
export declare const AuditEventDetailView: React.FC<{
|
|
19
|
+
detail: AuditEventDetail | null;
|
|
20
|
+
loading?: boolean;
|
|
21
|
+
emptyDescription?: string;
|
|
22
|
+
className?: string;
|
|
23
|
+
/** 当前登录 token(不含 Bearer 前缀亦可);复制 curl 用,不落库 */
|
|
24
|
+
getAuthToken?: () => string | null | undefined;
|
|
25
|
+
}>;
|
|
26
|
+
export declare const AuditLogList: React.FC<AuditLogListProps>;
|
|
27
|
+
export default AuditLogList;
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { jsx as e, jsxs as i, Fragment as f } from "react/jsx-runtime";
|
|
2
|
+
import { copyText as E } from "../../utils/copyText.js";
|
|
3
|
+
import { Typography as s, Empty as g, Button as j, message as T, Space as R } from "antd";
|
|
4
|
+
import I from "classnames";
|
|
5
|
+
import k from "dayjs";
|
|
6
|
+
import { useMemo as D } from "react";
|
|
7
|
+
import { formatAuditJson as F, isTruncatedAuditText as B } from "./formatAuditJson.js";
|
|
8
|
+
import { buildAuditReplayCurl as H, readBrowserReplaySession as O } from "./formatAuditCurl.js";
|
|
9
|
+
import l from "./style.module.scss.js";
|
|
10
|
+
import y, { SEMANTIC_COLORS as u } from "../Tag/SemanticTag.js";
|
|
11
|
+
import N from "../InfoPage/InfoPage/index.js";
|
|
12
|
+
import P from "../Descriptions/CommonDescriptions.js";
|
|
13
|
+
import U from "../InfoPage/Flow/index.js";
|
|
14
|
+
import Y from "../Table/Table.js";
|
|
15
|
+
import w from "../VirtualScrollbar/VirtualScrollbar/index.js";
|
|
16
|
+
function A(t) {
|
|
17
|
+
const r = k(t);
|
|
18
|
+
return r.isValid() ? r.format("YYYY-MM-DD HH:mm:ss") : t;
|
|
19
|
+
}
|
|
20
|
+
function L(t) {
|
|
21
|
+
return t === "success" ? "成功" : t === "fail" || t === "error" ? "失败" : t;
|
|
22
|
+
}
|
|
23
|
+
function v(t) {
|
|
24
|
+
return t === "success" ? u.SUCCESS : t === "fail" || t === "error" ? u.DANGER : u.DEFAULT;
|
|
25
|
+
}
|
|
26
|
+
function q(t) {
|
|
27
|
+
return t.stepType === "ERROR" || t.status === "error" ? "error" : t.status === "process" || t.status === "processing" ? "process" : t.status === "wait" ? "wait" : "finish";
|
|
28
|
+
}
|
|
29
|
+
function M(t) {
|
|
30
|
+
return t === "TRACE" ? "请求线路" : t === "SYSTEM" ? "系统" : t === "OPERATION" || !t ? "业务操作" : t;
|
|
31
|
+
}
|
|
32
|
+
function z(t) {
|
|
33
|
+
return t >= 500 ? u.DANGER : t >= 400 ? u.WARNING : t >= 200 && t < 300 ? u.SUCCESS : u.DEFAULT;
|
|
34
|
+
}
|
|
35
|
+
function G(t) {
|
|
36
|
+
if (!t || typeof t != "object" || Array.isArray(t)) return null;
|
|
37
|
+
const r = t.httpStatus;
|
|
38
|
+
if (typeof r == "number" && Number.isFinite(r)) return r;
|
|
39
|
+
if (r != null && String(r).trim() !== "") {
|
|
40
|
+
const o = Number(r);
|
|
41
|
+
return Number.isFinite(o) ? o : null;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const S = ({
|
|
46
|
+
value: t,
|
|
47
|
+
maxHeight: r = 360
|
|
48
|
+
}) => {
|
|
49
|
+
const o = F(t), a = B(t) || o.includes("…[truncated]");
|
|
50
|
+
return /* @__PURE__ */ i("div", { className: l.jsonWrap, children: [
|
|
51
|
+
a ? /* @__PURE__ */ e("div", { className: l.truncateHint, children: "内容已截断(采集侧 body 上限),以下为可读展开" }) : null,
|
|
52
|
+
/* @__PURE__ */ e(w, { className: l.jsonScroll, style: { maxHeight: r }, children: /* @__PURE__ */ e("pre", { className: l.jsonBlock, children: o }) })
|
|
53
|
+
] });
|
|
54
|
+
};
|
|
55
|
+
function C(t, r) {
|
|
56
|
+
if (r == null) return null;
|
|
57
|
+
if (t === "output" && typeof r == "object" && !Array.isArray(r) && r !== null && ("httpStatus" in r || "body" in r)) {
|
|
58
|
+
const o = r, a = { ...o };
|
|
59
|
+
delete a.httpStatus, delete a.body;
|
|
60
|
+
const m = Object.keys(a).length > 0;
|
|
61
|
+
return /* @__PURE__ */ i(f, { children: [
|
|
62
|
+
o.body !== void 0 ? /* @__PURE__ */ i(f, { children: [
|
|
63
|
+
/* @__PURE__ */ e("div", { className: l.blockLabel, children: "响应体" }),
|
|
64
|
+
/* @__PURE__ */ e(S, { value: o.body, maxHeight: 420 })
|
|
65
|
+
] }) : null,
|
|
66
|
+
m ? /* @__PURE__ */ i(f, { children: [
|
|
67
|
+
/* @__PURE__ */ e("div", { className: l.blockLabel, children: "其它" }),
|
|
68
|
+
/* @__PURE__ */ e(S, { value: a })
|
|
69
|
+
] }) : null
|
|
70
|
+
] });
|
|
71
|
+
}
|
|
72
|
+
return /* @__PURE__ */ i(f, { children: [
|
|
73
|
+
/* @__PURE__ */ e("div", { className: l.blockLabel, children: t }),
|
|
74
|
+
/* @__PURE__ */ e(S, { value: r })
|
|
75
|
+
] });
|
|
76
|
+
}
|
|
77
|
+
const V = ({ step: t }) => {
|
|
78
|
+
var o;
|
|
79
|
+
const r = G(t.output);
|
|
80
|
+
return /* @__PURE__ */ i("div", { className: l.stepBody, children: [
|
|
81
|
+
/* @__PURE__ */ i("div", { className: l.stepMeta, children: [
|
|
82
|
+
t.stepType ? /* @__PURE__ */ e(y, { color: u.DEFAULT, children: t.stepType }) : null,
|
|
83
|
+
r != null ? /* @__PURE__ */ i(y, { color: z(r), children: [
|
|
84
|
+
"HTTP ",
|
|
85
|
+
r
|
|
86
|
+
] }) : null,
|
|
87
|
+
t.occurredAt ? /* @__PURE__ */ e(s.Text, { type: "secondary", children: A(t.occurredAt) }) : null,
|
|
88
|
+
typeof t.durationMs == "number" ? /* @__PURE__ */ i(s.Text, { type: "secondary", children: [
|
|
89
|
+
t.durationMs,
|
|
90
|
+
" ms"
|
|
91
|
+
] }) : null
|
|
92
|
+
] }),
|
|
93
|
+
t.sqlText ? /* @__PURE__ */ i(f, { children: [
|
|
94
|
+
/* @__PURE__ */ e("div", { className: l.blockLabel, children: "SQL" }),
|
|
95
|
+
/* @__PURE__ */ e(w, { className: l.jsonScroll, style: { maxHeight: 200 }, children: /* @__PURE__ */ e("pre", { className: l.jsonBlock, children: t.sqlText }) })
|
|
96
|
+
] }) : null,
|
|
97
|
+
(o = t.tables) != null && o.length ? /* @__PURE__ */ i(s.Text, { type: "secondary", children: [
|
|
98
|
+
"表:",
|
|
99
|
+
t.tables.join(", ")
|
|
100
|
+
] }) : null,
|
|
101
|
+
t.errorMessage ? /* @__PURE__ */ e(s.Text, { type: "danger", children: t.errorMessage }) : null,
|
|
102
|
+
t.errorCode ? /* @__PURE__ */ i(s.Text, { type: "secondary", children: [
|
|
103
|
+
"错误码:",
|
|
104
|
+
t.errorCode
|
|
105
|
+
] }) : null,
|
|
106
|
+
t.input != null ? C("请求体", t.input) : null,
|
|
107
|
+
t.output != null ? C("output", t.output) : null
|
|
108
|
+
] });
|
|
109
|
+
}, st = ({ detail: t, loading: r, emptyDescription: o = "暂无明细", className: a, getAuthToken: m }) => {
|
|
110
|
+
var d, n, h;
|
|
111
|
+
if (r)
|
|
112
|
+
return /* @__PURE__ */ e(s.Text, { type: "secondary", children: "加载中…" });
|
|
113
|
+
if (!t)
|
|
114
|
+
return /* @__PURE__ */ e(g, { description: o });
|
|
115
|
+
const p = t.steps || [], b = t.actionLabel || t.action, x = [
|
|
116
|
+
{
|
|
117
|
+
label: "操作人",
|
|
118
|
+
value: (d = t.actorName) != null && d.trim() ? t.actorName : "—"
|
|
119
|
+
},
|
|
120
|
+
{ label: "时间", value: A(t.createdAt) },
|
|
121
|
+
{
|
|
122
|
+
label: "方法",
|
|
123
|
+
value: (n = t.httpMethod) != null && n.trim() ? t.httpMethod : "—"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
label: "状态",
|
|
127
|
+
value: /* @__PURE__ */ e(y, { color: v(t.status), children: L(t.status) })
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
label: "类别",
|
|
131
|
+
value: t.category ? M(t.category) : "—"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
label: "耗时",
|
|
135
|
+
value: typeof t.durationMs == "number" ? `${t.durationMs} ms` : "—"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
label: "路径",
|
|
139
|
+
value: (h = t.path) != null && h.trim() ? /* @__PURE__ */ e(s.Text, { code: !0, copyable: { text: t.path }, children: t.path }) : "—",
|
|
140
|
+
span: 2
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
label: "traceId",
|
|
144
|
+
value: t.traceId ? /* @__PURE__ */ e(s.Text, { copyable: { text: t.traceId }, children: t.traceId }) : "—",
|
|
145
|
+
span: 1
|
|
146
|
+
},
|
|
147
|
+
...t.actionLabel ? [{ label: "动作码", value: /* @__PURE__ */ e(s.Text, { code: !0, children: t.action }) }] : []
|
|
148
|
+
];
|
|
149
|
+
return /* @__PURE__ */ i(N, { className: I(l.detail, a), children: [
|
|
150
|
+
/* @__PURE__ */ e(
|
|
151
|
+
N.Part,
|
|
152
|
+
{
|
|
153
|
+
title: /* @__PURE__ */ i(R, { size: 8, wrap: !0, children: [
|
|
154
|
+
/* @__PURE__ */ e("span", { children: b }),
|
|
155
|
+
t.actionLabel ? /* @__PURE__ */ e(s.Text, { type: "secondary", className: l.actionCode, children: t.action }) : null
|
|
156
|
+
] }),
|
|
157
|
+
subtitle: "事件摘要",
|
|
158
|
+
extra: t.path || t.requestCurl ? /* @__PURE__ */ e(
|
|
159
|
+
j,
|
|
160
|
+
{
|
|
161
|
+
size: "small",
|
|
162
|
+
type: "primary",
|
|
163
|
+
onClick: async () => {
|
|
164
|
+
try {
|
|
165
|
+
const c = H(t, O(m));
|
|
166
|
+
await E(c) ? T.success("已复制 curl") : T.error("复制失败");
|
|
167
|
+
} catch (c) {
|
|
168
|
+
T.error(c instanceof Error ? c.message : "无法生成 curl");
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
children: "复制 curl"
|
|
172
|
+
}
|
|
173
|
+
) : void 0,
|
|
174
|
+
children: /* @__PURE__ */ e(P, { content: x, column: 3, bordered: !0, size: "small" })
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
/* @__PURE__ */ e(N.Part, { title: "执行流程", subtitle: "请求 → 响应步骤", children: p.length === 0 ? /* @__PURE__ */ e(g, { description: "无流程步骤" }) : /* @__PURE__ */ e("div", { className: l.flowWrap, children: /* @__PURE__ */ e(
|
|
178
|
+
U,
|
|
179
|
+
{
|
|
180
|
+
dataSource: p.map((c) => ({
|
|
181
|
+
title: c.title || c.stepType,
|
|
182
|
+
description: void 0,
|
|
183
|
+
status: q(c),
|
|
184
|
+
content: /* @__PURE__ */ e(V, { step: c })
|
|
185
|
+
}))
|
|
186
|
+
}
|
|
187
|
+
) }) })
|
|
188
|
+
] });
|
|
189
|
+
}, ct = ({
|
|
190
|
+
mode: t = "app",
|
|
191
|
+
dataSource: r,
|
|
192
|
+
loading: o,
|
|
193
|
+
onRowClick: a,
|
|
194
|
+
filterSlot: m,
|
|
195
|
+
pagination: p,
|
|
196
|
+
className: b
|
|
197
|
+
}) => {
|
|
198
|
+
const x = D(() => {
|
|
199
|
+
const d = [
|
|
200
|
+
{
|
|
201
|
+
title: "时间",
|
|
202
|
+
dataIndex: "createdAt",
|
|
203
|
+
width: 180,
|
|
204
|
+
render: (n) => A(n)
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
title: "类别",
|
|
208
|
+
dataIndex: "category",
|
|
209
|
+
width: 96,
|
|
210
|
+
render: (n) => M(n)
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
title: "方法",
|
|
214
|
+
dataIndex: "httpMethod",
|
|
215
|
+
width: 72,
|
|
216
|
+
render: (n) => n && String(n).trim() ? n : "—"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
title: "操作人",
|
|
220
|
+
dataIndex: "actorName",
|
|
221
|
+
width: 100,
|
|
222
|
+
ellipsis: !0,
|
|
223
|
+
render: (n) => n && String(n).trim() ? n : "—"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
title: "动作",
|
|
227
|
+
dataIndex: "action",
|
|
228
|
+
width: 160,
|
|
229
|
+
ellipsis: !0,
|
|
230
|
+
render: (n, h) => h.actionLabel || h.action
|
|
231
|
+
},
|
|
232
|
+
{ title: "摘要", dataIndex: "summary", ellipsis: !0 },
|
|
233
|
+
{
|
|
234
|
+
title: "状态",
|
|
235
|
+
dataIndex: "status",
|
|
236
|
+
width: 90,
|
|
237
|
+
render: (n) => /* @__PURE__ */ e(y, { color: v(n), children: L(n) })
|
|
238
|
+
},
|
|
239
|
+
{ title: "耗时ms", dataIndex: "durationMs", width: 80 },
|
|
240
|
+
{ title: "路径", dataIndex: "path", ellipsis: !0 }
|
|
241
|
+
];
|
|
242
|
+
return t === "platform" && d.splice(2, 0, {
|
|
243
|
+
title: "系统",
|
|
244
|
+
dataIndex: "systemAppId",
|
|
245
|
+
width: 140,
|
|
246
|
+
ellipsis: !0
|
|
247
|
+
}), d;
|
|
248
|
+
}, [t]);
|
|
249
|
+
return /* @__PURE__ */ i("div", { className: I(l.wrap, b), children: [
|
|
250
|
+
m ? /* @__PURE__ */ e("div", { className: l.filter, children: m }) : null,
|
|
251
|
+
/* @__PURE__ */ e(
|
|
252
|
+
Y,
|
|
253
|
+
{
|
|
254
|
+
rowKey: "id",
|
|
255
|
+
loading: o,
|
|
256
|
+
columns: x,
|
|
257
|
+
dataSource: r,
|
|
258
|
+
pagination: p === void 0 ? !1 : p,
|
|
259
|
+
onRow: a ? (d) => ({
|
|
260
|
+
onClick: () => a(d),
|
|
261
|
+
style: { cursor: "pointer" }
|
|
262
|
+
}) : void 0
|
|
263
|
+
}
|
|
264
|
+
)
|
|
265
|
+
] });
|
|
266
|
+
};
|
|
267
|
+
export {
|
|
268
|
+
st as AuditEventDetailView,
|
|
269
|
+
ct as AuditLogList,
|
|
270
|
+
V as AuditStepContent
|
|
271
|
+
};
|
|
272
|
+
//# sourceMappingURL=AuditLogList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLogList.js","sources":["../../../src/components/Audit/AuditLogList.tsx"],"sourcesContent":["import { CommonDescriptions } from '@/components/Descriptions';\nimport InfoPage, { Flow } from '@/components/InfoPage';\nimport { Table } from '@/components/Table';\nimport { SEMANTIC_COLORS, SemanticTag } from '@/components/Tag';\nimport { VirtualScrollbar } from '@/components/VirtualScrollbar';\nimport { copyText } from '@/utils/copyText';\nimport { Button, Empty, Space, Typography, message } from 'antd';\nimport type { ColumnsType } from 'antd/es/table';\nimport classNames from 'classnames';\nimport dayjs from 'dayjs';\nimport React, { useMemo } from 'react';\nimport { formatAuditJson, isTruncatedAuditText } from './formatAuditJson';\nimport { buildAuditReplayCurl, readBrowserReplaySession } from './formatAuditCurl';\nimport styles from './style.module.scss';\nimport type { AuditEventDetail, AuditEventListItem, AuditStep } from './types';\n\nexport type AuditLogListMode = 'app' | 'platform';\n\nexport type AuditLogListProps = {\n mode?: AuditLogListMode;\n dataSource: AuditEventListItem[];\n loading?: boolean;\n /** 点击行(进详情页) */\n onRowClick?: (row: AuditEventListItem) => void;\n filterSlot?: React.ReactNode;\n pagination?: false | object;\n className?: string;\n};\n\nfunction formatCreatedAt(iso: string): string {\n const d = dayjs(iso);\n return d.isValid() ? d.format('YYYY-MM-DD HH:mm:ss') : iso;\n}\n\nfunction statusLabel(status: string): string {\n if (status === 'success') return '成功';\n if (status === 'fail' || status === 'error') return '失败';\n return status;\n}\n\nfunction statusColor(status: string): string {\n if (status === 'success') return SEMANTIC_COLORS.SUCCESS;\n if (status === 'fail' || status === 'error') return SEMANTIC_COLORS.DANGER;\n return SEMANTIC_COLORS.DEFAULT;\n}\n\nfunction stepFlowStatus(s: AuditStep): string {\n if (s.stepType === 'ERROR' || s.status === 'error') return 'error';\n if (s.status === 'process' || s.status === 'processing') return 'process';\n if (s.status === 'wait') return 'wait';\n return 'finish';\n}\n\nfunction categoryLabel(c?: string | null): string {\n if (c === 'TRACE') return '请求线路';\n if (c === 'SYSTEM') return '系统';\n if (c === 'OPERATION' || !c) return '业务操作';\n return c;\n}\n\nfunction httpStatusColor(code: number): string {\n if (code >= 500) return SEMANTIC_COLORS.DANGER;\n if (code >= 400) return SEMANTIC_COLORS.WARNING;\n if (code >= 200 && code < 300) return SEMANTIC_COLORS.SUCCESS;\n return SEMANTIC_COLORS.DEFAULT;\n}\n\nfunction parseHttpStatus(output: unknown): number | null {\n if (!output || typeof output !== 'object' || Array.isArray(output)) return null;\n const v = (output as { httpStatus?: unknown }).httpStatus;\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n if (v != null && String(v).trim() !== '') {\n const n = Number(v);\n return Number.isFinite(n) ? n : null;\n }\n return null;\n}\n\nconst JsonBlock: React.FC<{ value: unknown; maxHeight?: number }> = ({\n value,\n maxHeight = 360,\n}) => {\n const text = formatAuditJson(value);\n const truncated = isTruncatedAuditText(value) || text.includes('…[truncated]');\n return (\n <div className={styles.jsonWrap}>\n {truncated ? (\n <div className={styles.truncateHint}>内容已截断(采集侧 body 上限),以下为可读展开</div>\n ) : null}\n <VirtualScrollbar className={styles.jsonScroll} style={{ maxHeight }}>\n <pre className={styles.jsonBlock}>{text}</pre>\n </VirtualScrollbar>\n </div>\n );\n};\n\nfunction renderBody(label: string, value: unknown): React.ReactNode {\n if (value == null) return null;\n if (\n label === 'output' &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n value !== null &&\n ('httpStatus' in (value as object) || 'body' in (value as object))\n ) {\n const out = value as { body?: unknown; [k: string]: unknown };\n const rest = { ...out };\n delete rest.httpStatus;\n delete rest.body;\n const hasRest = Object.keys(rest).length > 0;\n return (\n <>\n {out.body !== undefined ? (\n <>\n <div className={styles.blockLabel}>响应体</div>\n <JsonBlock value={out.body} maxHeight={420} />\n </>\n ) : null}\n {hasRest ? (\n <>\n <div className={styles.blockLabel}>其它</div>\n <JsonBlock value={rest} />\n </>\n ) : null}\n </>\n );\n }\n return (\n <>\n <div className={styles.blockLabel}>{label}</div>\n <JsonBlock value={value} />\n </>\n );\n}\n\nexport const AuditStepContent: React.FC<{ step: AuditStep }> = ({ step }) => {\n const httpStatus = parseHttpStatus(step.output);\n return (\n <div className={styles.stepBody}>\n <div className={styles.stepMeta}>\n {step.stepType ? (\n <SemanticTag color={SEMANTIC_COLORS.DEFAULT}>{step.stepType}</SemanticTag>\n ) : null}\n {httpStatus != null ? (\n <SemanticTag color={httpStatusColor(httpStatus)}>HTTP {httpStatus}</SemanticTag>\n ) : null}\n {step.occurredAt ? (\n <Typography.Text type=\"secondary\">{formatCreatedAt(step.occurredAt)}</Typography.Text>\n ) : null}\n {typeof step.durationMs === 'number' ? (\n <Typography.Text type=\"secondary\">{step.durationMs} ms</Typography.Text>\n ) : null}\n </div>\n {step.sqlText ? (\n <>\n <div className={styles.blockLabel}>SQL</div>\n <VirtualScrollbar className={styles.jsonScroll} style={{ maxHeight: 200 }}>\n <pre className={styles.jsonBlock}>{step.sqlText}</pre>\n </VirtualScrollbar>\n </>\n ) : null}\n {step.tables?.length ? (\n <Typography.Text type=\"secondary\">表:{step.tables.join(', ')}</Typography.Text>\n ) : null}\n {step.errorMessage ? (\n <Typography.Text type=\"danger\">{step.errorMessage}</Typography.Text>\n ) : null}\n {step.errorCode ? (\n <Typography.Text type=\"secondary\">错误码:{step.errorCode}</Typography.Text>\n ) : null}\n {step.input != null ? renderBody('请求体', step.input) : null}\n {step.output != null ? renderBody('output', step.output) : null}\n </div>\n );\n};\n\n/** 审计事件详情:InfoPage + CommonDescriptions + Flow */\nexport const AuditEventDetailView: React.FC<{\n detail: AuditEventDetail | null;\n loading?: boolean;\n emptyDescription?: string;\n className?: string;\n /** 当前登录 token(不含 Bearer 前缀亦可);复制 curl 用,不落库 */\n getAuthToken?: () => string | null | undefined;\n}> = ({ detail, loading, emptyDescription = '暂无明细', className, getAuthToken }) => {\n if (loading) {\n return <Typography.Text type=\"secondary\">加载中…</Typography.Text>;\n }\n if (!detail) {\n return <Empty description={emptyDescription} />;\n }\n const steps = detail.steps || [];\n const title = detail.actionLabel || detail.action;\n\n const descContent = [\n {\n label: '操作人',\n value: detail.actorName?.trim() ? detail.actorName : '—',\n },\n { label: '时间', value: formatCreatedAt(detail.createdAt) },\n {\n label: '方法',\n value: detail.httpMethod?.trim() ? detail.httpMethod : '—',\n },\n {\n label: '状态',\n value: (\n <SemanticTag color={statusColor(detail.status)}>{statusLabel(detail.status)}</SemanticTag>\n ),\n },\n {\n label: '类别',\n value: detail.category ? categoryLabel(detail.category) : '—',\n },\n {\n label: '耗时',\n value: typeof detail.durationMs === 'number' ? `${detail.durationMs} ms` : '—',\n },\n {\n label: '路径',\n value: detail.path?.trim() ? (\n <Typography.Text code copyable={{ text: detail.path }}>\n {detail.path}\n </Typography.Text>\n ) : (\n '—'\n ),\n span: 2,\n },\n {\n label: 'traceId',\n value: detail.traceId ? (\n <Typography.Text copyable={{ text: detail.traceId }}>{detail.traceId}</Typography.Text>\n ) : (\n '—'\n ),\n span: 1,\n },\n ...(detail.actionLabel\n ? [{ label: '动作码', value: <Typography.Text code>{detail.action}</Typography.Text> }]\n : []),\n ];\n\n return (\n <InfoPage className={classNames(styles.detail, className)}>\n <InfoPage.Part\n title={\n <Space size={8} wrap>\n <span>{title}</span>\n {detail.actionLabel ? (\n <Typography.Text type=\"secondary\" className={styles.actionCode}>\n {detail.action}\n </Typography.Text>\n ) : null}\n </Space>\n }\n subtitle=\"事件摘要\"\n extra={\n detail.path || detail.requestCurl ? (\n <Button\n size=\"small\"\n type=\"primary\"\n onClick={async () => {\n try {\n const text = buildAuditReplayCurl(detail, readBrowserReplaySession(getAuthToken));\n const ok = await copyText(text);\n if (ok) message.success('已复制 curl');\n else message.error('复制失败');\n } catch (e) {\n message.error(e instanceof Error ? e.message : '无法生成 curl');\n }\n }}\n >\n 复制 curl\n </Button>\n ) : undefined\n }\n >\n <CommonDescriptions content={descContent} column={3} bordered size=\"small\" />\n </InfoPage.Part>\n\n <InfoPage.Part title=\"执行流程\" subtitle=\"请求 → 响应步骤\">\n {steps.length === 0 ? (\n <Empty description=\"无流程步骤\" />\n ) : (\n <div className={styles.flowWrap}>\n <Flow\n dataSource={steps.map((s) => ({\n title: s.title || s.stepType,\n description: undefined,\n status: stepFlowStatus(s),\n content: <AuditStepContent step={s} />,\n }))}\n />\n </div>\n )}\n </InfoPage.Part>\n </InfoPage>\n );\n};\n\nexport const AuditLogList: React.FC<AuditLogListProps> = ({\n mode = 'app',\n dataSource,\n loading,\n onRowClick,\n filterSlot,\n pagination,\n className,\n}) => {\n const columns: ColumnsType<AuditEventListItem> = useMemo(() => {\n const cols: ColumnsType<AuditEventListItem> = [\n {\n title: '时间',\n dataIndex: 'createdAt',\n width: 180,\n render: (v: string) => formatCreatedAt(v),\n },\n {\n title: '类别',\n dataIndex: 'category',\n width: 96,\n render: (v: string | undefined) => categoryLabel(v),\n },\n {\n title: '方法',\n dataIndex: 'httpMethod',\n width: 72,\n render: (v: string | null | undefined) => (v && String(v).trim() ? v : '—'),\n },\n {\n title: '操作人',\n dataIndex: 'actorName',\n width: 100,\n ellipsis: true,\n render: (v: string | null | undefined) => (v && String(v).trim() ? v : '—'),\n },\n {\n title: '动作',\n dataIndex: 'action',\n width: 160,\n ellipsis: true,\n render: (_: unknown, row) => row.actionLabel || row.action,\n },\n { title: '摘要', dataIndex: 'summary', ellipsis: true },\n {\n title: '状态',\n dataIndex: 'status',\n width: 90,\n render: (v: string) => <SemanticTag color={statusColor(v)}>{statusLabel(v)}</SemanticTag>,\n },\n { title: '耗时ms', dataIndex: 'durationMs', width: 80 },\n { title: '路径', dataIndex: 'path', ellipsis: true },\n ];\n if (mode === 'platform') {\n cols.splice(2, 0, {\n title: '系统',\n dataIndex: 'systemAppId',\n width: 140,\n ellipsis: true,\n });\n }\n return cols;\n }, [mode]);\n\n return (\n <div className={classNames(styles.wrap, className)}>\n {filterSlot ? <div className={styles.filter}>{filterSlot}</div> : null}\n <Table<AuditEventListItem>\n rowKey=\"id\"\n loading={loading}\n columns={columns}\n dataSource={dataSource}\n pagination={pagination === undefined ? false : pagination}\n onRow={\n onRowClick\n ? (record) => ({\n onClick: () => onRowClick(record),\n style: { cursor: 'pointer' },\n })\n : undefined\n }\n />\n </div>\n );\n};\n\nexport default AuditLogList;\n"],"names":["formatCreatedAt","iso","d","dayjs","statusLabel","status","statusColor","SEMANTIC_COLORS","stepFlowStatus","s","categoryLabel","c","httpStatusColor","code","parseHttpStatus","output","v","n","JsonBlock","value","maxHeight","text","formatAuditJson","truncated","isTruncatedAuditText","jsxs","styles","jsx","VirtualScrollbar","renderBody","label","out","rest","hasRest","Fragment","AuditStepContent","step","httpStatus","SemanticTag","Typography","_a","AuditEventDetailView","detail","loading","emptyDescription","className","getAuthToken","Empty","steps","title","descContent","_b","_c","InfoPage","classNames","Space","Button","buildAuditReplayCurl","readBrowserReplaySession","copyText","message","e","CommonDescriptions","Flow","AuditLogList","mode","dataSource","onRowClick","filterSlot","pagination","columns","useMemo","cols","_","row","Table","record"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器「Copy as cURL」风格:用当前页 origin + 当前登录态拼可执行命令。
|
|
3
|
+
* 库内 requestCurl 仍脱敏,复制时不回读落库 token。
|
|
4
|
+
*/
|
|
5
|
+
export type AuditReplayDetail = {
|
|
6
|
+
httpMethod?: string | null;
|
|
7
|
+
path?: string | null;
|
|
8
|
+
requestCurl?: string | null;
|
|
9
|
+
steps?: Array<{
|
|
10
|
+
stepType?: string;
|
|
11
|
+
input?: unknown;
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
export type AuditReplaySession = {
|
|
15
|
+
origin: string;
|
|
16
|
+
authorization?: string | null;
|
|
17
|
+
cookie?: string | null;
|
|
18
|
+
userAgent?: string | null;
|
|
19
|
+
acceptLanguage?: string | null;
|
|
20
|
+
referer?: string | null;
|
|
21
|
+
};
|
|
22
|
+
export declare function resolveReplayPath(detail: AuditReplayDetail): string | undefined;
|
|
23
|
+
export declare function resolveReplayMethod(detail: AuditReplayDetail): string;
|
|
24
|
+
export declare function resolveReplayBody(detail: AuditReplayDetail): string | undefined;
|
|
25
|
+
/** Chrome Copy as cURL(bash)形态;可直接粘贴。 */
|
|
26
|
+
export declare function buildAuditReplayCurl(detail: AuditReplayDetail, session: AuditReplaySession): string;
|
|
27
|
+
export declare function readBrowserReplaySession(getToken?: () => string | null | undefined): AuditReplaySession;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
function a(r) {
|
|
2
|
+
return `'${r.replace(/'/g, "'\\''")}'`;
|
|
3
|
+
}
|
|
4
|
+
function $(r) {
|
|
5
|
+
if (r != null) {
|
|
6
|
+
if (typeof r == "string")
|
|
7
|
+
return r.trim() || void 0;
|
|
8
|
+
try {
|
|
9
|
+
return JSON.stringify(r);
|
|
10
|
+
} catch {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function S(r) {
|
|
16
|
+
const t = r.match(/https?:\/\/[^/\s']+(\/[^'\s]*)/);
|
|
17
|
+
if (t != null && t[1])
|
|
18
|
+
try {
|
|
19
|
+
return new URL(t[0]).pathname + new URL(t[0]).search;
|
|
20
|
+
} catch {
|
|
21
|
+
return t[1];
|
|
22
|
+
}
|
|
23
|
+
const e = r.match(/'(?:https?:\/\/[^']+)?(\/[^']*)'/);
|
|
24
|
+
return e == null ? void 0 : e[1];
|
|
25
|
+
}
|
|
26
|
+
function A(r) {
|
|
27
|
+
const t = r.match(/curl\s+(?:-X|--request)\s+(\w+)/i);
|
|
28
|
+
return t == null ? void 0 : t[1];
|
|
29
|
+
}
|
|
30
|
+
function L(r) {
|
|
31
|
+
const t = r.match(/--data(?:-raw)?\s+'((?:\\'|[^'])*)'/);
|
|
32
|
+
if (t != null && t[1])
|
|
33
|
+
return t[1].replace(/'\\''/g, "'");
|
|
34
|
+
}
|
|
35
|
+
function R(r) {
|
|
36
|
+
var e;
|
|
37
|
+
const t = (e = r.path) == null ? void 0 : e.trim();
|
|
38
|
+
if (t) {
|
|
39
|
+
if (t.startsWith("http://") || t.startsWith("https://"))
|
|
40
|
+
try {
|
|
41
|
+
const o = new URL(t);
|
|
42
|
+
return o.pathname + o.search;
|
|
43
|
+
} catch {
|
|
44
|
+
return t;
|
|
45
|
+
}
|
|
46
|
+
return t.startsWith("/") ? t : `/${t}`;
|
|
47
|
+
}
|
|
48
|
+
if (r.requestCurl) return S(r.requestCurl);
|
|
49
|
+
}
|
|
50
|
+
function q(r) {
|
|
51
|
+
var e;
|
|
52
|
+
const t = (e = r.httpMethod) == null ? void 0 : e.trim();
|
|
53
|
+
if (t) return t.toUpperCase();
|
|
54
|
+
if (r.requestCurl) {
|
|
55
|
+
const o = A(r.requestCurl);
|
|
56
|
+
if (o) return o.toUpperCase();
|
|
57
|
+
}
|
|
58
|
+
return "GET";
|
|
59
|
+
}
|
|
60
|
+
function U(r) {
|
|
61
|
+
const t = (r.steps || []).find((o) => String(o.stepType).toUpperCase() === "REQUEST"), e = $(t == null ? void 0 : t.input);
|
|
62
|
+
if (e) return e;
|
|
63
|
+
if (r.requestCurl) return L(r.requestCurl);
|
|
64
|
+
}
|
|
65
|
+
function i(r, t) {
|
|
66
|
+
return ` -H ${a(`${r}: ${t}`)} \\`;
|
|
67
|
+
}
|
|
68
|
+
function z(r, t) {
|
|
69
|
+
var l, f, g, d, m;
|
|
70
|
+
const e = R(r);
|
|
71
|
+
if (!e)
|
|
72
|
+
throw new Error("无请求路径,无法生成 curl");
|
|
73
|
+
const o = t.origin.replace(/\/$/, ""), C = `${o}${e}`, s = q(r), h = s === "GET" || s === "HEAD" ? void 0 : U(r), y = ((l = t.acceptLanguage) == null ? void 0 : l.trim()) || "zh-CN,zh;q=0.9", w = ((f = t.userAgent) == null ? void 0 : f.trim()) || "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36", v = ((g = t.referer) == null ? void 0 : g.trim()) || `${o}/`, n = [
|
|
74
|
+
`curl --url ${a(C)} \\`,
|
|
75
|
+
` -X ${s} \\`,
|
|
76
|
+
i("Accept", "application/json, text/plain, */*"),
|
|
77
|
+
i("Accept-Language", y)
|
|
78
|
+
], c = (d = t.authorization) == null ? void 0 : d.trim();
|
|
79
|
+
if (c) {
|
|
80
|
+
const u = c.toLowerCase().startsWith("bearer ") ? c : `Bearer ${c}`;
|
|
81
|
+
n.push(i("Authorization", u));
|
|
82
|
+
}
|
|
83
|
+
n.push(i("Connection", "keep-alive")), h && n.push(i("Content-Type", "application/json"));
|
|
84
|
+
const p = (m = t.cookie) == null ? void 0 : m.trim();
|
|
85
|
+
if (p && n.push(` -b ${a(p)} \\`), n.push(i("Origin", o)), n.push(i("Referer", v)), n.push(i("Sec-Fetch-Dest", "empty")), n.push(i("Sec-Fetch-Mode", "cors")), n.push(i("Sec-Fetch-Site", "same-origin")), n.push(i("User-Agent", w)), h)
|
|
86
|
+
n.push(` --data-raw ${a(h)}`);
|
|
87
|
+
else {
|
|
88
|
+
const u = n.length ? n[n.length - 1] : void 0;
|
|
89
|
+
typeof u == "string" && u.endsWith(" \\") && (n[n.length - 1] = u.slice(0, -2));
|
|
90
|
+
}
|
|
91
|
+
return n.join(`
|
|
92
|
+
`);
|
|
93
|
+
}
|
|
94
|
+
function M(r) {
|
|
95
|
+
var e;
|
|
96
|
+
if (typeof window > "u")
|
|
97
|
+
return { origin: "" };
|
|
98
|
+
const t = (e = r == null ? void 0 : r()) == null ? void 0 : e.trim();
|
|
99
|
+
return {
|
|
100
|
+
origin: window.location.origin,
|
|
101
|
+
authorization: t ? t.toLowerCase().startsWith("bearer ") ? t : `Bearer ${t}` : null,
|
|
102
|
+
cookie: document.cookie || null,
|
|
103
|
+
userAgent: navigator.userAgent || null,
|
|
104
|
+
acceptLanguage: navigator.language ? `${navigator.language},zh;q=0.9` : null,
|
|
105
|
+
referer: window.location.href
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export {
|
|
109
|
+
z as buildAuditReplayCurl,
|
|
110
|
+
M as readBrowserReplaySession,
|
|
111
|
+
U as resolveReplayBody,
|
|
112
|
+
q as resolveReplayMethod,
|
|
113
|
+
R as resolveReplayPath
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=formatAuditCurl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatAuditCurl.js","sources":["../../../src/components/Audit/formatAuditCurl.ts"],"sourcesContent":["/**\n * 浏览器「Copy as cURL」风格:用当前页 origin + 当前登录态拼可执行命令。\n * 库内 requestCurl 仍脱敏,复制时不回读落库 token。\n */\n\nexport type AuditReplayDetail = {\n httpMethod?: string | null;\n path?: string | null;\n requestCurl?: string | null;\n steps?: Array<{ stepType?: string; input?: unknown }>;\n};\n\nexport type AuditReplaySession = {\n origin: string;\n authorization?: string | null;\n cookie?: string | null;\n userAgent?: string | null;\n acceptLanguage?: string | null;\n referer?: string | null;\n};\n\nfunction shellSingleQuote(s: string): string {\n return `'${s.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction compactJsonBody(input: unknown): string | undefined {\n if (input == null) return undefined;\n if (typeof input === 'string') {\n const t = input.trim();\n return t || undefined;\n }\n try {\n return JSON.stringify(input);\n } catch {\n return undefined;\n }\n}\n\nfunction pathFromStoredCurl(curl: string): string | undefined {\n const abs = curl.match(/https?:\\/\\/[^/\\s']+(\\/[^'\\s]*)/);\n if (abs?.[1]) {\n try {\n return new URL(abs[0]).pathname + new URL(abs[0]).search;\n } catch {\n return abs[1];\n }\n }\n const rel = curl.match(/'(?:https?:\\/\\/[^']+)?(\\/[^']*)'/);\n return rel?.[1];\n}\n\nfunction methodFromStoredCurl(curl: string): string | undefined {\n const m = curl.match(/curl\\s+(?:-X|--request)\\s+(\\w+)/i);\n return m?.[1];\n}\n\nfunction bodyFromStoredCurl(curl: string): string | undefined {\n const m = curl.match(/--data(?:-raw)?\\s+'((?:\\\\'|[^'])*)'/);\n if (!m?.[1]) return undefined;\n return m[1].replace(/'\\\\''/g, \"'\");\n}\n\nexport function resolveReplayPath(detail: AuditReplayDetail): string | undefined {\n const p = detail.path?.trim();\n if (p) {\n if (p.startsWith('http://') || p.startsWith('https://')) {\n try {\n const u = new URL(p);\n return u.pathname + u.search;\n } catch {\n return p;\n }\n }\n return p.startsWith('/') ? p : `/${p}`;\n }\n if (detail.requestCurl) return pathFromStoredCurl(detail.requestCurl);\n return undefined;\n}\n\nexport function resolveReplayMethod(detail: AuditReplayDetail): string {\n const m = detail.httpMethod?.trim();\n if (m) return m.toUpperCase();\n if (detail.requestCurl) {\n const fromCurl = methodFromStoredCurl(detail.requestCurl);\n if (fromCurl) return fromCurl.toUpperCase();\n }\n return 'GET';\n}\n\nexport function resolveReplayBody(detail: AuditReplayDetail): string | undefined {\n const req = (detail.steps || []).find((s) => String(s.stepType).toUpperCase() === 'REQUEST');\n const fromStep = compactJsonBody(req?.input);\n if (fromStep) return fromStep;\n if (detail.requestCurl) return bodyFromStoredCurl(detail.requestCurl);\n return undefined;\n}\n\nfunction headerLine(name: string, value: string): string {\n return ` -H ${shellSingleQuote(`${name}: ${value}`)} \\\\`;\n}\n\n/** Chrome Copy as cURL(bash)形态;可直接粘贴。 */\nexport function buildAuditReplayCurl(\n detail: AuditReplayDetail,\n session: AuditReplaySession,\n): string {\n const path = resolveReplayPath(detail);\n if (!path) {\n throw new Error('无请求路径,无法生成 curl');\n }\n const origin = session.origin.replace(/\\/$/, '');\n const url = `${origin}${path}`;\n const method = resolveReplayMethod(detail);\n const body = method === 'GET' || method === 'HEAD' ? undefined : resolveReplayBody(detail);\n const lang = session.acceptLanguage?.trim() || 'zh-CN,zh;q=0.9';\n const ua =\n session.userAgent?.trim() ||\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36';\n const referer = session.referer?.trim() || `${origin}/`;\n const lines: string[] = [\n `curl --url ${shellSingleQuote(url)} \\\\`,\n ` -X ${method} \\\\`,\n headerLine('Accept', 'application/json, text/plain, */*'),\n headerLine('Accept-Language', lang),\n ];\n const auth = session.authorization?.trim();\n if (auth) {\n const value = auth.toLowerCase().startsWith('bearer ') ? auth : `Bearer ${auth}`;\n lines.push(headerLine('Authorization', value));\n }\n lines.push(headerLine('Connection', 'keep-alive'));\n if (body) {\n lines.push(headerLine('Content-Type', 'application/json'));\n }\n const cookie = session.cookie?.trim();\n if (cookie) {\n lines.push(` -b ${shellSingleQuote(cookie)} \\\\`);\n }\n lines.push(headerLine('Origin', origin));\n lines.push(headerLine('Referer', referer));\n lines.push(headerLine('Sec-Fetch-Dest', 'empty'));\n lines.push(headerLine('Sec-Fetch-Mode', 'cors'));\n lines.push(headerLine('Sec-Fetch-Site', 'same-origin'));\n lines.push(headerLine('User-Agent', ua));\n if (body) {\n lines.push(` --data-raw ${shellSingleQuote(body)}`);\n } else {\n const last = lines.length ? lines[lines.length - 1] : undefined;\n if (typeof last === 'string' && last.endsWith(' \\\\')) {\n lines[lines.length - 1] = last.slice(0, -2);\n }\n }\n return lines.join('\\n');\n}\n\nexport function readBrowserReplaySession(\n getToken?: () => string | null | undefined,\n): AuditReplaySession {\n if (typeof window === 'undefined') {\n return { origin: '' };\n }\n const token = getToken?.()?.trim();\n return {\n origin: window.location.origin,\n authorization: token\n ? token.toLowerCase().startsWith('bearer ')\n ? token\n : `Bearer ${token}`\n : null,\n cookie: document.cookie || null,\n userAgent: navigator.userAgent || null,\n acceptLanguage: navigator.language ? `${navigator.language},zh;q=0.9` : null,\n referer: window.location.href,\n };\n}\n"],"names":["shellSingleQuote","s","compactJsonBody","input","pathFromStoredCurl","curl","abs","rel","methodFromStoredCurl","m","bodyFromStoredCurl","resolveReplayPath","detail","_a","p","u","resolveReplayMethod","fromCurl","resolveReplayBody","req","fromStep","headerLine","name","value","buildAuditReplayCurl","session","_b","_c","_d","_e","path","origin","url","method","body","lang","ua","referer","lines","auth","cookie","last","readBrowserReplaySession","getToken","token"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 审计步骤里常见「body 为 JSON 字符串」或双层转义;展示前递归解包再 pretty-print。
|
|
3
|
+
* 截断串(…[truncated])尽量修复括号后再格式化;**禁止**对纯字符串再 JSON.stringify(会多包一层引号/转义)。
|
|
4
|
+
*/
|
|
5
|
+
export declare function isTruncatedAuditText(value: unknown): boolean;
|
|
6
|
+
export declare function unwrapAuditJson(value: unknown, depth?: number): unknown;
|
|
7
|
+
/** 尽量闭合截断 JSON 的括号/引号,便于 parse */
|
|
8
|
+
export declare function repairTruncatedJson(raw: string): string;
|
|
9
|
+
/** 无法 parse 时的轻量缩进(不包外层引号) */
|
|
10
|
+
export declare function indentJsonLike(s: string): string;
|
|
11
|
+
export declare function formatAuditJson(value: unknown): string;
|
|
12
|
+
/**
|
|
13
|
+
* 复制到 bash:修复历史粘连 header,Authorization 占位(禁止落真实 token)。
|
|
14
|
+
*/
|
|
15
|
+
export declare function sanitizeAuditCurl(raw: string): string;
|