{"_id":"@aegirassembly/vim-wasm","_rev":"4-703f206f6b9f7b3e2694e8bc28e2cd41","name":"@aegirassembly/vim-wasm","dist-tags":{"latest":"0.0.14"},"versions":{"0.0.13":{"name":"@aegirassembly/vim-wasm","version":"0.0.13","description":"Vim editor ported to WebAssembly","main":"vimwasm.js","scripts":{"build:main":"tsc -d -p tsconfig.main.json","build:worker":"tsc -p tsconfig.worker.json","build":"npm-run-all -p build:main build:worker vtest:build","watch:main":"tsc -p tsconfig.main.json --watch","watch:worker":"tsc -p tsconfig.worker.json --watch","watch":"npm-run-all -p watch:main watch:worker","minify:common":"uglifyjs --output main.js main.js && uglifyjs --output vimwasm.js vimwasm.js","minify:normal":"uglifyjs --output vim.js vim.js","minify:small":"uglifyjs --output small/vim.js small/vim.js","eslint":"eslint --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","stylelint":"stylelint style.css","lint":"npm-run-all -p stylelint eslint","fix:eslint":"eslint --fix --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","fix:stylelint":"stylelint --fix style.css","fix":"npm-run-all -p fix:eslint fix:stylelint","karma":"karma start","test":"karma start --single-run","vtest:build":"tsc -p ./vtest","vtest:run":"node ./vtest/test.js","vtest":"npm-run-all vtest:build vtest:run","serve":"http-server -p 1234","prepublishOnly":"npm-run-all build minify:common","preversion":"cd .. && ./build.sh release-all"},"repository":{"type":"git","url":"git+https://github.com/rhysd/vim.wasm.git"},"keywords":["Vim","editor","WebAssembly"],"author":{"name":"rhysd","email":"lin90162@yahoo.co.jp","url":"https://rhysd.github.io/"},"license":"Vim","homepage":"https://github.com/rhysd/vim.wasm#readme","bugs":{"url":"https://github.com/rhysd/vim.wasm/issues"},"types":"./vimwasm.d.ts","devDependencies":{"@types/chai":"^4.2.7","@types/http-server":"^0.10.0","@types/karma":"^3.0.5","@types/mocha":"^5.2.7","@types/node":"^13.1.1","@types/puppeteer":"^2.0.0","@types/sinon":"^7.5.1","@typescript-eslint/eslint-plugin":"^2.16.0","@typescript-eslint/parser":"^2.16.0","chai":"^4.2.0","chokidar-cli":"^2.1.0","eslint":"^6.8.0","eslint-config-prettier":"^6.9.0","eslint-plugin-mocha":"^6.2.2","eslint-plugin-prettier":"^3.1.2","eslint-plugin-security":"^1.4.0","http-server":"^0.12.0","husky":"^3.1.0","img-diff-js":"^0.4.1","karma":"^4.4.1","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.1.0","karma-mocha":"^1.3.0","karma-sinon":"^1.0.5","mocha":"^6.2.2","npm-run-all":"^4.1.5","open":"^7.0.0","prettier":"^1.19.1","puppeteer":"^2.0.0","sinon":"^8.0.1","stylelint":"^12.0.1","stylelint-config-recommended":"^3.0.0","typescript":"^3.7.4","uglify-es":"^3.3.9"},"stylelint":{"extends":"stylelint-config-recommended"},"husky":{"hooks":{"pre-push":"npm-run-all -p lint vtest:run"}},"gitHead":"310836b3824a401d18725f786bc7f3ff6ab678e8","_id":"@aegirassembly/vim-wasm@0.0.13","_nodeVersion":"19.8.1","_npmVersion":"9.5.1","dist":{"integrity":"sha512-7Yk0iFSEXukrvVrSeO0y0OC+BJuqdb2xoneD/khOGdasR2jfVObyCBXIHP00nvn6nsMXDgmZrYm4z5MeR9QyxQ==","shasum":"db706a97eefd7074742db4bc48d75a245a37477a","tarball":"https://registry.npmjs.org/@aegirassembly/vim-wasm/-/vim-wasm-0.0.13.tgz","fileCount":7,"unpackedSize":126225,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDssPgSRMh/fveJoH1prokByaDZM63JCJ5vNC+xWJHq1wIhAJOk/K9mZ52uY+4VyAUjB0mMkd2qJHjERfeM2bfsShC1"}]},"_npmUser":{"name":"zenkyu","email":"przemekgg2002@gmail.com"},"directories":{},"maintainers":[{"name":"zenkyu","email":"przemekgg2002@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vim-wasm_0.0.13_1698785202064_0.9983702440843769"},"_hasShrinkwrap":false},"0.0.13-a":{"name":"@aegirassembly/vim-wasm","version":"0.0.13-a","description":"Vim editor ported to WebAssembly","main":"vimwasm.js","scripts":{"build:main":"tsc -d -p tsconfig.main.json","build:worker":"tsc -p tsconfig.worker.json","build":"npm-run-all -p build:main build:worker vtest:build","watch:main":"tsc -p tsconfig.main.json --watch","watch:worker":"tsc -p tsconfig.worker.json --watch","watch":"npm-run-all -p watch:main watch:worker","minify:common":"uglifyjs --output main.js main.js && uglifyjs --output vimwasm.js vimwasm.js","minify:normal":"uglifyjs --output vim.js vim.js","minify:small":"uglifyjs --output small/vim.js small/vim.js","eslint":"eslint --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","stylelint":"stylelint style.css","lint":"npm-run-all -p stylelint eslint","fix:eslint":"eslint --fix --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","fix:stylelint":"stylelint --fix style.css","fix":"npm-run-all -p fix:eslint fix:stylelint","karma":"karma start","test":"karma start --single-run","vtest:build":"tsc -p ./vtest","vtest:run":"node ./vtest/test.js","vtest":"npm-run-all vtest:build vtest:run","serve":"http-server -p 1234","prepare":"npm-run-all build minify:common","prepublishOnly":"npm-run-all build minify:common","preversion":"cd .. && ./build.sh release-all"},"repository":{"type":"git","url":"git+https://github.com/rhysd/vim.wasm.git"},"keywords":["Vim","editor","WebAssembly"],"author":{"name":"rhysd","email":"lin90162@yahoo.co.jp","url":"https://rhysd.github.io/"},"license":"Vim","homepage":"https://github.com/rhysd/vim.wasm#readme","bugs":{"url":"https://github.com/rhysd/vim.wasm/issues"},"types":"./vimwasm.d.ts","devDependencies":{"@types/chai":"^4.2.7","@types/http-server":"^0.10.0","@types/karma":"^3.0.5","@types/mocha":"^5.2.7","@types/node":"^13.1.1","@types/puppeteer":"^2.0.0","@types/sinon":"^7.5.1","@typescript-eslint/eslint-plugin":"^2.16.0","@typescript-eslint/parser":"^2.16.0","chai":"^4.2.0","chokidar-cli":"^2.1.0","eslint":"^6.8.0","eslint-config-prettier":"^6.9.0","eslint-plugin-mocha":"^6.2.2","eslint-plugin-prettier":"^3.1.2","eslint-plugin-security":"^1.4.0","http-server":"^0.12.0","husky":"^3.1.0","img-diff-js":"^0.4.1","karma":"^4.4.1","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.1.0","karma-mocha":"^1.3.0","karma-sinon":"^1.0.5","mocha":"^6.2.2","npm-run-all":"^4.1.5","open":"^7.0.0","prettier":"^1.19.1","puppeteer":"^2.0.0","sinon":"^8.0.1","stylelint":"^12.0.1","stylelint-config-recommended":"^3.0.0","typescript":"^3.7.4","uglify-es":"^3.3.9"},"stylelint":{"extends":"stylelint-config-recommended"},"husky":{"hooks":{"pre-push":"npm-run-all -p lint vtest:run"}},"gitHead":"f5f6a137216f231b4b64caaf33e132d4da078200","_id":"@aegirassembly/vim-wasm@0.0.13-a","_nodeVersion":"19.8.1","_npmVersion":"9.5.1","dist":{"integrity":"sha512-UnenrtJ1cYQv3ww7hF3rzi7op1uu+x/lbL97zDWqHq2QLDmVY4/SP8QZRBqtMaAmu6HguBbKDtCi4/oH3pAU/Q==","shasum":"f0f483949d30c4fe8a7c17cd62ec7d7dda0b3297","tarball":"https://registry.npmjs.org/@aegirassembly/vim-wasm/-/vim-wasm-0.0.13-a.tgz","fileCount":7,"unpackedSize":126276,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAlZd83az5nS6gZynCNjFj9SEHhZ9xSUCqcPEUcxAr3IAiBe8c+0CJ4SjtMLvLS7MTLJfwXujT2Ym+h7tkmtPSYwNg=="}]},"_npmUser":{"name":"zenkyu","email":"przemekgg2002@gmail.com"},"directories":{},"maintainers":[{"name":"zenkyu","email":"przemekgg2002@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vim-wasm_0.0.13-a_1698861175019_0.8428053762324226"},"_hasShrinkwrap":false},"0.0.13-b":{"name":"@aegirassembly/vim-wasm","version":"0.0.13-b","description":"Vim editor ported to WebAssembly","main":"vimwasm.js","scripts":{"build:main":"tsc -d -p tsconfig.main.json","build:worker":"tsc -p tsconfig.worker.json","build":"npm-run-all -p build:main build:worker vtest:build","watch:main":"tsc -p tsconfig.main.json --watch","watch:worker":"tsc -p tsconfig.worker.json --watch","watch":"npm-run-all -p watch:main watch:worker","minify:common":"uglifyjs --output main.js main.js && uglifyjs --output vimwasm.js vimwasm.js","minify:normal":"uglifyjs --output vim.js vim.js","minify:small":"uglifyjs --output small/vim.js small/vim.js","eslint":"eslint --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","stylelint":"stylelint style.css","lint":"npm-run-all -p stylelint eslint","fix:eslint":"eslint --fix --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","fix:stylelint":"stylelint --fix style.css","fix":"npm-run-all -p fix:eslint fix:stylelint","karma":"karma start","test":"karma start --single-run","vtest:build":"tsc -p ./vtest","vtest:run":"node ./vtest/test.js","vtest":"npm-run-all vtest:build vtest:run","serve":"http-server -p 1234","prepare":"npm-run-all build minify:common","prepublishOnly":"npm-run-all build minify:common","preversion":"cd .. && ./build.sh release-all"},"repository":{"type":"git","url":"git+https://github.com/rhysd/vim.wasm.git"},"keywords":["Vim","editor","WebAssembly"],"author":{"name":"rhysd","email":"lin90162@yahoo.co.jp","url":"https://rhysd.github.io/"},"license":"Vim","homepage":"https://github.com/rhysd/vim.wasm#readme","bugs":{"url":"https://github.com/rhysd/vim.wasm/issues"},"types":"./vimwasm.d.ts","devDependencies":{"@types/chai":"^4.2.7","@types/http-server":"^0.10.0","@types/karma":"^3.0.5","@types/mocha":"^5.2.7","@types/node":"^13.1.1","@types/puppeteer":"^2.0.0","@types/sinon":"^7.5.1","@typescript-eslint/eslint-plugin":"^2.16.0","@typescript-eslint/parser":"^2.16.0","chai":"^4.2.0","chokidar-cli":"^2.1.0","eslint":"^6.8.0","eslint-config-prettier":"^6.9.0","eslint-plugin-mocha":"^6.2.2","eslint-plugin-prettier":"^3.1.2","eslint-plugin-security":"^1.4.0","http-server":"^0.12.0","husky":"^3.1.0","img-diff-js":"^0.4.1","karma":"^4.4.1","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.1.0","karma-mocha":"^1.3.0","karma-sinon":"^1.0.5","mocha":"^6.2.2","npm-run-all":"^4.1.5","open":"^7.0.0","prettier":"^1.19.1","puppeteer":"^2.0.0","sinon":"^8.0.1","stylelint":"^12.0.1","stylelint-config-recommended":"^3.0.0","typescript":"^3.7.4","uglify-es":"^3.3.9"},"stylelint":{"extends":"stylelint-config-recommended"},"husky":{"hooks":{"pre-push":"npm-run-all -p lint vtest:run"}},"gitHead":"ebc9a5ed632d6f220d7aa3bca76f7db4bacc1949","_id":"@aegirassembly/vim-wasm@0.0.13-b","_nodeVersion":"19.8.1","_npmVersion":"9.5.1","dist":{"integrity":"sha512-DV6FOlgwRaAfIFbpcgVIh9COb0bj098POLaYAlLOrteEN9Dev8vf6wy3IZKB9IxpSHwDsXdA9IDI4Sk6/o6WDg==","shasum":"93302392c99bac5b5cfa4e2ece25ea5255beb563","tarball":"https://registry.npmjs.org/@aegirassembly/vim-wasm/-/vim-wasm-0.0.13-b.tgz","fileCount":7,"unpackedSize":126276,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEL10AoaBBpXDYYXjXi7rInRVFmwBZUC6wbYXl5cukF0AiBLFeHwXhLT0QCux3QeuwvlaMBiy3oLkwo/iMfbaNa48Q=="}]},"_npmUser":{"name":"zenkyu","email":"przemekgg2002@gmail.com"},"directories":{},"maintainers":[{"name":"zenkyu","email":"przemekgg2002@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vim-wasm_0.0.13-b_1698861933616_0.852057893770281"},"_hasShrinkwrap":false},"0.0.13-c":{"name":"@aegirassembly/vim-wasm","version":"0.0.13-c","description":"Vim editor ported to WebAssembly","main":"vimwasm.js","scripts":{"build:main":"tsc -d -p tsconfig.main.json","build:worker":"tsc -p tsconfig.worker.json","build":"npm-run-all -p build:main build:worker vtest:build","watch:main":"tsc -p tsconfig.main.json --watch","watch:worker":"tsc -p tsconfig.worker.json --watch","watch":"npm-run-all -p watch:main watch:worker","minify:common":"uglifyjs --output main.js main.js && uglifyjs --output vimwasm.js vimwasm.js","minify:normal":"uglifyjs --output vim.js vim.js","minify:small":"uglifyjs --output small/vim.js small/vim.js","eslint":"eslint --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","stylelint":"stylelint style.css","lint":"npm-run-all -p stylelint eslint","fix:eslint":"eslint --fix --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","fix:stylelint":"stylelint --fix style.css","fix":"npm-run-all -p fix:eslint fix:stylelint","karma":"karma start","test":"karma start --single-run","vtest:build":"tsc -p ./vtest","vtest:run":"node ./vtest/test.js","vtest":"npm-run-all vtest:build vtest:run","serve":"http-server -p 1234","prepare":"npm-run-all build minify:common","prepublishOnly":"npm-run-all build minify:common","preversion":"cd .. && ./build.sh release-all"},"repository":{"type":"git","url":"git+https://github.com/rhysd/vim.wasm.git"},"keywords":["Vim","editor","WebAssembly"],"author":{"name":"rhysd","email":"lin90162@yahoo.co.jp","url":"https://rhysd.github.io/"},"license":"Vim","homepage":"https://github.com/rhysd/vim.wasm#readme","bugs":{"url":"https://github.com/rhysd/vim.wasm/issues"},"types":"./vimwasm.d.ts","devDependencies":{"@types/chai":"^4.2.7","@types/http-server":"^0.10.0","@types/karma":"^3.0.5","@types/mocha":"^5.2.7","@types/node":"^13.1.1","@types/puppeteer":"^2.0.0","@types/sinon":"^7.5.1","@typescript-eslint/eslint-plugin":"^2.16.0","@typescript-eslint/parser":"^2.16.0","chai":"^4.2.0","chokidar-cli":"^2.1.0","eslint":"^6.8.0","eslint-config-prettier":"^6.9.0","eslint-plugin-mocha":"^6.2.2","eslint-plugin-prettier":"^3.1.2","eslint-plugin-security":"^1.4.0","http-server":"^0.12.0","husky":"^3.1.0","img-diff-js":"^0.4.1","karma":"^4.4.1","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.1.0","karma-mocha":"^1.3.0","karma-sinon":"^1.0.5","mocha":"^6.2.2","npm-run-all":"^4.1.5","open":"^7.0.0","prettier":"^1.19.1","puppeteer":"^2.0.0","sinon":"^8.0.1","stylelint":"^12.0.1","stylelint-config-recommended":"^3.0.0","typescript":"^3.7.4","uglify-es":"^3.3.9"},"stylelint":{"extends":"stylelint-config-recommended"},"husky":{"hooks":{"pre-push":"npm-run-all -p lint vtest:run"}},"gitHead":"f99b328cd0d9370878a1192f15fed000c347162a","_id":"@aegirassembly/vim-wasm@0.0.13-c","_nodeVersion":"19.8.1","_npmVersion":"9.5.1","dist":{"integrity":"sha512-qL7EiPNs2Mfr9/6+3JxY9MXz0RYSOlgIVmYx5ri37nv29exee17fKsMK/RSFNQ4kfgs2vJrZ2zi7zxbB0c+o8g==","shasum":"08a5734cbacf7aebacef4fc35295461e7cb350df","tarball":"https://registry.npmjs.org/@aegirassembly/vim-wasm/-/vim-wasm-0.0.13-c.tgz","fileCount":10,"unpackedSize":7918441,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmtqVrpu1aQeb7ltqaJMm1SzQJs/OFBvdpTi1CL2klVQIgQNcKF4knS6Nutc1TFk+ZQxHgcDfnD+m8y2WJ7KAwicc="}]},"_npmUser":{"name":"zenkyu","email":"przemekgg2002@gmail.com"},"directories":{},"maintainers":[{"name":"zenkyu","email":"przemekgg2002@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vim-wasm_0.0.13-c_1698888814051_0.6788401514096676"},"_hasShrinkwrap":false},"0.0.14":{"name":"@aegirassembly/vim-wasm","version":"0.0.14","description":"Vim editor ported to WebAssembly","main":"vimwasm.js","scripts":{"build:main":"tsc -d -p tsconfig.main.json","build:worker":"tsc -p tsconfig.worker.json","build":"npm-run-all -p build:main build:worker vtest:build","watch:main":"tsc -p tsconfig.main.json --watch","watch:worker":"tsc -p tsconfig.worker.json --watch","watch":"npm-run-all -p watch:main watch:worker","minify:common":"uglifyjs --output main.js main.js && uglifyjs --output vimwasm.js vimwasm.js","minify:normal":"uglifyjs --output vim.js vim.js","minify:small":"uglifyjs --output small/vim.js small/vim.js","eslint":"eslint --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","stylelint":"stylelint style.css","lint":"npm-run-all -p stylelint eslint","fix:eslint":"eslint --fix --ignore-path .gitignore '*.ts' 'test/*.ts' 'vtest/*.ts'","fix:stylelint":"stylelint --fix style.css","fix":"npm-run-all -p fix:eslint fix:stylelint","karma":"karma start","test":"karma start --single-run","vtest:build":"tsc -p ./vtest","vtest:run":"node ./vtest/test.js","vtest":"npm-run-all vtest:build vtest:run","serve":"http-server -p 1234","prepare":"npm-run-all build minify:common","prepublishOnly":"npm-run-all build minify:common","preversion":"cd .. && ./build.sh release-all"},"repository":{"type":"git","url":"git+https://github.com/rhysd/vim.wasm.git"},"keywords":["Vim","editor","WebAssembly"],"author":{"name":"rhysd","email":"lin90162@yahoo.co.jp","url":"https://rhysd.github.io/"},"license":"Vim","homepage":"https://github.com/rhysd/vim.wasm#readme","bugs":{"url":"https://github.com/rhysd/vim.wasm/issues"},"types":"./vimwasm.d.ts","devDependencies":{"@types/chai":"^4.2.7","@types/http-server":"^0.10.0","@types/karma":"^3.0.5","@types/mocha":"^5.2.7","@types/node":"^13.1.1","@types/puppeteer":"^2.0.0","@types/sinon":"^7.5.1","@typescript-eslint/eslint-plugin":"^2.16.0","@typescript-eslint/parser":"^2.16.0","chai":"^4.2.0","chokidar-cli":"^2.1.0","eslint":"^6.8.0","eslint-config-prettier":"^6.9.0","eslint-plugin-mocha":"^6.2.2","eslint-plugin-prettier":"^3.1.2","eslint-plugin-security":"^1.4.0","http-server":"^0.12.0","husky":"^3.1.0","img-diff-js":"^0.4.1","karma":"^4.4.1","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.1.0","karma-mocha":"^1.3.0","karma-sinon":"^1.0.5","mocha":"^6.2.2","npm-run-all":"^4.1.5","open":"^7.0.0","prettier":"^1.19.1","puppeteer":"^2.0.0","sinon":"^8.0.1","stylelint":"^12.0.1","stylelint-config-recommended":"^3.0.0","typescript":"^3.7.4","uglify-es":"^3.3.9"},"stylelint":{"extends":"stylelint-config-recommended"},"husky":{"hooks":{"pre-push":"npm-run-all -p lint vtest:run"}},"gitHead":"1bd621b5e3c3f14a71664531bb6cfcadbdc15a4e","_id":"@aegirassembly/vim-wasm@0.0.14","_nodeVersion":"19.8.1","_npmVersion":"9.5.1","dist":{"integrity":"sha512-JzaWCt3AIBLf4SodGPpr0lQQP2ilCpzCcb9RVy3a4DoQ6OpecwepK5J+ZHcFgg9QlPkQK6x74ilV3hbqNhYqgw==","shasum":"4b936cdb35ed087d7b8c94eb92de9dc76f16a277","tarball":"https://registry.npmjs.org/@aegirassembly/vim-wasm/-/vim-wasm-0.0.14.tgz","fileCount":10,"unpackedSize":7918440,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1Rt3SxSUVkYU0B2GlkLxIC2/g67Q2vJu8VTCGzvxXmAIhAPMCjz6BeOWmzRdii6lY0WeDTQnI/Q5HOwu7C3S6eFq1"}]},"_npmUser":{"name":"zenkyu","email":"przemekgg2002@gmail.com"},"directories":{},"maintainers":[{"name":"zenkyu","email":"przemekgg2002@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/vim-wasm_0.0.14_1698891553663_0.09683831035550772"},"_hasShrinkwrap":false}},"time":{"created":"2023-10-31T20:46:41.940Z","0.0.13":"2023-10-31T20:46:42.277Z","modified":"2023-11-02T02:19:14.095Z","0.0.13-a":"2023-11-01T17:52:55.243Z","0.0.13-b":"2023-11-01T18:05:33.893Z","0.0.13-c":"2023-11-02T01:33:34.438Z","0.0.14":"2023-11-02T02:19:13.886Z"},"maintainers":[{"name":"zenkyu","email":"przemekgg2002@gmail.com"}],"description":"Vim editor ported to WebAssembly","homepage":"https://github.com/rhysd/vim.wasm#readme","keywords":["Vim","editor","WebAssembly"],"repository":{"type":"git","url":"git+https://github.com/rhysd/vim.wasm.git"},"author":{"name":"rhysd","email":"lin90162@yahoo.co.jp","url":"https://rhysd.github.io/"},"bugs":{"url":"https://github.com/rhysd/vim.wasm/issues"},"license":"Vim","readme":"[npm][] package for [vim.wasm][project]\n=======================================\n[![Build Status][travis-ci-badge]][travis-ci]\n[![npm version][npm-badge]][npm-pkg]\n[![code style: prettier][prettier-badge]][prettier]\n\n**WARNING!: This npm package is experimental until v0.1.0 beta release.**\n\n## Introduction\n\nThis is an [npm][] package to install pre-built [vim.wasm][project] binary easily. This package contains:\n\n- `vim.wasm`: WebAssembly binary\n- `vim.js`: Web Worker script to drive `vim.wasm`\n- `vim.data`: Bundled preloaded files loaded into filesystem at start up\n- `vimwasm.js`: ES Module to manage lifetime of Web Worker\n- `small/vim.{wasm,js,data}`: Small feature version\n\nPlease read the following instructions to use this package. You can play with [live demo][demo].\nFor usage of the demo, please read [usage documentation](./DEMO_USAGE.md).\n\n## Installation\n\nInstall [npm package][npm-pkg] via `npm` command.\n\n```\nnpm install --save vim-wasm\n```\n\n## Usage\n\n**NOTE:** This npm package is currently dedicated for browsers. It does not work with Wasm interpreters\noutside browser like `node`.\n\nPlease see [example directory](./example) for minimal live example and [live demo](./main.ts) for\nmore complicated example.\n\n### Prepare `index.html`\n\nPut `<canvas>` to render Vim screen and `<input/>` to take user input in HTML file.\n\n```html\n<canvas id=\"vim-canvas\"></canvas>\n<input id=\"vim-input\" autocomplete=\"off\" autofocus />\n<script type=\"module\" src=\"index.js\" />\n```\n\nYour script `index.js` must be loaded as `type=\"module\"` because this npm package provides ES Module\nunless you use some JS source bundler.\n\n### Prepare `index.js`\n\n```javascript\nimport { VimWasm } from '/path/to/vim-wasm/vimwasm.js';\n\nconst vim = new VimWasm({\n    canvas: document.getElementById('vim-canvas'),\n    input: document.getElementById('vim-input'),\n    workerScriptPath: '/path/to/vim-wasm/vim.js',\n});\n\n// Setup callbacks if you need...\n\n// Start Vim (give option object if necessary)\nvim.start();\n```\n\n`VimWasm` class is provided to manage Web Worker lifecycle where Vim is running. Please import it from\n`vimwasm.js` ES Module.\n\n`workerScriptPath` is the most important option value which represents a file path to a worker script\nwhich runs Vim in Web Worker. By switching path to scripts `vim-wasm/vim.js` and `vim-wasm/small/vim.js`,\nyou can switch feature set of Vim. Please read following 'Normal Feature and Small Feature' section.\n\n`VimWasm` provides several callbacks to interact with Vim running in Web Worker. Please check\n[example code](./example/index.js) for the callbacks setup.\n\nFinally calling `start()` method starts Vim in new Web Worker. You can pass an options object to the\nmethod call to specify various options.\n\n### Serve `index.html`\n\nServe `index.html` with HTTP server and access to it from a web browser.\n\n**NOTE:** This project uses [`SharedArrayBuffer`][shared-array-buffer] and [`Atomics` API][atomics-api].\nOnly Chrome or Chromium-based browsers enable them by default. For Firefox and Safari, feature flag must\nbe enabled manually for now to enable them. Please also read notices in README.md at [the project page][project].\n\n### Related Projects\n\nFollowing projects are related to this npm package and may be more suitable for your use case.\n\n- [react-vim-wasm](https://github.com/rhysd/react-vim-wasm): [React](https://reactjs.org/) component for [vim.wasm][project].\n  Vim editor can be embedded in your React web application.\n- [vimwasm-try-plugin](https://github.com/rhysd/vimwasm-try-plugin): Command line tool to open vim.wasm including specified\n  Vim plugin instantly. You can try Vim plugin\n  without installing it!\n- [vim.wasm.ipynb](https://github.com/nat-chan/vim.wasm.ipynb): Jupyter Notebook integration with vim.wasm.\n  [Try it online!](https://mybinder.org/v2/gh/nat-chan/vim.wasm.ipynb/gh-pages?filepath=vim.wasm.ipynb)\n\n## Normal Feature and Small Feature\n\nThis package contains two binaries for 'normal' feature set and 'small' feature set.\n'normal' feature set provides almost all Vim's powerful features but binary size is 4x bigger than\n'small' feature set. 'small' feature set only provides basic features but binary size is much smaller.\n\n|                 | Normal Feature      | Small Feature                                                                      |\n|-----------------|---------------------|------------------------------------------------------------------------------------|\n| **Script path** | `vim-wasm/vim.js`   | `vim-wasm/small/vim.js`                                                            |\n| **Data size**   | 1.3 MB              | 13 KB                                                                              |\n| **Wasm size**   | 709 KB              | 374 KB                                                                             |\n| **Features**    | Almost all features | Not including syntax highlight, indentation, Vim script support, text objects, ... |\n\nData size is significantly different because 'normal' feature set includes syntax highlighting and indentation\nsupport for all filetypes. In contrast 'small' feature set only includes colorscheme and minimal vimrc.\n\nBy passing a worker script path for each feature to `workerScriptPath` option, you can specify a feature set.\nPlease choose one considering your application's requirements.\n\n```javascript\nconst normalVim = new VimWasm({\n    canvas,\n    input,\n    workerScriptPath: '/path/to/vim-wasm/vim.js',\n});\n\nconst smallVim = new VimWasm({\n    canvas,\n    input,\n    workerScriptPath: '/path/to/vim-wasm/small/vim.js',\n});\n```\n\n## Check Browser Compatibility\n\nThis npm package runs Vim in Web Worker and the main thread communicates with the worker thread via `SharedArrayBuffer`.\nChrome or Chromium based browser supports `SharedArrayBuffer` by default. Safari and Firefox supports it under a feature\nflag due to Spectre vulnerability.\n\nTo check current browser can use this package, `checkBrowserCompatibility()` utility function is provided.\nIt returns an error message as string if it is not compatible (otherwise returns `undefined`).\n\n```javascript\nconst errmsg = checkBrowserCompatibility();\nif (errmsg !== undefined) {\n    alert(errmsg);\n    return;\n}\n\nconst vim = new VimWasm({...});\n```\n\n## Debug Logging\n\nPassing `debug: true` to `VimWasm.start()` method call enables debug logging with `console.log`.\n\n```javascript\nvim.start({ debug: true });\n```\n\n**Note:** Debug logs in C sources are not controlled by the query parameter. It is controlled `GUI_WASM_DEBUG` preprocessor macro.\n\n## Performance Logging\n\nPassing `perf: true` to `VimWasm.start()` method call enables the performance tracing.\nAfter Vim exits (e.g. `:qall!`), it dumps performance measurements in DevTools console as tables.\n\n```javascript\nvim.start({ perf: true });\n```\n\n**Note:** For performance measurements, please ensure to use release build. Measuring with debug build does not make sense.\n\n**Note:** Please do not use debug logging at the same time. Outputting console logs in DevTools slows application.\n\n## Program Arguments\n\nPassing program arguments of `vim` command is supported.\n\nPassing `cmdArgs` option to `VimWasm.start()` method call passes the value as Vim command arguments.\n\n```javascript\nvim.start({\n  cmdArgs: [ '~/.vim/vimrc', '-c', 'set number' ]\n});\n```\n\nAs shown in above example, this feature is useful when you want to open specific file at Vim startup.\n\n## Evaluate JavaScript with `:!`\n\n```\n:!/path/to/file.js\n```\n\n`:!` evaluates the JavaScript source file. In Vim's command line, `%` is replaced with the current buffer's\nfile path so `:!%` evaluates the current buffer.\n\nCurrently only `*.js` files are executable via `:!` and any other commands are not supported. Console\noutput is not captured. You need to open console in DevTools or use `alert()` to show value.\n\nThe JavaScript code is evaluated in main thread so DOM APIs are available. If the code throws an exception,\nthe error message and stacktrace is shown as an error message in Vim.\n\nUnlike `:!`, `system()` and `systemlist()` Vim script functions are explicitly not supported because their\ncalls in Vim plugins are intended to execute shell commands.\n\n## Set Font\n\n`guifont` option is available like other GUI Vim. All font names available in CSS are also available here.\nNote that **only monospace fonts are considered**. If you specify other font like `serif`, junks may remain\non re-rendering a screen.\n\n```vim\n\" Use 'Monaco' font\n:set guifont=Monaco\n```\n\nIf you want to specify font height also, `:h{pixels}` suffix is available.\n\n```vim\n\" Use 'Monaco' font with 20px font height\n:set guifont=Monaco:h20\n```\n\nNote that currently only font height can be specified in this format. And integer value is acceptable\nsince Vim contains font size as integer internally.\n\nIf you want to specify font name and font height from JavaScript, set it via `VimWasm.cmdline` method.\n\n```javascript\nvim.cmdline(`set guifont=${fontName}:h{fontHeight}`);\n```\n\n## FileSystem Setup\n\n`VimWasm.start()` method supports filesystem setup before starting Vim through `dirs`, `files`, `fetchFiles`\nand `persistentDirs` options.\n\n`dirs` option creates new directories on filesystem. They are created on memory using emscripten's\n`MEMFS` by default. Note that nested directory paths are not available.\n\nNotes:\n\n- You must specify each parent directories to create a nested directory.\n- Trying to create an existing directory causes an error.\n\n```javascript\n// Create /work/documents directory\nvim.start({\n    dirs: ['/work', '/work/documents'],\n});\n```\n\n`persistentDirs` option marks the directories are persistent. They are stored on [Indexed DB][idb]\nthanks to emscripten's `IDBFS`. They will remain even if user closes a browser tab.\n\nNotes:\n\n- Marking non-existing directories as persistent causes an error. Please set `dirs` correctly to ensure\n  they exists.\n- Files are synchronized when Vim exits. Closing browser tab without `:quit` does not save files on Indexed DB.\n  This behavior may change in the future.\n- This option adds overhead to load files from database at Vim startup.\n\n```javascript\n// Create /work/persistent directory. Contents of the directory are persistent\nvim.start({\n    dirs: ['/work', '/work/persistent'],\n    persistentDirs: ['/work/persistent'],\n});\n```\n\n`files` option creates files on filesystem. It is an object whose keys are file paths and values are files'\ncontents as `String`.\n\nNotes:\n\n- Parent directories must exist for the files. If they don't exist, please create them by `dirs` option.\n- You can overwrite default vimrc as below example.\n\n```javascript\n// Create new file /work/hello.txt and overwrite vimrc\nvim.start({\n    dirs: ['/work'],\n    files: {\n        '/work/hello.txt': 'hello, world!\\n',\n        '/.vim/vimrc': 'set number\\nset noexpandtab\\n',\n    },\n});\n```\n\n`fetchFiles` option fetches remote resources and map them to filesystem entries. It is an object whose\nkeys are file paths on filesystem and values are remote resource paths (relative file paths or URLs).\nIt fetches file paths or URLs just before starting Vim and put them on filesystem.\n\n```javascript\nvim.start({\n    fetchFiles: {\n        // Fetch hosted 'vim.js' file and put it as '/foo.js' in filesystem\n        '/foo.js': '/vim.js',\n        // Fetch 'README.md' file from remote with URL and put it as '/bar.md' in filesystem\n        '/bar.md': 'https://raw.githubusercontent.com/rhysd/vim.wasm/wasm/README.md',\n    },\n});\n```\n\nBy using this option, external files are easily loaded onto filesystem. For example, if you fetch plugin\nfiles, the plugin is available on Vim starting. [vimwasm-try-plugin][] uses this option to load specified\nVim plugin or colorscheme.\n\nResources (values of the object) are fetched with [`fetch()`][fetch]. Though all requests are sent\nasynchronously, Vim waits all responses. Fetching many files or too large file would slows Vim start\nup time so should be avoided.\n\n## Evaluate JavaScript from Vim script\n\nTo integrate JavaScript browser APIs into Vim script, `jsevalfunc()` Vim script function is implemented.\n\n```\njsevalfunc({script} [, {args} [, {notify_only}]])\n```\n\nThe first `{script}` argument is a string of JavaScript code which represents **a function body**.\nTo return a value from JavaScript to Vim script, `return` statement is necessary. Arguments are accessible\nvia `arguments` object in the code.\n\nThe second `{args}` optional argument is a list value which represents arguments passed to the JavaScript\nfunction. If it is omitted, the function will be called with no argument.\n\nThe third `{notify_only}` optional argument is a number or boolean value which indicates if returned\nvalue from the JavaScript function call is notified back to Vim script or not. If the value is truthy,\nfunction body and arguments are just notified to main thread and the returned value will never be notified\nback to Vim. In the case, `jsevalfunc()` call always returns `0` and doesn't wait the JavaScript function\ncall has completed. If it is omitted, the default value is `v:false`. This flag is useful when the returned\nvalue is not necessary since returning a value from main thread to Vim in worker may take time to serialize\nand convert values.\n\nThe JavaScript code is evaluated in main thread as a JavaScript function. So DOM element and other Web APIs\nare available.\n\n```vim\n\" Get Location object in JavaScript as dict\nlet location = jsevalfunc('return window.location')\n\n\" Get element text\nlet selector = '.description'\nlet text = jsevalfunc('\n        \\ const elem = document.querySelector(arguments[0]);\n        \\ if (elem === null) {\n        \\   return null;\n        \\ }\n        \\ return elem.textContent;\n        \\', [selector])\n\n\" Run script but does not wait for the script being completed\ncall jsevalfunc('document.title = arguments[0]', ['hello from Vim'], v:true)\n```\n\nSince values are passed by being encoded in JSON between Vim script, arguments passed to JavaScript function\ncall and returned value from JavaScript function must be JSON serializable. As a special case, `undefined`\nis translated to `v:none` in Vim script.\n\n```vim\n\" Error because funcref is not JSON serializable\ncall jsevalfunc('return \"hello\"', [function('empty')])\n\n\" Error because Function object is not JSON serializable\nlet f = jsevalfunc('return fetch')\n```\n\nThe JavaScript function is called in asynchronous context. So `await` operator is available as follows:\n\n```vim\nlet slug = 'rhysd/vim.wasm'\nlet repo = jsevalfunc('\n        \\ const res = await fetch(\"https://api.github.com/repos/\" + arguments[0]);\n        \\ if (!res.ok) {\n        \\   return null;\n        \\ }\n        \\ return JSON.parse(await res.text());\n        \\ ', [slug])\necho repo\n```\n\n`jsevalfunc()` throws an exception when:\n\n- some argument passed at 2nd argument is not JSON serializable\n- JavaScript code causes syntax error\n- evaluating JavaScript code throws an exception\n- returned value from the function call is not JSON serializable\n\n## TypeScript Support\n\n[This npm package][npm-pkg] provides complete TypeScript support. Type definitions are put in `vimwasm.d.ts`\nand automatically referenced by TypeScript compiler.\n\n## Ported Vim\n\n- Current version: 8.2.0055\n- Current features: normal and small\n\n## Development\n\n### Sources\n\nThis directory contains a browser runtime for `wasm` GUI frontend written in [TypeScript](https://www.typescriptlang.org/).\n\n- `pre.ts`, `runtime.ts`: Runtime to interact with main thread and Vim on Wasm. It runs on Web Worker.\n- `main.ts`, `vimwasm.ts`: Runtime to render a Vim screen and take user key inputs. It runs on main thread and is\n  responsible for starting Web Worker.\n- `package.json`: Toolchains for this frontend is managed by [`npm`](https://www.npmjs.com/) command.\n  You can build this runtime by `npm run build`. You can run linters ([`eslint`](https://eslint.org/),\n  [`stylelint`](https://github.com/stylelint/stylelint)) by `npm run lint`.\n\nWhen you run `./build.sh` from root of this repo, `vim.wasm`, `vim.js`, `vim.data` and `main.js` will\nbe generated.  Please host this directory on web server and access to `index.html`.\n\nFiles are formatted by [prettier](https://prettier.io/).\n\n### Testing\n\nUnit tests are developed at [test](./test) directory. Since `vim.wasm` assumes to be run on browsers, they are run\non headless Chromium using [karma](https://karma-runner.github.io/latest/index.html) test runner.\nBasically unit test cases run Vim worker and check draw events from it. Headless Chromium is installed in `node_modules`\nlocally by puppeteer.\n\n```sh\n# Single run\nnpm test\n\n# Watch test source files and run tests on changes\nnpm run karma\n\n# Use normal Chromium with DevTools instead of headless version\nnpm run karma -- --browsers ChromeDebug\n\n# Apply eslint to TypeScript sources\nnpm run lint\n\n# Run visual testing. It checks Vim screen is rendered correctly\nnpm run vtest\n```\n\n`npm run lint` and `npm run vtest` are run at `git push` by [husky][] :dog:.\n\n`npm test` is run at [Travis CI][travis-ci] for every remote push.\n\n## Notes\n\n### ES Modules in Worker\n\nES Modules and JS bundlers (e.g. parcel) are not available in worker because of `emcc`. `emcc` preprocesses input JavaScript\nsource (here `runtime.js`). It parses the source but the parser only accepts specific format of JavaScript code. The preprocessor\nseems to ignore all declarations which don't appear in `mergeInto` call. Dynamic import is also not available for now.\n\n- `import` statement is not available since the `emcc` JS parser cannot parse it\n- Dynamic import is not available in dedicated worker: https://bugs.chromium.org/p/chromium/issues/detail?id=680046\n- Bundled JS sources by bundlers such as parcel cannot be parsed by the `emcc` JS parser\n- Compiling TS sources into one JS file using `--outFile=xxx.js` does not work since toplevel constants are ignored by\n  the `emcc` JS parser\n\n### Offscreen Canvas\n\nThere were 3 trials but all were not available for now.\n\n- Send `<canvas/>` to worker (runtime.js) by `transferControlToOffscreen()` and render draw events there. This is not available\n  since runtime.js runs synchronously with `Atomics` API. It sleeps until main thread notifies. In this case, calling draw methods\n  of `OffscreenCanvas` does nothing because rendering does not happen until JavaScript context ends (like busy loop in main thread\n  prevents DOM rendering).\n- In main thread, draw to `OffscreenCanvas` and transfer the rendered result to on-screen `<canvas/>` as `ImageBitmap`. I tried\n  this but it was slower than simply drawing to `<canvas/>` directly. It is because sending rendered image to `<canvas/>` causes\n  re-rending whole screen.\n- Create another worker thread (renderer.js) in worker (runtime.js) and send draw events to renderer.js. In renderer.js, it renders\n  them to `OffscreenCanvas` passed from main thread via runtime.js. This solution should be possible and is possibly faster than\n  rendering draw events in main thread. However, it is currently not available due to Chromium bug https://bugs.chromium.org/p/chromium/issues/detail?id=977924.\n  When a worker thread runs synchronously with `Atomics` API, new `Worker` instance cannot start because new worker is created\n  in the same thread and starts asynchronously. This would be fixed by https://bugs.chromium.org/p/chromium/issues/detail?id=835717\n  but we need to wait for the fix.\n\n## License\n\nDistributed under VIM License.\n\nExample code is based on https://github.com/trekhleb/javascript-algorithms.\n\n> Copyright (c) 2018 Oleksii Trekhleb\n\n[npm]: https://www.npmjs.com/\n[npm-pkg]: https://www.npmjs.com/package/vim-wasm\n[project]: https://github.com/rhysd/vim.wasm\n[shared-array-buffer]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer\n[atomics-api]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics\n[idb]: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API\n[travis-ci-badge]: https://travis-ci.org/rhysd/vim.wasm.svg?branch=wasm\n[travis-ci]: https://travis-ci.org/rhysd/vim.wasm\n[npm-badge]: https://badge.fury.io/js/vim-wasm.svg\n[prettier-badge]: https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat\n[prettier]: https://github.com/prettier/prettier\n[demo]: https://rhysd.github.io/vim.wasm\n[husky]: https://github.com/typicode/husky\n[fetch]: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n[vimwasm-try-plugin]: https://github.com/rhysd/vimwasm-try-plugin\n","readmeFilename":"README.md"}