{"_id":"@angeldeejay/magicmirror-module-sandbox","_rev":"8-f92f522140fae6f13e9a2ee558fced8f","name":"@angeldeejay/magicmirror-module-sandbox","dist-tags":{"latest":"3.0.0"},"versions":{"1.0.0":{"name":"@angeldeejay/magicmirror-module-sandbox","version":"1.0.0","author":{"url":"https://github.com/angeldeejay","name":"Andrés Vanegas Jiménez"},"license":"MIT","_id":"@angeldeejay/magicmirror-module-sandbox@1.0.0","maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"bin":{"magicmirror-module-sandbox":"dist/bin/magicmirror-module-sandbox.js"},"dist":{"shasum":"bf1b0e0741f56ddaff38a9cd7900a7d8ae9b9ffd","tarball":"https://registry.npmjs.org/@angeldeejay/magicmirror-module-sandbox/-/magicmirror-module-sandbox-1.0.0.tgz","fileCount":202,"integrity":"sha512-10HKjeTRIdRmmfvEMR0SAzzQ1LyOmJ/juC9MjkEErt+YK+YkYiSAkh9Gb1+w86o3I6ndgHtu7xr1bA4ERcq2zA==","signatures":[{"sig":"MEUCIHM6mqzJj6PeTqijmAI8dGt0B/p7HpdJMThC3nn0rc07AiEAkD6jtoSRQokBm1NGER5qUQFWIG4q5K2qs43URrJHSt8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2810503},"engines":{"node":">=22.21.1 <23 || >=24"},"gitHead":"98bd242575e82fe4441afd7849f366ca6a5d37b7","scripts":{"lint":"eslint --no-error-on-unmatched-pattern bin/*.js client/*.js client/runtime/*.js client/vendor/*.js config/*.js scripts/*.js server/*.js shims/*.js tests/**/*.{js,mjs}","test":"npm run test:unit:coverage && npm run test:integration && npm run test:ui && npm run test:e2e","build":"npm run sync:mm-assets && npm run build:client-assets && node --experimental-strip-types scripts/build-dist.ts","start":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts","watch":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch","format":"prettier --write .github/CONTRIBUTING.md .github/pull_request_template.md .github/ISSUE_TEMPLATE/*.yml .github/workflows/*.yml AGENTS.md CHANGELOG.md README.md docs/*.md package.json tsconfig.json tsconfig.client-runtime.json tsconfig.node.json vite.config.mjs .editorconfig .gitattributes .gitignore .prettierrc eslint.config.mjs bin/*.{js,ts} bin/helpers/*.{js,ts} client/*.{js,ts} client/runtime/*.{js,ts} client/vendor/*.{js,ts} client/scss/*.scss client/app/**/*.{ts,tsx} client/types/**/*.d.ts config/*.js scripts/*.{js,ts} server/*.js shims/*.js tests/**/*.{js,ts} client/styles/*.css","styles":"node --experimental-strip-types scripts/build-client-assets.ts --scope styles","prepack":"npm run build","prepare":"npm run build","test:ui":"vitest run --config vitest.config.ts --project ui","test:e2e":"vitest run --config vitest.config.ts --project e2e","test:unit":"vitest run --config vitest.config.ts --project unit","typecheck":"tsc --noEmit && tsc -p tsconfig.client-runtime.json --noEmit && tsc -p tsconfig.node.json --noEmit && tsc -p tests/tsconfig.json --noEmit","postinstall":"node bin/install-guard.js","styles:watch":"sass --watch --style=compressed --no-source-map client/scss/entrypoint.scss:client/styles/harness.css","start:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --preview","watch:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch --preview","sync:mm-assets":"node --experimental-strip-types bin/sync-magicmirror-assets.ts","test:npx-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/npx-smoke.e2e.test.ts","test:ui:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project ui","coverage:badges":"generate-coverage-report -p ./coverage/badges","test:integration":"vitest run --config vitest.config.ts --project integration","build:node-compat":"node --experimental-strip-types scripts/build-node-compat.ts","test:devdep-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/devdep-smoke.e2e.test.ts","build:client-shell":"node --experimental-strip-types scripts/build-client-assets.ts --scope shell","test:unit:coverage":"vitest run --config vitest.config.ts --project unit --coverage","build:client-assets":"node --experimental-strip-types scripts/build-client-assets.ts","test:browser:headed":"npm run test:integration:headed && npm run test:ui:headed","build:client-runtime":"node --experimental-strip-types scripts/build-client-assets.ts --scope runtime","coverage:job-summary":"node --experimental-strip-types scripts/write-coverage-job-summary.ts","coverage:journey-badges":"node --experimental-strip-types scripts/generate-journey-badges.ts","test:integration:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project integration"},"_npmUser":{"name":"angeldeejay","email":"ukab72106@gmail.com"},"repository":{"url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git","type":"git"},"_npmVersion":"11.10.0","description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","directories":{},"_nodeVersion":"24.13.1","dependencies":{"eta":"^4.6.0","zod":"^4.3.6","moment":"^2.30.1","preact":"^10.29.1","undici":"^7.24.6","fastify":"^5.8.5","chokidar":"^5.0.0","socket.io":"^4.8.3","animate.css":"^4.1.1","serve-static":"^2.2.1","@fastify/middie":"^9.3.2","@fastify/static":"^9.1.3","moment-timezone":"^0.6.1","@fortawesome/fontawesome-free":"^7.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.99.0","vite":"^8.0.10","eslint":"^10.1.0","vitest":"^4.1.2","esbuild":"^0.28.0","globals":"^17.4.0","css-tree":"^3.2.1","prettier":"^3.8.1","@eslint/js":"^10.0.1","node-fetch":"^3.3.2","playwright":"^1.58.2","typescript":"^6.0.3","magicmirror":"^2.35.0","@preact/preset-vite":"^2.10.5","@vitest/coverage-v8":"^4.1.2","@vitest/browser-playwright":"^4.1.2","@hyperse/vitest-coverage-reporter":"^1.0.16"},"_npmOperationalInternal":{"tmp":"tmp/magicmirror-module-sandbox_1.0.0_1777331726122_0.888254497540713","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@angeldeejay/magicmirror-module-sandbox","version":"1.0.1","author":{"url":"https://github.com/angeldeejay","name":"Andrés Vanegas Jiménez"},"license":"MIT","_id":"@angeldeejay/magicmirror-module-sandbox@1.0.1","maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"bin":{"magicmirror-module-sandbox":"dist/bin/magicmirror-module-sandbox.js"},"dist":{"shasum":"9dbe93fa8267f865e757cd950d78b759d60ea361","tarball":"https://registry.npmjs.org/@angeldeejay/magicmirror-module-sandbox/-/magicmirror-module-sandbox-1.0.1.tgz","fileCount":206,"integrity":"sha512-FfgVyNry2pP7clXVvKgFnlbKZKIRJWgDV7MXxiwmrod0ZbRMOGf1AhS+0uapej9ejBGoV2hKyzq5eHfA42wkCg==","signatures":[{"sig":"MEYCIQCIvAhMFcFGLDtQejYiPEbvaDaNWSNtH/edUKyaTx4G5AIhAJ3pJsUS3Y+qeE3ImTzO6ntpiwjyLFzCnH9np1KvsNQy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angeldeejay%2fmagicmirror-module-sandbox@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4035554},"engines":{"node":">=22.21.1 <23 || >=24"},"gitHead":"c0337e2f5e9593be025448555972c79034c33dff","scripts":{"lint":"eslint --no-error-on-unmatched-pattern bin/*.js client/*.js client/runtime/*.js client/vendor/*.js config/*.js scripts/*.js server/*.js shims/*.js tests/**/*.{js,mjs}","test":"npm run test:unit:coverage && npm run test:integration && npm run test:ui && npm run test:e2e","build":"npm run sync:mm-assets && npm run build:client-assets && node --experimental-strip-types scripts/build-dist.ts","start":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts","watch":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch","format":"prettier --write .github/CONTRIBUTING.md .github/pull_request_template.md .github/ISSUE_TEMPLATE/*.yml .github/workflows/*.yml AGENTS.md CHANGELOG.md README.md docs/*.md package.json tsconfig.json tsconfig.client-runtime.json tsconfig.node.json vite.config.mjs .editorconfig .gitattributes .gitignore .prettierrc eslint.config.mjs bin/*.{js,ts} bin/helpers/*.{js,ts} client/*.{js,ts} client/runtime/*.{js,ts} client/vendor/*.{js,ts} client/scss/*.scss client/app/**/*.{ts,tsx} client/types/**/*.d.ts config/*.js scripts/*.{js,ts} server/*.js shims/*.js tests/**/*.{js,ts} client/styles/*.css","styles":"node --experimental-strip-types scripts/build-client-assets.ts --scope styles","prepack":"npm run build","prepare":"npm run build","test:ui":"vitest run --config vitest.config.ts --project ui","test:e2e":"vitest run --config vitest.config.ts --project e2e","test:unit":"vitest run --config vitest.config.ts --project unit","typecheck":"tsc --noEmit && tsc -p tsconfig.client-runtime.json --noEmit && tsc -p tsconfig.node.json --noEmit && tsc -p tests/tsconfig.json --noEmit","postinstall":"node bin/install-guard.js","styles:watch":"sass --watch --style=compressed --no-source-map client/scss/entrypoint.scss:client/styles/harness.css","start:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --preview","watch:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch --preview","sync:mm-assets":"node --experimental-strip-types bin/sync-magicmirror-assets.ts","test:npx-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/npx-smoke.e2e.test.ts","test:ui:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project ui","coverage:badges":"generate-coverage-report -p ./coverage/badges","test:integration":"vitest run --config vitest.config.ts --project integration","build:node-compat":"node --experimental-strip-types scripts/build-node-compat.ts","test:devdep-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/devdep-smoke.e2e.test.ts","build:client-shell":"node --experimental-strip-types scripts/build-client-assets.ts --scope shell","test:unit:coverage":"vitest run --config vitest.config.ts --project unit --coverage","build:client-assets":"node --experimental-strip-types scripts/build-client-assets.ts","test:browser:headed":"npm run test:integration:headed && npm run test:ui:headed","build:client-runtime":"node --experimental-strip-types scripts/build-client-assets.ts --scope runtime","coverage:job-summary":"node --experimental-strip-types scripts/write-coverage-job-summary.ts","coverage:journey-badges":"node --experimental-strip-types scripts/generate-journey-badges.ts","test:integration:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80d5d5c1-5160-46af-a87b-f302326151a4"}},"repository":{"url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git","type":"git"},"_npmVersion":"11.11.0","description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","directories":{},"_nodeVersion":"24.14.1","dependencies":{"eta":"^4.6.0","zod":"^4.3.6","moment":"^2.30.1","preact":"^10.29.1","undici":"^7.24.6","fastify":"^5.8.5","chokidar":"^5.0.0","socket.io":"^4.8.3","animate.css":"^4.1.1","serve-static":"^2.2.1","@fastify/middie":"^9.3.2","@fastify/static":"^9.1.3","moment-timezone":"^0.6.1","@fortawesome/fontawesome-free":"^7.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.99.0","vite":"^8.0.10","eslint":"^10.1.0","vitest":"^4.1.2","esbuild":"^0.28.0","globals":"^17.4.0","css-tree":"^3.2.1","prettier":"^3.8.1","@eslint/js":"^10.0.1","node-fetch":"^3.3.2","playwright":"^1.58.2","typescript":"^6.0.3","magicmirror":"^2.35.0","@preact/preset-vite":"^2.10.5","@vitest/coverage-v8":"^4.1.2","preact-render-to-string":"^6.6.7","@vitest/browser-playwright":"^4.1.2","@hyperse/vitest-coverage-reporter":"^1.0.16"},"_npmOperationalInternal":{"tmp":"tmp/magicmirror-module-sandbox_1.0.1_1777433104482_0.4809413098362427","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@angeldeejay/magicmirror-module-sandbox","version":"1.1.0","author":{"url":"https://github.com/angeldeejay","name":"Andrés Vanegas Jiménez"},"license":"MIT","_id":"@angeldeejay/magicmirror-module-sandbox@1.1.0","maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"bin":{"magicmirror-module-sandbox":"dist/bin/magicmirror-module-sandbox.js"},"dist":{"shasum":"2a28b57e5cb844a6e90d2bb2740993c1c3b7537e","tarball":"https://registry.npmjs.org/@angeldeejay/magicmirror-module-sandbox/-/magicmirror-module-sandbox-1.1.0.tgz","fileCount":226,"integrity":"sha512-qA/6LTXpldXZYt8l/1pbB2sVXJfyijbujVnTHzQs7rz8wD2TcjzoPYme4iLgsxVTfn3JmwHMNzwwD7fJB1jrLw==","signatures":[{"sig":"MEUCIHMwhtlfRe+cJRnqvkIZol6mnj5OgP2BdkLqOC9mV5/GAiEA/UtGttGAIaDswTQrzLZOOJjlUv0lkbuV8gQjyUOPEc0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angeldeejay%2fmagicmirror-module-sandbox@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6843893},"engines":{"node":">=22.21.1 <23 || >=24"},"gitHead":"b87da3ec7ae23c931514d182d68f835406efcff7","scripts":{"lint":"eslint --no-error-on-unmatched-pattern bin/*.js client/*.js client/runtime/*.js client/vendor/*.js config/*.js scripts/*.js server/*.js shims/*.js tests/**/*.{js,mjs}","test":"npm run test:unit:coverage && npm run test:integration && npm run test:ui && npm run test:e2e","build":"npm run sync:mm-assets && npm run sync:module-analyzer && npm run build:client-assets && node --experimental-strip-types scripts/build-dist.ts","start":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts","watch":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch","format":"prettier --write .github/CONTRIBUTING.md .github/pull_request_template.md .github/ISSUE_TEMPLATE/*.yml .github/workflows/*.yml AGENTS.md CHANGELOG.md README.md docs/*.md package.json tsconfig.json tsconfig.client-runtime.json tsconfig.node.json vite.config.mjs .editorconfig .gitattributes .gitignore .prettierrc eslint.config.mjs bin/*.{js,ts} bin/helpers/*.{js,ts} client/*.{js,ts} client/runtime/*.{js,ts} client/vendor/*.{js,ts} client/scss/*.scss client/app/**/*.{ts,tsx} client/types/**/*.d.ts config/*.js scripts/*.{js,ts} server/*.js shims/*.js tests/**/*.{js,ts} client/styles/*.css","styles":"node --experimental-strip-types scripts/build-client-assets.ts --scope styles","prepack":"npm run build","prepare":"npm run build","test:ui":"vitest run --config vitest.config.ts --project ui","test:e2e":"vitest run --config vitest.config.ts --project e2e","test:unit":"vitest run --config vitest.config.ts --project unit","typecheck":"tsc --noEmit && tsc -p tsconfig.client-runtime.json --noEmit && tsc -p tsconfig.node.json --noEmit && tsc -p tests/tsconfig.json --noEmit","postinstall":"node bin/install-guard.js","styles:watch":"sass --watch --style=compressed --no-source-map client/scss/entrypoint.scss:client/styles/harness.css","start:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --preview","watch:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch --preview","sync:mm-assets":"node --experimental-strip-types bin/sync-magicmirror-assets.ts","test:npx-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/npx-smoke.e2e.test.ts","test:ui:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project ui","coverage:badges":"generate-coverage-report -p ./coverage/badges","test:integration":"vitest run --config vitest.config.ts --project integration","build:node-compat":"node --experimental-strip-types scripts/build-node-compat.ts","test:devdep-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/devdep-smoke.e2e.test.ts","build:client-shell":"node --experimental-strip-types scripts/build-client-assets.ts --scope shell","test:unit:coverage":"vitest run --config vitest.config.ts --project unit --coverage","build:client-assets":"node --experimental-strip-types scripts/build-client-assets.ts","test:browser:headed":"npm run test:integration:headed && npm run test:ui:headed","build:client-runtime":"node --experimental-strip-types scripts/build-client-assets.ts --scope runtime","coverage:job-summary":"node --experimental-strip-types scripts/write-coverage-job-summary.ts","sync:module-analyzer":"node --experimental-strip-types scripts/sync-module-analyzer.ts","coverage:journey-badges":"node --experimental-strip-types scripts/generate-journey-badges.ts","test:integration:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80d5d5c1-5160-46af-a87b-f302326151a4"}},"repository":{"url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git","type":"git"},"_npmVersion":"11.11.0","description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","directories":{},"_nodeVersion":"24.14.1","dependencies":{"eta":"^4.6.0","zod":"^4.3.6","pathe":"^2.0.3","ignore":"^5.3.2","moment":"^2.30.1","preact":"^10.29.1","fastify":"^5.8.5","chokidar":"^5.0.0","socket.io":"^4.8.3","animate.css":"^4.1.1","@fastify/middie":"^9.3.2","@fastify/static":"^9.1.3","moment-timezone":"^0.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.99.0","vite":"^8.0.10","eslint":"^10.1.0","vitest":"^4.1.2","esbuild":"^0.28.0","globals":"^17.4.0","css-tree":"^3.2.1","prettier":"^3.8.1","@eslint/js":"^10.0.1","@vitest/ui":"^4.1.5","node-fetch":"^3.3.2","playwright":"^1.58.2","typescript":"^6.0.3","@types/node":"^24.12.2","magicmirror":"^2.35.0","@preact/preset-vite":"^2.10.5","@vitest/coverage-v8":"^4.1.2","preact-render-to-string":"^6.6.7","@vitest/browser-playwright":"^4.1.2","@fortawesome/fontawesome-free":"^7.2.0","@hyperse/vitest-coverage-reporter":"^1.0.16"},"_npmOperationalInternal":{"tmp":"tmp/magicmirror-module-sandbox_1.1.0_1777687135841_0.44132384555484694","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@angeldeejay/magicmirror-module-sandbox","version":"1.1.1","author":{"url":"https://github.com/angeldeejay","name":"Andrés Vanegas Jiménez"},"license":"MIT","_id":"@angeldeejay/magicmirror-module-sandbox@1.1.1","maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"bin":{"magicmirror-module-sandbox":"dist/bin/magicmirror-module-sandbox.js"},"dist":{"shasum":"5bc665ade53d4d94f2b1a1267fa314445f19f836","tarball":"https://registry.npmjs.org/@angeldeejay/magicmirror-module-sandbox/-/magicmirror-module-sandbox-1.1.1.tgz","fileCount":226,"integrity":"sha512-lqtNN9pdRSsnQQbZTO6Fb8LyVe/8e4fhzPGM2efvZH7UKmQodN6M1e88ff971D9hC0t+fB3Zhf5ErUtH79PNNg==","signatures":[{"sig":"MEUCIFons9w5BVHYdJIkN8fHX/PooaFpZ5xw99TtD3kO6iLUAiEAzQ8kwYtlGgiFL6lWio8nMvs8AT0B7rBvgio2HMP6UL4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angeldeejay%2fmagicmirror-module-sandbox@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6935370},"engines":{"node":">=22.21.1 <23 || >=24"},"gitHead":"0230634b4b094398d38ad0ec15e0ec1fd42550e6","scripts":{"lint":"eslint --no-error-on-unmatched-pattern bin/*.js client/*.js client/runtime/*.js client/vendor/*.js config/*.js scripts/*.js server/*.js shims/*.js tests/**/*.{js,mjs}","test":"npm run test:unit:coverage && npm run test:integration && npm run test:ui && npm run test:e2e","build":"npm run sync:mm-assets && npm run sync:module-analyzer && npm run build:client-assets && node --experimental-strip-types scripts/build-dist.ts","start":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts","watch":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch","format":"prettier --write .github/CONTRIBUTING.md .github/pull_request_template.md .github/ISSUE_TEMPLATE/*.yml .github/workflows/*.yml AGENTS.md CHANGELOG.md README.md docs/*.md package.json tsconfig.json tsconfig.client-runtime.json tsconfig.node.json vite.config.mjs .editorconfig .gitattributes .gitignore .prettierrc eslint.config.mjs bin/*.{js,ts} bin/helpers/*.{js,ts} client/*.{js,ts} client/runtime/*.{js,ts} client/vendor/*.{js,ts} client/scss/*.scss client/app/**/*.{ts,tsx} client/types/**/*.d.ts config/*.js scripts/*.{js,ts} server/*.js shims/*.js tests/**/*.{js,ts} client/styles/*.css","styles":"node --experimental-strip-types scripts/build-client-assets.ts --scope styles","prepack":"npm run build","prepare":"npm run build","test:ui":"vitest run --config vitest.config.ts --project ui","test:e2e":"vitest run --config vitest.config.ts --project e2e","test:unit":"vitest run --config vitest.config.ts --project unit","typecheck":"tsc --noEmit && tsc -p tsconfig.client-runtime.json --noEmit && tsc -p tsconfig.node.json --noEmit && tsc -p tests/tsconfig.json --noEmit","postinstall":"node bin/install-guard.js","styles:watch":"sass --watch --style=compressed --no-source-map client/scss/entrypoint.scss:client/styles/harness.css","start:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --preview","watch:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch --preview","sync:mm-assets":"node --experimental-strip-types bin/sync-magicmirror-assets.ts","test:npx-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/npx-smoke.e2e.test.ts","test:ui:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project ui","coverage:badges":"generate-coverage-report -p ./coverage/badges","test:integration":"vitest run --config vitest.config.ts --project integration","build:node-compat":"node --experimental-strip-types scripts/build-node-compat.ts","test:devdep-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/devdep-smoke.e2e.test.ts","build:client-shell":"node --experimental-strip-types scripts/build-client-assets.ts --scope shell","test:unit:coverage":"vitest run --config vitest.config.ts --project unit --coverage","build:client-assets":"node --experimental-strip-types scripts/build-client-assets.ts","test:browser:headed":"npm run test:integration:headed && npm run test:ui:headed","build:client-runtime":"node --experimental-strip-types scripts/build-client-assets.ts --scope runtime","coverage:job-summary":"node --experimental-strip-types scripts/write-coverage-job-summary.ts","sync:module-analyzer":"node --experimental-strip-types scripts/sync-module-analyzer.ts","coverage:journey-badges":"node --experimental-strip-types scripts/generate-journey-badges.ts","test:integration:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80d5d5c1-5160-46af-a87b-f302326151a4"}},"repository":{"url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git","type":"git"},"_npmVersion":"11.11.0","description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","directories":{},"_nodeVersion":"24.14.1","dependencies":{"eta":"^4.6.0","zod":"^4.3.6","pathe":"^2.0.3","ignore":"^5.3.2","moment":"^2.30.1","preact":"^10.29.1","fastify":"^5.8.5","chokidar":"^5.0.0","socket.io":"^4.8.3","animate.css":"^4.1.1","@fastify/middie":"^9.3.2","@fastify/static":"^9.1.3","moment-timezone":"^0.6.1","@fastify/rate-limit":"^10.3.0","@fontsource/open-sans":"^5.2.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.99.0","vite":"^8.0.10","eslint":"^10.1.0","vitest":"^4.1.2","esbuild":"^0.28.0","globals":"^17.4.0","css-tree":"^3.2.1","prettier":"^3.8.1","@eslint/js":"^10.0.1","@vitest/ui":"^4.1.5","node-fetch":"^3.3.2","playwright":"^1.58.2","typescript":"^6.0.3","@types/node":"^24.12.2","magicmirror":"^2.35.0","@preact/preset-vite":"^2.10.5","@vitest/coverage-v8":"^4.1.2","preact-render-to-string":"^6.6.7","@vitest/browser-playwright":"^4.1.2","@fortawesome/fontawesome-free":"^7.2.0","@hyperse/vitest-coverage-reporter":"^1.0.16"},"_npmOperationalInternal":{"tmp":"tmp/magicmirror-module-sandbox_1.1.1_1777696245635_0.36435822426503517","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@angeldeejay/magicmirror-module-sandbox","version":"1.2.0","author":{"url":"https://github.com/angeldeejay","name":"Andrés Vanegas Jiménez"},"license":"MIT","_id":"@angeldeejay/magicmirror-module-sandbox@1.2.0","maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"bin":{"magicmirror-module-sandbox":"dist/bin/magicmirror-module-sandbox.js"},"dist":{"shasum":"b1f724d1c35b88fd0776f66bdb44b229accd0191","tarball":"https://registry.npmjs.org/@angeldeejay/magicmirror-module-sandbox/-/magicmirror-module-sandbox-1.2.0.tgz","fileCount":226,"integrity":"sha512-1nVOHk1nrUFTcKxINCtKOG/Uo/Tm2FRuQZGTIXt3mqti0WFMx2p+1NMpy4jyw69i1Q43Bt/ZdhjUzK+JEAB90w==","signatures":[{"sig":"MEUCIGkdrQvez1nAMO6Gl+msx4G76Brl800uGXJ5jPIan2kJAiEAkfQmMlxeHpOMDujdlriL70G6ntC7a1aCSLQ6S4GmhsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angeldeejay%2fmagicmirror-module-sandbox@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6953469},"engines":{"node":">=22.21.1 <23 || >=24"},"gitHead":"96ae24e781a255ca764527d3e4140153f5319607","scripts":{"lint":"eslint --no-error-on-unmatched-pattern bin/*.js client/*.js client/runtime/*.js client/vendor/*.js config/*.js scripts/*.js server/*.js shims/*.js tests/**/*.{js,mjs}","test":"npm run test:unit:coverage && npm run test:integration && npm run test:ui && npm run test:e2e","build":"npm run sync:mm-assets && npm run sync:module-analyzer && npm run build:client-assets && node --experimental-strip-types scripts/build-dist.ts","start":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts","watch":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch","ci:act":"act push --job validate --rm -P ubuntu-latest=ghcr.io/angeldeejay/ubuntu-latest-playwright:latest","format":"prettier --write .github/CONTRIBUTING.md .github/pull_request_template.md .github/ISSUE_TEMPLATE/*.yml .github/workflows/*.yml AGENTS.md CHANGELOG.md README.md docs/*.md package.json tsconfig.json tsconfig.client-runtime.json tsconfig.node.json vite.config.mjs .editorconfig .gitattributes .gitignore .prettierrc eslint.config.mjs bin/*.{js,ts} bin/helpers/*.{js,ts} client/*.{js,ts} client/runtime/*.{js,ts} client/vendor/*.{js,ts} client/scss/*.scss client/app/**/*.{ts,tsx} client/types/**/*.d.ts config/*.js scripts/*.{js,ts} server/*.js shims/*.js tests/**/*.{js,ts}","styles":"node --experimental-strip-types scripts/build-client-assets.ts --scope styles","prepack":"npm run build","prepare":"npm run build","test:ui":"vitest run --config vitest.config.ts --project ui","test:e2e":"vitest run --config vitest.config.ts --project e2e","test:unit":"vitest run --config vitest.config.ts --project unit","typecheck":"tsc --noEmit && tsc -p tsconfig.client-runtime.json --noEmit && tsc -p tsconfig.node.json --noEmit && tsc -p tests/tsconfig.json --noEmit","postinstall":"node bin/install-guard.js","styles:watch":"sass --watch --style=compressed --no-source-map client/scss/entrypoint.scss:client/styles/harness.css","start:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --preview","watch:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch --preview","sync:mm-assets":"node --experimental-strip-types bin/sync-magicmirror-assets.ts","test:npx-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/npx-smoke.e2e.test.ts","test:ui:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project ui","coverage:badges":"generate-coverage-report -p ./coverage/badges","test:integration":"vitest run --config vitest.config.ts --project integration","build:node-compat":"node --experimental-strip-types scripts/build-node-compat.ts","test:devdep-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/devdep-smoke.e2e.test.ts","build:client-shell":"node --experimental-strip-types scripts/build-client-assets.ts --scope shell","test:unit:coverage":"vitest run --config vitest.config.ts --project unit --coverage","build:client-assets":"node --experimental-strip-types scripts/build-client-assets.ts","test:browser:headed":"npm run test:integration:headed && npm run test:ui:headed","build:client-runtime":"node --experimental-strip-types scripts/build-client-assets.ts --scope runtime","coverage:job-summary":"node --experimental-strip-types scripts/write-coverage-job-summary.ts","sync:module-analyzer":"node --experimental-strip-types scripts/sync-module-analyzer.ts","coverage:journey-badges":"node --experimental-strip-types scripts/generate-journey-badges.ts","test:integration:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80d5d5c1-5160-46af-a87b-f302326151a4"}},"repository":{"url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git","type":"git"},"_npmVersion":"11.11.0","description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","directories":{},"_nodeVersion":"24.14.1","dependencies":{"eta":"^4.6.0","zod":"^4.3.6","pathe":"^2.0.3","ignore":"^7.0.5","moment":"^2.30.1","preact":"^10.29.1","fastify":"^5.8.5","chokidar":"^5.0.0","socket.io":"^4.8.3","animate.css":"^4.1.1","@fastify/middie":"^9.3.2","@fastify/static":"^9.1.3","moment-timezone":"^0.6.1","@fastify/rate-limit":"^10.3.0","@fontsource/open-sans":"^5.2.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.99.0","vite":"^8.0.10","eslint":"^10.1.0","vitest":"^4.1.2","esbuild":"^0.28.0","globals":"^17.4.0","css-tree":"^3.2.1","prettier":"^3.8.1","@eslint/js":"^10.0.1","@vitest/ui":"^4.1.5","node-fetch":"^3.3.2","playwright":"^1.58.2","typescript":"^6.0.3","@types/node":"^24.12.2","magicmirror":"^2.35.0","@preact/preset-vite":"^2.10.5","@vitest/coverage-v8":"^4.1.2","preact-render-to-string":"^6.6.7","@vitest/browser-playwright":"^4.1.2","@fortawesome/fontawesome-free":"^7.2.0","@hyperse/vitest-coverage-reporter":"^1.0.16"},"_npmOperationalInternal":{"tmp":"tmp/magicmirror-module-sandbox_1.2.0_1777770059816_0.4270206487376147","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@angeldeejay/magicmirror-module-sandbox","version":"1.3.0","author":{"url":"https://github.com/angeldeejay","name":"Andrés Vanegas Jiménez"},"license":"MIT","_id":"@angeldeejay/magicmirror-module-sandbox@1.3.0","maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"bin":{"magicmirror-module-sandbox":"dist/bin/magicmirror-module-sandbox.js"},"dist":{"shasum":"7c8a481f50e0da738d83abc318cd8b887e86da64","tarball":"https://registry.npmjs.org/@angeldeejay/magicmirror-module-sandbox/-/magicmirror-module-sandbox-1.3.0.tgz","fileCount":237,"integrity":"sha512-QwMHPP4PGSX7QRSEmQhAaALQLBfLtPkEllKv+wL/vPT7/sHWyLL4arjsqnu8hG4SdGQy9qtCcjlOU1qcLqFarg==","signatures":[{"sig":"MEUCIEQFYb4Sw/322f2LvB86qSZxc0yYzBp9f4QPu0YzzgMJAiEAwDeaUe1V7J5CeoXDqb1PW/4i48OZ2tVrvf+vVqhDaGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angeldeejay%2fmagicmirror-module-sandbox@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7846700},"engines":{"node":">=22.21.1 <23 || >=24"},"gitHead":"f1e96183b782bd7501a2cd311879eafb71fe0ce8","scripts":{"lint":"eslint --no-error-on-unmatched-pattern bin/*.js client/*.js client/runtime/*.js client/vendor/*.js config/*.js scripts/*.js server/*.js shims/*.js tests/**/*.{js,mjs}","test":"npm run test:unit:coverage && npm run test:integration && npm run test:ui && npm run test:e2e","build":"npm run sync:mm-assets && npm run sync:module-analyzer && npm run build:client-assets && node --experimental-strip-types scripts/build-dist.ts","start":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts","watch":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch","ci:act":"act push --job validate --rm -P ubuntu-latest=ghcr.io/angeldeejay/ubuntu-latest-playwright:latest","format":"prettier --write .github/CONTRIBUTING.md .github/pull_request_template.md .github/ISSUE_TEMPLATE/*.yml .github/workflows/*.yml AGENTS.md CHANGELOG.md README.md docs/*.md package.json tsconfig.json tsconfig.client-runtime.json tsconfig.node.json vite.config.mjs .editorconfig .gitattributes .gitignore .prettierrc eslint.config.mjs bin/*.{js,ts} bin/helpers/*.{js,ts} client/*.{js,ts} client/runtime/*.{js,ts} client/vendor/*.{js,ts} client/scss/*.scss client/app/**/*.{ts,tsx} client/types/**/*.d.ts config/*.js scripts/*.{js,ts} server/*.js shims/*.js tests/**/*.{js,ts}","styles":"node --experimental-strip-types scripts/build-client-assets.ts --scope styles","prepack":"npm run build","prepare":"npm run build","test:ui":"vitest run --config vitest.config.ts --project ui","test:e2e":"vitest run --config vitest.config.ts --project e2e","test:unit":"vitest run --config vitest.config.ts --project unit","typecheck":"tsc --noEmit && tsc -p tsconfig.client-runtime.json --noEmit && tsc -p tsconfig.node.json --noEmit && tsc -p tests/tsconfig.json --noEmit","postinstall":"node bin/install-guard.js","styles:watch":"sass --watch --style=compressed --no-source-map client/scss/entrypoint.scss:client/styles/harness.css","start:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --preview","watch:preview":"npm run build:client-assets && node --experimental-strip-types bin/magicmirror-module-sandbox.ts --watch --preview","sync:mm-assets":"node --experimental-strip-types bin/sync-magicmirror-assets.ts","test:npx-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/npx-smoke.e2e.test.ts","test:ui:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project ui","coverage:badges":"generate-coverage-report -p ./coverage/badges","test:integration":"vitest run --config vitest.config.ts --project integration","build:node-compat":"node --experimental-strip-types scripts/build-node-compat.ts","test:devdep-smoke":"vitest run --config vitest.config.ts --project e2e tests/e2e/devdep-smoke.e2e.test.ts","build:client-shell":"node --experimental-strip-types scripts/build-client-assets.ts --scope shell","test:unit:coverage":"vitest run --config vitest.config.ts --project unit --coverage","build:client-assets":"node --experimental-strip-types scripts/build-client-assets.ts","test:browser:headed":"npm run test:integration:headed && npm run test:ui:headed","build:client-runtime":"node --experimental-strip-types scripts/build-client-assets.ts --scope runtime","coverage:job-summary":"node --experimental-strip-types scripts/write-coverage-job-summary.ts","sync:module-analyzer":"node --experimental-strip-types scripts/sync-module-analyzer.ts","coverage:journey-badges":"node --experimental-strip-types scripts/generate-journey-badges.ts","test:integration:headed":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project integration"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80d5d5c1-5160-46af-a87b-f302326151a4"}},"repository":{"url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git","type":"git"},"_npmVersion":"11.11.0","description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","directories":{},"_nodeVersion":"24.14.1","dependencies":{"eta":"^4.6.0","zod":"^4.3.6","pathe":"^2.0.3","ignore":"^7.0.5","moment":"^2.30.1","preact":"^10.29.1","fastify":"^5.8.5","chokidar":"^5.0.0","socket.io":"^4.8.3","ace-builds":"^1.43.6","animate.css":"^4.1.1","js-beautify":"^1.15.4","@fastify/middie":"^9.3.2","@fastify/static":"^9.1.3","moment-timezone":"^0.6.1","@fastify/rate-limit":"^10.3.0","@fontsource/open-sans":"^5.2.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.99.0","vite":"^8.0.10","eslint":"^10.1.0","vitest":"^4.1.2","esbuild":"^0.28.0","globals":"^17.4.0","css-tree":"^3.2.1","prettier":"^3.8.1","@eslint/js":"^10.0.1","@vitest/ui":"^4.1.5","node-fetch":"^3.3.2","playwright":"^1.58.2","typescript":"^6.0.3","@types/node":"^24.12.2","magicmirror":"^2.36.0","@preact/preset-vite":"^2.10.5","@vitest/coverage-v8":"^4.1.2","preact-render-to-string":"^6.6.7","@vitest/browser-playwright":"^4.1.2","@fortawesome/fontawesome-free":"^7.2.0","@hyperse/vitest-coverage-reporter":"^1.0.16"},"_npmOperationalInternal":{"tmp":"tmp/magicmirror-module-sandbox_1.3.0_1777865864714_0.9524083441302438","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@angeldeejay/magicmirror-module-sandbox","version":"2.0.0","author":{"url":"https://github.com/angeldeejay","name":"Andrés Vanegas Jiménez"},"license":"MIT","_id":"@angeldeejay/magicmirror-module-sandbox@2.0.0","maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"bin":{"magicmirror-module-sandbox":"dist/bin/magicmirror-module-sandbox.js"},"dist":{"shasum":"9fde8a461acdaa2ee7dd5a8a50c1f297025608fc","tarball":"https://registry.npmjs.org/@angeldeejay/magicmirror-module-sandbox/-/magicmirror-module-sandbox-2.0.0.tgz","fileCount":222,"integrity":"sha512-wxh3EqEVcRCAgK4Kj8QKYaaPj5mlb35mbHyKrmp8oRldUfo+cbpGyf0dOzAv7cKXu5Yc2Af7vfQXxxiR0H4UZg==","signatures":[{"sig":"MEYCIQDUG0FBFy2UdIwyMEOrEAdQYBHCqyywQ3jaC5LHgiZSjAIhALvF1mkO5H5DfZntT4MWHyzwWXJiz1Q8i9PVEndj8WWM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angeldeejay%2fmagicmirror-module-sandbox@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6643914},"engines":{"node":">=24"},"gitHead":"34cfa7fd7d4bfcabf42898fbd487b2691db4a593","scripts":{"lint":"node node_modules/eslint/bin/eslint.js .","test":"run-s test:*","build":"run-s build:*","start":"run-s build:10-client _server","report":"run-p report:*","_server":"tsx bin/magicmirror-module-sandbox.ts","prepare":"npm run build && husky","test-ci":"run-s test-ci:*","lint:fix":"node node_modules/eslint/bin/eslint.js . --fix","dev:start":"run-s build:10-client _server","dev:watch":"npm-run-all build:10-client --parallel client:shell:watch client:styles:watch _server:watch","typecheck":"run-p typecheck:*","test-quick":"run-s test-quick:*","test-smoke":"run-s test-smoke:*","test:30-ui":"vitest run --config vitest.config.ts --project ui","postinstall":"tsx bin/install-guard.ts","test-ci:act":"tsx scripts/run-pipeline-test.ts","test-headed":"run-s test-headed:*","test:40-e2e":"vitest run --config vitest.config.ts --project e2e","client:shell":"tsx scripts/build-client-assets.ts --scope shell","_server:watch":"tsx bin/magicmirror-module-sandbox.ts --watch","build:30-dist":"tsx scripts/build-dist.ts","client:styles":"tsx scripts/build-client-assets.ts --scope styles","client:runtime":"tsx scripts/build-client-assets.ts --scope runtime","test-headed:ui":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project ui","test-smoke:npx":"vitest run --config vitest.config.ts --project e2e tests/e2e/npx-smoke.e2e.test.ts","typecheck:node":"tsc -p tsconfig.node.json --noEmit","_server:preview":"tsx bin/magicmirror-module-sandbox.ts --preview","build:10-client":"tsx scripts/build-client-assets.ts","test-quick:unit":"vitest run --config vitest.config.ts --project unit","typecheck:tests":"tsc -p tests/tsconfig.json --noEmit","docs:screenshots":"tsx scripts/take-screenshots.ts","report:10-badges":"tsx scripts/generate-coverage-badges.ts","typecheck:client":"tsc -p client/tsconfig.json --noEmit","dev:start-preview":"run-s build:10-client _server:preview","dev:watch-preview":"npm-run-all build:10-client --parallel client:shell:watch client:styles:watch _server:watch-preview","test-smoke:devdep":"vitest run --config vitest.config.ts --project e2e tests/e2e/devdep-smoke.e2e.test.ts","client:shell:watch":"vite build --watch","client:styles:watch":"sass --watch --style=compressed --no-source-map client/scss/entrypoint.scss:client/styles/harness.css","test:20-integration":"vitest run --config vitest.config.ts --project integration","build:20-node-compat":"tsx scripts/build-node-compat.ts","_server:watch-preview":"tsx bin/magicmirror-module-sandbox.ts --watch --preview","report:30-job-summary":"tsx scripts/generate-coverage-summary.ts","test:10-unit-coverage":"vitest run --config vitest.config.ts --project unit --coverage","build:01-sync-analyzer":"tsx scripts/sync-module-analyzer.ts","build:00-sync-mm-assets":"tsx bin/sync-magicmirror-assets.ts","test-headed:integration":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project integration","report:20-journey-badges":"tsx scripts/generate-journey-badges.ts","typecheck:client-runtime":"tsc -p client/tsconfig.runtime.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80d5d5c1-5160-46af-a87b-f302326151a4"}},"repository":{"url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git","type":"git"},"_npmVersion":"11.11.0","description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","directories":{},"lint-staged":{"*.{ts,tsx,js,mjs,cjs,json}":"node node_modules/eslint/bin/eslint.js --fix"},"_nodeVersion":"24.14.1","dependencies":{"eta":"^4.6.0","tsx":"^4.19.4","zod":"^4.3.6","pathe":"^2.0.3","ignore":"^7.0.5","moment":"^2.30.1","preact":"^10.29.1","fastify":"^5.8.5","chokidar":"^5.0.0","socket.io":"^4.8.3","animate.css":"^4.1.1","js-beautify":"^1.15.4","@fastify/middie":"^9.3.2","@fastify/static":"^9.1.3","moment-timezone":"^0.6.1","@fastify/rate-limit":"^10.3.0","@fontsource/open-sans":"^5.2.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","sass":"^1.99.0","vite":"^8.0.10","husky":"^9.1.7","eslint":"^10.1.0","vitest":"^4.1.2","esbuild":"^0.27.7","globals":"^17.4.0","css-tree":"^3.2.1","prettier":"^3.8.1","dockerode":"^5.0.0","@eslint/js":"^10.0.1","@vitest/ui":"^4.1.5","ace-builds":"^1.43.6","node-fetch":"^3.3.2","playwright":"^1.58.2","typescript":"^6.0.3","@types/node":"^24.12.2","lint-staged":"^16.4.0","magicmirror":"github:angeldeejay/MagicMirror#develop","@eslint/compat":"^2.0.5","@types/dockerode":"^4.0.1","npm-run-all-next":"^1.4.0","@preact/preset-vite":"^2.10.5","@vitest/coverage-v8":"^4.1.2","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","preact-render-to-string":"^6.6.7","@vitest/browser-playwright":"^4.1.2","@fortawesome/fontawesome-free":"^7.2.0","eslint-plugin-simple-import-sort":"^13.0.0","@hyperse/vitest-coverage-reporter":"^1.0.16"},"_npmOperationalInternal":{"tmp":"tmp/magicmirror-module-sandbox_2.0.0_1778019617846_0.9289836575484487","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@angeldeejay/magicmirror-module-sandbox","version":"3.0.0","description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","author":{"name":"Andrés Vanegas Jiménez","url":"https://github.com/angeldeejay"},"repository":{"type":"git","url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git"},"homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"license":"MIT","bin":{"magicmirror-module-sandbox":"dist/bin/magicmirror-module-sandbox.js"},"scripts":{"build":"run-s build:*","build:00-sync-mmcore-source":"tsx scripts/sync-mmcore-source.ts","build:01-sync-mm-assets":"tsx bin/sync-magicmirror-assets.ts","build:02-sync-analyzer":"tsx scripts/sync-module-analyzer.ts","build:10-client":"tsx scripts/build-client-assets.ts","build:20-node-compat":"tsx scripts/build-node-compat.ts","build:30-dist":"tsx scripts/build-dist.ts","client:shell":"tsx scripts/build-client-assets.ts --scope shell","client:runtime":"tsx scripts/build-client-assets.ts --scope runtime","client:styles":"tsx scripts/build-client-assets.ts --scope styles","client:shell:watch":"vite build --watch","client:styles:watch":"sass --watch --style=compressed --no-source-map client/scss/entrypoint.scss:client/styles/harness.css","prepare":"npm run build && husky","postinstall":"tsx bin/install-guard.ts","docs:screenshots":"tsx scripts/take-screenshots.ts","_server":"tsx bin/magicmirror-module-sandbox.ts","_server:preview":"tsx bin/magicmirror-module-sandbox.ts --preview","_server:watch":"tsx bin/magicmirror-module-sandbox.ts --watch","_server:watch-preview":"tsx bin/magicmirror-module-sandbox.ts --watch --preview","start":"run-s build:10-client _server","dev:start":"run-s build:10-client _server","dev:start-preview":"run-s build:10-client _server:preview","dev:watch":"npm-run-all build:10-client --parallel client:shell:watch client:styles:watch _server:watch","dev:watch-preview":"npm-run-all build:10-client --parallel client:shell:watch client:styles:watch _server:watch-preview","report":"run-p report:*","report:10-badges":"tsx scripts/generate-coverage-badges.ts","report:20-journey-badges":"tsx scripts/generate-journey-badges.ts","report:30-job-summary":"tsx scripts/generate-coverage-summary.ts","typecheck":"run-p typecheck:*","typecheck:client":"tsc -p client/tsconfig.json --noEmit","typecheck:client-runtime":"tsc -p client/tsconfig.runtime.json --noEmit","typecheck:node":"tsc -p tsconfig.node.json --noEmit","typecheck:tests":"tsc -p tests/tsconfig.json --noEmit","test":"run-s test:*","test:10-unit-coverage":"vitest run --config vitest.config.ts --project unit --coverage","test:20-integration":"vitest run --config vitest.config.ts --project integration","test:30-ui":"vitest run --config vitest.config.ts --project ui","test:40-e2e":"vitest run --config vitest.config.ts --project e2e","test-quick":"run-s test-quick:*","test-quick:unit":"vitest run --config vitest.config.ts --project unit","test-smoke":"run-s test-smoke:*","test-smoke:npx":"vitest run --config vitest.config.ts --project e2e tests/e2e/npx-smoke.e2e.test.ts","test-smoke:devdep":"vitest run --config vitest.config.ts --project e2e tests/e2e/devdep-smoke.e2e.test.ts","test-headed":"run-s test-headed:*","test-headed:integration":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project integration","test-headed:ui":"node --env-file=.env.vitest-browser-headed ./node_modules/vitest/vitest.mjs run --config vitest.config.ts --project ui","lint":"node node_modules/eslint/bin/eslint.js .","lint:fix":"node node_modules/eslint/bin/eslint.js . --fix","test-ci":"run-s test-ci:*","test-ci:act":"tsx scripts/run-pipeline-test.ts"},"lint-staged":{"*.{ts,tsx,js,mjs,cjs,json}":"node node_modules/eslint/bin/eslint.js --fix"},"engines":{"node":">=24"},"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"dependencies":{"@fastify/middie":"^9.3.2","@fastify/rate-limit":"^10.3.0","@fastify/static":"^9.1.3","@fontsource/open-sans":"^5.2.7","animate.css":"^4.1.1","chokidar":"^5.0.0","eta":"^4.6.0","fastify":"^5.8.5","ignore":"^7.0.5","js-beautify":"^1.15.4","jsonc-parser":"^3.3.1","moment":"^2.30.1","moment-timezone":"^0.6.1","pathe":"^2.0.3","preact":"^10.29.1","semver":"^7.8.0","socket.io":"^4.8.3","tsx":"^4.19.4","zod":"^4.3.6"},"devDependencies":{"@eslint/compat":"^2.0.5","@eslint/js":"^10.0.1","@fortawesome/fontawesome-free":"^7.2.0","@hyperse/vitest-coverage-reporter":"^1.0.16","@preact/preset-vite":"^2.10.5","@testing-library/preact":"^3.2.4","@types/dockerode":"^4.0.1","@types/node":"^24.12.2","@types/semver":"^7.7.1","@vitest/browser-playwright":"^4.1.2","@vitest/coverage-v8":"^4.1.2","@vitest/ui":"^4.1.5","ace-builds":"^1.43.6","css-tree":"^3.2.1","dockerode":"^5.0.0","esbuild":"^0.27.7","eslint":"^10.1.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-simple-import-sort":"^13.0.0","globals":"^17.4.0","happy-dom":"^20.9.0","husky":"^9.1.7","jiti":"^2.6.1","lint-staged":"^16.4.0","node-fetch":"^3.3.2","npm-run-all-next":"^1.4.0","playwright":"^1.58.2","preact-render-to-string":"^6.6.7","prettier":"^3.8.1","sass":"^1.99.0","typescript":"^6.0.3","vite":"^8.0.10","vitest":"^4.1.2"},"gitHead":"df80a496fae7ce6add5e79d3e1a329a894331f15","_id":"@angeldeejay/magicmirror-module-sandbox@3.0.0","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-mthVa+lx1iC/NSDg8S51lriOYVIJnMBsaVoz/COt+Jnw/5OgSPkh3cE12PORrKOQ8El0BMMEF6I3jM9cNPIfoA==","shasum":"90bd834ce7aff6e5224bf9700c920c344dfae5f1","tarball":"https://registry.npmjs.org/@angeldeejay/magicmirror-module-sandbox/-/magicmirror-module-sandbox-3.0.0.tgz","fileCount":227,"unpackedSize":6712483,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@angeldeejay%2fmagicmirror-module-sandbox@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDCbDrN4ZxbpfvQsfy32KfWUBl+UjMk0EDvtatw/uqZDAiBTeEkTtjWnHu0Xwvz5gVmIz5LpSy6H+mwkNNAlStFn5Q=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:80d5d5c1-5160-46af-a87b-f302326151a4"}},"directories":{},"maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/magicmirror-module-sandbox_3.0.0_1778458763469_0.8425246519886147"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-27T23:15:26.031Z","modified":"2026-05-11T00:19:24.037Z","1.0.0":"2026-04-27T23:15:26.373Z","1.0.1":"2026-04-29T03:25:04.735Z","1.1.0":"2026-05-02T01:58:56.123Z","1.1.1":"2026-05-02T04:30:45.946Z","1.2.0":"2026-05-03T01:01:00.167Z","1.3.0":"2026-05-04T03:37:44.998Z","2.0.0":"2026-05-05T22:20:18.216Z","3.0.0":"2026-05-11T00:19:23.770Z"},"bugs":{"url":"https://github.com/angeldeejay/magicmirror-module-sandbox/issues"},"author":{"name":"Andrés Vanegas Jiménez","url":"https://github.com/angeldeejay"},"license":"MIT","homepage":"https://github.com/angeldeejay/magicmirror-module-sandbox#readme","repository":{"type":"git","url":"git+https://github.com/angeldeejay/magicmirror-module-sandbox.git"},"description":"Single-module MagicMirror dev sandbox with a Fastify host, Preact shell, real node_helper wiring, and browser-based debugging","maintainers":[{"name":"angeldeejay","email":"ukab72106@gmail.com"}],"readme":"# MagicMirror Module Sandbox\n\n[![Coverage: Statements](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/badges/statements.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Coverage: Branches](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/badges/branches.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Coverage: Functions](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/badges/functions.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Coverage: Lines](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/badges/lines.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Journeys UI](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/journey-badges/journeys-ui.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Transitions UI](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/journey-badges/transitions-ui.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Outcomes UI](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/journey-badges/outcomes-ui.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Journeys Integration](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/journey-badges/journeys-integration.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Transitions Integration](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/journey-badges/transitions-integration.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n[![Outcomes Integration](https://raw.githubusercontent.com/angeldeejay/magicmirror-module-sandbox/coverage/journey-badges/outcomes-integration.svg)](https://github.com/angeldeejay/magicmirror-module-sandbox/actions/workflows/ci.yml)\n\n`@angeldeejay/magicmirror-module-sandbox` is a standalone, single-module MagicMirror\ndevelopment sandbox.\n\nIt mounts **one real third-party module at a time**, keeps real\n`node_helper.js` wiring in place, and gives you a persistent browser shell for:\n\n- Runtime controls\n- Config editing\n- Notification inspection\n- Helper and browser debug output\n- Module quality analysis against MagicMirror 3rd-party criteria\n- MagicMirror version management (install, activate, and switch core versions)\n- Quick product context while you work\n- Collapsible sidebar with domain navigation dropdown and topbar version badge\n\nThe goal is simple: give a MagicMirror module author a narrow, practical place\nto develop and inspect a real module without pretending to be a full\nMagicMirror replacement.\n\n## ✨ What you get\n\n- **Fastify host** for the local HTTP surface and config APIs\n- **Vite + Preact shell** for the persistent sandbox UI\n- **Backend-owned persistence** in temp files keyed to the mounted module\n  identity, without writing sandbox-owned config into the mounted module tree\n- **Dist-first packaging** so consumer installs run packaged runtime artifacts\n- **Core-coupled helper compatibility wrappers** for `require(\"logger\")` and\n  `require(\"node_helper\")`\n- **A synced MagicMirror compatibility root** under helper-side\n  `global.root_path` so core-style path-based requires can reach\n  `js/class.js`, `js/logger.js`, `js/node_helper.js`, `js/http_fetcher.js`, and\n  `js/server_functions.js`\n- **Template/runtime compatibility guards** for browser-side Nunjucks plus\n  `getDom()` overrides that call `this._super()` and expect a wrapper\n  immediately\n- **Operator docs** under `docs/` that mirror the current sidebar domains\n\n## 🚀 Choose the install style that fits your workflow\n\nThere are two normal ways to use the sandbox as a consumer.\n\n### ⚡ Option 1: one-off usage with `npx`\n\nUse this when you want a quick run from a module repository without keeping the\npackage installed locally.\n\n```bash\nnpx @angeldeejay/magicmirror-module-sandbox@latest\n```\n\nThis is the lightest way to try the sandbox, verify behavior, or do a quick\nmanual check from a real module repo.\n\n### 🧰 Option 2: local tool install as a devDependency\n\nUse this when the sandbox is part of your regular module workflow and you want\nthe command version pinned in your project.\n\n```bash\nnpm install --save-dev @angeldeejay/magicmirror-module-sandbox\nnpx magicmirror-module-sandbox\n```\n\nThis is the recommended path when you come back to the same module often or\nwant the sandbox available as part of your normal local tooling.\n\n### 🌐 After startup\n\nOpen `http://127.0.0.1:3010`.\n\nFrom there you can:\n\n- Inspect the mounted module in the stage\n- Open one sidebar domain at a time from the topbar\n- Edit config through the sandbox UI\n- Inspect notifications and debug output without leaving the page\n\n## 🧭 How the sandbox decides what to mount\n\nThe sandbox supports two explicit bootstrap flows.\n\n### 👤 Consumer flow\n\nRun the sandbox from a real MagicMirror module repository so the mounted module\ncan be autodiscovered.\n\nIf you need to point at a module root explicitly, set:\n\n```bash\nMM_SANDBOX_MOUNTED_MODULE_ROOT=<path-to-your-module>\n```\n\n### 🛠️ Maintainer preview flow\n\nFrom this source repository, use the preview commands to boot the internal\n`MMM-TestModule` fixture:\n\n```bash\nnpm run dev:watch-preview\n```\n\nThis is the recommended maintainer mode — it watches JS, CSS, and the server\ntogether. For lighter starts without full watch mode:\n\n```bash\nnpm run dev:start-preview\n```\n\nIf neither flow resolves a real mounted module, startup fails clearly instead\nof inventing a fallback identity.\n\n## 🔧 Local maintainer workflow\n\nIf you are working inside this repository itself:\n\n```bash\nnpm install\nnpm run build\nnpm start\n```\n\nUseful maintainer commands:\n\n- `npm run build:10-client`\n- `npm run client:shell`\n- `npm run client:runtime`\n- `npm run build:20-node-compat`\n- `npm run dev:watch`\n- `npm run dev:watch-preview`\n- `npm run dev:start-preview`\n- `npm run typecheck`\n- `npm test`\n- `npm run docs:screenshots`\n\nFor browser-backed inspection during maintenance:\n\n- `npm run test-headed:ui`\n- `npm run test-headed:integration`\n- `npm run test-headed`\n\nThe headed browser scripts are maintainer inspection tools. They switch the\nVitest browser suites to headed Chromium, run more slowly, and keep the visible\nflow easy to inspect while designing or reviewing a spec. You can pass a file\npath after `--` to focus a single test file.\n\n## 🎯 What the product intentionally is\n\n- A **single mounted module** sandbox, not a generic multi-module MagicMirror\n  replacement\n- A sandbox that preserves **real frontend module + real `node_helper.js`**\n  behavior for the supported slice\n- A tool where **config writes stay in the backend**\n- A workflow with pragmatic **watch mode** and iframe-first reload behavior\n- A product that aims for **supported-slice compatibility**, not broad\n  one-to-one parity with every MagicMirror core behavior\n\n## 🗂️ Project shape\n\n- `server/`: Fastify host, routes, helper lifecycle, startup scripts, and watch loop\n- `client/app/`: Preact shell app and typed bootstrap boundary\n- `client/runtime/`: TypeScript stage/runtime adapters that keep the real module flow\n- `client/vendor/`: hand-authored browser components (`module-config-editor.ts`, `ace-theme-harness.ts`) compiled as standalone assets\n- `client/generated/`: built browser assets emitted from the maintained runtime and shell\n- `config/`: harness config, contracts, language metadata, and module option metadata\n- `docs/`: operator manuals by sidebar domain\n- `tests/`: unit, integration, UI, and packaged-install smoke coverage\n- `bin/`: CLI entrypoint plus maintainer/runtime helpers\n\n## 📚 Documentation\n\n- Operator manual: [`docs/README.md`](docs/README.md)\n- Architecture notes: [`ARCHITECTURE.md`](ARCHITECTURE.md)\n- Contribution policy: [`.github/CONTRIBUTING.md`](.github/CONTRIBUTING.md)\n- Change history: [`CHANGELOG.md`](CHANGELOG.md)\n\n## 📦 Release publishing\n\n`.github/workflows/publish.yml` publishes the package to both `npmjs.org` and\nGitHub Packages.\n\n- `npmjs.org` uses npm trusted publishing from GitHub Actions, so the workflow\n  path must stay aligned with the npm trusted-publisher configuration.\n- GitHub Packages publishes through the workflow `GITHUB_TOKEN`, so releases and\n  manual dispatches mirror the same package version to `npm.pkg.github.com`.\n","readmeFilename":"README.md"}