fmode-ng 0.0.113 → 0.0.115
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/LICENSE.md +8 -0
- package/README.md +37 -37
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
- package/esm2022/lib/aigc/agent/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
- package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
- package/esm2022/lib/aigc/index.mjs +10 -14
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
- package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
- package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
- package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
- package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
- package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
- package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
- package/esm2022/lib/aigc/story/index.mjs +10 -6
- package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
- package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
- package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
- package/esm2022/lib/aigc/story/story.service.mjs +10 -35
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
- package/esm2022/lib/aigc/voice/index.mjs +10 -7
- package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
- package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
- package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
- package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
- package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
- package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
- package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
- package/esm2022/lib/code/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
- package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
- package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
- package/esm2022/lib/core/agent/chat/index.mjs +10 -4
- package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
- package/esm2022/lib/core/agent/index.mjs +10 -6
- package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
- package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
- package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
- package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
- package/esm2022/lib/core/agent/story/index.mjs +10 -2
- package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
- package/esm2022/lib/core/agent/task/index.mjs +10 -2
- package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
- package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
- package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
- package/esm2022/lib/core/index.mjs +10 -4
- package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
- package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
- package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
- package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
- package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
- package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
- package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
- package/esm2022/lib/core/parse/index.mjs +10 -5
- package/esm2022/lib/core/parse/types.mjs +10 -2
- package/esm2022/lib/core/voice/index.mjs +10 -3
- package/esm2022/lib/core/voice/tts/index.mjs +10 -2
- package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
- package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
- package/esm2022/lib/icon/filetype/index.mjs +10 -12
- package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
- package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
- package/esm2022/lib/icon/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
- package/esm2022/lib/nova-cloud/index.mjs +10 -3
- package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
- package/esm2022/lib/payment/index.mjs +10 -2
- package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
- package/esm2022/lib/payment/payment.service.mjs +10 -202
- package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
- package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
- package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
- package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
- package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
- package/esm2022/lib/person/index.mjs +10 -5
- package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
- package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
- package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
- package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
- package/esm2022/lib/person/person.service.mjs +8 -193
- package/esm2022/lib/platform/cross.service.mjs +10 -62
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
- package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
- package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
- package/esm2022/lib/storage/storage.module.mjs +10 -42
- package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
- package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
- package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
- package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
- package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
- package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
- package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
- package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
- package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
- package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
- package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
- package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
- package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
- package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
- package/esm2022/lib/text/index.mjs +10 -4
- package/esm2022/lib/user/account/account.service.mjs +10 -222
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -433
- package/esm2022/lib/user/login/login.component.mjs +10 -916
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
- package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
- package/esm2022/lib/user/profile/profile.module.mjs +10 -54
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -102
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -21
- package/fesm2022/fmode-ng.mjs +7 -19788
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
- package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
- package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
- package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
- package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
- package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
- package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
- package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
- package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
- package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
- package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
- package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
- package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
- package/lib/aigc/story/story.service.d.ts +3 -2
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
- package/lib/core/agent/story/agent.story.d.ts +8 -8
- package/lib/core/parse/datatype/geopoint.d.ts +5 -1
- package/lib/core/parse/fmode.cloud.d.ts +32 -0
- package/lib/core/parse/fmode.object.d.ts +2 -2
- package/lib/core/parse/fmode.parse.d.ts +15 -9
- package/lib/core/parse/fmode.query.d.ts +41 -2
- package/lib/core/parse/fmode.user.d.ts +1 -0
- package/lib/core/parse/index.d.ts +1 -0
- package/lib/core/parse/types.d.ts +2 -0
- package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
- package/lib/payment/payment/payment.component.d.ts +3 -3
- package/lib/payment/payment.service.d.ts +4 -4
- package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
- package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
- package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
- package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
- package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
- package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
- package/lib/person/person-detail/person-detail.component.d.ts +4 -4
- package/lib/person/person.service.d.ts +7 -7
- package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
- package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
- package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
- package/lib/text/fm-article-editor/article.service.d.ts +12 -12
- package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
- package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
- package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
- package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
- package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
- package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
- package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
- package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
- package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
- package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
- package/lib/user/account/account.service.d.ts +2 -2
- package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
- package/lib/user/login/auth.service.d.ts +5 -5
- package/lib/user/login/login.component.d.ts +3 -3
- package/lib/user/profile/auth-profile.service.d.ts +8 -8
- package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
- package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
- package/lib/user/staff/staff.service.d.ts +3 -3
- package/lib/user/user-name.pipe.d.ts +2 -2
- package/package.json +12 -18
|
@@ -1,344 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
-
import { EditorView, basicSetup } from 'codemirror';
|
|
4
|
-
import { Compartment } from '@codemirror/state';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
function normalizeLineEndings(str) {
|
|
7
|
-
if (!str) {
|
|
8
|
-
return str;
|
|
9
|
-
}
|
|
10
|
-
return str.replace(/\r\n|\r/g, '\n');
|
|
11
|
-
}
|
|
12
|
-
export class CodemirrorComponent {
|
|
1
|
+
|
|
13
2
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs
|
|
16
7
|
*/
|
|
17
|
-
set extensions(value) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
this._differ = this._differs.find(value).create();
|
|
21
|
-
}
|
|
22
|
-
this.reconfigureEditor();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Legacy options support - converts common v5 options to v6 extensions
|
|
26
|
-
*/
|
|
27
|
-
set options(value) {
|
|
28
|
-
this._options = value;
|
|
29
|
-
this._extensions = this.convertOptionsToExtensions(value);
|
|
30
|
-
if (!this._differ && value) {
|
|
31
|
-
this._differ = this._differs.find(value).create();
|
|
32
|
-
}
|
|
33
|
-
this.reconfigureEditor();
|
|
34
|
-
}
|
|
35
|
-
constructor(_differs, _ngZone) {
|
|
36
|
-
this._differs = _differs;
|
|
37
|
-
this._ngZone = _ngZone;
|
|
38
|
-
/* class applied to the created container */
|
|
39
|
-
this.className = '';
|
|
40
|
-
/* name applied to the editor (for form purposes) */
|
|
41
|
-
this.name = 'codemirror';
|
|
42
|
-
/* autofocus setting applied to the editor */
|
|
43
|
-
this.autoFocus = false;
|
|
44
|
-
/* preserve previous scroll position after updating value */
|
|
45
|
-
this.preserveScrollPosition = false;
|
|
46
|
-
/* called when the text cursor is moved */
|
|
47
|
-
this.cursorActivity = new EventEmitter();
|
|
48
|
-
/* called when the editor is focused or loses focus */
|
|
49
|
-
this.focusChange = new EventEmitter();
|
|
50
|
-
/* called when the editor is scrolled */
|
|
51
|
-
this.scroll = new EventEmitter();
|
|
52
|
-
/* called when file(s) are dropped */
|
|
53
|
-
this.drop = new EventEmitter();
|
|
54
|
-
/* called when codeMirror instance is initiated on the component */
|
|
55
|
-
this.codeMirrorLoaded = new EventEmitter();
|
|
56
|
-
this.value = '';
|
|
57
|
-
this.disabled = false;
|
|
58
|
-
this.isFocused = false;
|
|
59
|
-
this._options = {};
|
|
60
|
-
this._extensions = [];
|
|
61
|
-
this.extensionsCompartment = new Compartment();
|
|
62
|
-
this.readOnlyCompartment = new Compartment();
|
|
63
|
-
/** Implemented as part of ControlValueAccessor. */
|
|
64
|
-
this.onChange = (_) => { };
|
|
65
|
-
/** Implemented as part of ControlValueAccessor. */
|
|
66
|
-
this.onTouched = () => { };
|
|
67
|
-
}
|
|
68
|
-
ngAfterViewInit() {
|
|
69
|
-
this._ngZone.runOutsideAngular(() => {
|
|
70
|
-
this.initializeEditor();
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
async initializeEditor() {
|
|
74
|
-
const { EditorView } = await import('codemirror');
|
|
75
|
-
const { EditorState } = await import('@codemirror/state');
|
|
76
|
-
const extensions = [
|
|
77
|
-
basicSetup,
|
|
78
|
-
this.extensionsCompartment.of(this._extensions),
|
|
79
|
-
this.readOnlyCompartment.of(this.disabled ? EditorState.readOnly.of(true) : []),
|
|
80
|
-
this.createUpdateListener(),
|
|
81
|
-
this.createFocusExtension(),
|
|
82
|
-
this.createScrollExtension(),
|
|
83
|
-
this.createDropExtension(),
|
|
84
|
-
];
|
|
85
|
-
const state = EditorState.create({
|
|
86
|
-
doc: this.value,
|
|
87
|
-
extensions,
|
|
88
|
-
});
|
|
89
|
-
this.editorView = new EditorView({
|
|
90
|
-
state,
|
|
91
|
-
parent: this.ref.nativeElement,
|
|
92
|
-
});
|
|
93
|
-
if (this.autoFocus) {
|
|
94
|
-
this.editorView.focus();
|
|
95
|
-
}
|
|
96
|
-
this._ngZone.run(() => {
|
|
97
|
-
this.codeMirrorLoaded.emit(this);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
createUpdateListener() {
|
|
101
|
-
return EditorView.updateListener.of((update) => {
|
|
102
|
-
if (update.docChanged) {
|
|
103
|
-
this._ngZone.run(() => {
|
|
104
|
-
this.codemirrorValueChanged(update.view);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
if (update.selectionSet) {
|
|
108
|
-
this._ngZone.run(() => {
|
|
109
|
-
this.cursorActive(update.view);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
createFocusExtension() {
|
|
115
|
-
return EditorView.domEventHandlers({
|
|
116
|
-
focus: () => {
|
|
117
|
-
this._ngZone.run(() => this.focusChanged(true));
|
|
118
|
-
return false;
|
|
119
|
-
},
|
|
120
|
-
blur: () => {
|
|
121
|
-
this._ngZone.run(() => this.focusChanged(false));
|
|
122
|
-
return false;
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
createScrollExtension() {
|
|
127
|
-
return EditorView.domEventHandlers({
|
|
128
|
-
scroll: (event, view) => {
|
|
129
|
-
this._ngZone.run(() => this.scrollChanged(view));
|
|
130
|
-
return false;
|
|
131
|
-
},
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
createDropExtension() {
|
|
135
|
-
return EditorView.domEventHandlers({
|
|
136
|
-
drop: (event, view) => {
|
|
137
|
-
this._ngZone.run(() => this.dropFiles(view, event));
|
|
138
|
-
return false;
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
convertOptionsToExtensions(options) {
|
|
143
|
-
const extensions = [];
|
|
144
|
-
if (!options)
|
|
145
|
-
return extensions;
|
|
146
|
-
// Handle common v5 options and convert to v6 extensions
|
|
147
|
-
if (options.mode) {
|
|
148
|
-
// Language mode conversion would need specific language packages
|
|
149
|
-
// This is a simplified example - you'd need to import specific language packages
|
|
150
|
-
// extensions.push(javascript()); // for JavaScript mode
|
|
151
|
-
}
|
|
152
|
-
if (options.theme) {
|
|
153
|
-
// Theme conversion would need specific theme packages
|
|
154
|
-
// extensions.push(oneDark); // for dark theme example
|
|
155
|
-
}
|
|
156
|
-
if (options.lineNumbers === false) {
|
|
157
|
-
// Remove line numbers from basicSetup if needed
|
|
158
|
-
}
|
|
159
|
-
// readOnly is handled separately through readOnlyCompartment
|
|
160
|
-
return extensions;
|
|
161
|
-
}
|
|
162
|
-
ngDoCheck() {
|
|
163
|
-
if (!this._differ) {
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
const changes = this._differ.diff(this._options);
|
|
167
|
-
if (changes) {
|
|
168
|
-
// For v6, we need to reconfigure the editor with new extensions
|
|
169
|
-
this.reconfigureEditor();
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
async reconfigureEditor() {
|
|
173
|
-
if (!this.editorView)
|
|
174
|
-
return;
|
|
175
|
-
const effects = [
|
|
176
|
-
this.extensionsCompartment.reconfigure(this._extensions)
|
|
177
|
-
];
|
|
178
|
-
this.editorView.dispatch({
|
|
179
|
-
effects
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
ngOnDestroy() {
|
|
183
|
-
if (this.editorView) {
|
|
184
|
-
this.editorView.destroy();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
codemirrorValueChanged(view) {
|
|
188
|
-
const newValue = view.state.doc.toString();
|
|
189
|
-
if (this.value !== newValue) {
|
|
190
|
-
this.value = newValue;
|
|
191
|
-
this.onChange(this.value);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
focusChanged(focused) {
|
|
195
|
-
this.onTouched();
|
|
196
|
-
this.isFocused = focused;
|
|
197
|
-
this.focusChange.emit(focused);
|
|
198
|
-
}
|
|
199
|
-
scrollChanged(view) {
|
|
200
|
-
const scrollDOM = view.scrollDOM;
|
|
201
|
-
const scrollInfo = {
|
|
202
|
-
left: scrollDOM.scrollLeft,
|
|
203
|
-
top: scrollDOM.scrollTop,
|
|
204
|
-
width: scrollDOM.scrollWidth,
|
|
205
|
-
height: scrollDOM.scrollHeight,
|
|
206
|
-
clientWidth: scrollDOM.clientWidth,
|
|
207
|
-
clientHeight: scrollDOM.clientHeight,
|
|
208
|
-
};
|
|
209
|
-
this.scroll.emit(scrollInfo);
|
|
210
|
-
}
|
|
211
|
-
cursorActive(view) {
|
|
212
|
-
this.cursorActivity.emit(view);
|
|
213
|
-
}
|
|
214
|
-
dropFiles(view, e) {
|
|
215
|
-
this.drop.emit([view, e]);
|
|
216
|
-
}
|
|
217
|
-
/** Implemented as part of ControlValueAccessor. */
|
|
218
|
-
writeValue(value) {
|
|
219
|
-
if (value === null || value === undefined) {
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
if (!this.editorView) {
|
|
223
|
-
this.value = value;
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
const currentValue = this.editorView.state.doc.toString();
|
|
227
|
-
if (value !== currentValue && normalizeLineEndings(currentValue) !== normalizeLineEndings(value)) {
|
|
228
|
-
this.value = value;
|
|
229
|
-
if (this.preserveScrollPosition) {
|
|
230
|
-
const scrollInfo = {
|
|
231
|
-
left: this.editorView.scrollDOM.scrollLeft,
|
|
232
|
-
top: this.editorView.scrollDOM.scrollTop,
|
|
233
|
-
};
|
|
234
|
-
this.editorView.dispatch({
|
|
235
|
-
changes: {
|
|
236
|
-
from: 0,
|
|
237
|
-
to: this.editorView.state.doc.length,
|
|
238
|
-
insert: value,
|
|
239
|
-
},
|
|
240
|
-
});
|
|
241
|
-
this.editorView.scrollDOM.scrollTo(scrollInfo.left, scrollInfo.top);
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
this.editorView.dispatch({
|
|
245
|
-
changes: {
|
|
246
|
-
from: 0,
|
|
247
|
-
to: this.editorView.state.doc.length,
|
|
248
|
-
insert: value,
|
|
249
|
-
},
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
/** Implemented as part of ControlValueAccessor. */
|
|
255
|
-
registerOnChange(fn) {
|
|
256
|
-
this.onChange = fn;
|
|
257
|
-
}
|
|
258
|
-
/** Implemented as part of ControlValueAccessor. */
|
|
259
|
-
registerOnTouched(fn) {
|
|
260
|
-
this.onTouched = fn;
|
|
261
|
-
}
|
|
262
|
-
/** Implemented as part of ControlValueAccessor. */
|
|
263
|
-
async setDisabledState(isDisabled) {
|
|
264
|
-
this.disabled = isDisabled;
|
|
265
|
-
if (this.editorView) {
|
|
266
|
-
const { EditorState } = await import('@codemirror/state');
|
|
267
|
-
this.editorView.dispatch({
|
|
268
|
-
effects: [
|
|
269
|
-
this.readOnlyCompartment.reconfigure(isDisabled ? EditorState.readOnly.of(true) : [])
|
|
270
|
-
]
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
// Public API methods for compatibility
|
|
275
|
-
focus() {
|
|
276
|
-
this.editorView?.focus();
|
|
277
|
-
}
|
|
278
|
-
getEditorView() {
|
|
279
|
-
return this.editorView;
|
|
280
|
-
}
|
|
281
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CodemirrorComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
282
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CodemirrorComponent, isStandalone: true, selector: "ngx-codemirror", inputs: { className: "className", name: "name", autoFocus: "autoFocus", extensions: "extensions", options: "options", preserveScrollPosition: "preserveScrollPosition" }, outputs: { cursorActivity: "cursorActivity", focusChange: "focusChange", scroll: "scroll", drop: "drop", codeMirrorLoaded: "codeMirrorLoaded" }, providers: [
|
|
283
|
-
{
|
|
284
|
-
provide: NG_VALUE_ACCESSOR,
|
|
285
|
-
useExisting: forwardRef(() => CodemirrorComponent),
|
|
286
|
-
multi: true,
|
|
287
|
-
},
|
|
288
|
-
], viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: `
|
|
289
|
-
<div
|
|
290
|
-
[class]="'ngx-codemirror ' + className"
|
|
291
|
-
[class.ngx-codemirror--focused]="isFocused"
|
|
292
|
-
#ref
|
|
293
|
-
></div>
|
|
294
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
295
|
-
}
|
|
296
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CodemirrorComponent, decorators: [{
|
|
297
|
-
type: Component,
|
|
298
|
-
args: [{
|
|
299
|
-
selector: 'ngx-codemirror',
|
|
300
|
-
standalone: true,
|
|
301
|
-
template: `
|
|
302
|
-
<div
|
|
303
|
-
[class]="'ngx-codemirror ' + className"
|
|
304
|
-
[class.ngx-codemirror--focused]="isFocused"
|
|
305
|
-
#ref
|
|
306
|
-
></div>
|
|
307
|
-
`,
|
|
308
|
-
providers: [
|
|
309
|
-
{
|
|
310
|
-
provide: NG_VALUE_ACCESSOR,
|
|
311
|
-
useExisting: forwardRef(() => CodemirrorComponent),
|
|
312
|
-
multi: true,
|
|
313
|
-
},
|
|
314
|
-
],
|
|
315
|
-
preserveWhitespaces: false,
|
|
316
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
317
|
-
}]
|
|
318
|
-
}], ctorParameters: () => [{ type: i0.KeyValueDiffers }, { type: i0.NgZone }], propDecorators: { className: [{
|
|
319
|
-
type: Input
|
|
320
|
-
}], name: [{
|
|
321
|
-
type: Input
|
|
322
|
-
}], autoFocus: [{
|
|
323
|
-
type: Input
|
|
324
|
-
}], extensions: [{
|
|
325
|
-
type: Input
|
|
326
|
-
}], options: [{
|
|
327
|
-
type: Input
|
|
328
|
-
}], preserveScrollPosition: [{
|
|
329
|
-
type: Input
|
|
330
|
-
}], cursorActivity: [{
|
|
331
|
-
type: Output
|
|
332
|
-
}], focusChange: [{
|
|
333
|
-
type: Output
|
|
334
|
-
}], scroll: [{
|
|
335
|
-
type: Output
|
|
336
|
-
}], drop: [{
|
|
337
|
-
type: Output
|
|
338
|
-
}], codeMirrorLoaded: [{
|
|
339
|
-
type: Output
|
|
340
|
-
}], ref: [{
|
|
341
|
-
type: ViewChild,
|
|
342
|
-
args: ['ref']
|
|
343
|
-
}] } });
|
|
344
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm0tY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2NvZGUvZm0tY29kZW1pcnJvci9mbS1jb2RlbWlycm9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBRUwsZUFBZSxFQUNmLE1BQU0sRUFFTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQXVDLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUdyRixTQUFTLG9CQUFvQixDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBK0JELE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7OztPQUdHO0lBQ0gsSUFDSSxVQUFVLENBQUMsS0FBa0I7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIs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QkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2dCQUNsRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0Ysc0hBYlM7Ozs7OztLQU1UOzs0RkFXVSxtQkFBbUI7a0JBcEIvQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7OztLQU1UO29CQUNELFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7b0JBQ0QsbUJBQW1CLEVBQUUsS0FBSztvQkFDMUIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEO3lHQUtVLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBTUYsVUFBVTtzQkFEYixLQUFLO2dCQWFGLE9BQU87c0JBRFYsS0FBSztnQkFXRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBR0ksY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxJQUFJO3NCQUFiLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVXLEdBQUc7c0JBQXBCLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBEb0NoZWNrLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIGZvcndhcmRSZWYsXHJcbiAgICBJbnB1dCxcclxuICAgIEtleVZhbHVlRGlmZmVyLFxyXG4gICAgS2V5VmFsdWVEaWZmZXJzLFxyXG4gICAgTmdab25lLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgVmlld0NoaWxkLFxyXG4gIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAgaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG4gIGltcG9ydCB7IEVkaXRvclZpZXcsIGJhc2ljU2V0dXAgfSBmcm9tICdjb2RlbWlycm9yJztcclxuICBpbXBvcnQgeyBFZGl0b3JTdGF0ZSwgRXh0ZW5zaW9uLCBTdGF0ZUVmZmVjdCwgQ29tcGFydG1lbnQgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XHJcbiAgaW1wb3J0IHsgVmlld1VwZGF0ZSB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xyXG4gIFxyXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVFbmRpbmdzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RyKSB7XHJcbiAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcclxcbnxcXHIvZywgJ1xcbicpO1xyXG4gIH1cclxuICBcclxuICBpbnRlcmZhY2UgU2Nyb2xsSW5mbyB7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIGNsaWVudFdpZHRoOiBudW1iZXI7XHJcbiAgICBjbGllbnRIZWlnaHQ6IG51bWJlcjtcclxuICB9XHJcbiAgXHJcbiAgQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ25neC1jb2RlbWlycm9yJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgW2NsYXNzXT1cIiduZ3gtY29kZW1pcnJvciAnICsgY2xhc3NOYW1lXCJcclxuICAgICAgICBbY2xhc3Mubmd4LWNvZGVtaXJyb3ItLWZvY3VzZWRdPVwiaXNGb2N1c2VkXCJcclxuICAgICAgICAjcmVmXHJcbiAgICAgID48L2Rpdj5cclxuICAgIGAsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvZGVtaXJyb3JDb21wb25lbnQpLFxyXG4gICAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICB9LFxyXG4gICAgXSxcclxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgfSlcclxuICBleHBvcnQgY2xhc3MgQ29kZW1pcnJvckNvbXBvbmVudFxyXG4gICAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBEb0NoZWNrXHJcbiAge1xyXG4gICAgLyogY2xhc3MgYXBwbGllZCB0byB0aGUgY3JlYXRlZCBjb250YWluZXIgKi9cclxuICAgIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xyXG4gICAgLyogbmFtZSBhcHBsaWVkIHRvIHRoZSBlZGl0b3IgKGZvciBmb3JtIHB1cnBvc2VzKSAqL1xyXG4gICAgQElucHV0KCkgbmFtZSA9ICdjb2RlbWlycm9yJztcclxuICAgIC8qIGF1dG9mb2N1cyBzZXR0aW5nIGFwcGxpZWQgdG8gdGhlIGVkaXRvciAqL1xyXG4gICAgQElucHV0KCkgYXV0b0ZvY3VzID0gZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIHNldCBleHRlbnNpb25zIGZvciBjb2RlbWlycm9yIDZcclxuICAgICAqIEBsaW5rIGh0dHBzOi8vY29kZW1pcnJvci5uZXQvZG9jcy9yZWYvXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgZXh0ZW5zaW9ucyh2YWx1ZTogRXh0ZW5zaW9uW10pIHtcclxuICAgICAgdGhpcy5fZXh0ZW5zaW9ucyA9IHZhbHVlIHx8IFtdO1xyXG4gICAgICBpZiAoIXRoaXMuX2RpZmZlciAmJiB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZWNvbmZpZ3VyZUVkaXRvcigpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIExlZ2FjeSBvcHRpb25zIHN1cHBvcnQgLSBjb252ZXJ0cyBjb21tb24gdjUgb3B0aW9ucyB0byB2NiBleHRlbnNpb25zXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgb3B0aW9ucyh2YWx1ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xyXG4gICAgICB0aGlzLl9vcHRpb25zID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuX2V4dGVuc2lvbnMgPSB0aGlzLmNvbnZlcnRPcHRpb25zVG9FeHRlbnNpb25zKHZhbHVlKTtcclxuICAgICAgaWYgKCF0aGlzLl9kaWZmZXIgJiYgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9kaWZmZXJzLmZpbmQodmFsdWUpLmNyZWF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVjb25maWd1cmVFZGl0b3IoKTtcclxuICAgIH1cclxuICBcclxuICAgIC8qIHByZXNlcnZlIHByZXZpb3VzIHNjcm9sbCBwb3NpdGlvbiBhZnRlciB1cGRhdGluZyB2YWx1ZSAqL1xyXG4gICAgQElucHV0KCkgcHJlc2VydmVTY3JvbGxQb3NpdGlvbiA9IGZhbHNlO1xyXG4gICAgXHJcbiAgICAvKiBjYWxsZWQgd2hlbiB0aGUgdGV4dCBjdXJzb3IgaXMgbW92ZWQgKi9cclxuICAgIEBPdXRwdXQoKSBjdXJzb3JBY3Rpdml0eSA9IG5ldyBFdmVudEVtaXR0ZXI8RWRpdG9yVmlldz4oKTtcclxuICAgIC8qIGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgZm9jdXNlZCBvciBsb3NlcyBmb2N1cyAqL1xyXG4gICAgQE91dHB1dCgpIGZvY3VzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gICAgLyogY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxlZCAqL1xyXG4gICAgQE91dHB1dCgpIHNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8U2Nyb2xsSW5mbz4oKTtcclxuICAgIC8qIGNhbGxlZCB3aGVuIGZpbGUocykgYXJlIGRyb3BwZWQgKi9cclxuICAgIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxbRWRpdG9yVmlldywgRHJhZ0V2ZW50XT4oKTtcclxuICAgIC8qIGNhbGxlZCB3aGVuIGNvZGVNaXJyb3IgaW5zdGFuY2UgaXMgaW5pdGlhdGVkIG9uIHRoZSBjb21wb25lbnQgKi9cclxuICAgIEBPdXRwdXQoKSBjb2RlTWlycm9yTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb2RlbWlycm9yQ29tcG9uZW50PigpO1xyXG4gIFxyXG4gICAgQFZpZXdDaGlsZCgncmVmJykgcmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgXHJcbiAgICB2YWx1ZSA9ICcnO1xyXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIGlzRm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgZWRpdG9yVmlldz86IEVkaXRvclZpZXc7XHJcbiAgXHJcbiAgICBwcml2YXRlIF9kaWZmZXI/OiBLZXlWYWx1ZURpZmZlcjxzdHJpbmcsIGFueT47XHJcbiAgICBwcml2YXRlIF9vcHRpb25zOiBhbnkgPSB7fTtcclxuICAgIHByaXZhdGUgX2V4dGVuc2lvbnM6IEV4dGVuc2lvbltdID0gW107XHJcbiAgICBwcml2YXRlIGV4dGVuc2lvbnNDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xyXG4gICAgcHJpdmF0ZSByZWFkT25seUNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XHJcbiAgXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsIHByaXZhdGUgX25nWm9uZTogTmdab25lKSB7fVxyXG4gIFxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUVkaXRvcigpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUVkaXRvcigpIHtcclxuICAgICAgY29uc3QgeyBFZGl0b3JWaWV3IH0gPSBhd2FpdCBpbXBvcnQoJ2NvZGVtaXJyb3InKTtcclxuICAgICAgY29uc3QgeyBFZGl0b3JTdGF0ZSB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9zdGF0ZScpO1xyXG4gICAgICBcclxuICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IFtcclxuICAgICAgICBiYXNpY1NldHVwLFxyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uc0NvbXBhcnRtZW50Lm9mKHRoaXMuX2V4dGVuc2lvbnMpLFxyXG4gICAgICAgIHRoaXMucmVhZE9ubHlDb21wYXJ0bWVudC5vZih0aGlzLmRpc2FibGVkID8gRWRpdG9yU3RhdGUucmVhZE9ubHkub2YodHJ1ZSkgOiBbXSksXHJcbiAgICAgICAgdGhpcy5jcmVhdGVVcGRhdGVMaXN0ZW5lcigpLFxyXG4gICAgICAgIHRoaXMuY3JlYXRlRm9jdXNFeHRlbnNpb24oKSxcclxuICAgICAgICB0aGlzLmNyZWF0ZVNjcm9sbEV4dGVuc2lvbigpLFxyXG4gICAgICAgIHRoaXMuY3JlYXRlRHJvcEV4dGVuc2lvbigpLFxyXG4gICAgICBdO1xyXG4gIFxyXG4gICAgICBjb25zdCBzdGF0ZSA9IEVkaXRvclN0YXRlLmNyZWF0ZSh7XHJcbiAgICAgICAgZG9jOiB0aGlzLnZhbHVlLFxyXG4gICAgICAgIGV4dGVuc2lvbnMsXHJcbiAgICAgIH0pO1xyXG4gIFxyXG4gICAgICB0aGlzLmVkaXRvclZpZXcgPSBuZXcgRWRpdG9yVmlldyh7XHJcbiAgICAgICAgc3RhdGUsXHJcbiAgICAgICAgcGFyZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LFxyXG4gICAgICB9KTtcclxuICBcclxuICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3JWaWV3LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb2RlTWlycm9yTG9hZGVkLmVtaXQodGhpcyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVMaXN0ZW5lcigpOiBFeHRlbnNpb24ge1xyXG4gICAgICByZXR1cm4gRWRpdG9yVmlldy51cGRhdGVMaXN0ZW5lci5vZigodXBkYXRlOiBWaWV3VXBkYXRlKSA9PiB7XHJcbiAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKSB7XHJcbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2RlbWlycm9yVmFsdWVDaGFuZ2VkKHVwZGF0ZS52aWV3KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodXBkYXRlLnNlbGVjdGlvblNldCkge1xyXG4gICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY3Vyc29yQWN0aXZlKHVwZGF0ZS52aWV3KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIGNyZWF0ZUZvY3VzRXh0ZW5zaW9uKCk6IEV4dGVuc2lvbiB7XHJcbiAgICAgIHJldHVybiBFZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xyXG4gICAgICAgIGZvY3VzOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZm9jdXNDaGFuZ2VkKHRydWUpKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGJsdXI6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c0NoYW5nZWQoZmFsc2UpKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgY3JlYXRlU2Nyb2xsRXh0ZW5zaW9uKCk6IEV4dGVuc2lvbiB7XHJcbiAgICAgIHJldHVybiBFZGl0b3JWaWV3LmRvbUV2ZW50SGFuZGxlcnMoe1xyXG4gICAgICAgIHNjcm9sbDogKGV2ZW50LCB2aWV3KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuc2Nyb2xsQ2hhbmdlZCh2aWV3KSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIGNyZWF0ZURyb3BFeHRlbnNpb24oKTogRXh0ZW5zaW9uIHtcclxuICAgICAgcmV0dXJuIEVkaXRvclZpZXcuZG9tRXZlbnRIYW5kbGVycyh7XHJcbiAgICAgICAgZHJvcDogKGV2ZW50LCB2aWV3KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZHJvcEZpbGVzKHZpZXcsIGV2ZW50KSk7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIGNvbnZlcnRPcHRpb25zVG9FeHRlbnNpb25zKG9wdGlvbnM6IGFueSk6IEV4dGVuc2lvbltdIHtcclxuICAgICAgY29uc3QgZXh0ZW5zaW9uczogRXh0ZW5zaW9uW10gPSBbXTtcclxuICAgICAgXHJcbiAgICAgIGlmICghb3B0aW9ucykgcmV0dXJuIGV4dGVuc2lvbnM7XHJcbiAgXHJcbiAgICAgIC8vIEhhbmRsZSBjb21tb24gdjUgb3B0aW9ucyBhbmQgY29udmVydCB0byB2NiBleHRlbnNpb25zXHJcbiAgICAgIGlmIChvcHRpb25zLm1vZGUpIHtcclxuICAgICAgICAvLyBMYW5ndWFnZSBtb2RlIGNvbnZlcnNpb24gd291bGQgbmVlZCBzcGVjaWZpYyBsYW5ndWFnZSBwYWNrYWdlc1xyXG4gICAgICAgIC8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGV4YW1wbGUgLSB5b3UnZCBuZWVkIHRvIGltcG9ydCBzcGVjaWZpYyBsYW5ndWFnZSBwYWNrYWdlc1xyXG4gICAgICAgIC8vIGV4dGVuc2lvbnMucHVzaChqYXZhc2NyaXB0KCkpOyAvLyBmb3IgSmF2YVNjcmlwdCBtb2RlXHJcbiAgICAgIH1cclxuICBcclxuICAgICAgaWYgKG9wdGlvbnMudGhlbWUpIHtcclxuICAgICAgICAvLyBUaGVtZSBjb252ZXJzaW9uIHdvdWxkIG5lZWQgc3BlY2lmaWMgdGhlbWUgcGFja2FnZXNcclxuICAgICAgICAvLyBleHRlbnNpb25zLnB1c2gob25lRGFyayk7IC8vIGZvciBkYXJrIHRoZW1lIGV4YW1wbGVcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBpZiAob3B0aW9ucy5saW5lTnVtYmVycyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAvLyBSZW1vdmUgbGluZSBudW1iZXJzIGZyb20gYmFzaWNTZXR1cCBpZiBuZWVkZWRcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvLyByZWFkT25seSBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgdGhyb3VnaCByZWFkT25seUNvbXBhcnRtZW50XHJcbiAgXHJcbiAgICAgIHJldHVybiBleHRlbnNpb25zO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgbmdEb0NoZWNrKCkge1xyXG4gICAgICBpZiAoIXRoaXMuX2RpZmZlcikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX29wdGlvbnMpO1xyXG4gICAgICBpZiAoY2hhbmdlcykge1xyXG4gICAgICAgIC8vIEZvciB2Niwgd2UgbmVlZCB0byByZWNvbmZpZ3VyZSB0aGUgZWRpdG9yIHdpdGggbmV3IGV4dGVuc2lvbnNcclxuICAgICAgICB0aGlzLnJlY29uZmlndXJlRWRpdG9yKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIHByaXZhdGUgYXN5bmMgcmVjb25maWd1cmVFZGl0b3IoKSB7XHJcbiAgICAgIGlmICghdGhpcy5lZGl0b3JWaWV3KSByZXR1cm47XHJcbiAgXHJcbiAgICAgIGNvbnN0IGVmZmVjdHM6IFN0YXRlRWZmZWN0PGFueT5bXSA9IFtcclxuICAgICAgICB0aGlzLmV4dGVuc2lvbnNDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLl9leHRlbnNpb25zKVxyXG4gICAgICBdO1xyXG4gIFxyXG4gICAgICB0aGlzLmVkaXRvclZpZXcuZGlzcGF0Y2goe1xyXG4gICAgICAgIGVmZmVjdHNcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgaWYgKHRoaXMuZWRpdG9yVmlldykge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yVmlldy5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICAgIGNvZGVtaXJyb3JWYWx1ZUNoYW5nZWQodmlldzogRWRpdG9yVmlldykge1xyXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XHJcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICBmb2N1c0NoYW5nZWQoZm9jdXNlZDogYm9vbGVhbikge1xyXG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLmlzRm9jdXNlZCA9IGZvY3VzZWQ7XHJcbiAgICAgIHRoaXMuZm9jdXNDaGFuZ2UuZW1pdChmb2N1c2VkKTtcclxuICAgIH1cclxuICBcclxuICAgIHNjcm9sbENoYW5nZWQodmlldzogRWRpdG9yVmlldykge1xyXG4gICAgICBjb25zdCBzY3JvbGxET00gPSB2aWV3LnNjcm9sbERPTTtcclxuICAgICAgY29uc3Qgc2Nyb2xsSW5mbzogU2Nyb2xsSW5mbyA9IHtcclxuICAgICAgICBsZWZ0OiBzY3JvbGxET00uc2Nyb2xsTGVmdCxcclxuICAgICAgICB0b3A6IHNjcm9sbERPTS5zY3JvbGxUb3AsXHJcbiAgICAgICAgd2lkdGg6IHNjcm9sbERPTS5zY3JvbGxXaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IHNjcm9sbERPTS5zY3JvbGxIZWlnaHQsXHJcbiAgICAgICAgY2xpZW50V2lkdGg6IHNjcm9sbERPTS5jbGllbnRXaWR0aCxcclxuICAgICAgICBjbGllbnRIZWlnaHQ6IHNjcm9sbERPTS5jbGllbnRIZWlnaHQsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuc2Nyb2xsLmVtaXQoc2Nyb2xsSW5mbyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBjdXJzb3JBY3RpdmUodmlldzogRWRpdG9yVmlldykge1xyXG4gICAgICB0aGlzLmN1cnNvckFjdGl2aXR5LmVtaXQodmlldyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBkcm9wRmlsZXModmlldzogRWRpdG9yVmlldywgZTogRHJhZ0V2ZW50KSB7XHJcbiAgICAgIHRoaXMuZHJvcC5lbWl0KFt2aWV3LCBlXSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cclxuICAgIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgaWYgKCF0aGlzLmVkaXRvclZpZXcpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZWRpdG9yVmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcclxuICAgICAgaWYgKHZhbHVlICE9PSBjdXJyZW50VmFsdWUgJiYgbm9ybWFsaXplTGluZUVuZGluZ3MoY3VycmVudFZhbHVlKSAhPT0gbm9ybWFsaXplTGluZUVuZGluZ3ModmFsdWUpKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLnByZXNlcnZlU2Nyb2xsUG9zaXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IHNjcm9sbEluZm8gPSB7XHJcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMuZWRpdG9yVmlldy5zY3JvbGxET00uc2Nyb2xsTGVmdCxcclxuICAgICAgICAgICAgdG9wOiB0aGlzLmVkaXRvclZpZXcuc2Nyb2xsRE9NLnNjcm9sbFRvcCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIHRoaXMuZWRpdG9yVmlldy5kaXNwYXRjaCh7XHJcbiAgICAgICAgICAgIGNoYW5nZXM6IHtcclxuICAgICAgICAgICAgICBmcm9tOiAwLFxyXG4gICAgICAgICAgICAgIHRvOiB0aGlzLmVkaXRvclZpZXcuc3RhdGUuZG9jLmxlbmd0aCxcclxuICAgICAgICAgICAgICBpbnNlcnQ6IHZhbHVlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIHRoaXMuZWRpdG9yVmlldy5zY3JvbGxET00uc2Nyb2xsVG8oc2Nyb2xsSW5mby5sZWZ0LCBzY3JvbGxJbmZvLnRvcCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZWRpdG9yVmlldy5kaXNwYXRjaCh7XHJcbiAgICAgICAgICAgIGNoYW5nZXM6IHtcclxuICAgICAgICAgICAgICBmcm9tOiAwLFxyXG4gICAgICAgICAgICAgIHRvOiB0aGlzLmVkaXRvclZpZXcuc3RhdGUuZG9jLmxlbmd0aCxcclxuICAgICAgICAgICAgICBpbnNlcnQ6IHZhbHVlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKSB7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuICBcclxuICAgIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpIHtcclxuICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuICBcclxuICAgIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xyXG4gICAgYXN5bmMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgICBcclxuICAgICAgaWYgKHRoaXMuZWRpdG9yVmlldykge1xyXG4gICAgICAgIGNvbnN0IHsgRWRpdG9yU3RhdGUgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3Ivc3RhdGUnKTtcclxuICAgICAgICB0aGlzLmVkaXRvclZpZXcuZGlzcGF0Y2goe1xyXG4gICAgICAgICAgZWZmZWN0czogW1xyXG4gICAgICAgICAgICB0aGlzLnJlYWRPbmx5Q29tcGFydG1lbnQucmVjb25maWd1cmUoXHJcbiAgICAgICAgICAgICAgaXNEaXNhYmxlZCA/IEVkaXRvclN0YXRlLnJlYWRPbmx5Lm9mKHRydWUpIDogW11cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cclxuICAgIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcclxuICAgIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xyXG4gICAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7fTtcclxuICBcclxuICAgIC8vIFB1YmxpYyBBUEkgbWV0aG9kcyBmb3IgY29tcGF0aWJpbGl0eVxyXG4gICAgcHVibGljIGZvY3VzKCkge1xyXG4gICAgICB0aGlzLmVkaXRvclZpZXc/LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwdWJsaWMgZ2V0RWRpdG9yVmlldygpOiBFZGl0b3JWaWV3IHwgdW5kZWZpbmVkIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yVmlldztcclxuICAgIH1cclxuICB9XHJcbiAgIl19
|
|
8
|
+
import{ChangeDetectionStrategy,Component,ElementRef,EventEmitter,forwardRef,Input,KeyValueDiffers,NgZone,Output,ViewChild}from"@angular/core";import{NG_VALUE_ACCESSOR}from"@angular/forms";import{EditorView,basicSetup}from"codemirror";import{Compartment}from"@codemirror/state";import*as i0 from"@angular/core";function normalizeLineEndings(e){return e?e.replace(/\r\n|\r/g,"\n"):e}export class CodemirrorComponent{set extensions(e){this._extensions=e||[],!this._differ&&e&&(this._differ=this._differs.find(e).create()),this.reconfigureEditor()}set options(e){this._options=e,this._extensions=this.convertOptionsToExtensions(e),!this._differ&&e&&(this._differ=this._differs.find(e).create()),this.reconfigureEditor()}constructor(e,t){this._differs=e,this._ngZone=t,this.className="",this.name="codemirror",this.autoFocus=!1,this.preserveScrollPosition=!1,this.cursorActivity=new EventEmitter,this.focusChange=new EventEmitter,this.scroll=new EventEmitter,this.drop=new EventEmitter,this.codeMirrorLoaded=new EventEmitter,this.value="",this.disabled=!1,this.isFocused=!1,this._options={},this._extensions=[],this.extensionsCompartment=new Compartment,this.readOnlyCompartment=new Compartment,this.onChange=e=>{},this.onTouched=()=>{}}ngAfterViewInit(){this._ngZone.runOutsideAngular((()=>{this.initializeEditor()}))}async initializeEditor(){const{EditorView:e}=await import("codemirror"),{EditorState:t}=await import("@codemirror/state"),i=[basicSetup,this.extensionsCompartment.of(this._extensions),this.readOnlyCompartment.of(this.disabled?t.readOnly.of(!0):[]),this.createUpdateListener(),this.createFocusExtension(),this.createScrollExtension(),this.createDropExtension()],o=t.create({doc:this.value,extensions:i});this.editorView=new e({state:o,parent:this.ref.nativeElement}),this.autoFocus&&this.editorView.focus(),this._ngZone.run((()=>{this.codeMirrorLoaded.emit(this)}))}createUpdateListener(){return EditorView.updateListener.of((e=>{e.docChanged&&this._ngZone.run((()=>{this.codemirrorValueChanged(e.view)})),e.selectionSet&&this._ngZone.run((()=>{this.cursorActive(e.view)}))}))}createFocusExtension(){return EditorView.domEventHandlers({focus:()=>(this._ngZone.run((()=>this.focusChanged(!0))),!1),blur:()=>(this._ngZone.run((()=>this.focusChanged(!1))),!1)})}createScrollExtension(){return EditorView.domEventHandlers({scroll:(e,t)=>(this._ngZone.run((()=>this.scrollChanged(t))),!1)})}createDropExtension(){return EditorView.domEventHandlers({drop:(e,t)=>(this._ngZone.run((()=>this.dropFiles(t,e))),!1)})}convertOptionsToExtensions(e){const t=[];return e?(e.mode,e.theme,e.lineNumbers,t):t}ngDoCheck(){if(!this._differ)return;this._differ.diff(this._options)&&this.reconfigureEditor()}async reconfigureEditor(){if(!this.editorView)return;const e=[this.extensionsCompartment.reconfigure(this._extensions)];this.editorView.dispatch({effects:e})}ngOnDestroy(){this.editorView&&this.editorView.destroy()}codemirrorValueChanged(e){const t=e.state.doc.toString();this.value!==t&&(this.value=t,this.onChange(this.value))}focusChanged(e){this.onTouched(),this.isFocused=e,this.focusChange.emit(e)}scrollChanged(e){const t=e.scrollDOM,i={left:t.scrollLeft,top:t.scrollTop,width:t.scrollWidth,height:t.scrollHeight,clientWidth:t.clientWidth,clientHeight:t.clientHeight};this.scroll.emit(i)}cursorActive(e){this.cursorActivity.emit(e)}dropFiles(e,t){this.drop.emit([e,t])}writeValue(e){if(null==e)return;if(!this.editorView)return void(this.value=e);const t=this.editorView.state.doc.toString();if(e!==t&&normalizeLineEndings(t)!==normalizeLineEndings(e))if(this.value=e,this.preserveScrollPosition){const t={left:this.editorView.scrollDOM.scrollLeft,top:this.editorView.scrollDOM.scrollTop};this.editorView.dispatch({changes:{from:0,to:this.editorView.state.doc.length,insert:e}}),this.editorView.scrollDOM.scrollTo(t.left,t.top)}else this.editorView.dispatch({changes:{from:0,to:this.editorView.state.doc.length,insert:e}})}registerOnChange(e){this.onChange=e}registerOnTouched(e){this.onTouched=e}async setDisabledState(e){if(this.disabled=e,this.editorView){const{EditorState:t}=await import("@codemirror/state");this.editorView.dispatch({effects:[this.readOnlyCompartment.reconfigure(e?t.readOnly.of(!0):[])]})}}focus(){this.editorView?.focus()}getEditorView(){return this.editorView}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:CodemirrorComponent,deps:[{token:i0.KeyValueDiffers},{token:i0.NgZone}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:CodemirrorComponent,isStandalone:!0,selector:"ngx-codemirror",inputs:{className:"className",name:"name",autoFocus:"autoFocus",extensions:"extensions",options:"options",preserveScrollPosition:"preserveScrollPosition"},outputs:{cursorActivity:"cursorActivity",focusChange:"focusChange",scroll:"scroll",drop:"drop",codeMirrorLoaded:"codeMirrorLoaded"},providers:[{provide:NG_VALUE_ACCESSOR,useExisting:forwardRef((()=>CodemirrorComponent)),multi:!0}],viewQueries:[{propertyName:"ref",first:!0,predicate:["ref"],descendants:!0}],ngImport:i0,template:'\n <div\n [class]="\'ngx-codemirror \' + className"\n [class.ngx-codemirror--focused]="isFocused"\n #ref\n ></div>\n ',isInline:!0,changeDetection:i0.ChangeDetectionStrategy.OnPush})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:CodemirrorComponent,decorators:[{type:Component,args:[{selector:"ngx-codemirror",standalone:!0,template:'\n <div\n [class]="\'ngx-codemirror \' + className"\n [class.ngx-codemirror--focused]="isFocused"\n #ref\n ></div>\n ',providers:[{provide:NG_VALUE_ACCESSOR,useExisting:forwardRef((()=>CodemirrorComponent)),multi:!0}],preserveWhitespaces:!1,changeDetection:ChangeDetectionStrategy.OnPush}]}],ctorParameters:()=>[{type:i0.KeyValueDiffers},{type:i0.NgZone}],propDecorators:{className:[{type:Input}],name:[{type:Input}],autoFocus:[{type:Input}],extensions:[{type:Input}],options:[{type:Input}],preserveScrollPosition:[{type:Input}],cursorActivity:[{type:Output}],focusChange:[{type:Output}],scroll:[{type:Output}],drop:[{type:Output}],codeMirrorLoaded:[{type:Output}],ref:[{type:ViewChild,args:["ref"]}]}});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb2RlL2ZtLWNvZGVtaXJyb3IvZm0tY29kZW1pcnJvci5jb21wb25lbnQubWpz`
|
|
10
|
+
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/code/index.mjs
|
|
7
|
+
*/
|
|
8
|
+
export*from"./fm-codemirror/fm-codemirror.component";
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb2RlL2luZGV4Lm1qcw==`
|
|
10
|
+
|