{"id":15020777,"url":"https://github.com/electron/fiddle-core","last_synced_at":"2026-04-05T01:05:52.904Z","repository":{"id":40261165,"uuid":"389789861","full_name":"electron/fiddle-core","owner":"electron","description":"Run fiddles from anywhere, on any Electron release","archived":false,"fork":false,"pushed_at":"2024-10-26T14:09:16.000Z","size":631,"stargazers_count":13,"open_issues_count":10,"forks_count":16,"subscribers_count":9,"default_branch":"main","last_synced_at":"2024-10-29T17:15:17.634Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/electron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-26T22:59:38.000Z","updated_at":"2024-10-26T14:09:19.000Z","dependencies_parsed_at":"2022-07-18T01:10:39.981Z","dependency_job_id":"3aa8faa5-fec2-4021-9774-e075e9873da2","html_url":"https://github.com/electron/fiddle-core","commit_stats":{"total_commits":150,"total_committers":13,"mean_commits":"11.538461538461538","dds":0.6133333333333333,"last_synced_commit":"15f86a6b51b5edcd8d1e5bcf244683a0eec3e81f"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Ffiddle-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Ffiddle-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Ffiddle-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/electron%2Ffiddle-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/electron","download_url":"https://codeload.github.com/electron/fiddle-core/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247516997,"owners_count":20951708,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T19:55:36.891Z","updated_at":"2026-02-04T09:21:42.603Z","avatar_url":"https://github.com/electron.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @electron/fiddle-core\n\n[![Test](https://github.com/electron/fiddle-core/actions/workflows/test.yml/badge.svg)](https://github.com/electron/fiddle-core/actions/workflows/test.yml)\n[![NPM](https://img.shields.io/npm/v/@electron/fiddle-core.svg?style=flat)](https://npmjs.org/package/@electron/fiddle-core)\n\nRun fiddles from anywhere, on any Electron release\n\n## CLI\n\n```sh\n# fiddle-core run ver (gist | repo URL | folder)\n# fiddle-core test ver (gist | repo URL | folder)\n# fiddle-core bisect ver1 ver2 (gist | repo URL | folder)\n#\n# Run with Windows MSIX identity (Windows only):\n# fiddle-core run:msix ver (gist | repo URL | folder)\n# fiddle-core test:msix ver (gist | repo URL | folder)\n# fiddle-core start:msix ver (gist | repo URL | folder)\n#\n# Examples:\n\n$ fiddle-core run 12.0.0 /path/to/fiddle\n$ fiddle-core test 12.0.0 642fa8daaebea6044c9079e3f8a46390\n$ fiddle-core bisect 8.0.0 13.0.0 https://github.com/my/testcase.git\n\n# Run with Windows MSIX identity (gives Electron a Windows app identity)\n$ fiddle-core run:msix 30.0.0 /path/to/fiddle\n\n\n$ fiddle-core bisect 8.0.0 13.0.0 642fa8daaebea6044c9079e3f8a46390\n...\n🏁 finished bisecting across 438 versions...\n# 219 🟢 passed 11.0.0-nightly.20200611 (test #1)\n# 328 🟢 passed 12.0.0-beta.12 (test #2)\n# 342 🟢 passed 12.0.0-beta.29 (test #5)\n# 346 🟢 passed 12.0.1 (test #7)\n# 347 🔴 failed 12.0.2 (test #9)\n# 348 🔴 failed 12.0.3 (test #8)\n# 349 🔴 failed 12.0.4 (test #6)\n# 356 🔴 failed 12.0.11 (test #4)\n# 383 🔴 failed 13.0.0-nightly.20210108 (test #3)\n\n🏁 Done bisecting\n🟢 passed 12.0.1\n🔴 failed 12.0.2\nCommits between versions:\n↔ https://github.com/electron/electron/compare/v12.0.1...v12.0.2\nDone in 28.19s.\n```\n\n## API\n\n### Hello, World!\n\n```ts\nimport { Runner } from '@electron/fiddle-core';\n\nconst runner = await Runner.create();\nconst { status } = await runner.run('13.1.7', '/path/to/fiddle');\nconsole.log(status);\n```\n\n### Running Fiddles\n\n```ts\nimport { Runner } from '@electron/fiddle-core';\n\nconst runner = await Runner.create();\n\n// use a specific Electron version to run code from a local folder\nconst result = await runner.run('13.1.7', '/path/to/fiddle');\n\n// use a specific Electron version to run code from a github gist\nconst result = await runner.run('14.0.0-beta.17', '642fa8daaebea6044c9079e3f8a46390');\n\n// use a specific Electron version to run code from a git repo\nconst result = await runner.run('15.0.0-alpha.1', 'https://github.com/my/repo.git');\n\n// use a specific Electron version to run code from iterable filename/content pairs\nconst files = new Map\u003cstring, string\u003e([['main.js', '\"use strict\";']]);\nconst result = await runner.run('15.0.0-alpha.1', files);\n\n// bisect a regression test across a range of Electron versions\nconst result = await runner.bisect('10.0.0', '13.1.7', path_or_gist_or_git_repo);\n\n// run with Windows MSIX identity (Windows only)\n// This registers Electron as a sparse MSIX package, giving it a Windows app identity\nconst result = await runner.run('30.0.0', fiddle, { runWithIdentity: true });\n\n// see also `Runner.spawn()` in Advanced Use\n```\n\n### Running with Windows MSIX Identity\n\nOn Windows, you can run Electron with a [sparse MSIX package](https://learn.microsoft.com/en-us/windows/msix/overview) identity. This gives Electron a Windows app identity, which is required for certain Windows features.\n\n```ts\nimport { Runner } from '@electron/fiddle-core';\n\nconst runner = await Runner.create();\n\n// Run fiddle with Windows MSIX identity\nconst result = await runner.run('30.0.0', fiddle, {\n  runWithIdentity: true,\n});\n```\n\nWhen `runWithIdentity` is `true`, fiddle-core will:\n1. Generate an AppxManifest.xml in the Electron installation directory\n2. Register Electron as a sparse MSIX package using `Add-AppxPackage`\n3. Run Electron via its registered execution alias\n\n\n### Managing Electron Installations\n\n```ts\nimport { Installer, ProgressObject } from '@electron/fiddle-core';\n\nconst installer = new Installer();\ninstaller.on('state-changed', ({version, state}) =\u003e {\n  console.log(`Version \"${version}\" state changed: \"${state}\"`);\n});\n\n// download a version of electron\nawait installer.ensureDownloaded('12.0.15');\n// expect(installer.state('12.0.5').toBe('downloaded');\n\n// download a version with callback\nconst callback = (progress: ProgressObject) =\u003e {\n  const percent = progress.percent * 100;\n  console.log(`Current download progress %: ${percent.toFixed(2)}`);\n};\nawait installer.ensureDownloaded('12.0.15', {\n  progressCallback: callback,\n});\n\n// download a version with a specific mirror\nconst npmMirrors = {\n  electronMirror: 'https://npmmirror.com/mirrors/electron/',\n  electronNightlyMirror: 'https://npmmirror.com/mirrors/electron-nightly/',\n},\n\nawait installer.ensureDownloaded('12.0.15', {\n  mirror: npmMirrors,\n});\n\n// remove a download\nawait installer.remove('12.0.15');\n// expect(installer.state('12.0.15').toBe('not-downloaded');\n\n// install a specific version for the runner to use\nconst exec = await installer.install('11.4.10');\n\n// Installing with callback and custom mirrors\nawait installer.install('11.4.10', {\n  progressCallback: callback,\n  mirror: npmMirrors,\n});\n// expect(installer.state('11.4.10').toBe('installed');\n// expect(fs.accessSync(exec, fs.constants.X_OK)).toBe(true);\n```\n\n### Versions\n\n```ts\nimport { ElectronVersions } from '@electron/fiddle-core';\n\n// - querying specific versions\nconst elves = await ElectronVersions.create();\n// expect(elves.isVersion('12.0.0')).toBe(true);\n// expect(elves.isVersion('12.99.99')).toBe(false);\nconst { versions } = elves;\n// expect(versions).find((ver) =\u003e ver.version === '12.0.0').not.toBeNull();\n// expect(versions[versions.length - 1]).toStrictEqual(elves.latest);\n\n// - supported major versions\nconst { supportedMajors } = elves;\n// expect(supportedMajors.length).toBe(4);\n\n// - querying prerelease branches\nconst { supportedMajors, prereleaseMajors } = elves;\nconst newestSupported = Math.max(...supportedMajors);\nconst oldestPrerelease = Math.min(...prereleaseMajors);\n// expect(newestSupported + 1).toBe(oldestPrerelease);\n\n// - get all releases in a range\nlet range = releases.inRange('12.0.0', '12.0.15');\n// expect(range.length).toBe(16);\n// expect(range.shift().version).toBe('12.0.0');\n// expect(range.pop().version).toBe('12.0.15');\n\n// - get all 10-x-y releases\nrange = releases.inMajor(10);\n// expect(range.length).toBe(101);\n// expect(range.shift().version).toBe('10.0.0-nightly.20200209');\n// expect(range.pop().version).toBe('10.4.7');\n```\n\n## Advanced Use\n\n### child_process.Spawn\n\n```ts\nimport { Runner } from '@electron/fiddle-core';\n\n// third argument is same as node.spawn()'s opts\nconst child = await runner.spawn('12.0.1', fiddle, nodeSpawnOpts);\n\n// see also `Runner.run()` and `Runner.bisect()` above\n```\n\n### Using Local Builds\n\n```ts\nimport { Runner } from '@electron/fiddle-core';\n\nconst runner = await Runner.create();\nconst result = await runner.run('/path/to/electron/build', fiddle);\n```\n\n### Using Custom Paths\n\n```ts\nimport { Paths, Runner } from '@electron/fiddle-core';\n\nconst paths: Paths = {\n  // where to store zipfiles of downloaded electron versions\n  electronDownloads: '/tmp/my/electron-downloads',\n\n  // where to install an electron version to be used by the Runner\n  electronInstall: '/tmp/my/electron-install',\n\n  // where to save temporary copies of fiddles\n  fiddles: '/tmp/my/fiddles',\n\n  // where to save releases fetched from online\n  versionsCache: '/tmp/my/releases.json',\n});\n\nconst runner = await Runner.create({ paths });\n```\n\n### Manually Creating Fiddle Objects \n\nRunner will do this work for you; but if you want finer-grained control\nover the lifecycle of your Fiddle objects, you can instantiate them yourself:\n\n```ts\nimport { FiddleFactory } from '@electron/fiddle-core';\n\nconst factory = new FiddleFactory();\n\n// load a fiddle from a local directory\nconst fiddle = await factory.from('/path/to/fiddle'));\n\n// ...or from a gist\nconst fiddle = await factory.from('642fa8daaebea6044c9079e3f8a46390'));\n\n// ...or from a git repo\nconst fiddle = await factory.from('https://github.com/my/testcase.git'));\n\n// ...or from an iterable of key / value entries\nconst fiddle = await factory.from([\n  ['main.js', '\"use strict\";'],\n]);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felectron%2Ffiddle-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felectron%2Ffiddle-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felectron%2Ffiddle-core/lists"}