polyipseity6k downloadsLoad JavaScript and related languages like TypeScript modules from the vault and the Internet.
Load JavaScript and related languages like TypeScript modules from the vault and the Internet.
Repository · Changelog · Community plugin · Related · Features · Installation · Usage · Contributing · Security

For first time users, read the installation section first!
This file is automatically opened on first install. You can reopen it in settings or command palette.
module.exports) and ES modules (export).modules under .obsidian/plugins of your vault.manifest.json, main.js, and styles.css from the latest release into the directory.bun. See https://bun.sh for installation.bun install in the root directory.bun run obsidian:install <vault directory> in the root directory.// Using `require.import` is recommended.
await self.require.import("obsidian") // builtin modules such as the Obsidian API
await self.require.import("vault/path/to/a module.md") // vault path
// The following three require context and may not be able to infer the current directory. Please file an issue if so. Context inference is only available for top-level code, i.e. not inside functions or classes.
await self.require.import("../relative/path/to/a module.js") // relative path
await self.require.import("[omitted or whatever](markdown/link/to/a%20module.js.md)") // Markdown link
await self.require.import("[[wikilink/to/a module|omitted or whatever]]") // wikilink
// The following one requires enabling external links in settings.
await self.require.import("https://esm.sh/scratchblocks") // external link
// You can workaround the inability to infer the current directory.
await self.require.import("../relative/path/to/a module.js", { cwd: context.currentDirectory })
// If `await` is not supported, use `require` instead. It has less support for loading modules, however.
self.require("obsidian")
self.require("vault/path/to/a module.md")
// The following three require context and may not be able to infer the current directory. Please file an issue if so. Context inference is only available for top-level code, i.e. not inside functions or classes.
self.require("../relative/path/to/a module.js")
// The following three may not work in startup scripts.
self.require("[omitted or whatever](markdown/link/to/a%20module.js.md)")
self.require("[[wikilink/to/a module|omitted or whatever]]")
// The following one requires enabling external links and adding the link to preloaded external links in settings.
self.require("https://esm.sh/scratchblocks") // external link
// You can workaround the inability to infer the current directory.
self.require("../relative/path/to/a module.js", { cwd: context.currentDirectory })
const { eat, pi } = await self.require.import("[[module]]")
eat(2 * pi)
// OR
const mod = await self.require.import("[[module]]")
mod.eat(2 * mod.pi)
require (but not require.import), the module file needs to be preloaded, which can be configured in settings. By default, preloaded files have the following extensions: .js, .js.md, .mjs, .mjs.md, .ts.md, .mts.md, .ts, .ts.md.xxx.md) or prepend the following metadata:// { "language": "TypeScript" }
export const variable: string = "string"
---
module:
language: TypeScript
---
```TypeScript
export const variable: string = "string"
```
// ES module-style, supported by `require.import`.
export function fun() {}
export const variable = "string"
export default 42 // The default export has the name `default`.
// CommonJS-style, supported by both `require` and `require.import`.
module.exports.fun = function() {}
module.exports.variable = "string"
module.exports.default = 42
exports.abbreviatedForm = {}
export default or assigning to module.exports and add the module to plugin settings:// ES module-style
export default function() {
console.log("Hello world!")
}
// CommonJS-style
module.exports = function() {
console.log("Hello world!")
}
src/@types/obsidian-modules.ts.Contributions are welcome!
This project uses changesets to manage the changelog. When creating a pull request, please add a changeset describing the changes. Add multiple changesets if your pull request changes several things. End each changeset with ([PR number](PR link) by [author username](author link)). For example, the newly created file under the directory .changeset should look like:
---
"example": patch
---
This is an example change. ([GH#1](https://github.com/ghost/example/pull/1) by [@ghost](https://github.com/ghost))
This project uses the following tools to ensure code and commit quality:
bun run check (lint only) or bun run fix (auto-fix lint issues).bun run format (format all files) or bun run format:check (check formatting only).bun run markdownlint or auto-fix with bun run markdownlint:fix.lint-staged and pre-push runs commitlint.Lint-staged note: The lint-staged configuration (
.lintstagedrc.mjs) invokes formatter/linter binaries directly (for exampleprettier --write,eslint --cache --fix,markdownlint-cli2 --fix) so that the list of staged files is passed through to the tool. Invoking these viabun runwould prevent lint-staged from forwarding filenames and cause the tool to operate on its default glob (or the entire repo). Usebun run formatto format the entire repository when needed.
To set up locally:
bun install to install dependencies and set up hooks.You can manually run:
bun run check — lint all code (no formatting)bun run fix — auto-fix lint issues (no formatting)bun run format — format all code with Prettierbun run format:check — check formatting with Prettierbun run markdownlint — check all Markdown filesbun run markdownlint:fix — auto-fix Markdown filesbun run commitlint — check commit messages in rangeConfiguration files:
.eslintrc.* or eslint.config.mjs — ESLint rules.prettierrc — Prettier rules.prettierignore — Prettier ignore patterns.markdownlint.jsonc — markdownlint rules.commitlintrc.js — commitlint config.husky/ — Git hooksThis repository uses Vitest for fast unit tests. Tests live under tests/ and should be named *.spec.ts or *.spec.js.
bun run test (runs vitest run --coverage).bun run test:watch.bun run test (see .husky/pre-push) and will block pushes if tests fail.See vitest.config.mts for minimal config and further instructions.
The todos here, ordered alphabetically, are things planned for the plugin. There are no guarantees that they will be completed. However, we are likely to accept contributions for them.
We hope that there will never be any security vulnerabilities, but unfortunately it does happen. Please report them!
| Version | Supported |
|---|---|
| rolling | ✅ |
| latest | ✅ |
| outdated | ❌ |
Please report a vulnerability by opening an new issue. We will get back to you as soon as possible.