From 8fc2ece82aad0dd2c17c0a0cb8d5c3f14b8c9890 Mon Sep 17 00:00:00 2001 From: Alf Eaton Date: Wed, 2 Oct 2024 09:25:02 +0100 Subject: [PATCH] Use Hunspell for client-side spellchecking (#20286) GitOrigin-RevId: c4d0d9e06fe0cc9d7cb7a058fd0768eb024e44f5 --- package-lock.json | 11 + services/web/.eslintignore | 1 + services/web/.prettierignore | 1 + .../Features/Editor/EditorHttpController.js | 1 + .../src/Features/Project/ProjectController.js | 1 + .../Features/Spelling/SpellingController.js | 2 +- .../app/src/infrastructure/ExpressLocals.js | 1 + .../app/src/infrastructure/PackageVersions.js | 1 + services/web/app/views/layout-base.pug | 1 + services/web/bin/sentry_upload | 3 +- services/web/config/settings.defaults.js | 139 +- .../web/cypress/support/webpack.cypress.ts | 6 + .../web/frontend/extracted-translations.json | 1 + .../js/features/dictionary/ignored-words.ts | 8 +- .../settings-spell-check-language.tsx | 34 +- .../extensions/spelling/context-menu.ts | 327 -- .../extensions/spelling/context-menu.tsx | 224 + .../extensions/spelling/ignored-words.ts | 6 + .../extensions/spelling/index.ts | 88 +- .../extensions/spelling/misspelled-words.ts | 27 +- .../extensions/spelling/spellchecker.ts | 110 +- .../spelling/spelling-suggestions.tsx | 189 + .../hooks/use-codemirror-scope.ts | 11 +- .../source-editor/hooks/use-hunspell.ts | 35 + .../source-editor/hunspell/Dockerfile | 9 + .../source-editor/hunspell/HunspellManager.ts | 111 + .../features/source-editor/hunspell/build.sh | 13 + .../source-editor/hunspell/compile.sh | 24 + .../source-editor/hunspell/hunspell.worker.ts | 237 + .../source-editor/hunspell/wasm/hunspell.d.ts | 66 + .../source-editor/hunspell/wasm/hunspell.mjs | 3940 +++++++++++++++++ .../source-editor/hunspell/wasm/hunspell.wasm | Bin 0 -> 884804 bytes services/web/frontend/js/utils/meta.ts | 2 + services/web/locales/en.json | 1 + services/web/package.json | 1 + .../dictionary-modal-content.spec.jsx | 100 + .../dictionary-modal-content.test.jsx | 60 - ...mirror-editor-spellchecker-client.spec.tsx | 85 + services/web/types/project-settings.ts | 2 + services/web/webpack.config.js | 26 + 40 files changed, 5391 insertions(+), 514 deletions(-) delete mode 100644 services/web/frontend/js/features/source-editor/extensions/spelling/context-menu.ts create mode 100644 services/web/frontend/js/features/source-editor/extensions/spelling/context-menu.tsx create mode 100644 services/web/frontend/js/features/source-editor/extensions/spelling/spelling-suggestions.tsx create mode 100644 services/web/frontend/js/features/source-editor/hooks/use-hunspell.ts create mode 100644 services/web/frontend/js/features/source-editor/hunspell/Dockerfile create mode 100644 services/web/frontend/js/features/source-editor/hunspell/HunspellManager.ts create mode 100755 services/web/frontend/js/features/source-editor/hunspell/build.sh create mode 100755 services/web/frontend/js/features/source-editor/hunspell/compile.sh create mode 100644 services/web/frontend/js/features/source-editor/hunspell/hunspell.worker.ts create mode 100644 services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.d.ts create mode 100644 services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.mjs create mode 100644 services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.wasm create mode 100644 services/web/test/frontend/features/dictionary/components/dictionary-modal-content.spec.jsx delete mode 100644 services/web/test/frontend/features/dictionary/components/dictionary-modal-content.test.jsx create mode 100644 services/web/test/frontend/features/source-editor/components/codemirror-editor-spellchecker-client.spec.tsx diff --git a/package-lock.json b/package-lock.json index 64adf3c8b2..ee3618b282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8371,6 +8371,11 @@ "resolved": "services/contacts", "link": true }, + "node_modules/@overleaf/dictionaries": { + "version": "0.0.2", + "resolved": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.2.tar.gz", + "integrity": "sha512-p8QJhmQcZ33PEPe0Lqi7NfFkA9IbZNOvlPk3URKFTeb3qAHW+s5+U9qEnHp1s3xr7ZOgu6D5YPK0fRNOE9+zmg==" + }, "node_modules/@overleaf/docstore": { "resolved": "services/docstore", "link": true @@ -43751,6 +43756,7 @@ "@node-oauth/oauth2-server": "^5.1.0", "@node-saml/passport-saml": "^4.0.4", "@overleaf/access-token-encryptor": "*", + "@overleaf/dictionaries": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.2.tar.gz", "@overleaf/fetch-utils": "*", "@overleaf/logger": "*", "@overleaf/metrics": "*", @@ -51353,6 +51359,10 @@ } } }, + "@overleaf/dictionaries": { + "version": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.2.tar.gz", + "integrity": "sha512-p8QJhmQcZ33PEPe0Lqi7NfFkA9IbZNOvlPk3URKFTeb3qAHW+s5+U9qEnHp1s3xr7ZOgu6D5YPK0fRNOE9+zmg==" + }, "@overleaf/docstore": { "version": "file:services/docstore", "requires": { @@ -52361,6 +52371,7 @@ "@opentelemetry/semantic-conventions": "^1.15.2", "@overleaf/access-token-encryptor": "*", "@overleaf/codemirror-tree-view": "^0.1.3", + "@overleaf/dictionaries": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.2.tar.gz", "@overleaf/fetch-utils": "*", "@overleaf/logger": "*", "@overleaf/metrics": "*", diff --git a/services/web/.eslintignore b/services/web/.eslintignore index 54c37561b4..673c2a75e3 100644 --- a/services/web/.eslintignore +++ b/services/web/.eslintignore @@ -9,3 +9,4 @@ frontend/js/features/source-editor/lezer-latex/latex.mjs frontend/js/features/source-editor/lezer-latex/latex.terms.mjs frontend/js/features/source-editor/lezer-bibtex/bibtex.mjs frontend/js/features/source-editor/lezer-bibtex/bibtex.terms.mjs +frontend/js/features/source-editor/hunspell/wasm/hunspell.mjs diff --git a/services/web/.prettierignore b/services/web/.prettierignore index 3ab82e1eb6..f4be187b87 100644 --- a/services/web/.prettierignore +++ b/services/web/.prettierignore @@ -11,3 +11,4 @@ frontend/js/features/source-editor/lezer-latex/latex.mjs frontend/js/features/source-editor/lezer-latex/latex.terms.mjs frontend/js/features/source-editor/lezer-bibtex/bibtex.mjs frontend/js/features/source-editor/lezer-bibtex/bibtex.terms.mjs +frontend/js/features/source-editor/hunspell/wasm/hunspell.mjs diff --git a/services/web/app/src/Features/Editor/EditorHttpController.js b/services/web/app/src/Features/Editor/EditorHttpController.js index 35e17fdfe9..5cdc205320 100644 --- a/services/web/app/src/Features/Editor/EditorHttpController.js +++ b/services/web/app/src/Features/Editor/EditorHttpController.js @@ -79,6 +79,7 @@ async function joinProject(req, res, next) { // disable spellchecking for currently unsupported spell check languages // preserve the value in the db so they can use it again once we add back // support. + // TODO: allow these if in client-side spell check split test if ( unsupportedSpellcheckLanguages.indexOf(project.spellCheckLanguage) !== -1 ) { diff --git a/services/web/app/src/Features/Project/ProjectController.js b/services/web/app/src/Features/Project/ProjectController.js index c528c64036..5d149e9098 100644 --- a/services/web/app/src/Features/Project/ProjectController.js +++ b/services/web/app/src/Features/Project/ProjectController.js @@ -340,6 +340,7 @@ const _ProjectController = { 'ieee-stylesheet', 'write-and-cite', 'default-visual-for-beginners', + 'spell-check-client', ].filter(Boolean) const getUserValues = async userId => diff --git a/services/web/app/src/Features/Spelling/SpellingController.js b/services/web/app/src/Features/Spelling/SpellingController.js index cdf28f36d9..64b7363637 100644 --- a/services/web/app/src/Features/Spelling/SpellingController.js +++ b/services/web/app/src/Features/Spelling/SpellingController.js @@ -7,7 +7,7 @@ const LearnedWordsManager = require('./LearnedWordsManager') const TEN_SECONDS = 1000 * 10 const languageCodeIsSupported = code => - Settings.languages.some(lang => lang.code === code) + Settings.languages.some(lang => lang.code === code && lang.server !== false) module.exports = { learn(req, res, next) { diff --git a/services/web/app/src/infrastructure/ExpressLocals.js b/services/web/app/src/infrastructure/ExpressLocals.js index 936453fe93..226d5efcaf 100644 --- a/services/web/app/src/infrastructure/ExpressLocals.js +++ b/services/web/app/src/infrastructure/ExpressLocals.js @@ -174,6 +174,7 @@ module.exports = function (webRouter, privateApiRouter, publicApiRouter) { } res.locals.mathJaxPath = `/js/libs/mathjax-${PackageVersions.version.mathjax}/es5/tex-svg-full.js` + res.locals.dictionariesRoot = `/js/dictionaries/${PackageVersions.version.dictionaries}/` res.locals.lib = PackageVersions.lib diff --git a/services/web/app/src/infrastructure/PackageVersions.js b/services/web/app/src/infrastructure/PackageVersions.js index bdf2ab54ec..56589ec36a 100644 --- a/services/web/app/src/infrastructure/PackageVersions.js +++ b/services/web/app/src/infrastructure/PackageVersions.js @@ -1,5 +1,6 @@ const version = { mathjax: '3.2.2', + dictionaries: '0.0.2', } module.exports = { diff --git a/services/web/app/views/layout-base.pug b/services/web/app/views/layout-base.pug index c9eec5fe6e..b567ada69a 100644 --- a/services/web/app/views/layout-base.pug +++ b/services/web/app/views/layout-base.pug @@ -47,6 +47,7 @@ html( //- See: https://webpack.js.org/guides/public-path/#on-the-fly meta(name="ol-baseAssetPath" content=buildBaseAssetPath()) meta(name="ol-mathJaxPath" content=mathJaxPath) + meta(name="ol-dictionariesRoot" content=dictionariesRoot) meta(name="ol-usersEmail" content=getUserEmail()) meta(name="ol-ab" data-type="json" content={}) diff --git a/services/web/bin/sentry_upload b/services/web/bin/sentry_upload index 309ea99345..a1badc66f3 100755 --- a/services/web/bin/sentry_upload +++ b/services/web/bin/sentry_upload @@ -8,10 +8,9 @@ if [[ "$BRANCH_NAME" == "master" || "$BRANCH_NAME" == "main" ]]; then cd sentry_upload/public SENTRY_RELEASE=${COMMIT_SHA} - OPTS="--no-rewrite --url-prefix ~" sentry-cli releases new "$SENTRY_RELEASE" sentry-cli releases set-commits --auto "$SENTRY_RELEASE" - sentry-cli releases files "$SENTRY_RELEASE" upload-sourcemaps ${OPTS} . + sentry-cli releases files "$SENTRY_RELEASE" upload-sourcemaps --ignore '*/dictionaries/*' --no-rewrite --url-prefix ~ . sentry-cli releases finalize "$SENTRY_RELEASE" rm -rf sentry_upload diff --git a/services/web/config/settings.defaults.js b/services/web/config/settings.defaults.js index 311134d22c..c72c99e28a 100644 --- a/services/web/config/settings.defaults.js +++ b/services/web/config/settings.defaults.js @@ -428,58 +428,115 @@ module.exports = { }, // Spelling languages + // dic = available in client + // server: false = not available on server // ------------------ - // - // You must have the corresponding aspell package installed to - // be able to use a language. languages: [ { code: 'en', name: 'English' }, - { code: 'en_US', name: 'English (American)' }, - { code: 'en_GB', name: 'English (British)' }, - { code: 'en_CA', name: 'English (Canadian)' }, - { code: 'af', name: 'Afrikaans' }, - { code: 'ar', name: 'Arabic' }, - { code: 'gl', name: 'Galician' }, - { code: 'eu', name: 'Basque' }, - { code: 'br', name: 'Breton' }, - { code: 'bg', name: 'Bulgarian' }, - { code: 'ca', name: 'Catalan' }, - { code: 'hr', name: 'Croatian' }, - { code: 'cs', name: 'Czech' }, - { code: 'da', name: 'Danish' }, - { code: 'nl', name: 'Dutch' }, - { code: 'eo', name: 'Esperanto' }, - { code: 'et', name: 'Estonian' }, - { code: 'fo', name: 'Faroese' }, - { code: 'fr', name: 'French' }, - { code: 'de', name: 'German' }, - { code: 'el', name: 'Greek' }, - { code: 'id', name: 'Indonesian' }, - { code: 'ga', name: 'Irish' }, - { code: 'it', name: 'Italian' }, - { code: 'kk', name: 'Kazakh' }, + { code: 'en_US', dic: 'en_US', name: 'English (American)' }, + { code: 'en_GB', dic: 'en_GB', name: 'English (British)' }, + { code: 'en_CA', dic: 'en_CA', name: 'English (Canadian)' }, + { + code: 'en_AU', + dic: 'en_AU', + name: 'English (Australian)', + server: false, + }, + { + code: 'en_ZA', + dic: 'en_ZA', + name: 'English (South African)', + server: false, + }, + { code: 'af', dic: 'af_ZA', name: 'Afrikaans' }, + { code: 'an', dic: 'an_ES', name: 'Aragonese', server: false }, + { code: 'ar', dic: 'ar', name: 'Arabic' }, + { code: 'be_BY', dic: 'be_BY', name: 'Belarusian', server: false }, + { code: 'gl', dic: 'gl_ES', name: 'Galician' }, + { code: 'eu', dic: 'eu', name: 'Basque' }, + { code: 'bn_BD', dic: 'bn_BD', name: 'Bengali', server: false }, + { code: 'bs_BA', dic: 'bs_BA', name: 'Bosnian', server: false }, + { code: 'br', dic: 'br_FR', name: 'Breton' }, + { code: 'bg', dic: 'bg_BG', name: 'Bulgarian' }, + { code: 'ca', dic: 'ca', name: 'Catalan' }, + { code: 'hr', dic: 'hr_HR', name: 'Croatian' }, + { code: 'cs', dic: 'cs_CZ', name: 'Czech' }, + { + code: 'da', + // dic: 'da_DK', TODO: re-enable client spell check + name: 'Danish', + }, + { code: 'nl', dic: 'nl', name: 'Dutch' }, + { code: 'dz', dic: 'dz', name: 'Dzongkha', server: false }, + { code: 'eo', dic: 'eo', name: 'Esperanto' }, + { code: 'et', dic: 'et_EE', name: 'Estonian' }, + { code: 'fo', dic: 'fo', name: 'Faroese' }, + { code: 'fr', dic: 'fr', name: 'French' }, + { code: 'gl_ES', dic: 'gl_ES', name: 'Galician', server: false }, + { code: 'de', dic: 'de_DE', name: 'German' }, + { code: 'de_AT', dic: 'de_AT', name: 'German (Austria)', server: false }, + { + code: 'de_CH', + dic: 'de_CH', + name: 'German (Switzerland)', + server: false, + }, + { code: 'el', dic: 'el_GR', name: 'Greek' }, + { code: 'gug_PY', dic: 'gug_PY', name: 'Guarani', server: false }, + { code: 'gu_IN', dic: 'gu_IN', name: 'Gujarati', server: false }, + { code: 'he_IL', dic: 'he_IL', name: 'Hebrew', server: false }, + { code: 'hi_IN', dic: 'hi_IN', name: 'Hindi', server: false }, + { code: 'hu_HU', dic: 'hu_HU', name: 'Hungarian', server: false }, + { code: 'is_IS', dic: 'is_IS', name: 'Icelandic', server: false }, + { code: 'id', dic: 'id_ID', name: 'Indonesian' }, + { code: 'ga', dic: 'ga_IE', name: 'Irish' }, + { code: 'it', dic: 'it_IT', name: 'Italian' }, + { code: 'kk', dic: 'kk_KZ', name: 'Kazakh' }, + { code: 'ko', dic: 'ko', name: 'Korean', server: false }, { code: 'ku', name: 'Kurdish' }, - { code: 'lv', name: 'Latvian' }, - { code: 'lt', name: 'Lithuanian' }, + { code: 'kmr', dic: 'kmr_Latn', name: 'Kurmanji', server: false }, + { code: 'lv', dic: 'lv_LV', name: 'Latvian' }, + { code: 'lt', dic: 'lt_LT', name: 'Lithuanian' }, + { code: 'lo_LA', dic: 'lo_LA', name: 'Laotian', server: false }, + { code: 'ml_IN', dic: 'ml_IN', name: 'Malayalam', server: false }, + { code: 'mn_MN', dic: 'mn_MN', name: 'Mongolian', server: false }, { code: 'nr', name: 'Ndebele' }, + { code: 'ne_NP', dic: 'ne_NP', name: 'Nepali', server: false }, { code: 'ns', name: 'Northern Sotho' }, - { code: 'no', name: 'Norwegian' }, - { code: 'fa', name: 'Persian' }, - { code: 'pl', name: 'Polish' }, - { code: 'pt_BR', name: 'Portuguese (Brazilian)' }, - { code: 'pt_PT', name: 'Portuguese (European)' }, + { code: 'no', dic: 'nn_NO', name: 'Norwegian' }, + { code: 'oc_FR', dic: 'oc_FR', name: 'Occitan', server: false }, + { code: 'fa', dic: 'fa_IR', name: 'Persian' }, + { code: 'pl', dic: 'pl_PL', name: 'Polish' }, + { code: 'pt_BR', dic: 'pt_BR', name: 'Portuguese (Brazilian)' }, + { + code: 'pt_PT', + dic: 'pt_PT', + name: 'Portuguese (European)', + server: true, + }, { code: 'pa', name: 'Punjabi' }, - { code: 'ro', name: 'Romanian' }, - { code: 'ru', name: 'Russian' }, - { code: 'sk', name: 'Slovak' }, - { code: 'sl', name: 'Slovenian' }, + { code: 'ro', dic: 'ro_RO', name: 'Romanian' }, + { code: 'ru', dic: 'ru_RU', name: 'Russian' }, + { code: 'gd_GB', dic: 'gd_GB', name: 'Scottish Gaelic', server: false }, + { code: 'sr_RS', dic: 'sr_RS', name: 'Serbian', server: false }, + { code: 'si_LK', dic: 'si_LK', name: 'Sinhala', server: false }, + { code: 'sk', dic: 'sk_SK', name: 'Slovak' }, + { code: 'sl', dic: 'sl_SI', name: 'Slovenian' }, { code: 'st', name: 'Southern Sotho' }, - { code: 'es', name: 'Spanish' }, - { code: 'sv', name: 'Swedish' }, - { code: 'tl', name: 'Tagalog' }, + { code: 'es', dic: 'es_ES', name: 'Spanish' }, + { code: 'sw_TZ', dic: 'sw_TZ', name: 'Swahili', server: false }, + { code: 'sv', dic: 'sv_SE', name: 'Swedish' }, + { code: 'tl', dic: 'tl', name: 'Tagalog' }, + { code: 'te_IN', dic: 'te_IN', name: 'Telugu', server: false }, + { code: 'th_TH', dic: 'th_TH', name: 'Thai', server: false }, + { code: 'bo', dic: 'bo', name: 'Tibetan', server: false }, { code: 'ts', name: 'Tsonga' }, { code: 'tn', name: 'Tswana' }, + { code: 'tr_TR', dic: 'tr_TR', name: 'Turkish', server: false }, + { code: 'uk_UA', dic: 'uk_UA', name: 'Ukrainian', server: false }, { code: 'hsb', name: 'Upper Sorbian' }, + { code: 'uz_UZ', dic: 'uz_UZ', name: 'Uzbek', server: false }, + { code: 'vi_VN', dic: 'vi_VN', name: 'Vietnamese', server: false }, { code: 'cy', name: 'Welsh' }, { code: 'xh', name: 'Xhosa' }, ], diff --git a/services/web/cypress/support/webpack.cypress.ts b/services/web/cypress/support/webpack.cypress.ts index b210d80e5c..6930302b66 100644 --- a/services/web/cypress/support/webpack.cypress.ts +++ b/services/web/cypress/support/webpack.cypress.ts @@ -34,6 +34,12 @@ const buildConfig = () => { '../../frontend/js/features/source-editor/languages/latex/linter/latex-linter.worker' ) + // add entrypoint under '/' for hunspell worker + addWorker( + 'hunspell-worker', + '../../frontend/js/features/source-editor/hunspell/hunspell.worker' + ) + // add entrypoints under '/' for pdfjs workers addWorker('pdfjs-dist213', 'pdfjs-dist213/legacy/build/pdf.worker.js') addWorker('pdfjs-dist401', 'pdfjs-dist401/legacy/build/pdf.worker.mjs') diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index 5cc37e7b00..544108d058 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -65,6 +65,7 @@ "add_or_remove_project_from_tag": "", "add_people": "", "add_role_and_department": "", + "add_to_dictionary": "", "add_to_tag": "", "add_your_comment_here": "", "add_your_first_group_member_now": "", diff --git a/services/web/frontend/js/features/dictionary/ignored-words.ts b/services/web/frontend/js/features/dictionary/ignored-words.ts index d7b141656f..90230eefd2 100644 --- a/services/web/frontend/js/features/dictionary/ignored-words.ts +++ b/services/web/frontend/js/features/dictionary/ignored-words.ts @@ -1,6 +1,6 @@ import getMeta from '../../utils/meta' -const IGNORED_MISSPELLINGS = [ +export const globalLearnedWords = new Set([ 'Overleaf', 'overleaf', 'ShareLaTeX', @@ -21,15 +21,15 @@ const IGNORED_MISSPELLINGS = [ 'lockdown', 'Coronavirus', 'coronavirus', -] +]) export class IgnoredWords { public learnedWords!: Set - private ignoredMisspellings: Set + private readonly ignoredMisspellings: Set constructor() { this.reset() - this.ignoredMisspellings = new Set(IGNORED_MISSPELLINGS) + this.ignoredMisspellings = globalLearnedWords window.addEventListener('learnedWords:doreset', () => this.reset()) // for tests } diff --git a/services/web/frontend/js/features/editor-left-menu/components/settings/settings-spell-check-language.tsx b/services/web/frontend/js/features/editor-left-menu/components/settings/settings-spell-check-language.tsx index 240927cedb..9772a33a3f 100644 --- a/services/web/frontend/js/features/editor-left-menu/components/settings/settings-spell-check-language.tsx +++ b/services/web/frontend/js/features/editor-left-menu/components/settings/settings-spell-check-language.tsx @@ -4,25 +4,39 @@ import getMeta from '../../../../utils/meta' import { useProjectSettingsContext } from '../../context/project-settings-context' import SettingsMenuSelect from './settings-menu-select' import type { Optgroup } from './settings-menu-select' +import { useFeatureFlag } from '@/shared/context/split-test-context' + +// TODO: set to true when ready to show new languages that are only available in the client +const showClientOnlyLanguages = false export default function SettingsSpellCheckLanguage() { const { t } = useTranslation() const languages = getMeta('ol-languages') + const spellCheckClientEnabled = useFeatureFlag('spell-check-client') + const { spellCheckLanguage, setSpellCheckLanguage } = useProjectSettingsContext() - const optgroup: Optgroup = useMemo( - () => ({ + const optgroup: Optgroup = useMemo(() => { + const options = (languages ?? []).filter(lang => { + const clientOnly = lang.server === false + + if (clientOnly && !showClientOnlyLanguages) { + return false + } + + return spellCheckClientEnabled || !clientOnly + }) + + return { label: 'Language', - options: - languages?.map(language => ({ - value: language.code, - label: language.name, - })) ?? [], - }), - [languages] - ) + options: options.map(language => ({ + value: language.code, + label: language.name, + })), + } + }, [languages, spellCheckClientEnabled]) return ( { - if (Date.now() < openingUntil) { - return - } - - if (view.state.field(spellingMenuField, false)) { - view.dispatch({ - effects: hideSpellingMenu.of(null), - }) - } -} - -/* - * Detect when the user right-clicks on a misspelled word, - * and show a menu of suggestions - */ -const handleContextMenuEvent = (event: MouseEvent, view: EditorView) => { - const position = view.posAtCoords( - { - x: event.pageX, - y: event.pageY, - }, - false - ) - const targetMark = getMarkAtPosition(view, position) - - if (!targetMark) { - return - } - - const { from, to, value } = targetMark - - const targetWord = value.spec.word - if (!targetWord) { - debugConsole.debug( - '>> spelling no word associated with decorated range, stopping' - ) - return - } - - event.preventDefault() - - openingUntil = Date.now() + 100 - - view.dispatch({ - selection: EditorSelection.range(from, to), - effects: showSpellingMenu.of({ - mark: targetMark, - word: targetWord, - }), - }) -} - -const handleShortcutEvent = (view: EditorView) => { - const targetMark = getMarkAtPosition(view, view.state.selection.main.from) - - if (!targetMark || !targetMark.value) { - return false - } - - view.dispatch({ - selection: EditorSelection.range(targetMark.from, targetMark.to), - effects: showSpellingMenu.of({ - mark: targetMark, - word: targetMark.value.spec.word, - }), - }) - - return true -} - -/* - * Spelling menu "tooltip" field. - * Manages the menu of suggestions shown on right-click - */ -export const spellingMenuField = StateField.define({ - create() { - return null - }, - update(value, transaction) { - if (value) { - value = { - ...value, - pos: transaction.changes.mapPos(value.pos), - end: value.end ? transaction.changes.mapPos(value.end) : undefined, - } - } - - for (const effect of transaction.effects) { - if (effect.is(hideSpellingMenu)) { - value = null - } else if (effect.is(showSpellingMenu)) { - const { mark, word } = effect.value - // Build a "Tooltip" showing the suggestions - value = { - pos: mark.from, - end: mark.to, - above: false, - strictSide: false, - create: view => { - return createSpellingSuggestionList(word, view) - }, - } - } - } - return value - }, - provide: field => { - return [ - showTooltip.from(field), - EditorView.domEventHandlers({ - contextmenu: handleContextMenuEvent, - click: handleClickEvent, - }), - Prec.highest( - keymap.of([ - { key: 'Ctrl-Space', run: handleShortcutEvent }, - { key: 'Alt-Space', run: handleShortcutEvent }, - ]) - ), - ] - }, -}) - -const showSpellingMenu = StateEffect.define<{ mark: Mark; word: Word }>() - -const hideSpellingMenu = StateEffect.define() - -/* - * Creates the suggestion menu dom, to be displayed in the - * spelling menu "tooltip" - * */ -const createSpellingSuggestionList = (word: Word, view: EditorView) => { - // Wrapper div. - // Note, CM6 doesn't like showing complex elements - // 'inside' its Tooltip element, so we style this - // wrapper div to be basically invisible, and allow - // the dropdown list to hang off of it, giving the illusion that - // the list _is_ the tooltip. - // See the theme in spelling/index for styling that makes this work. - const dom = document.createElement('div') - dom.classList.add('ol-cm-spelling-context-menu-tooltip') - - // List - const list = document.createElement('ul') - list.setAttribute('tabindex', '0') - list.setAttribute('role', 'menu') - list.addEventListener('keydown', event => { - if (event.code === 'Tab') { - // preventing selecting next element - event.preventDefault() - } - }) - list.addEventListener('keyup', event => { - switch (event.code) { - case 'ArrowDown': { - // get currently selected option - const selectedButton = - list.querySelector('li button:focus') - - if (!selectedButton) { - return list - .querySelector('li[role="option"] button') - ?.focus() - } - - // get next option - let nextElement = selectedButton.parentElement?.nextElementSibling - if (nextElement?.getAttribute('role') !== 'option') { - nextElement = nextElement?.nextElementSibling - } - nextElement?.querySelector('button')?.focus() - break - } - case 'ArrowUp': { - // get currently selected option - const selectedButton = - list.querySelector('li button:focus') - - if (!selectedButton) { - return list - .querySelector( - 'li[role="option"]:last-child button' - ) - ?.focus() - } - - // get previous option - let previousElement = - selectedButton.parentElement?.previousElementSibling - if (previousElement?.getAttribute('role') !== 'option') { - previousElement = previousElement?.previousElementSibling - } - previousElement?.querySelector('button')?.focus() - break - } - case 'Escape': - case 'Tab': { - view.dispatch({ - effects: hideSpellingMenu.of(null), - }) - view.focus() - break - } - } - }) - - list.classList.add('dropdown-menu', 'dropdown-menu-unpositioned') - - // List items, with links inside - if (Array.isArray(word.suggestions)) { - for (const suggestion of word.suggestions.slice(0, ITEMS_TO_SHOW)) { - const li = makeLinkItem(suggestion, event => { - const text = (event.target as HTMLElement).innerText - handleCorrectWord(word, text, view) - event.preventDefault() - }) - list.appendChild(li) - } - } - - setTimeout(() => { - list.querySelector('li:first-child button')?.focus() - }, 0) - - // Divider - const divider = document.createElement('li') - divider.classList.add('divider') - list.append(divider) - - // Add to Dictionary - const addToDictionary = makeLinkItem( - 'Add to Dictionary', - async function (event: Event) { - await handleLearnWord(word, view) - event.preventDefault() - } - ) - list.append(addToDictionary) - - dom.appendChild(list) - return { dom } -} - -const makeLinkItem = (suggestion: string, handler: EventListener) => { - const li = document.createElement('li') - const button = document.createElement('button') - li.setAttribute('role', 'option') - button.classList.add('btn-link', 'text-left', 'dropdown-menu-button') - button.onclick = handler - button.textContent = suggestion - li.appendChild(button) - return li -} - -/* - * Learn a word, adding it to the local cache - * and sending it to the spelling backend - */ -const handleLearnWord = async function (word: Word, view: EditorView) { - try { - await learnWordRequest(word) - view.dispatch({ - effects: [addIgnoredWord.of(word), hideSpellingMenu.of(null)], - }) - } catch (err) { - debugConsole.error(err) - } -} - -/* - * Correct a word, removing the marked range - * and replacing it with the chosen text - */ -const handleCorrectWord = (word: Word, text: string, view: EditorView) => { - const tooltip = view.state.field(spellingMenuField) - if (!tooltip) { - throw new Error('No active tooltip') - } - const existingText = view.state.doc.sliceString(tooltip.pos, tooltip.end) - // Defend against erroneous replacement, if the word at this - // position is not actually what we think it is - if (existingText !== word.text) { - debugConsole.debug( - '>> spelling word-to-correct does not match, stopping', - tooltip.pos, - tooltip.end, - existingText, - word - ) - return - } - view.dispatch({ - changes: [ - { - from: tooltip.pos, - to: tooltip.end, - insert: text, - }, - ], - effects: [hideSpellingMenu.of(null)], - }) - view.focus() -} diff --git a/services/web/frontend/js/features/source-editor/extensions/spelling/context-menu.tsx b/services/web/frontend/js/features/source-editor/extensions/spelling/context-menu.tsx new file mode 100644 index 0000000000..1f7d2b4bfd --- /dev/null +++ b/services/web/frontend/js/features/source-editor/extensions/spelling/context-menu.tsx @@ -0,0 +1,224 @@ +import { + StateField, + StateEffect, + EditorSelection, + Prec, +} from '@codemirror/state' +import { EditorView, showTooltip, Tooltip, keymap } from '@codemirror/view' +import { addIgnoredWord } from './ignored-words' +import { learnWordRequest } from './backend' +import { Word, Mark, getMarkAtPosition } from './spellchecker' +import { debugConsole } from '@/utils/debugging' +import { + getSpellChecker, + getSpellCheckLanguage, +} from '@/features/source-editor/extensions/spelling/index' +import { sendMB } from '@/infrastructure/event-tracking' +import ReactDOM from 'react-dom' +import { SpellingSuggestions } from '@/features/source-editor/extensions/spelling/spelling-suggestions' +import { SplitTestProvider } from '@/shared/context/split-test-context' + +/* + * The time until which a click event will be ignored, so it doesn't immediately close the spelling menu. + * Safari emits an additional "click" event when event.preventDefault() is called in the "contextmenu" event listener. + */ +let openingUntil = 0 + +/* + * Hide the spelling menu on click + */ +const handleClickEvent = (event: MouseEvent, view: EditorView) => { + if (Date.now() < openingUntil) { + return + } + + if (view.state.field(spellingMenuField, false)) { + view.dispatch({ + effects: hideSpellingMenu.of(null), + }) + } +} + +/* + * Detect when the user right-clicks on a misspelled word, + * and show a menu of suggestions + */ +const handleContextMenuEvent = (event: MouseEvent, view: EditorView) => { + const position = view.posAtCoords( + { + x: event.pageX, + y: event.pageY, + }, + false + ) + const targetMark = getMarkAtPosition(view, position) + + if (!targetMark) { + return + } + + const { from, to, value } = targetMark + + const targetWord = value.spec.word + if (!targetWord) { + debugConsole.debug( + '>> spelling no word associated with decorated range, stopping' + ) + return + } + + event.preventDefault() + + openingUntil = Date.now() + 100 + + view.dispatch({ + selection: EditorSelection.range(from, to), + effects: showSpellingMenu.of({ + mark: targetMark, + word: targetWord, + }), + }) +} + +const handleShortcutEvent = (view: EditorView) => { + const targetMark = getMarkAtPosition(view, view.state.selection.main.from) + + if (!targetMark || !targetMark.value) { + return false + } + + view.dispatch({ + selection: EditorSelection.range(targetMark.from, targetMark.to), + effects: showSpellingMenu.of({ + mark: targetMark, + word: targetMark.value.spec.word, + }), + }) + + return true +} + +/* + * Spelling menu "tooltip" field. + * Manages the menu of suggestions shown on right-click + */ +export const spellingMenuField = StateField.define({ + create() { + return null + }, + update(value, transaction) { + if (value) { + value = { + ...value, + pos: transaction.changes.mapPos(value.pos), + end: value.end ? transaction.changes.mapPos(value.end) : undefined, + } + } + + for (const effect of transaction.effects) { + if (effect.is(hideSpellingMenu)) { + value = null + } else if (effect.is(showSpellingMenu)) { + const { mark, word } = effect.value + // Build a "Tooltip" showing the suggestions + value = { + pos: mark.from, + end: mark.to, + above: false, + strictSide: false, + create: createSpellingSuggestionList(word), + } + } + } + return value + }, + provide: field => { + return [ + showTooltip.from(field), + EditorView.domEventHandlers({ + contextmenu: handleContextMenuEvent, + click: handleClickEvent, + }), + Prec.highest( + keymap.of([ + { key: 'Ctrl-Space', run: handleShortcutEvent }, + { key: 'Alt-Space', run: handleShortcutEvent }, + ]) + ), + ] + }, +}) + +const showSpellingMenu = StateEffect.define<{ mark: Mark; word: Word }>() + +export const hideSpellingMenu = StateEffect.define() + +/* + * Creates the suggestion menu dom, to be displayed in the + * spelling menu "tooltip" + * */ +const createSpellingSuggestionList = (word: Word) => (view: EditorView) => { + const dom = document.createElement('div') + dom.classList.add('ol-cm-spelling-context-menu-tooltip') + + ReactDOM.render( + + { + view.dispatch({ + effects: hideSpellingMenu.of(null), + }) + view.focus() + }} + handleLearnWord={() => { + learnWordRequest(word) + .then(() => { + view.dispatch({ + effects: [addIgnoredWord.of(word), hideSpellingMenu.of(null)], + }) + sendMB('spelling-word-added', { + language: getSpellCheckLanguage(view.state), + }) + }) + .catch(error => { + debugConsole.error(error) + }) + }} + handleCorrectWord={(text: string) => { + const tooltip = view.state.field(spellingMenuField) + if (!tooltip) { + throw new Error('No active tooltip') + } + + const existingText = view.state.doc.sliceString( + tooltip.pos, + tooltip.end + ) + if (existingText !== word.text) { + return + } + + view.dispatch({ + changes: [{ from: tooltip.pos, to: tooltip.end, insert: text }], + effects: [hideSpellingMenu.of(null)], + }) + view.focus() + + sendMB('spelling-suggestion-click', { + language: getSpellCheckLanguage(view.state), + }) + }} + /> + , + dom + ) + + const destroy = () => { + ReactDOM.unmountComponentAtNode(dom) + } + + return { dom, destroy } +} diff --git a/services/web/frontend/js/features/source-editor/extensions/spelling/ignored-words.ts b/services/web/frontend/js/features/source-editor/extensions/spelling/ignored-words.ts index 69105e3c43..1a17451d7d 100644 --- a/services/web/frontend/js/features/source-editor/extensions/spelling/ignored-words.ts +++ b/services/web/frontend/js/features/source-editor/extensions/spelling/ignored-words.ts @@ -20,6 +20,12 @@ export const addIgnoredWord = StateEffect.define<{ text: string }>() +export const removeIgnoredWord = StateEffect.define<{ + text: string +}>() + export const updateAfterAddingIgnoredWord = StateEffect.define() +export const updateAfterRemovingIgnoredWord = StateEffect.define() + export const resetSpellChecker = StateEffect.define() diff --git a/services/web/frontend/js/features/source-editor/extensions/spelling/index.ts b/services/web/frontend/js/features/source-editor/extensions/spelling/index.ts index aa8970b611..345a357a76 100644 --- a/services/web/frontend/js/features/source-editor/extensions/spelling/index.ts +++ b/services/web/frontend/js/features/source-editor/extensions/spelling/index.ts @@ -1,26 +1,29 @@ import { EditorView, ViewPlugin } from '@codemirror/view' import { - Compartment, - Facet, + EditorState, StateEffect, StateField, TransactionSpec, } from '@codemirror/state' -import { misspelledWordsField, resetMisspelledWords } from './misspelled-words' +import { misspelledWordsField } from './misspelled-words' import { + addIgnoredWord, ignoredWordsField, + removeIgnoredWord, resetSpellChecker, updateAfterAddingIgnoredWord, } from './ignored-words' import { addWordToCache, cacheField, removeWordFromCache } from './cache' -import { spellingMenuField } from './context-menu' +import { hideSpellingMenu, spellingMenuField } from './context-menu' import { SpellChecker } from './spellchecker' import { parserWatcher } from '../wait-for-parser' +import type { HunspellManager } from '@/features/source-editor/hunspell/HunspellManager' +import { debugConsole } from '@/utils/debugging' -const spellCheckLanguageConf = new Compartment() -const spellCheckLanguageFacet = Facet.define() - -type Options = { spellCheckLanguage?: string } +type Options = { + spellCheckLanguage?: string + hunspellManager?: HunspellManager +} /** * A custom extension that creates a spell checker for the current language (from the user settings). @@ -29,12 +32,16 @@ type Options = { spellCheckLanguage?: string } * Mis-spelled words are decorated with a Mark decoration. * The suggestions menu is displayed in a tooltip, activated with a right-click on the decoration. */ -export const spelling = ({ spellCheckLanguage }: Options) => { +export const spelling = ({ spellCheckLanguage, hunspellManager }: Options) => { return [ spellingTheme, parserWatcher, - spellCheckLanguageConf.of(spellCheckLanguageFacet.of(spellCheckLanguage)), - spellCheckField, + spellCheckLanguageField.init(() => spellCheckLanguage), + spellCheckerField.init(() => + spellCheckLanguage + ? new SpellChecker(spellCheckLanguage, hunspellManager) + : null + ), misspelledWordsField, ignoredWordsField, cacheField, @@ -56,16 +63,27 @@ const spellingTheme = EditorView.baseTheme({ }, }) -const spellCheckField = StateField.define({ - create(state) { - const [spellCheckLanguage] = state.facet(spellCheckLanguageFacet) - return spellCheckLanguage ? new SpellChecker(spellCheckLanguage) : null +export const getSpellChecker = (state: EditorState) => + state.field(spellCheckerField, false) + +const spellCheckerField = StateField.define({ + create() { + return null }, update(value, tr) { for (const effect of tr.effects) { if (effect.is(setSpellCheckLanguageEffect)) { value?.destroy() - return effect.value ? new SpellChecker(effect.value) : null + value = effect.value.spellCheckLanguage + ? new SpellChecker( + effect.value.spellCheckLanguage, + effect.value.hunspellManager + ) + : null + } else if (effect.is(addIgnoredWord)) { + value?.addWord(effect.value.text).catch(debugConsole.error) + } else if (effect.is(removeIgnoredWord)) { + value?.removeWord(effect.value.text).catch(debugConsole.error) } } return value @@ -80,7 +98,7 @@ const spellCheckField = StateField.define({ } }), EditorView.domEventHandlers({ - focus: (event, view) => { + focus: (_event, view) => { if (view.state.facet(EditorView.editable)) { view.state.field(field)?.scheduleSpellCheck(view) } @@ -95,18 +113,39 @@ const spellCheckField = StateField.define({ }, }) -const setSpellCheckLanguageEffect = StateEffect.define() +export const getSpellCheckLanguage = (state: EditorState) => + state.field(spellCheckLanguageField, false) -export const setSpelling = ({ +const spellCheckLanguageField = StateField.define({ + create() { + return undefined + }, + update(value, tr) { + for (const effect of tr.effects) { + if (effect.is(setSpellCheckLanguageEffect)) { + value = effect.value.spellCheckLanguage + } + } + return value + }, +}) + +export const setSpellCheckLanguageEffect = StateEffect.define<{ + spellCheckLanguage: string | undefined + hunspellManager?: HunspellManager +}>() + +export const setSpellCheckLanguage = ({ spellCheckLanguage, + hunspellManager, }: Options): TransactionSpec => { return { effects: [ - resetMisspelledWords.of(null), - spellCheckLanguageConf.reconfigure( - spellCheckLanguageFacet.of(spellCheckLanguage) - ), - setSpellCheckLanguageEffect.of(spellCheckLanguage), + setSpellCheckLanguageEffect.of({ + spellCheckLanguage, + hunspellManager, + }), + hideSpellingMenu.of(null), ], } } @@ -137,6 +176,7 @@ export const removeLearnedWord = ( lang: spellCheckLanguage, wordText: word, }), + removeIgnoredWord.of({ text: word }), ], } } diff --git a/services/web/frontend/js/features/source-editor/extensions/spelling/misspelled-words.ts b/services/web/frontend/js/features/source-editor/extensions/spelling/misspelled-words.ts index ce052842c0..66240c9074 100644 --- a/services/web/frontend/js/features/source-editor/extensions/spelling/misspelled-words.ts +++ b/services/web/frontend/js/features/source-editor/extensions/spelling/misspelled-words.ts @@ -2,11 +2,10 @@ import { StateField, StateEffect } from '@codemirror/state' import { EditorView, Decoration, DecorationSet } from '@codemirror/view' import { updateAfterAddingIgnoredWord } from './ignored-words' import { Word } from './spellchecker' +import { setSpellCheckLanguageEffect } from '@/features/source-editor/extensions/spelling/index' export const addMisspelledWords = StateEffect.define() -export const resetMisspelledWords = StateEffect.define() - const createMark = (word: Word) => { return Decoration.mark({ class: 'ol-cm-spelling-error', @@ -39,14 +38,17 @@ export const misspelledWordsField = StateField.define({ if (effect.is(addMisspelledWords)) { // Merge the new misspelled words into the existing set of marks marks = marks.update({ - add: effect.value.map(word => createMark(word)), + add: effect.value.map(word => createMark(word)), // TODO: make sure these positions are still accurate sort: true, }) } else if (effect.is(updateAfterAddingIgnoredWord)) { - // Remove a misspelled word, all instances that match text - const word = effect.value - marks = removeAllMarksMatchingWordText(marks, word) - } else if (effect.is(resetMisspelledWords)) { + // Remove existing marks matching the text of a supplied word + marks = marks.update({ + filter(_from, _to, mark) { + return mark.spec.word.text !== effect.value + }, + }) + } else if (effect.is(setSpellCheckLanguageEffect)) { marks = Decoration.none } } @@ -56,14 +58,3 @@ export const misspelledWordsField = StateField.define({ return EditorView.decorations.from(field) }, }) - -/* - * Remove existing marks matching the text of a supplied word - */ -const removeAllMarksMatchingWordText = (marks: DecorationSet, word: string) => { - return marks.update({ - filter: (from, to, mark) => { - return mark.spec.word.text !== word - }, - }) -} diff --git a/services/web/frontend/js/features/source-editor/extensions/spelling/spellchecker.ts b/services/web/frontend/js/features/source-editor/extensions/spelling/spellchecker.ts index d32a90ff59..e90f98da1b 100644 --- a/services/web/frontend/js/features/source-editor/extensions/spelling/spellchecker.ts +++ b/services/web/frontend/js/features/source-editor/extensions/spelling/spellchecker.ts @@ -13,6 +13,7 @@ import { } from '../../utils/tree-query' import { waitForParser } from '../wait-for-parser' import { debugConsole } from '@/utils/debugging' +import type { HunspellManager } from '../../hunspell/HunspellManager' /* * Spellchecker, handles updates, schedules spelling checks @@ -26,13 +27,17 @@ export class SpellChecker { private trackedChanges: ChangeSet // eslint-disable-next-line no-useless-constructor - constructor(private readonly language: string) { - this.language = language + constructor( + private readonly language: string, + private hunspellManager?: HunspellManager + ) { + debugConsole.log('SpellChecker', language, hunspellManager) this.trackedChanges = ChangeSet.empty(0) } destroy() { this._clearPendingSpellCheck() + // this.hunspellManager?.destroy() } _abortRequest() { @@ -86,7 +91,7 @@ export class SpellChecker { wordsToCheck ) const processResult = ( - misspellings: { index: number; suggestions: string[] }[] + misspellings: { index: number; suggestions?: string[] }[] ) => { this.trackedChanges = ChangeSet.empty(0) @@ -108,18 +113,79 @@ export class SpellChecker { } else { this._abortRequest() this.abortController = new AbortController() - spellCheckRequest(this.language, unknownWords, this.abortController) - .then(result => { - this.abortController = null - processResult(result.misspellings) - }) - .catch(error => { - this.abortController = null - debugConsole.error(error) - }) + if (this.hunspellManager) { + const signal = this.abortController.signal + this.hunspellManager.send( + { + type: 'spell', + words: unknownWords.map(word => word.text), + }, + (result: any) => { + if (!signal.aborted) { + if (result.error) { + debugConsole.error(result.error) + } else { + processResult(result.misspellings) + } + } + } + ) + } else { + spellCheckRequest(this.language, unknownWords, this.abortController) + .then(result => { + this.abortController = null + return processResult(result.misspellings) + }) + .catch(error => { + this.abortController = null + debugConsole.error(error) + }) + } } } + suggest(word: string) { + return new Promise<{ suggestions: string[] }>((resolve, reject) => { + if (this.hunspellManager) { + this.hunspellManager.send({ type: 'suggest', word }, result => { + if ((result as { error: true }).error) { + reject(new Error()) + } else { + resolve(result as { suggestions: string[] }) + } + }) + } + }) + } + + addWord(word: string) { + return new Promise((resolve, reject) => { + if (this.hunspellManager) { + this.hunspellManager.send({ type: 'add_word', word }, result => { + if ((result as { error: true }).error) { + reject(new Error()) + } else { + resolve() + } + }) + } + }) + } + + removeWord(word: string) { + return new Promise((resolve, reject) => { + if (this.hunspellManager) { + this.hunspellManager.send({ type: 'remove_word', word }, result => { + if ((result as { error: true }).error) { + reject(new Error()) + } else { + resolve() + } + }) + } + }) + } + _spellCheckWhenParserReady(view: EditorView) { if (this.waitingForParser) { return @@ -163,7 +229,7 @@ export class SpellChecker { const { from, to } = view.viewport const changedLineNumbers = new Set() if (this.trackedChanges.length > 0) { - this.trackedChanges.iterChangedRanges((fromA, toA, fromB, toB) => { + this.trackedChanges.iterChangedRanges((_fromA, _toA, fromB, toB) => { if (fromB <= to && toB >= from) { const fromLine = view.state.doc.lineAt(fromB).number const toLine = view.state.doc.lineAt(toB).number @@ -180,7 +246,9 @@ export class SpellChecker { } } - const ignoredWords = view.state.field(ignoredWordsField) + const ignoredWords = this.hunspellManager + ? null + : view.state.field(ignoredWordsField) for (const i of changedLineNumbers) { const line = view.state.doc.line(i) wordsToCheck.push( @@ -228,7 +296,7 @@ export class Word { export const buildSpellCheckResult = ( knownMisspelledWords: Word[], unknownWords: Word[], - misspellings: { index: number; suggestions: string[] }[] + misspellings: { index: number; suggestions?: string[] }[] ) => { const cacheAdditions: [Word, string[] | boolean][] = [] @@ -277,7 +345,7 @@ export const compileEffects = (results: { export const getWordsFromLine = ( view: EditorView, line: Line, - ignoredWords: IgnoredWords, + ignoredWords: IgnoredWords | null, lang: string ): Word[] => { const normalTextSpans: Array = getNormalTextSpansFromLine( @@ -287,14 +355,8 @@ export const getWordsFromLine = ( const words: Word[] = [] for (const span of normalTextSpans) { for (const match of span.text.matchAll(WORD_REGEX)) { - let word = match[0] - if (word.startsWith("'")) { - word = word.slice(1) - } - if (word.endsWith("'")) { - word = word.slice(0, -1) - } - if (!ignoredWords.has(word)) { + const word = match[0].replace(/^'+/, '').replace(/'+$/, '') + if (!ignoredWords?.has(word)) { const from = span.from + match.index words.push( new Word({ diff --git a/services/web/frontend/js/features/source-editor/extensions/spelling/spelling-suggestions.tsx b/services/web/frontend/js/features/source-editor/extensions/spelling/spelling-suggestions.tsx new file mode 100644 index 0000000000..d3ab0644f7 --- /dev/null +++ b/services/web/frontend/js/features/source-editor/extensions/spelling/spelling-suggestions.tsx @@ -0,0 +1,189 @@ +import { + FC, + MouseEventHandler, + useCallback, + useEffect, + useMemo, + useState, +} from 'react' +import { SpellChecker, Word } from './spellchecker' +import { useTranslation } from 'react-i18next' +import SplitTestBadge from '@/shared/components/split-test-badge' +import getMeta from '@/utils/meta' +import classnames from 'classnames' +import { SpellCheckLanguage } from '../../../../../../types/project-settings' +import Icon from '@/shared/components/icon' +import { useFeatureFlag } from '@/shared/context/split-test-context' +import { sendMB } from '@/infrastructure/event-tracking' + +const ITEMS_TO_SHOW = 8 + +// TODO: messaging below the spelling suggestions +const SHOW_FOOTER = false + +// (index % length) that works for negative index +const wrapArrayIndex = (index: number, length: number) => + ((index % length) + length) % length + +export const SpellingSuggestions: FC<{ + word: Word + spellCheckLanguage?: string + spellChecker?: SpellChecker | null + handleClose: () => void + handleLearnWord: () => void + handleCorrectWord: (text: string) => void +}> = ({ + word, + spellCheckLanguage, + spellChecker, + handleClose, + handleLearnWord, + handleCorrectWord, +}) => { + const { t } = useTranslation() + + const [suggestions, setSuggestions] = useState(() => + Array.isArray(word.suggestions) + ? word.suggestions.slice(0, ITEMS_TO_SHOW) + : [] + ) + + const [waiting, setWaiting] = useState(!word.suggestions) + + const [selectedIndex, setSelectedIndex] = useState(0) + + const itemsLength = suggestions.length + 1 + + useEffect(() => { + if (!word.suggestions) { + spellChecker?.suggest(word.text).then(result => { + setSuggestions(result.suggestions.slice(0, ITEMS_TO_SHOW)) + setWaiting(false) + sendMB('spelling-suggestion-shown', { + language: spellCheckLanguage, + count: result.suggestions.length, + // word: transaction.state.sliceDoc(mark.from, mark.to), + }) + }) + } + }, [word, spellChecker, spellCheckLanguage]) + + const language = useMemo(() => { + if (spellCheckLanguage) { + return getMeta('ol-languages').find( + item => item.code === spellCheckLanguage + ) + } + }, [spellCheckLanguage]) + + return ( +
    { + switch (event.code) { + case 'ArrowDown': + setSelectedIndex(value => wrapArrayIndex(value + 1, itemsLength)) + break + + case 'ArrowUp': + setSelectedIndex(value => wrapArrayIndex(value - 1, itemsLength)) + break + + case 'Escape': + case 'Tab': + event.preventDefault() + handleClose() + break + } + }} + > + {Array.isArray(suggestions) && ( + <> + {suggestions.map((suggestion, index) => ( + { + event.preventDefault() + handleCorrectWord(suggestion) + }} + /> + ))} + {suggestions.length > 0 &&
  • } + + )} + { + event.preventDefault() + handleLearnWord() + }} + /> + {SHOW_FOOTER && language && ( + <> +
  • +
  • +
    +
  • + + )} +
+ ) +} + +const Footer: FC<{ language: SpellCheckLanguage }> = ({ language }) => { + const spellCheckClientEnabled = useFeatureFlag('spell-check-client') + + if (!spellCheckClientEnabled) { + return null + } + + return language.dic ? ( +
+ {' '} + {language?.name} +
+ ) : ( +
+ {language?.name} +
+ ) +} + +const ListItem: FC<{ + content: string + selected: boolean + handleClick: MouseEventHandler +}> = ({ content, selected, handleClick }) => { + const handleListItem = useCallback( + (element: HTMLElement | null) => { + if (element && selected) { + window.setTimeout(() => { + element.focus() + }) + } + }, + [selected] + ) + + return ( +
  • + +
  • + ) +} diff --git a/services/web/frontend/js/features/source-editor/hooks/use-codemirror-scope.ts b/services/web/frontend/js/features/source-editor/hooks/use-codemirror-scope.ts index 977534d922..aafab8eb19 100644 --- a/services/web/frontend/js/features/source-editor/hooks/use-codemirror-scope.ts +++ b/services/web/frontend/js/features/source-editor/hooks/use-codemirror-scope.ts @@ -37,7 +37,7 @@ import { addLearnedWord, removeLearnedWord, resetLearnedWords, - setSpelling, + setSpellCheckLanguage, } from '../extensions/spelling' import { createChangeManager, @@ -65,6 +65,7 @@ import { setMathPreview } from '@/features/source-editor/extensions/math-preview import { useRangesContext } from '@/features/review-panel-new/context/ranges-context' import { updateRanges } from '@/features/source-editor/extensions/ranges' import { useThreadsContext } from '@/features/review-panel-new/context/threads-context' +import { useHunspell } from '@/features/source-editor/hooks/use-hunspell' function useCodeMirrorScope(view: EditorView) { const { fileTreeData } = useFileTreeData() @@ -111,6 +112,8 @@ function useCodeMirrorScope(view: EditorView) { 'project.spellCheckLanguage' ) + const hunspellManager = useHunspell(spellCheckLanguage) + const [visual] = useScopeValue('editor.showVisual') const { referenceKeys } = useReferencesContext() @@ -214,14 +217,16 @@ function useCodeMirrorScope(view: EditorView) { const spellingRef = useRef({ spellCheckLanguage, + hunspellManager, }) useEffect(() => { spellingRef.current = { spellCheckLanguage, + hunspellManager, } - view.dispatch(setSpelling(spellingRef.current)) - }, [view, spellCheckLanguage]) + view.dispatch(setSpellCheckLanguage(spellingRef.current)) + }, [view, spellCheckLanguage, hunspellManager]) // listen to doc:after-opened, and focus the editor if it's not a new doc useEffect(() => { diff --git a/services/web/frontend/js/features/source-editor/hooks/use-hunspell.ts b/services/web/frontend/js/features/source-editor/hooks/use-hunspell.ts new file mode 100644 index 0000000000..5a10b1dfcb --- /dev/null +++ b/services/web/frontend/js/features/source-editor/hooks/use-hunspell.ts @@ -0,0 +1,35 @@ +import { isSplitTestEnabled } from '@/utils/splitTestUtils' +import { useEffect, useState } from 'react' +import getMeta from '@/utils/meta' +import { globalLearnedWords } from '@/features/dictionary/ignored-words' +import { HunspellManager } from '@/features/source-editor/hunspell/HunspellManager' +import { debugConsole } from '@/utils/debugging' + +export const useHunspell = (spellCheckLanguage: string | null) => { + const [hunspellManager, setHunspellManager] = useState() + + useEffect(() => { + if (isSplitTestEnabled('spell-check-client')) { + if (spellCheckLanguage) { + const languages = getMeta('ol-languages') + const lang = languages.find(item => item.code === spellCheckLanguage) + if (lang?.dic) { + const hunspellManager = new HunspellManager(lang.dic, [ + ...globalLearnedWords, + ...getMeta('ol-learnedWords'), + ]) + setHunspellManager(hunspellManager) + debugConsole.log(spellCheckLanguage, hunspellManager) + + return () => { + hunspellManager.destroy() + } + } else { + setHunspellManager(undefined) + } + } + } + }, [spellCheckLanguage]) + + return hunspellManager +} diff --git a/services/web/frontend/js/features/source-editor/hunspell/Dockerfile b/services/web/frontend/js/features/source-editor/hunspell/Dockerfile new file mode 100644 index 0000000000..6ad77a84df --- /dev/null +++ b/services/web/frontend/js/features/source-editor/hunspell/Dockerfile @@ -0,0 +1,9 @@ +FROM emscripten/emsdk:3.1.67 + +RUN apt-get update && apt-get install -y \ + autoconf \ + automake \ + autopoint \ + build-essential \ + libtool \ + cmake diff --git a/services/web/frontend/js/features/source-editor/hunspell/HunspellManager.ts b/services/web/frontend/js/features/source-editor/hunspell/HunspellManager.ts new file mode 100644 index 0000000000..81f9ea13af --- /dev/null +++ b/services/web/frontend/js/features/source-editor/hunspell/HunspellManager.ts @@ -0,0 +1,111 @@ +import { v4 as uuid } from 'uuid' +import { createWorker } from '@/utils/worker' +import getMeta from '@/utils/meta' +import { debugConsole } from '@/utils/debugging' + +type Message = + | { + id?: string + type: 'spell' + words: string[] + } + | { + id?: string + type: 'suggest' + word: string + } + | { + id?: string + type: 'add_word' + word: string + } + | { + id?: string + type: 'remove_word' + word: string + } + | { + id?: string + type: 'destroy' + } + +export class HunspellManager { + dictionariesRoot: string + hunspellWorker!: Worker + abortController: AbortController | undefined + listening = false + loaded = false + pendingMessages: Message[] = [] + callbacks: Map void> = new Map() + + constructor( + private readonly language: string, + private readonly learnedWords: string[] + ) { + const baseAssetPath = new URL( + getMeta('ol-baseAssetPath'), + window.location.href + ) + + this.dictionariesRoot = new URL( + getMeta('ol-dictionariesRoot'), + baseAssetPath + ).toString() + + createWorker(() => { + this.hunspellWorker = new Worker( + new URL('./hunspell.worker.ts', import.meta.url), + { type: 'module' } + ) + + this.hunspellWorker.addEventListener('message', this.receive.bind(this)) + }) + } + + destroy() { + this.send({ type: 'destroy' }, () => { + this.hunspellWorker.terminate() + }) + } + + send(message: Message, callback: (value: unknown) => void) { + debugConsole.log(message) + if (callback) { + message.id = uuid() + this.callbacks.set(message.id, callback) + } + + if (this.listening) { + this.hunspellWorker.postMessage(message) + } else { + this.pendingMessages.push(message) + } + } + + receive(event: MessageEvent) { + debugConsole.log(event.data) + const { id, listening, loaded, ...rest } = event.data + if (id) { + const callback = this.callbacks.get(id) + if (callback) { + this.callbacks.delete(id) + callback(rest) + } + } else if (listening) { + this.listening = true + this.hunspellWorker.postMessage({ + type: 'init', + lang: this.language, + learnedWords: this.learnedWords, // TODO: add words + dictionariesRoot: this.dictionariesRoot, + }) + for (const message of this.pendingMessages) { + this.hunspellWorker.postMessage(message) + this.pendingMessages.length = 0 + } + } else if (loaded) { + this.loaded = true + // TODO: use this to display pending state? + } + } +} diff --git a/services/web/frontend/js/features/source-editor/hunspell/build.sh b/services/web/frontend/js/features/source-editor/hunspell/build.sh new file mode 100755 index 0000000000..8c19c197ea --- /dev/null +++ b/services/web/frontend/js/features/source-editor/hunspell/build.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -e + +# build an Emscripten SDK Docker image with Hunspell's build dependencies installed +docker build --pull --tag overleaf/emsdk . + +# compile Hunspell to WASM and copy the output files from the Docker container +docker run --rm \ + --workdir /opt \ + --volume "$(pwd)/wasm":/wasm \ + --volume "$(pwd)/compile.sh":/opt/compile.sh:ro \ + overleaf/emsdk \ + bash compile.sh diff --git a/services/web/frontend/js/features/source-editor/hunspell/compile.sh b/services/web/frontend/js/features/source-editor/hunspell/compile.sh new file mode 100755 index 0000000000..e14639cf65 --- /dev/null +++ b/services/web/frontend/js/features/source-editor/hunspell/compile.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -e + +COMMIT="e994dceb97fb695bca6bfe5ad5665525426bf01f" + +curl -L "https://github.com/hunspell/hunspell/archive/${COMMIT}.tar.gz" | tar xvz + +cd "hunspell-${COMMIT}" +autoreconf -fiv +emconfigure ./configure --disable-shared --enable-static +emmake make + +em++ \ + -s EXPORTED_FUNCTIONS="['_Hunspell_create', '_Hunspell_destroy', '_Hunspell_spell', '_Hunspell_suggest', '_Hunspell_free_list', '_Hunspell_add_dic', '_Hunspell_add', '_Hunspell_remove', '_free', '_malloc', 'FS']" \ + -s EXPORTED_RUNTIME_METHODS="['ccall', 'cwrap', 'getValue', 'stringToNewUTF8', 'UTF8ToString', 'WORKERFS']" \ + -s ENVIRONMENT=worker \ + -s ALLOW_MEMORY_GROWTH \ + -lworkerfs.js \ + -O2 \ + -g2 \ + src/hunspell/.libs/libhunspell-1.7.a \ + -o hunspell.mjs + +cp hunspell.{mjs,wasm} /wasm/ diff --git a/services/web/frontend/js/features/source-editor/hunspell/hunspell.worker.ts b/services/web/frontend/js/features/source-editor/hunspell/hunspell.worker.ts new file mode 100644 index 0000000000..db5dad7848 --- /dev/null +++ b/services/web/frontend/js/features/source-editor/hunspell/hunspell.worker.ts @@ -0,0 +1,237 @@ +import Hunspell from './wasm/hunspell' + +type SpellChecker = { + spell(words: string[]): { index: number }[] + suggest(word: string): string[] + addWord(word: string): void + removeWord(word: string): void + destroy(): void +} + +const createSpellChecker = async ({ + lang, + learnedWords, + dictionariesRoot, +}: { + lang: string + learnedWords: string[] + dictionariesRoot: string +}) => { + const hunspell = await Hunspell() + + const { + cwrap, + FS, + WORKERFS, + stringToNewUTF8, + _malloc, + _free, + getValue, + UTF8ToString, + } = hunspell + + // https://github.com/hunspell/hunspell/blob/master/src/hunspell/hunspell.h + // https://github.com/kwonoj/hunspell-asm/blob/master/src/wrapHunspellInterface.ts + + const create = cwrap('Hunspell_create', 'number', ['number', 'number']) + const destroy = cwrap('Hunspell_destroy', 'number', ['number', 'number']) + const spell = cwrap('Hunspell_spell', 'number', ['number', 'number']) + const suggest = cwrap('Hunspell_suggest', 'number', [ + 'number', + 'number', + 'number', + ]) + const addWord = cwrap('Hunspell_add', 'number', ['number', 'number']) + const removeWord = cwrap('Hunspell_remove', 'number', ['number', 'number']) + const freeList = cwrap('Hunspell_free_list', 'number', [ + 'number', + 'number', + 'number', + ]) + + FS.mkdir('/dictionaries') + + const [dic, aff] = await Promise.all([ + fetch(new URL(`./${lang}.dic`, dictionariesRoot)).then(response => + response.blob() + ), + fetch(new URL(`./${lang}.aff`, dictionariesRoot)).then(response => + response.blob() + ), + ]) + + FS.mount( + WORKERFS, + { + blobs: [ + { name: 'index.dic', data: dic }, + { name: 'index.aff', data: aff }, + ], + }, + '/dictionaries' + ) + + const dicPtr = stringToNewUTF8('/dictionaries/index.dic') + const affPtr = stringToNewUTF8('/dictionaries/index.aff') + const spellPtr = create(affPtr, dicPtr) + + for (const word of learnedWords) { + const wordPtr = stringToNewUTF8(word) + addWord(spellPtr, wordPtr) + _free(wordPtr) + } + + const spellChecker: SpellChecker = { + spell(words) { + const misspellings: { index: number }[] = [] + + for (const [index, word] of words.entries()) { + const wordPtr = stringToNewUTF8(word) + const spellResult = spell(spellPtr, wordPtr) + _free(wordPtr) + + if (spellResult === 0) { + misspellings.push({ index }) + } + } + + return misspellings + }, + suggest(word) { + const suggestions: string[] = [] + + const suggestionListPtr = _malloc(4) + const wordPtr = stringToNewUTF8(word) + const suggestionCount = suggest(spellPtr, suggestionListPtr, wordPtr) + _free(wordPtr) + const suggestionListValuePtr = getValue(suggestionListPtr, '*') + + for (let i = 0; i < suggestionCount; i++) { + const suggestion = UTF8ToString( + getValue(suggestionListValuePtr + i * 4, '*') + ) + suggestions.push(suggestion) + } + + freeList(spellPtr, suggestionListPtr, suggestionCount) + _free(suggestionListPtr) + + return suggestions + }, + addWord(word) { + const wordPtr = stringToNewUTF8(word) + const result = addWord(spellPtr, wordPtr) + _free(wordPtr) + + if (result !== 0) { + throw new Error('The word could not be added to the dictionary') + } + }, + removeWord(word) { + const wordPtr = stringToNewUTF8(word) + const result = removeWord(spellPtr, wordPtr) + _free(wordPtr) + + if (result !== 0) { + throw new Error('The word could not be removed from the dictionary') + } + }, + destroy() { + destroy(spellPtr) + _free(spellPtr) + _free(dicPtr) + _free(affPtr) + }, + } + + return spellChecker +} + +let spellCheckerPromise: Promise + +self.addEventListener('message', async event => { + switch (event.data.type) { + case 'init': + try { + spellCheckerPromise = createSpellChecker(event.data) + await spellCheckerPromise + self.postMessage({ loaded: true }) + } catch (error) { + console.error(error) + self.postMessage({ error: true }) + } + break + + case 'spell': + { + const { id, words } = event.data + try { + const spellChecker = await spellCheckerPromise + const misspellings = spellChecker.spell(words) + self.postMessage({ id, misspellings }) + } catch (error) { + console.error(error) + self.postMessage({ id, error: true }) + } + } + break + + case 'suggest': + { + const { id, word } = event.data + try { + const spellChecker = await spellCheckerPromise + const suggestions = spellChecker.suggest(word) + self.postMessage({ id, suggestions }) + } catch (error) { + console.error(error) + self.postMessage({ id, error: true }) + } + } + break + + case 'add_word': + { + const { id, word } = event.data + try { + const spellChecker = await spellCheckerPromise + spellChecker.addWord(word) + self.postMessage({ id }) + } catch (error) { + console.error(error) + self.postMessage({ id, error: true }) + } + } + break + + case 'remove_word': + { + const { id, word } = event.data + try { + const spellChecker = await spellCheckerPromise + spellChecker.removeWord(word) + self.postMessage({ id }) + } catch (error) { + console.error(error) + self.postMessage({ id, error: true }) + } + } + break + + case 'destroy': + { + const { id } = event.data + try { + const spellChecker = await spellCheckerPromise + spellChecker.destroy() + self.postMessage({ id }) + } catch (error) { + console.error(error) + self.postMessage({ id, error: true }) + } + } + break + } +}) + +self.postMessage({ listening: true }) diff --git a/services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.d.ts b/services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.d.ts new file mode 100644 index 0000000000..6b15ba55c5 --- /dev/null +++ b/services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.d.ts @@ -0,0 +1,66 @@ +/* eslint no-dupe-class-members: 0 */ + +declare class Hunspell { + cwrap( + method: 'Hunspell_create', + output: string, + input: string[] + ): (affPtr: number, dicPtr: number) => number + + cwrap( + method: 'Hunspell_destroy', + output: string, + input: string[] + ): (spellPtr: number) => number + + cwrap( + method: 'Hunspell_spell', + output: string, + input: string[] + ): (spellPtr: number, wordPtr: number) => number + + cwrap( + method: 'Hunspell_suggest', + output: string, + input: string[] + ): (spellPtr: number, suggestionListPtr: number, wordPtr: number) => number + + cwrap( + method: 'Hunspell_add', + output: string, + input: string[] + ): (spellPtr: number, wordPtr: number) => number + + cwrap( + method: 'Hunspell_remove', + output: string, + input: string[] + ): (spellPtr: number, wordPtr: number) => number + + cwrap( + method: 'Hunspell_free_list', + output: string, + input: string[] + ): (spellPtr: number, suggestionListPtr: number, n: number) => number + + stringToNewUTF8(input: string): number + UTF8ToString(input: number): string + _malloc(length: number): number + _free(ptr: number): void + getValue(ptr: number, type: string): number + FS: { + mkdir(path: string): void + mount( + type: any, + data: { blobs: Record<{ name: string; data: BlobPart }>[] }, + dir: string + ): void + } + + WORKERFS: any +} + +declare const factory = async (options?: Record) => + new Hunspell(options) + +export default factory diff --git a/services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.mjs b/services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.mjs new file mode 100644 index 0000000000..ec6cf66d7c --- /dev/null +++ b/services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.mjs @@ -0,0 +1,3940 @@ + +var Module = (() => { + var _scriptName = import.meta.url; + + return ( +function(moduleArg = {}) { + var moduleRtn; + +// include: shell.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(moduleArg) => Promise +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = moduleArg; + +// Set up the promise that indicates the Module is initialized +var readyPromiseResolve, readyPromiseReject; + +var readyPromise = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; +}); + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). +var ENVIRONMENT_IS_WEB = false; + +var ENVIRONMENT_IS_WORKER = true; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; + +var thisProgram = "./this.program"; + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ""; + +function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var readAsync, readBinary; + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != "undefined" && document.currentScript) { + // web + scriptDirectory = document.currentScript.src; + } + // When MODULARIZE, this JS may be executed later, after document.currentScript + // is gone, so we saved it, and we use it here instead of any other info. + if (_scriptName) { + scriptDirectory = _scriptName; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.startsWith("blob:")) { + scriptDirectory = ""; + } else { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1); + } + { + // include: web_or_worker_shell_read.js + if (ENVIRONMENT_IS_WORKER) { + readBinary = url => { + var xhr = new XMLHttpRequest; + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */ (xhr.response)); + }; + } + readAsync = url => fetch(url, { + credentials: "same-origin" + }).then(response => { + if (response.ok) { + return response.arrayBuffer(); + } + return Promise.reject(new Error(response.status + " : " + response.url)); + }); + } +} else // end include: web_or_worker_shell_read.js +{} + +var out = Module["print"] || console.log.bind(console); + +var err = Module["printErr"] || console.error.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); + +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used. +moduleOverrides = null; + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. +if (Module["arguments"]) arguments_ = Module["arguments"]; + +if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// end include: shell.js +// include: preamble.js +// === Preamble library stuff === +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html +var wasmBinary = Module["wasmBinary"]; + +// Wasm globals +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we +// don't define it at all in release modes. This matches the behaviour of +// MINIMAL_RUNTIME. +// TODO(sbc): Make this the default even without STRICT enabled. +/** @type {function(*, string=)} */ function assert(condition, text) { + if (!condition) { + // This build was created without ASSERTIONS defined. `assert()` should not + // ever be called in this configuration but in case there are callers in + // the wild leave this simple abort() implementation here for now. + abort(text); + } +} + +// Memory management +var /** @type {!Int8Array} */ HEAP8, /** @type {!Uint8Array} */ HEAPU8, /** @type {!Int16Array} */ HEAP16, /** @type {!Uint16Array} */ HEAPU16, /** @type {!Int32Array} */ HEAP32, /** @type {!Uint32Array} */ HEAPU32, /** @type {!Float32Array} */ HEAPF32, /** @type {!Float64Array} */ HEAPF64; + +// include: runtime_shared.js +function updateMemoryViews() { + var b = wasmMemory.buffer; + Module["HEAP8"] = HEAP8 = new Int8Array(b); + Module["HEAP16"] = HEAP16 = new Int16Array(b); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); + Module["HEAP32"] = HEAP32 = new Int32Array(b); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); + Module["HEAPF32"] = HEAPF32 = new Float32Array(b); + Module["HEAPF64"] = HEAPF64 = new Float64Array(b); +} + +// end include: runtime_shared.js +// include: runtime_stack_check.js +// end include: runtime_stack_check.js +var __ATPRERUN__ = []; + +// functions called before the runtime is initialized +var __ATINIT__ = []; + +// functions called during shutdown +var __ATPOSTRUN__ = []; + +// functions called after the main() is called +var runtimeInitialized = false; + +function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [ Module["preRun"] ]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + runtimeInitialized = true; + if (!Module["noFSInit"] && !FS.initialized) FS.init(); + FS.ignorePermissions = false; + TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [ Module["postRun"] ]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; + +var runDependencyWatcher = null; + +var dependenciesFulfilled = null; + +// overridden to take different actions when all run dependencies are fulfilled +function getUniqueRunDependency(id) { + return id; +} + +function addRunDependency(id) { + runDependencies++; + Module["monitorRunDependencies"]?.(runDependencies); +} + +function removeRunDependency(id) { + runDependencies--; + Module["monitorRunDependencies"]?.(runDependencies); + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } +} + +/** @param {string|number=} what */ function abort(what) { + Module["onAbort"]?.(what); + what = "Aborted(" + what + ")"; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + // Suppress closure compiler warning here. Closure compiler's builtin extern + // definition for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// include: URIUtils.js +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = "data:application/octet-stream;base64,"; + +/** + * Indicates whether filename is a base64 data URI. + * @noinline + */ var isDataURI = filename => filename.startsWith(dataURIPrefix); + +// end include: URIUtils.js +// include: runtime_exceptions.js +// end include: runtime_exceptions.js +function findWasmBinary() { + if (Module["locateFile"]) { + var f = "hunspell.wasm"; + if (!isDataURI(f)) { + return locateFile(f); + } + return f; + } + // Use bundler-friendly `new URL(..., import.meta.url)` pattern; works in browsers too. + return new URL("hunspell.wasm", import.meta.url).href; +} + +var wasmBinaryFile; + +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw "both async and sync fetching of the wasm failed"; +} + +function getBinaryPromise(binaryFile) { + // If we don't have the binary yet, load it asynchronously using readAsync. + if (!wasmBinary) { + // Fetch the binary using readAsync + return readAsync(binaryFile).then(response => new Uint8Array(/** @type{!ArrayBuffer} */ (response)), // Fall back to getBinarySync if readAsync fails + () => getBinarySync(binaryFile)); + } + // Otherwise, getBinarySync should be able to get it synchronously + return Promise.resolve().then(() => getBinarySync(binaryFile)); +} + +function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile).then(binary => WebAssembly.instantiate(binary, imports)).then(receiver, reason => { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + }); +} + +function instantiateAsync(binary, binaryFile, imports, callback) { + if (!binary && typeof WebAssembly.instantiateStreaming == "function" && !isDataURI(binaryFile) && typeof fetch == "function") { + return fetch(binaryFile, { + credentials: "same-origin" + }).then(response => { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ var result = WebAssembly.instantiateStreaming(response, imports); + return result.then(callback, function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err(`wasm streaming compile failed: ${reason}`); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(binaryFile, imports, callback); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); +} + +function getWasmImports() { + // prepare imports + return { + "env": wasmImports, + "wasi_snapshot_preview1": wasmImports + }; +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + var info = getWasmImports(); + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ function receiveInstance(instance, module) { + wasmExports = instance.exports; + wasmMemory = wasmExports["memory"]; + updateMemoryViews(); + addOnInit(wasmExports["__wasm_call_ctors"]); + removeRunDependency("wasm-instantiate"); + return wasmExports; + } + // wait for the pthread pool (if any) + addRunDependency("wasm-instantiate"); + // Prefer streaming instantiation if available. + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above PTHREADS-enabled path. + receiveInstance(result["instance"]); + } + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + if (Module["instantiateWasm"]) { + try { + return Module["instantiateWasm"](info, receiveInstance); + } catch (e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + // If instantiation fails, reject the module ready promise. + readyPromiseReject(e); + } + } + if (!wasmBinaryFile) wasmBinaryFile = findWasmBinary(); + // If instantiation fails, reject the module ready promise. + instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult).catch(readyPromiseReject); + return {}; +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; + +var tempI64; + +var callRuntimeCallbacks = callbacks => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } +}; + +/** + * @param {number} ptr + * @param {string} type + */ function getValue(ptr, type = "i8") { + if (type.endsWith("*")) type = "*"; + switch (type) { + case "i1": + return HEAP8[ptr]; + + case "i8": + return HEAP8[ptr]; + + case "i16": + return HEAP16[((ptr) >> 1)]; + + case "i32": + return HEAP32[((ptr) >> 2)]; + + case "i64": + abort("to do getValue(i64) use WASM_BIGINT"); + + case "float": + return HEAPF32[((ptr) >> 2)]; + + case "double": + return HEAPF64[((ptr) >> 3)]; + + case "*": + return HEAPU32[((ptr) >> 2)]; + + default: + abort(`invalid type for getValue: ${type}`); + } +} + +var noExitRuntime = Module["noExitRuntime"] || true; + +var stackRestore = val => __emscripten_stack_restore(val); + +var stackSave = () => _emscripten_stack_get_current(); + +var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder : undefined; + +/** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. Also, use the length info to avoid running tiny + // strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, + // so that undefined means Infinity) + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ""; + // If building with TextDecoder, we have already computed the string length + // above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); + } + } + return str; +}; + +/** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + +var ___assert_fail = (condition, filename, line, func) => { + abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [ filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function" ]); +}; + +class ExceptionInfo { + // excPtr - Thrown object pointer to wrap. Metadata pointer is calculated from it. + constructor(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - 24; + } + set_type(type) { + HEAPU32[(((this.ptr) + (4)) >> 2)] = type; + } + get_type() { + return HEAPU32[(((this.ptr) + (4)) >> 2)]; + } + set_destructor(destructor) { + HEAPU32[(((this.ptr) + (8)) >> 2)] = destructor; + } + get_destructor() { + return HEAPU32[(((this.ptr) + (8)) >> 2)]; + } + set_caught(caught) { + caught = caught ? 1 : 0; + HEAP8[(this.ptr) + (12)] = caught; + } + get_caught() { + return HEAP8[(this.ptr) + (12)] != 0; + } + set_rethrown(rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(this.ptr) + (13)] = rethrown; + } + get_rethrown() { + return HEAP8[(this.ptr) + (13)] != 0; + } + // Initialize native structure fields. Should be called once after allocated. + init(type, destructor) { + this.set_adjusted_ptr(0); + this.set_type(type); + this.set_destructor(destructor); + } + set_adjusted_ptr(adjustedPtr) { + HEAPU32[(((this.ptr) + (16)) >> 2)] = adjustedPtr; + } + get_adjusted_ptr() { + return HEAPU32[(((this.ptr) + (16)) >> 2)]; + } +} + +var exceptionLast = 0; + +var uncaughtExceptionCount = 0; + +var ___cxa_throw = (ptr, type, destructor) => { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + throw exceptionLast; +}; + +/** @suppress {duplicate } */ function syscallGetVarargI() { + // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number. + var ret = HEAP32[((+SYSCALLS.varargs) >> 2)]; + SYSCALLS.varargs += 4; + return ret; +} + +var syscallGetVarargP = syscallGetVarargI; + +var PATH = { + isAbs: path => path.charAt(0) === "/", + splitPath: filename => { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + }, + normalizeArray: (parts, allowAboveRoot) => { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === ".") { + parts.splice(i, 1); + } else if (last === "..") { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (;up; up--) { + parts.unshift(".."); + } + } + return parts; + }, + normalize: path => { + var isAbsolute = PATH.isAbs(path), trailingSlash = path.substr(-1) === "/"; + // Normalize the path + path = PATH.normalizeArray(path.split("/").filter(p => !!p), !isAbsolute).join("/"); + if (!path && !isAbsolute) { + path = "."; + } + if (path && trailingSlash) { + path += "/"; + } + return (isAbsolute ? "/" : "") + path; + }, + dirname: path => { + var result = PATH.splitPath(path), root = result[0], dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return "."; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: path => { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === "/") return "/"; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf("/"); + if (lastSlash === -1) return path; + return path.substr(lastSlash + 1); + }, + join: (...paths) => PATH.normalize(paths.join("/")), + join2: (l, r) => PATH.normalize(l + "/" + r) +}; + +var initRandomFill = () => { + if (typeof crypto == "object" && typeof crypto["getRandomValues"] == "function") { + // for modern web browsers + return view => crypto.getRandomValues(view); + } else // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + abort("initRandomDevice"); +}; + +var randomFill = view => (randomFill = initRandomFill())(view); + +var PATH_FS = { + resolve: (...args) => { + var resolvedPath = "", resolvedAbsolute = false; + for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? args[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != "string") { + throw new TypeError("Arguments to path.resolve must be strings"); + } else if (!path) { + return ""; + } + // an invalid portion invalidates the whole thing + resolvedPath = path + "/" + resolvedPath; + resolvedAbsolute = PATH.isAbs(path); + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter(p => !!p), !resolvedAbsolute).join("/"); + return ((resolvedAbsolute ? "/" : "") + resolvedPath) || "."; + }, + relative: (from, to) => { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (;start < arr.length; start++) { + if (arr[start] !== "") break; + } + var end = arr.length - 1; + for (;end >= 0; end--) { + if (arr[end] !== "") break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split("/")); + var toParts = trim(to.split("/")); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push(".."); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join("/"); + } +}; + +var FS_stdin_getChar_buffer = []; + +var lengthBytesUTF8 = str => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var c = str.charCodeAt(i); + // possibly a lead surrogate + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; +}; + +var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description + // and https://www.ietf.org/rfc/rfc2279.txt + // and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); + // possibly a lead surrogate + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +}; + +/** @type {function(string, boolean=, number=)} */ function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +var FS_stdin_getChar = () => { + if (!FS_stdin_getChar_buffer.length) { + var result = null; + {} + if (!result) { + return null; + } + FS_stdin_getChar_buffer = intArrayFromString(result, true); + } + return FS_stdin_getChar_buffer.shift(); +}; + +var TTY = { + ttys: [], + init() {}, + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process.stdin.setEncoding('utf8'); + // } + shutdown() {}, + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process.stdin.pause(); + // } + register(dev, ops) { + TTY.ttys[dev] = { + input: [], + output: [], + ops + }; + FS.registerDevice(dev, TTY.stream_ops); + }, + stream_ops: { + open(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + stream.tty.ops.fsync(stream.tty); + }, + fsync(stream) { + stream.tty.ops.fsync(stream.tty); + }, + read(stream, buffer, offset, length, pos) { + /* ignored */ if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }, + default_tty_ops: { + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + // val == 0 would cut text output off in the middle. + fsync(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + ioctl_tcgets(tty) { + // typical setting + return { + c_iflag: 25856, + c_oflag: 5, + c_cflag: 191, + c_lflag: 35387, + c_cc: [ 3, 28, 127, 21, 4, 0, 1, 0, 17, 19, 26, 0, 18, 15, 23, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] + }; + }, + ioctl_tcsets(tty, optional_actions, data) { + // currently just ignore + return 0; + }, + ioctl_tiocgwinsz(tty) { + return [ 24, 80 ]; + } + }, + default_tty1_ops: { + put_char(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + } + } +}; + +var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; + +var mmapAlloc = size => { + abort(); +}; + +var MEMFS = { + ops_table: null, + mount(mount) { + return MEMFS.createNode(null, "/", 16384 | 511, /* 0777 */ 0); + }, + createNode(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + MEMFS.ops_table ||= { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; + // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + }, + getFileDataAsTypedArray(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); + // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; + // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); + // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + }, + // Copy old data over to the new storage. + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; + // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); + } + // Copy old data over to the new storage. + node.usedBytes = newSize; + } + }, + node_ops: { + getattr(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw FS.genericErrors[44]; + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now(); + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.timestamp = Date.now(); + }, + rmdir(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.timestamp = Date.now(); + }, + readdir(node) { + var entries = [ ".", ".." ]; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 | /* 0777 */ 40960, 0); + node.link = oldpath; + return node; + }, + readlink(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + } + }, + stream_ops: { + read(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + if (size > 8 && contents.subarray) { + // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + }, + write(stream, buffer, offset, length, position, canOwn) { + // If the buffer is located in main memory (HEAP), and if + // memory can grow, we can't hold on to references of the + // memory buffer, as they may get invalidated. That means we + // need to do copy its contents. + if (buffer.buffer === HEAP8.buffer) { + canOwn = false; + } + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + if (buffer.subarray && (!node.contents || node.contents.subarray)) { + // This write is from a typed array to a typed array? + if (canOwn) { + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { + // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { + // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + }, + allocate(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + }, + mmap(stream, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents && contents.buffer === HEAP8.buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the + // buffer we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + if (contents) { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + HEAP8.set(contents, ptr); + } + } + return { + ptr, + allocated + }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + } + } +}; + +/** @param {boolean=} noRunDep */ var asyncLoad = (url, onload, onerror, noRunDep) => { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ""; + readAsync(url).then(arrayBuffer => { + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, err => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + }); + if (dep) addRunDependency(dep); +}; + +var FS_createDataFile = (parent, name, fileData, canRead, canWrite, canOwn) => { + FS.createDataFile(parent, name, fileData, canRead, canWrite, canOwn); +}; + +var preloadPlugins = Module["preloadPlugins"] || []; + +var FS_handledByPreloadPlugin = (byteArray, fullname, finish, onerror) => { + // Ensure plugins are ready. + if (typeof Browser != "undefined") Browser.init(); + var handled = false; + preloadPlugins.forEach(plugin => { + if (handled) return; + if (plugin["canHandle"](fullname)) { + plugin["handle"](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; +}; + +var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); + // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + onload?.(); + removeRunDependency(dep); + } + if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + onerror?.(); + removeRunDependency(dep); + })) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == "string") { + asyncLoad(url, processData, onerror); + } else { + processData(url); + } +}; + +var FS_modeStringToFlags = str => { + var flagModes = { + "r": 0, + "r+": 2, + "w": 512 | 64 | 1, + "w+": 512 | 64 | 2, + "a": 1024 | 64 | 1, + "a+": 1024 | 64 | 2 + }; + var flags = flagModes[str]; + if (typeof flags == "undefined") { + throw new Error(`Unknown file open mode: ${str}`); + } + return flags; +}; + +var FS_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; +}; + +var WORKERFS = { + DIR_MODE: 16895, + FILE_MODE: 33279, + reader: null, + mount(mount) { + assert(ENVIRONMENT_IS_WORKER); + if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync; + var root = WORKERFS.createNode(null, "/", WORKERFS.DIR_MODE, 0); + var createdParents = {}; + function ensureParent(path) { + // return the parent node, creating subdirs as necessary + var parts = path.split("/"); + var parent = root; + for (var i = 0; i < parts.length - 1; i++) { + var curr = parts.slice(0, i + 1).join("/"); + // Issue 4254: Using curr as a node name will prevent the node + // from being found in FS.nameTable when FS.open is called on + // a path which holds a child of this node, + // given that all FS functions assume node names + // are just their corresponding parts within their given path, + // rather than incremental aggregates which include their parent's + // directories. + createdParents[curr] ||= WORKERFS.createNode(parent, parts[i], WORKERFS.DIR_MODE, 0); + parent = createdParents[curr]; + } + return parent; + } + function base(path) { + var parts = path.split("/"); + return parts[parts.length - 1]; + } + // We also accept FileList here, by using Array.prototype + Array.prototype.forEach.call(mount.opts["files"] || [], function(file) { + WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate); + }); + (mount.opts["blobs"] || []).forEach(obj => { + WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]); + }); + (mount.opts["packages"] || []).forEach(pack => { + pack["metadata"].files.forEach(file => { + var name = file.filename.substr(1); + // remove initial slash + WORKERFS.createNode(ensureParent(name), base(name), WORKERFS.FILE_MODE, 0, pack["blob"].slice(file.start, file.end)); + }); + }); + return root; + }, + createNode(parent, name, mode, dev, contents, mtime) { + var node = FS.createNode(parent, name, mode); + node.mode = mode; + node.node_ops = WORKERFS.node_ops; + node.stream_ops = WORKERFS.stream_ops; + node.timestamp = (mtime || new Date).getTime(); + assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE); + if (mode === WORKERFS.FILE_MODE) { + node.size = contents.size; + node.contents = contents; + } else { + node.size = 4096; + node.contents = {}; + } + if (parent) { + parent.contents[name] = node; + } + return node; + }, + node_ops: { + getattr(node) { + return { + dev: 1, + ino: node.id, + mode: node.mode, + nlink: 1, + uid: 0, + gid: 0, + rdev: 0, + size: node.size, + atime: new Date(node.timestamp), + mtime: new Date(node.timestamp), + ctime: new Date(node.timestamp), + blksize: 4096, + blocks: Math.ceil(node.size / 4096) + }; + }, + setattr(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + }, + lookup(parent, name) { + throw new FS.ErrnoError(44); + }, + mknod(parent, name, mode, dev) { + throw new FS.ErrnoError(63); + }, + rename(oldNode, newDir, newName) { + throw new FS.ErrnoError(63); + }, + unlink(parent, name) { + throw new FS.ErrnoError(63); + }, + rmdir(parent, name) { + throw new FS.ErrnoError(63); + }, + readdir(node) { + var entries = [ ".", ".." ]; + for (var key of Object.keys(node.contents)) { + entries.push(key); + } + return entries; + }, + symlink(parent, newName, oldPath) { + throw new FS.ErrnoError(63); + } + }, + stream_ops: { + read(stream, buffer, offset, length, position) { + if (position >= stream.node.size) return 0; + var chunk = stream.node.contents.slice(position, position + length); + var ab = WORKERFS.reader.readAsArrayBuffer(chunk); + buffer.set(new Uint8Array(ab), offset); + return chunk.size; + }, + write(stream, buffer, offset, length, position) { + throw new FS.ErrnoError(29); + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.size; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + } + } +}; + +var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: "/", + initialized: false, + ignorePermissions: true, + ErrnoError: class { + // We set the `name` property to be able to identify `FS.ErrnoError` + // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway. + // - when using PROXYFS, an error can come from an underlying FS + // as different FS objects have their own FS.ErrnoError each, + // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs. + // we'll use the reliable test `err.name == "ErrnoError"` instead + constructor(errno) { + // TODO(sbc): Use the inline member declaration syntax once we + // support it in acorn and closure. + this.name = "ErrnoError"; + this.errno = errno; + } + }, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + FSStream: class { + constructor() { + // TODO(https://github.com/emscripten-core/emscripten/issues/21414): + // Use inline field declarations. + this.shared = {}; + } + get object() { + return this.node; + } + set object(val) { + this.node = val; + } + get isRead() { + return (this.flags & 2097155) !== 1; + } + get isWrite() { + return (this.flags & 2097155) !== 0; + } + get isAppend() { + return (this.flags & 1024); + } + get flags() { + return this.shared.flags; + } + set flags(val) { + this.shared.flags = val; + } + get position() { + return this.shared.position; + } + set position(val) { + this.shared.position = val; + } + }, + FSNode: class { + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + // root node sets parent to itself + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + this.readMode = 292 | 73; + this.writeMode = 146; + } + get read() { + return (this.mode & this.readMode) === this.readMode; + } + set read(val) { + val ? this.mode |= this.readMode : this.mode &= ~this.readMode; + } + get write() { + return (this.mode & this.writeMode) === this.writeMode; + } + set write(val) { + val ? this.mode |= this.writeMode : this.mode &= ~this.writeMode; + } + get isFolder() { + return FS.isDir(this.mode); + } + get isDevice() { + return FS.isChrdev(this.mode); + } + }, + lookupPath(path, opts = {}) { + path = PATH_FS.resolve(path); + if (!path) return { + path: "", + node: null + }; + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + opts = Object.assign(defaults, opts); + if (opts.recurse_count > 8) { + // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + // split the absolute path + var parts = path.split("/").filter(p => !!p); + // start at the root + var current = FS.root; + var current_path = "/"; + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length - 1); + if (islast && opts.parent) { + // stop resolving + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count + 1 + }); + current = lookup.node; + if (count++ > 40) { + // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current + }; + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length - 1] !== "/" ? `${mount}/${path}` : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + }, + hashAddNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + }, + hashRemoveNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + }, + lookupNode(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + }, + createNode(parent, name, mode, rdev) { + var node = new FS.FSNode(parent, name, mode, rdev); + FS.hashAddNode(node); + return node; + }, + destroyNode(node) { + FS.hashRemoveNode(node); + }, + isRoot(node) { + return node === node.parent; + }, + isMountpoint(node) { + return !!node.mounted; + }, + isFile(mode) { + return (mode & 61440) === 32768; + }, + isDir(mode) { + return (mode & 61440) === 16384; + }, + isLink(mode) { + return (mode & 61440) === 40960; + }, + isChrdev(mode) { + return (mode & 61440) === 8192; + }, + isBlkdev(mode) { + return (mode & 61440) === 24576; + }, + isFIFO(mode) { + return (mode & 61440) === 4096; + }, + isSocket(mode) { + return (mode & 49152) === 49152; + }, + flagsToPermissionString(flag) { + var perms = [ "r", "w", "rw" ][flag & 3]; + if ((flag & 512)) { + perms += "w"; + } + return perms; + }, + nodePermissions(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes("r") && !(node.mode & 292)) { + return 2; + } else if (perms.includes("w") && !(node.mode & 146)) { + return 2; + } else if (perms.includes("x") && !(node.mode & 73)) { + return 2; + } + return 0; + }, + mayLookup(dir) { + if (!FS.isDir(dir.mode)) return 54; + var errCode = FS.nodePermissions(dir, "x"); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + }, + mayCreate(dir, name) { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) {} + return FS.nodePermissions(dir, "wx"); + }, + mayDelete(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, "wx"); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + }, + mayOpen(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== "r" || // opening for write + (flags & 512)) { + // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + MAX_OPEN_FDS: 4096, + nextfd() { + for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + }, + getStreamChecked(fd) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + return stream; + }, + getStream: fd => FS.streams[fd], + createStream(stream, fd = -1) { + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream, stream); + if (fd == -1) { + fd = FS.nextfd(); + } + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + }, + closeStream(fd) { + FS.streams[fd] = null; + }, + dupStream(origStream, fd = -1) { + var stream = FS.createStream(origStream, fd); + stream.stream_ops?.dup?.(stream); + return stream; + }, + chrdev_stream_ops: { + open(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + stream.stream_ops.open?.(stream); + }, + llseek() { + throw new FS.ErrnoError(70); + } + }, + major: dev => ((dev) >> 8), + minor: dev => ((dev) & 255), + makedev: (ma, mi) => ((ma) << 8 | (mi)), + registerDevice(dev, ops) { + FS.devices[dev] = { + stream_ops: ops + }; + }, + getDevice: dev => FS.devices[dev], + getMounts(mount) { + var mounts = []; + var check = [ mount ]; + while (check.length) { + var m = check.pop(); + mounts.push(m); + check.push(...m.mounts); + } + return mounts; + }, + syncfs(populate, callback) { + if (typeof populate == "function") { + callback = populate; + populate = false; + } + FS.syncFSRequests++; + if (FS.syncFSRequests > 1) { + err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); + } + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + function doCallback(errCode) { + FS.syncFSRequests--; + return callback(errCode); + } + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + } + // sync all mounts + mounts.forEach(mount => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + mount(type, opts, mountpoint) { + var root = mountpoint === "/"; + var pseudo = !mountpoint; + var node; + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { + follow_mount: false + }); + mountpoint = lookup.path; + // use the absolute path + node = lookup.node; + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + var mount = { + type, + opts, + mountpoint, + mounts: [] + }; + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + return mountRoot; + }, + unmount(mountpoint) { + var lookup = FS.lookupPath(mountpoint, { + follow_mount: false + }); + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + Object.keys(FS.nameTable).forEach(hash => { + var current = FS.nameTable[hash]; + while (current) { + var next = current.name_next; + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + current = next; + } + }); + // no longer a mountpoint + node.mounted = null; + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + node.mount.mounts.splice(idx, 1); + }, + lookup(parent, name) { + return parent.node_ops.lookup(parent, name); + }, + mknod(path, mode, dev) { + var lookup = FS.lookupPath(path, { + parent: true + }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === "." || name === "..") { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + }, + create(path, mode) { + mode = mode !== undefined ? mode : 438; + /* 0666 */ mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode) { + mode = mode !== undefined ? mode : 511; + /* 0777 */ mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split("/"); + var d = ""; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += "/" + dirs[i]; + try { + FS.mkdir(d, mode); + } catch (e) { + if (e.errno != 20) throw e; + } + } + }, + mkdev(path, mode, dev) { + if (typeof dev == "undefined") { + dev = mode; + mode = 438; + } + /* 0666 */ mode |= 8192; + return FS.mknod(path, mode, dev); + }, + symlink(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { + parent: true + }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + }, + rename(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + // let the errors from non existent directories percolate up + lookup = FS.lookupPath(old_path, { + parent: true + }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { + parent: true + }); + new_dir = lookup.node; + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== ".") { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== ".") { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, "w"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + // update old node (we do this here to avoid each backend + // needing to) + old_node.parent = new_dir; + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + }, + rmdir(path) { + var lookup = FS.lookupPath(path, { + parent: true + }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + }, + readdir(path) { + var lookup = FS.lookupPath(path, { + follow: true + }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + }, + unlink(path) { + var lookup = FS.lookupPath(path, { + parent: true + }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + }, + readlink(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat(path) { + return FS.stat(path, true); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == "string") { + var lookup = FS.lookupPath(path, { + follow: !dontFollow + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.chmod(stream.node, mode); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == "string") { + var lookup = FS.lookupPath(path, { + follow: !dontFollow + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + }); + }, + // we ignore the uid / gid for now + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.chown(stream.node, uid, gid); + }, + truncate(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == "string") { + var lookup = FS.lookupPath(path, { + follow: true + }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, "w"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime(path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + }, + open(path, flags, mode) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags == "string" ? FS_modeStringToFlags(flags) : flags; + if ((flags & 64)) { + mode = typeof mode == "undefined" ? 438 : /* 0666 */ mode; + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == "object") { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) {} + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512) && !created) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + // register the stream with the filesystem + var stream = FS.createStream({ + node, + path: FS.getPath(node), + // we want the absolute path to the node + flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module["logReadFiles"] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + return stream; + }, + close(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; + // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + }, + isClosed(stream) { + return stream.fd === null; + }, + llseek(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + }, + read(stream, buffer, offset, length, position) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != "undefined"; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + }, + write(stream, buffer, offset, length, position, canOwn) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != "undefined"; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + }, + allocate(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + mmap(stream, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + if (!length) { + throw new FS.ErrnoError(28); + } + return stream.stream_ops.mmap(stream, length, position, prot, flags); + }, + msync(stream, buffer, offset, length, mmapFlags) { + if (!stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + }, + ioctl(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + }, + readFile(path, opts = {}) { + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || "binary"; + if (opts.encoding !== "utf8" && opts.encoding !== "binary") { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === "utf8") { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === "binary") { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == "string") { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error("Unsupported data type"); + } + FS.close(stream); + }, + cwd: () => FS.currentPath, + chdir(path) { + var lookup = FS.lookupPath(path, { + follow: true + }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, "x"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + }, + createDefaultDirectories() { + FS.mkdir("/tmp"); + FS.mkdir("/home"); + FS.mkdir("/home/web_user"); + }, + createDefaultDevices() { + // create /dev + FS.mkdir("/dev"); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length + }); + FS.mkdev("/dev/null", FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev("/dev/tty", FS.makedev(5, 0)); + FS.mkdev("/dev/tty1", FS.makedev(6, 0)); + // setup /dev/[u]random + // use a buffer to avoid overhead of individual crypto calls per byte + var randomBuffer = new Uint8Array(1024), randomLeft = 0; + var randomByte = () => { + if (randomLeft === 0) { + randomLeft = randomFill(randomBuffer).byteLength; + } + return randomBuffer[--randomLeft]; + }; + FS.createDevice("/dev", "random", randomByte); + FS.createDevice("/dev", "urandom", randomByte); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir("/dev/shm"); + FS.mkdir("/dev/shm/tmp"); + }, + createSpecialDirectories() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir("/proc"); + var proc_self = FS.mkdir("/proc/self"); + FS.mkdir("/proc/self/fd"); + FS.mount({ + mount() { + var node = FS.createNode(proc_self, "fd", 16384 | 511, /* 0777 */ 73); + node.node_ops = { + lookup(parent, name) { + var fd = +name; + var stream = FS.getStreamChecked(fd); + var ret = { + parent: null, + mount: { + mountpoint: "fake" + }, + node_ops: { + readlink: () => stream.path + } + }; + ret.parent = ret; + // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, "/proc/self/fd"); + }, + createStandardStreams(input, output, error) { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (input) { + FS.createDevice("/dev", "stdin", input); + } else { + FS.symlink("/dev/tty", "/dev/stdin"); + } + if (output) { + FS.createDevice("/dev", "stdout", null, output); + } else { + FS.symlink("/dev/tty", "/dev/stdout"); + } + if (error) { + FS.createDevice("/dev", "stderr", null, error); + } else { + FS.symlink("/dev/tty1", "/dev/stderr"); + } + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open("/dev/stdin", 0); + var stdout = FS.open("/dev/stdout", 1); + var stderr = FS.open("/dev/stderr", 1); + }, + staticInit() { + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [ 44 ].forEach(code => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ""; + }); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, "/"); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + "MEMFS": MEMFS, + "WORKERFS": WORKERFS + }; + }, + init(input, output, error) { + FS.initialized = true; + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + input ??= Module["stdin"]; + output ??= Module["stdout"]; + error ??= Module["stderr"]; + FS.createStandardStreams(input, output, error); + }, + quit() { + FS.initialized = false; + // force-flush all streams, so we get musl std streams printed out + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + }, + findObject(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (!ret.exists) { + return null; + } + return ret.object; + }, + analyzePath(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { + follow: !dontResolveLastLink + }); + path = lookup.path; + } catch (e) {} + var ret = { + isRoot: false, + exists: false, + error: 0, + name: null, + path: null, + object: null, + parentExists: false, + parentPath: null, + parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { + parent: true + }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { + follow: !dontResolveLastLink + }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === "/"; + } catch (e) { + ret.error = e.errno; + } + return ret; + }, + createPath(parent, path, canRead, canWrite) { + parent = typeof parent == "string" ? parent : FS.getPath(parent); + var parts = path.split("/").reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) {} + // ignore EEXIST + parent = current; + } + return current; + }, + createFile(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent == "string" ? parent : FS.getPath(parent), name); + var mode = FS_getMode(canRead, canWrite); + return FS.create(path, mode); + }, + createDataFile(parent, name, data, canRead, canWrite, canOwn) { + var path = name; + if (parent) { + parent = typeof parent == "string" ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; + } + var mode = FS_getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data == "string") { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + }, + createDevice(parent, name, input, output) { + var path = PATH.join2(typeof parent == "string" ? parent : FS.getPath(parent), name); + var mode = FS_getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open(stream) { + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + if (output?.buffer?.length) { + output(10); + } + }, + read(stream, buffer, offset, length, pos) { + /* ignored */ var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + if (typeof XMLHttpRequest != "undefined") { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else { + // Command-line. + try { + obj.contents = readBinary(obj.url); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). + // Actual getting is abstracted away for eventual reuse. + class LazyUint8Array { + constructor() { + this.lengthKnown = false; + this.chunks = []; + } + // Loaded chunks. Index is the chunk number + get(idx) { + if (idx > this.length - 1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize) | 0; + return this.getter(chunkNum)[chunkOffset]; + } + setDataGetter(getter) { + this.getter = getter; + } + cacheLength() { + // Find length + var xhr = new XMLHttpRequest; + xhr.open("HEAD", url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + var chunkSize = 1024 * 1024; + // Chunk size in bytes + if (!hasByteServing) chunkSize = datalength; + // Function to get a range from the remote URL. + var doXHR = (from, to) => { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!"); + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest; + xhr.open("GET", url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + // Some hints to the browser that we want binary data. + xhr.responseType = "arraybuffer"; + if (xhr.overrideMimeType) { + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + } + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */ (xhr.response || [])); + } + return intArrayFromString(xhr.responseText || "", true); + }; + var lazyArray = this; + lazyArray.setDataGetter(chunkNum => { + var start = chunkNum * chunkSize; + var end = (chunkNum + 1) * chunkSize - 1; + // including this byte + end = Math.min(end, datalength - 1); + // if datalength-1 is selected, this is the last block + if (typeof lazyArray.chunks[chunkNum] == "undefined") { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray.chunks[chunkNum] == "undefined") throw new Error("doXHR failed!"); + return lazyArray.chunks[chunkNum]; + }); + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; + // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + } + get length() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + get chunkSize() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + if (typeof XMLHttpRequest != "undefined") { + if (!ENVIRONMENT_IS_WORKER) throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"; + var lazyArray = new LazyUint8Array; + var properties = { + isDevice: false, + contents: lazyArray + }; + } else { + var properties = { + isDevice: false, + url + }; + } + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: function() { + return this.contents.length; + } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach(key => { + var fn = node.stream_ops[key]; + stream_ops[key] = (...args) => { + FS.forceLoadFile(node); + return fn(...args); + }; + }); + function writeChunks(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= contents.length) return 0; + var size = Math.min(contents.length - position, length); + if (contents.slice) { + // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { + // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + return writeChunks(stream, buffer, offset, length, position); + }; + // use a custom mmap function + stream_ops.mmap = (stream, length, position, prot, flags) => { + FS.forceLoadFile(node); + var ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + writeChunks(stream, HEAP8, ptr, length, position); + return { + ptr, + allocated: true + }; + }; + node.stream_ops = stream_ops; + return node; + } +}; + +Module["FS"] = FS; + +var SYSCALLS = { + DEFAULT_POLLMASK: 5, + calculateAt(dirfd, path, allowEmpty) { + if (PATH.isAbs(path)) { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = SYSCALLS.getStreamFromFD(dirfd); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44); + } + return dir; + } + return PATH.join2(dir, path); + }, + doStat(func, path, buf) { + var stat = func(path); + HEAP32[((buf) >> 2)] = stat.dev; + HEAP32[(((buf) + (4)) >> 2)] = stat.mode; + HEAPU32[(((buf) + (8)) >> 2)] = stat.nlink; + HEAP32[(((buf) + (12)) >> 2)] = stat.uid; + HEAP32[(((buf) + (16)) >> 2)] = stat.gid; + HEAP32[(((buf) + (20)) >> 2)] = stat.rdev; + (tempI64 = [ stat.size >>> 0, (tempDouble = stat.size, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], + HEAP32[(((buf) + (24)) >> 2)] = tempI64[0], HEAP32[(((buf) + (28)) >> 2)] = tempI64[1]); + HEAP32[(((buf) + (32)) >> 2)] = 4096; + HEAP32[(((buf) + (36)) >> 2)] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [ Math.floor(atime / 1e3) >>> 0, (tempDouble = Math.floor(atime / 1e3), + (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], + HEAP32[(((buf) + (40)) >> 2)] = tempI64[0], HEAP32[(((buf) + (44)) >> 2)] = tempI64[1]); + HEAPU32[(((buf) + (48)) >> 2)] = (atime % 1e3) * 1e3 * 1e3; + (tempI64 = [ Math.floor(mtime / 1e3) >>> 0, (tempDouble = Math.floor(mtime / 1e3), + (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], + HEAP32[(((buf) + (56)) >> 2)] = tempI64[0], HEAP32[(((buf) + (60)) >> 2)] = tempI64[1]); + HEAPU32[(((buf) + (64)) >> 2)] = (mtime % 1e3) * 1e3 * 1e3; + (tempI64 = [ Math.floor(ctime / 1e3) >>> 0, (tempDouble = Math.floor(ctime / 1e3), + (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], + HEAP32[(((buf) + (72)) >> 2)] = tempI64[0], HEAP32[(((buf) + (76)) >> 2)] = tempI64[1]); + HEAPU32[(((buf) + (80)) >> 2)] = (ctime % 1e3) * 1e3 * 1e3; + (tempI64 = [ stat.ino >>> 0, (tempDouble = stat.ino, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], + HEAP32[(((buf) + (88)) >> 2)] = tempI64[0], HEAP32[(((buf) + (92)) >> 2)] = tempI64[1]); + return 0; + }, + doMsync(addr, stream, len, flags, offset) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (flags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + }, + getStreamFromFD(fd) { + var stream = FS.getStreamChecked(fd); + return stream; + }, + varargs: undefined, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + } +}; + +function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: + { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + + case 1: + case 2: + return 0; + + // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + + case 4: + { + var arg = syscallGetVarargI(); + stream.flags |= arg; + return 0; + } + + case 12: + { + var arg = syscallGetVarargP(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg) + (offset)) >> 1)] = 2; + return 0; + } + + case 13: + case 14: + return 0; + } + // Pretend that the locking is successful. + return -28; + } catch (e) { + if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; + return -e.errno; + } +} + +function ___syscall_ioctl(fd, op, varargs) { + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: + { + if (!stream.tty) return -59; + return 0; + } + + case 21505: + { + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcgets) { + var termios = stream.tty.ops.ioctl_tcgets(stream); + var argp = syscallGetVarargP(); + HEAP32[((argp) >> 2)] = termios.c_iflag || 0; + HEAP32[(((argp) + (4)) >> 2)] = termios.c_oflag || 0; + HEAP32[(((argp) + (8)) >> 2)] = termios.c_cflag || 0; + HEAP32[(((argp) + (12)) >> 2)] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[(argp + i) + (17)] = termios.c_cc[i] || 0; + } + return 0; + } + return 0; + } + + case 21510: + case 21511: + case 21512: + { + if (!stream.tty) return -59; + return 0; + } + + // no-op, not actually adjusting terminal settings + case 21506: + case 21507: + case 21508: + { + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcsets) { + var argp = syscallGetVarargP(); + var c_iflag = HEAP32[((argp) >> 2)]; + var c_oflag = HEAP32[(((argp) + (4)) >> 2)]; + var c_cflag = HEAP32[(((argp) + (8)) >> 2)]; + var c_lflag = HEAP32[(((argp) + (12)) >> 2)]; + var c_cc = []; + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[(argp + i) + (17)]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { + c_iflag, + c_oflag, + c_cflag, + c_lflag, + c_cc + }); + } + return 0; + } + + // no-op, not actually adjusting terminal settings + case 21519: + { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[((argp) >> 2)] = 0; + return 0; + } + + case 21520: + { + if (!stream.tty) return -59; + return -28; + } + + // not supported + case 21531: + { + var argp = syscallGetVarargP(); + return FS.ioctl(stream, op, argp); + } + + case 21523: + { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tiocgwinsz) { + var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty); + var argp = syscallGetVarargP(); + HEAP16[((argp) >> 1)] = winsize[0]; + HEAP16[(((argp) + (2)) >> 1)] = winsize[1]; + } + return 0; + } + + case 21524: + { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + + case 21515: + { + if (!stream.tty) return -59; + return 0; + } + + default: + return -28; + } + } // not supported + catch (e) { + if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; + return -e.errno; + } +} + +function ___syscall_openat(dirfd, path, flags, varargs) { + SYSCALLS.varargs = varargs; + try { + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + var mode = varargs ? syscallGetVarargI() : 0; + return FS.open(path, flags, mode).fd; + } catch (e) { + if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; + return -e.errno; + } +} + +var __abort_js = () => { + abort(""); +}; + +var nowIsMonotonic = 1; + +var __emscripten_get_now_is_monotonic = () => nowIsMonotonic; + +var __emscripten_memcpy_js = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); + +var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + +var __tzset_js = (timezone, daylight, std_name, dst_name) => { + // TODO: Use (malleable) environment variables instead of system settings. + var currentYear = (new Date).getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + // Local standard timezone offset. Local standard time is not adjusted for + // daylight savings. This code uses the fact that getTimezoneOffset returns + // a greater value during Standard Time versus Daylight Saving Time (DST). + // Thus it determines the expected output during Standard Time, and it + // compares whether the output of the given date the same (Standard) or less + // (DST). + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + // timezone is specified as seconds west of UTC ("The external variable + // `timezone` shall be set to the difference, in seconds, between + // Coordinated Universal Time (UTC) and local standard time."), the same + // as returned by stdTimezoneOffset. + // See http://pubs.opengroup.org/onlinepubs/009695399/functions/tzset.html + HEAPU32[((timezone) >> 2)] = stdTimezoneOffset * 60; + HEAP32[((daylight) >> 2)] = Number(winterOffset != summerOffset); + var extractZone = timezoneOffset => { + // Why inverse sign? + // Read here https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset + var sign = timezoneOffset >= 0 ? "-" : "+"; + var absOffset = Math.abs(timezoneOffset); + var hours = String(Math.floor(absOffset / 60)).padStart(2, "0"); + var minutes = String(absOffset % 60).padStart(2, "0"); + return `UTC${sign}${hours}${minutes}`; + }; + var winterName = extractZone(winterOffset); + var summerName = extractZone(summerOffset); + if (summerOffset < winterOffset) { + // Northern hemisphere + stringToUTF8(winterName, std_name, 17); + stringToUTF8(summerName, dst_name, 17); + } else { + stringToUTF8(winterName, dst_name, 17); + stringToUTF8(summerName, std_name, 17); + } +}; + +var _emscripten_date_now = () => Date.now(); + +var _emscripten_get_now; + +// Modern environment where performance.now() is supported: +// N.B. a shorter form "_emscripten_get_now = performance.now;" is +// unfortunately not allowed even in current browsers (e.g. FF Nightly 75). +_emscripten_get_now = () => performance.now(); + +var getHeapMax = () => // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate +// full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side +// for any code that deals with heap sizes, which would require special +// casing all heap size related code to treat 0 specially. +2147483648; + +var growMemory = size => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536; + try { + // round size grow request up to wasm page size (fixed 64KB per spec) + wasmMemory.grow(pages); + // .grow() takes a delta compared to the previous size + updateMemoryViews(); + return 1; + } /*success*/ catch (e) {} +}; + +// implicit 0 return to save code size (caller will cast "undefined" into 0 +// anyhow) +var _emscripten_resize_heap = requestedSize => { + var oldSize = HEAPU8.length; + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + requestedSize >>>= 0; + // With multithreaded builds, races can happen (another thread might increase the size + // in between), so return a failure, and let the caller retry. + // Memory resize rules: + // 1. Always increase heap size to at least the requested size, rounded up + // to next page multiple. + // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap + // geometrically: increase the heap size according to + // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most + // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). + // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap + // linearly: increase the heap size by at least + // MEMORY_GROWTH_LINEAR_STEP bytes. + // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by + // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest + // 4. If we were unable to allocate as much memory, it may be due to + // over-eager decision to excessively reserve due to (3) above. + // Hence if an allocation fails, cut down on the amount of excess + // growth, in an attempt to succeed to perform a smaller allocation. + // A limit is set for how much we can grow. We should not exceed that + // (the wasm binary specifies it, so if we tried, we'd fail anyhow). + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + // Loop through potential heap size increases. If we attempt a too eager + // reservation that fails, cut down on the attempted size and reserve a + // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + .2 / cutDown); + // ensure geometric growth + // but limit overreserving (default to capping at +96MB overgrowth at most) + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; +}; + +var ENV = {}; + +var getExecutableName = () => thisProgram || "./this.program"; + +var getEnvStrings = () => { + if (!getEnvStrings.strings) { + // Default values. + // Browser language detection #8751 + var lang = ((typeof navigator == "object" && navigator.languages && navigator.languages[0]) || "C").replace("-", "_") + ".UTF-8"; + var env = { + "USER": "web_user", + "LOGNAME": "web_user", + "PATH": "/", + "PWD": "/", + "HOME": "/home/web_user", + "LANG": lang, + "_": getExecutableName() + }; + // Apply the user-provided values, if any. + for (var x in ENV) { + // x is a key in ENV; if ENV[x] is undefined, that means it was + // explicitly set to be so. We allow user code to do that to + // force variables with default values to remain unset. + if (ENV[x] === undefined) delete env[x]; else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(`${x}=${env[x]}`); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; +}; + +var stringToAscii = (str, buffer) => { + for (var i = 0; i < str.length; ++i) { + HEAP8[buffer++] = str.charCodeAt(i); + } + // Null-terminate the string + HEAP8[buffer] = 0; +}; + +var _environ_get = (__environ, environ_buf) => { + var bufSize = 0; + getEnvStrings().forEach((string, i) => { + var ptr = environ_buf + bufSize; + HEAPU32[(((__environ) + (i * 4)) >> 2)] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; +}; + +var _environ_sizes_get = (penviron_count, penviron_buf_size) => { + var strings = getEnvStrings(); + HEAPU32[((penviron_count) >> 2)] = strings.length; + var bufSize = 0; + strings.forEach(string => bufSize += string.length + 1); + HEAPU32[((penviron_buf_size) >> 2)] = bufSize; + return 0; +}; + +function _fd_close(fd) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; + return e.errno; + } +} + +/** @param {number=} offset */ var doReadv = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov) >> 2)]; + var len = HEAPU32[(((iov) + (4)) >> 2)]; + iov += 8; + var curr = FS.read(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; + // nothing more to read + if (typeof offset != "undefined") { + offset += curr; + } + } + return ret; +}; + +function _fd_read(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[((pnum) >> 2)] = num; + return 0; + } catch (e) { + if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; + return e.errno; + } +} + +var convertI32PairToI53Checked = (lo, hi) => ((hi + 2097152) >>> 0 < 4194305 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; + +function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + var offset = convertI32PairToI53Checked(offset_low, offset_high); + try { + if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [ stream.position >>> 0, (tempDouble = stream.position, (+(Math.abs(tempDouble))) >= 1 ? (tempDouble > 0 ? (+(Math.floor((tempDouble) / 4294967296))) >>> 0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble))) >>> 0)) / 4294967296))))) >>> 0) : 0) ], + HEAP32[((newOffset) >> 2)] = tempI64[0], HEAP32[(((newOffset) + (4)) >> 2)] = tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; + // reset readdir state + return 0; + } catch (e) { + if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; + return e.errno; + } +} + +/** @param {number=} offset */ var doWritev = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov) >> 2)]; + var len = HEAPU32[(((iov) + (4)) >> 2)]; + iov += 8; + var curr = FS.write(stream, HEAP8, ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) { + // No more space to write. + break; + } + if (typeof offset != "undefined") { + offset += curr; + } + } + return ret; +}; + +function _fd_write(fd, iov, iovcnt, pnum) { + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[((pnum) >> 2)] = num; + return 0; + } catch (e) { + if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; + return e.errno; + } +} + +var getCFunc = ident => { + var func = Module["_" + ident]; + // closure exported function + return func; +}; + +var writeArrayToMemory = (array, buffer) => { + HEAP8.set(array, buffer); +}; + +var stackAlloc = sz => __emscripten_stack_alloc(sz); + +var stringToUTF8OnStack = str => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; +}; + +/** + * @param {string|null=} returnType + * @param {Array=} argTypes + * @param {Arguments|Array=} args + * @param {Object=} opts + */ var ccall = (ident, returnType, argTypes, args, opts) => { + // For fast lookup of conversion functions + var toC = { + "string": str => { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { + // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + ret = stringToUTF8OnStack(str); + } + return ret; + }, + "array": arr => { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + function convertReturnValue(ret) { + if (returnType === "string") { + return UTF8ToString(ret); + } + if (returnType === "boolean") return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func(...cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + ret = onDone(ret); + return ret; +}; + +/** + * @param {string=} returnType + * @param {Array=} argTypes + * @param {Object=} opts + */ var cwrap = (ident, returnType, argTypes, opts) => { + // When the function takes numbers and returns a number, we can just return + // the original function + var numericArgs = !argTypes || argTypes.every(type => type === "number" || type === "boolean"); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return (...args) => ccall(ident, returnType, argTypes, args, opts); +}; + +var stringToNewUTF8 = str => { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8(str, ret, size); + return ret; +}; + +FS.createPreloadedFile = FS_createPreloadedFile; + +FS.staticInit(); + +var wasmImports = { + /** @export */ __assert_fail: ___assert_fail, + /** @export */ __cxa_throw: ___cxa_throw, + /** @export */ __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ __syscall_ioctl: ___syscall_ioctl, + /** @export */ __syscall_openat: ___syscall_openat, + /** @export */ _abort_js: __abort_js, + /** @export */ _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, + /** @export */ _emscripten_memcpy_js: __emscripten_memcpy_js, + /** @export */ _tzset_js: __tzset_js, + /** @export */ emscripten_date_now: _emscripten_date_now, + /** @export */ emscripten_get_now: _emscripten_get_now, + /** @export */ emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ environ_get: _environ_get, + /** @export */ environ_sizes_get: _environ_sizes_get, + /** @export */ fd_close: _fd_close, + /** @export */ fd_read: _fd_read, + /** @export */ fd_seek: _fd_seek, + /** @export */ fd_write: _fd_write +}; + +var wasmExports = createWasm(); + +var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); + +var _Hunspell_create = Module["_Hunspell_create"] = (a0, a1) => (_Hunspell_create = Module["_Hunspell_create"] = wasmExports["Hunspell_create"])(a0, a1); + +var _Hunspell_destroy = Module["_Hunspell_destroy"] = a0 => (_Hunspell_destroy = Module["_Hunspell_destroy"] = wasmExports["Hunspell_destroy"])(a0); + +var _Hunspell_add_dic = Module["_Hunspell_add_dic"] = (a0, a1) => (_Hunspell_add_dic = Module["_Hunspell_add_dic"] = wasmExports["Hunspell_add_dic"])(a0, a1); + +var _Hunspell_spell = Module["_Hunspell_spell"] = (a0, a1) => (_Hunspell_spell = Module["_Hunspell_spell"] = wasmExports["Hunspell_spell"])(a0, a1); + +var _Hunspell_suggest = Module["_Hunspell_suggest"] = (a0, a1, a2) => (_Hunspell_suggest = Module["_Hunspell_suggest"] = wasmExports["Hunspell_suggest"])(a0, a1, a2); + +var _Hunspell_add = Module["_Hunspell_add"] = (a0, a1) => (_Hunspell_add = Module["_Hunspell_add"] = wasmExports["Hunspell_add"])(a0, a1); + +var _Hunspell_remove = Module["_Hunspell_remove"] = (a0, a1) => (_Hunspell_remove = Module["_Hunspell_remove"] = wasmExports["Hunspell_remove"])(a0, a1); + +var _Hunspell_free_list = Module["_Hunspell_free_list"] = (a0, a1, a2) => (_Hunspell_free_list = Module["_Hunspell_free_list"] = wasmExports["Hunspell_free_list"])(a0, a1, a2); + +var _malloc = Module["_malloc"] = a0 => (_malloc = Module["_malloc"] = wasmExports["malloc"])(a0); + +var _free = Module["_free"] = a0 => (_free = Module["_free"] = wasmExports["free"])(a0); + +var __emscripten_stack_restore = a0 => (__emscripten_stack_restore = wasmExports["_emscripten_stack_restore"])(a0); + +var __emscripten_stack_alloc = a0 => (__emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"])(a0); + +var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"])(); + +var dynCall_iiiiij = Module["dynCall_iiiiij"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_iiiiij = Module["dynCall_iiiiij"] = wasmExports["dynCall_iiiiij"])(a0, a1, a2, a3, a4, a5, a6); + +var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8) => (dynCall_iiiiijj = Module["dynCall_iiiiijj"] = wasmExports["dynCall_iiiiijj"])(a0, a1, a2, a3, a4, a5, a6, a7, a8); + +var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) => (dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = wasmExports["dynCall_iiiiiijj"])(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); + +var dynCall_jiji = Module["dynCall_jiji"] = (a0, a1, a2, a3, a4) => (dynCall_jiji = Module["dynCall_jiji"] = wasmExports["dynCall_jiji"])(a0, a1, a2, a3, a4); + +var dynCall_viijii = Module["dynCall_viijii"] = (a0, a1, a2, a3, a4, a5, a6) => (dynCall_viijii = Module["dynCall_viijii"] = wasmExports["dynCall_viijii"])(a0, a1, a2, a3, a4, a5, a6); + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === +Module["ccall"] = ccall; + +Module["cwrap"] = cwrap; + +Module["getValue"] = getValue; + +Module["UTF8ToString"] = UTF8ToString; + +Module["stringToNewUTF8"] = stringToNewUTF8; + +Module["WORKERFS"] = WORKERFS; + +var calledRun; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; +}; + +// try this again later, after new deps are fulfilled +function run() { + if (runDependencies > 0) { + return; + } + preRun(); + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + readyPromiseResolve(Module); + Module["onRuntimeInitialized"]?.(); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(() => { + setTimeout(() => Module["setStatus"](""), 1); + doRun(); + }, 1); + } else { + doRun(); + } +} + +if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [ Module["preInit"] ]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } +} + +run(); + +// end include: postamble.js +// include: postamble_modularize.js +// In MODULARIZE mode we wrap the generated code in a factory function +// and return either the Module itself, or a promise of the module. +// We assign to the `moduleRtn` global here and configure closure to see +// this as and extern so it won't get minified. +moduleRtn = readyPromise; + + + return moduleRtn; +} +); +})(); +export default Module; diff --git a/services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.wasm b/services/web/frontend/js/features/source-editor/hunspell/wasm/hunspell.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9ac85110d068fe6e007796bd3a19d93df8664526 GIT binary patch literal 884804 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

    kXY%T8JC7HhS%%t>9TM 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%0AuhlX2nWtb+lm;}Z&499^gzXj z9Oca#)XCFp9p`6^k)yqj>9z|&5ojZt7QQ62XnbRm@-F2k!QErLhK50nQe(DUX6r#( zn-0zulAhnO-epMAX%=%84)2=}y2-F7r;7PYlSV&r9l`&CV?IKT^DaWDH{e3Z`5vXc z%?|{hkM~ZEL3^H+ZhP#>3Eo02kDXUFPV}Bl>GGx^&Bxr&6d?1L79#z`1u2Q4WjG{* z9b_|QpooF;@CmLzwTWThwZ#Z%G#r8 zJCj0>{B0&AAlV>)q5XnA`j!ZjS)3q zQVGa~j?+DKU8QxAFSrtHxixx z1JqHD!t3b=`cClgA_w~;+p6*-&Pq-A^weqpZOM5q#kjUjTaLJA5tUm?_qL| zcO?q*hwB-~TlR#M+&Sw{mtgCpzPX}99tTD*K9j>N6&E`+OJOR8JE{q!nb58jRXgNd z@4bdjrH6#sCl#INU1J!t%EZQO&XAXg=`AEj1j}vMlST$;(9{blb;Tfi@c>#4f8;NPv=Y`Ccx)aV#Je+y?3w}TyZ830kJ0T zB)P=9(-^$6GZdH>VIej8#o#!Cg-DN-Bw9kFE(!2LZpo$IO)&9j6W3suB~JEzu9O6=+{MPhhkfiYWMWgc@*uJo=(Tb^*e{<0hNSpXkF`eAVJ0|O@1`CvRdV%NzY*l%x(`zk>qCCnLJ-hMja&92Vt=MtAXGz|vm3k$ z4N{_6VNYm)D0b5}6q60!=w(d}16wuL1VN2v5{Ov>FFHbQ^3FnOVjGRAZ5uPv9_rvE zRM6A#pa%_onB450oHjYj)MFxsLkJU|qHQGN0V*E`OJYj!7Vp<+NDWR1Hqy+?TB|W> z@61eYgu+2P2?8g#dIuzA0C_afG+9|?fFfq%VpHC2-Zv~iL!Ar!dUO81>%D@4CxaU} z$neVh%RXchvcG9@k`jg0?*J*nuFo1Kw|jfor(EJZJ6AY%sWO}yQcq+ssEL;4%^_`TF6rIx?QS7SSNP^1 zMe=}GH?>Btk}J>dn9RY>f=uK=?+#1p!*V4(2|dwfH$ts13Hp$C?Z&8_l!ImY4q7j5 zBzhRs*2CWImPW|KjwU!+sa3{#r2|xzcsvXatQ5&dyn7Ov32vkzls4P5M1kww=p7zjfrPA$ha~lD&h~ydX9dNE!BVRAoAmJXaU7=@tfyBdw z7{RmN+rr;ie#vv*yF!&%hCjdB=y~t$c%Y_&M09+#xm<7h@bE_K!8GEY4&U!Weh-b_8N*jzoXe8U@56N~;-KQDfxeqQn> z{XF_-`g!S}>*r;Ep`VxkrGDP}&H8!8TlDkFzf#Xj7Hy%Q7r#|MFL|4O9(}uhUiuFG zylhMTy!@T|dFyxS=N0eP&nw@fo<|q`wSHbaq@S0(S3i%wPd_jH8~wcO{rY+N2lVsS o!}@u}2leyHth*KEC|SV%+iLNMcv$iw@i4kjJS_dNcv$xT0AO2@Z2$lO literal 0 HcmV?d00001 diff --git a/services/web/frontend/js/utils/meta.ts b/services/web/frontend/js/utils/meta.ts index 4ae6e3fb68..b6c110ae2e 100644 --- a/services/web/frontend/js/utils/meta.ts +++ b/services/web/frontend/js/utils/meta.ts @@ -54,6 +54,7 @@ export interface Meta { 'ol-allowedExperiments': string[] 'ol-allowedImageNames': AllowedImageName[] 'ol-anonymous': boolean + 'ol-baseAssetPath': string 'ol-bootstrapVersion': 3 | 5 'ol-brandVariation': Record @@ -76,6 +77,7 @@ export interface Meta { 'ol-currentUrl': string 'ol-debugPdfDetach': boolean 'ol-detachRole': 'detached' | 'detacher' | '' + 'ol-dictionariesRoot': 'string' 'ol-dropbox': { error: boolean; registered: boolean } 'ol-editorThemes': string[] 'ol-email': string diff --git a/services/web/locales/en.json b/services/web/locales/en.json index 87a2567341..804525c50a 100644 --- a/services/web/locales/en.json +++ b/services/web/locales/en.json @@ -77,6 +77,7 @@ "add_or_remove_project_from_tag": "Add or remove project from tag __tagName__", "add_people": "Add people", "add_role_and_department": "Add role and department", + "add_to_dictionary": "Add to Dictionary", "add_to_tag": "Add to tag", "add_your_comment_here": "Add your comment here", "add_your_first_group_member_now": "Add your first group members now", diff --git a/services/web/package.json b/services/web/package.json index 6d4ac29db1..d860fd915a 100644 --- a/services/web/package.json +++ b/services/web/package.json @@ -76,6 +76,7 @@ "@node-oauth/oauth2-server": "^5.1.0", "@node-saml/passport-saml": "^4.0.4", "@overleaf/access-token-encryptor": "*", + "@overleaf/dictionaries": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.2.tar.gz", "@overleaf/fetch-utils": "*", "@overleaf/logger": "*", "@overleaf/metrics": "*", diff --git a/services/web/test/frontend/features/dictionary/components/dictionary-modal-content.spec.jsx b/services/web/test/frontend/features/dictionary/components/dictionary-modal-content.spec.jsx new file mode 100644 index 0000000000..37875012a5 --- /dev/null +++ b/services/web/test/frontend/features/dictionary/components/dictionary-modal-content.spec.jsx @@ -0,0 +1,100 @@ +import DictionaryModal from '@/features/dictionary/components/dictionary-modal' +import { EditorProviders } from '../../../helpers/editor-providers' + +describe('', function () { + beforeEach(function () { + cy.interceptCompile() + }) + + afterEach(function () { + cy.window().then(win => { + win.dispatchEvent(new CustomEvent('learnedWords:doreset')) + }) + }) + + it('list words', function () { + cy.window().then(win => { + win.metaAttributesCache.set('ol-learnedWords', ['foo', 'bar']) + win.dispatchEvent(new CustomEvent('learnedWords:doreset')) + }) + + cy.mount( + + + + ) + + cy.findByText('foo') + cy.findByText('bar') + }) + + it('shows message when empty', function () { + cy.window().then(win => { + win.metaAttributesCache.set('ol-learnedWords', []) + win.dispatchEvent(new CustomEvent('learnedWords:doreset')) + }) + + cy.mount( + + + + ) + + cy.contains('Your custom dictionary is empty.') + }) + + it('removes words', function () { + cy.intercept('/spelling/unlearn', { statusCode: 200 }) + + cy.window().then(win => { + win.metaAttributesCache.set('ol-learnedWords', ['Foo', 'bar']) + win.dispatchEvent(new CustomEvent('learnedWords:doreset')) + }) + + cy.mount( + + + + ) + + cy.findByText('Foo') + cy.findByText('bar') + + cy.findAllByRole('button', { + name: 'Remove from dictionary', + }) + .eq(0) + .click() + + cy.findByText('bar').should('not.exist') + cy.findByText('Foo') + }) + + it('handles errors', function () { + cy.intercept('/spelling/unlearn', { statusCode: 500 }).as('unlearn') + + cy.window().then(win => { + win.metaAttributesCache.set('ol-learnedWords', ['foo']) + win.dispatchEvent(new CustomEvent('learnedWords:doreset')) + }) + + cy.mount( + + + + ) + + cy.findByText('foo') + + cy.findAllByRole('button', { + name: 'Remove from dictionary', + }) + .eq(0) + .click() + + cy.wait('@unlearn') + + cy.findByText('Sorry, something went wrong') + cy.findByText('foo') + }) +}) diff --git a/services/web/test/frontend/features/dictionary/components/dictionary-modal-content.test.jsx b/services/web/test/frontend/features/dictionary/components/dictionary-modal-content.test.jsx deleted file mode 100644 index 63a8202403..0000000000 --- a/services/web/test/frontend/features/dictionary/components/dictionary-modal-content.test.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import { - screen, - fireEvent, - waitForElementToBeRemoved, -} from '@testing-library/react' -import fetchMock from 'fetch-mock' -import DictionaryModal from '../../../../../frontend/js/features/dictionary/components/dictionary-modal' -import { renderWithEditorContext } from '../../../helpers/render-with-context' - -function setLearnedWords(words) { - window.metaAttributesCache.set('ol-learnedWords', words) - window.dispatchEvent(new CustomEvent('learnedWords:doreset')) -} -describe('', function () { - afterEach(function () { - fetchMock.reset() - setLearnedWords([]) - }) - - it('list words', async function () { - setLearnedWords(['foo', 'bar']) - renderWithEditorContext( {}} />) - screen.getByText('foo') - screen.getByText('bar') - }) - - it('shows message when empty', async function () { - setLearnedWords([]) - renderWithEditorContext( {}} />) - screen.getByText('Your custom dictionary is empty.') - }) - - it('removes words', async function () { - fetchMock.post('/spelling/unlearn', 200) - setLearnedWords(['Foo', 'bar']) - renderWithEditorContext( {}} />) - screen.getByText('Foo') - screen.getByText('bar') - const [firstButton] = screen.getAllByRole('button', { - name: 'Remove from dictionary', - }) - fireEvent.click(firstButton) - await waitForElementToBeRemoved(() => screen.getByText('bar')) - screen.getByText('Foo') - }) - - it('handles errors', async function () { - fetchMock.post('/spelling/unlearn', 500) - setLearnedWords(['foo']) - renderWithEditorContext( {}} />) - screen.getByText('foo') - const [firstButton] = screen.getAllByRole('button', { - name: 'Remove from dictionary', - }) - fireEvent.click(firstButton) - await fetchMock.flush() - screen.getByText('Sorry, something went wrong') - screen.getByText('foo') - }) -}) diff --git a/services/web/test/frontend/features/source-editor/components/codemirror-editor-spellchecker-client.spec.tsx b/services/web/test/frontend/features/source-editor/components/codemirror-editor-spellchecker-client.spec.tsx new file mode 100644 index 0000000000..20ed94f322 --- /dev/null +++ b/services/web/test/frontend/features/source-editor/components/codemirror-editor-spellchecker-client.spec.tsx @@ -0,0 +1,85 @@ +import '../../../helpers/bootstrap-3' +import { mockScope } from '../helpers/mock-scope' +import { EditorProviders } from '../../../helpers/editor-providers' +import CodeMirrorEditor from '../../../../../frontend/js/features/source-editor/components/codemirror-editor' +import { TestContainer } from '../helpers/test-container' +import forEach from 'mocha-each' +import PackageVersions from '../../../../../app/src/infrastructure/PackageVersions' + +const languages = [ + { code: 'en_GB', dic: 'en_GB', name: 'English (British)' }, + { code: 'fr', dic: 'fr', name: 'French' }, + { code: 'sv', dic: 'sv_SE', name: 'Swedish' }, +] + +const suggestions = { + en_GB: ['medecine', 'medicine'], + fr: ['medecin', 'médecin'], + sv: ['medecin', 'medicin'], +} + +forEach(Object.keys(suggestions)).describe( + 'Spell check in client (%s)', + (spellCheckLanguage: keyof typeof suggestions) => { + const content = ` +\\documentclass{} + +\\title{} +\\author{} + +\\begin{document} +\\maketitle + +\\begin{abstract} +\\end{abstract} + +\\section{} + +\\end{document}` + + beforeEach(function () { + cy.window().then(win => { + win.metaAttributesCache.set('ol-preventCompileOnLoad', true) + win.metaAttributesCache.set('ol-splitTestVariants', { + 'spell-check-client': 'enabled', + }) + win.metaAttributesCache.set('ol-splitTestInfo', {}) + win.metaAttributesCache.set('ol-learnedWords', ['baz']) + win.metaAttributesCache.set( + 'ol-dictionariesRoot', + `js/dictionaries/${PackageVersions.version.dictionaries}/` + ) + win.metaAttributesCache.set('ol-baseAssetPath', '/__cypress/src/') + win.metaAttributesCache.set('ol-languages', languages) + }) + + cy.interceptEvents() + + const scope = mockScope(content) + scope.project.spellCheckLanguage = spellCheckLanguage + + cy.mount( + + + + + + ) + + cy.get('.cm-line').eq(13).as('line') + cy.get('@line').click() + }) + + it('shows suggestions for misspelled word', function () { + const [from, to] = suggestions[spellCheckLanguage] + + cy.get('@line').type(from) + cy.get('@line').get('.ol-cm-spelling-error').contains(from) + + cy.get('@line').get('.ol-cm-spelling-error').rightclick() + cy.findByText(to).click() + cy.get('@line').contains(to) + cy.get('@line').find('.ol-cm-spelling-error').should('not.exist') + }) + } +) diff --git a/services/web/types/project-settings.ts b/services/web/types/project-settings.ts index 13e49d7757..f256a038c2 100644 --- a/services/web/types/project-settings.ts +++ b/services/web/types/project-settings.ts @@ -30,4 +30,6 @@ export type PdfViewer = 'pdfjs' | 'native' export type SpellCheckLanguage = { name: string code: string + dic?: string + server?: false } diff --git a/services/web/webpack.config.js b/services/web/webpack.config.js index 002cfda877..8f6f47a4a9 100644 --- a/services/web/webpack.config.js +++ b/services/web/webpack.config.js @@ -66,6 +66,7 @@ function getModuleDirectory(moduleName) { } const mathjaxDir = getModuleDirectory('mathjax') +const dictionariesDir = getModuleDirectory('@overleaf/dictionaries') const pdfjsVersions = ['pdfjs-dist213', 'pdfjs-dist401'] @@ -78,6 +79,14 @@ if (MATHJAX_VERSION !== PackageVersions.version.mathjax) { ) } +const DICTIONARIES_VERSION = + require('@overleaf/dictionaries/package.json').version +if (DICTIONARIES_VERSION !== PackageVersions.version.dictionaries) { + throw new Error( + '"@overleaf/dictionaries" version de-synced, update services/web/app/src/infrastructure/PackageVersions.js' + ) +} + module.exports = { // Defines the "entry point(s)" for the application - i.e. the file which // bootstraps the application @@ -141,6 +150,13 @@ module.exports = { ], type: 'javascript/auto', }, + { + test: /\.wasm$/, + type: 'asset/resource', + generator: { + filename: 'js/[name]-[contenthash][ext]', + }, + }, { // Pass Less files through less-loader/css-loader/mini-css-extract- // plugin (note: run in reverse order) @@ -275,6 +291,10 @@ module.exports = { }, }, + experiments: { + asyncWebAssembly: true, + }, + plugins: [ new LezerGrammarCompilerPlugin(), @@ -346,6 +366,12 @@ module.exports = { toType: 'dir', context: mathjaxDir, }, + { + from: '*', + to: `js/dictionaries/${PackageVersions.version.dictionaries}`, + toType: 'dir', + context: `${dictionariesDir}/dictionaries`, + }, ...pdfjsVersions.flatMap(version => { const dir = getModuleDirectory(version)