{"id":48755858,"url":"https://github.com/NullVoxPopuli/ember.nvp","last_synced_at":"2026-04-28T23:00:57.089Z","repository":{"id":332399733,"uuid":"1133678198","full_name":"NullVoxPopuli/ember.nvp","owner":"NullVoxPopuli","description":"ember project generator, a reenvisioning of blueprints -- hopefully one day to upstream back in to ember-cli / official blueprints, if all the caveats can be cleaned up","archived":false,"fork":false,"pushed_at":"2026-01-28T05:46:36.000Z","size":435,"stargazers_count":1,"open_issues_count":3,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-28T21:37:53.438Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/NullVoxPopuli.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-13T17:11:23.000Z","updated_at":"2026-01-28T05:46:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/NullVoxPopuli/ember.nvp","commit_stats":null,"previous_names":["nullvoxpopuli/ember.nvp"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/NullVoxPopuli/ember.nvp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullVoxPopuli%2Fember.nvp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullVoxPopuli%2Fember.nvp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullVoxPopuli%2Fember.nvp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullVoxPopuli%2Fember.nvp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NullVoxPopuli","download_url":"https://codeload.github.com/NullVoxPopuli/ember.nvp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NullVoxPopuli%2Fember.nvp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32402673,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T19:38:08.556Z","status":"ssl_error","status_checked_at":"2026-04-28T19:37:55.688Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":"2026-04-13T02:00:31.728Z","updated_at":"2026-04-28T23:00:57.073Z","avatar_url":"https://github.com/NullVoxPopuli.png","language":"JavaScript","funding_links":[],"categories":["Tools"],"sub_categories":["Development"],"readme":"# ember.nvp\n\n_ember project generator: a reenvisioning of blueprints -- hopefully one day to upstream back in to ember-cli / official blueprints, **if** all the caveats can be cleaned up_\n\n\u003e [!NOTE]\n\u003e **Why isn't this work happening in the default blueprints?** for a long time now, I've felt the old blueprint system from the very early days of ember-cli has not allowed for expressive enough layering of what people actually want out of a project generator. That said, that means there are some compromises in the CLI/generator in this repo. Throughout all files generated, whenever there is a caveat, there will be a comment in the file with the caveat, explaining status, open issues, and how we can collectively move forward. It's possible that one day ember-cli adopts or is inspired by this project, but it's too early to tell at the moment.\n\n_I can't recommend using this tool unless your comfortable with the emitted caveats in the project_.\n(And being comfortable debugging build issues is recommended)\n\nBut I'm very excited about this tool, because it's everything I've ever wanted from a project generator. Each layer is idempotent, and knows about the other layers. So if, for example, you omit eslint when setting up your project, but do have github-actions, when you do add eslint, your github-actions will be updated as well. And this works in any order.\n\n## Usage\n\n```bash\nnpx ember.nvp\n```\n\nor, faster:\n\n```bash\npnpm dlx ember.nvp\n```\n\nUsing the unreleased version:\n\n```bash\npnpm dlx NullVoxPopuli/ember.nvp\n# or, slower:\nnpx NullVoxPopuli/ember.nvp\n```\n\n### Wrapping\n\nThe provided CLI is only a wrapper around our exported `generateProject` function.\n\nOther tools can call `generateProject` themselves if they wish to provide a different terminal or graphical UI.\n\n```js\nimport { generateProject, Project } from 'ember.nvp';\n\n\nawait generateProject(new Project(\n    directoryToGenerateIn\n    // desires\n    {\n        name,\n        path,\n        type,\n        layers,\n        packageManager,\n    }\n));\n```\n\nAll parts of the generator are idempotent, so running generators on existing projects _can_ no-op.\n\n## Reqs\n\n- node 24+\n\n## What this does?\n\n- Always `\"type\": \"module\"`\n- Modern, incremental\n- Interactive CLI\n  - choose your features\n- The generators fro the different types of projects are never out of date from each other\n  - each feature/layer is a mini codemod that has to support working within all the other layers -- so eslint for example is always derived the same way -- no way for \"app\" and \"library\" configs to get out of sync\n\nGood for:\n\n- demos\n- reproductions\n- existing monorepos\n- example integrations with other tools\n\n## Layers\n\nEach layer is a standalone module that can add features to your ember project,\nand every layer is aware of the other layers, so if, for example, you run github actions first, and then later decide to add linting, the github actions output will be updated.\n\n### 🎯 Minimal (always included)\n\nThe base layer, matching the `--minimal` flag from [ember-cli/ember-app-blueprint#49](https://github.com/ember-cli/ember-app-blueprint/pull/49):\n\n- ✅ `\"type\": \"module\"` in package.json\n- ✅ No @embroider/compat (faster builds)\n- ✅ No testing framework (minimal setup)\n- ✅ No linting or formatting\n- ✅ No ember-welcome-page\n- ✅ Vite-based with modern Ember\n\nPerfect for demos, reproductions, and learning!\n\n### Git\n\nRuns `git init` for you.\n\nBy default this layer is enabled, _unless_ you are running the generator in a git repo already -- then you have to opt in to git.\n\n### GitHub Actions (optional)\n\nAdds simple GitHub Actions workflow to your project\n\n### 📝 ESLint (optional)\n\nAdds modern ESLint configuration with:\n\n- TypeScript support\n- Ember plugin\n- Flat config (ESLint 9+)\n- Prettier compatibility\n\n### 🎨 Prettier (optional)\n\nCode formatting with:\n\n- GTS/GJS template support\n- Sensible defaults\n- Format scripts\n\n### 🧪 QUnit (optional)\n\n- Both co-located tests as well as traditionally located tests with QUnit.\n- New Theme: [qunit-theme-ember](https://github.com/IgnaceMaes/qunit-theme-ember)\n- Default utilities to help you find why tests are stuck\n\n### ⚡ Vitest (optional)\n\nSuper experimental vitest setup using [ember-vitest](https://github.com/NullVoxPopuli/ember-vitest)\n\n## Architecture\n\n### How Layers Work\n\n1. **Discovery**: CLI scans `src/layers/` and imports each `index.js`\n2. **Selection**: User selects which optional layers to include\n3. **Execution**: Each layer's `run()` function is called in sequence:\n   ```js\n   await layer.run(project);\n   ```\n4. **Layer Functions**: Inside `run()`, layers use [`ember-apply`](https://ember-apply.pages.dev/) to apply codemods in order to:\n   - Copy files from `files/` directory\n   - Add dependencies/devDependencies to package.json\n   - Add npm scripts\n   - Modify package.json metadata\n   - etc\n\n### Adding New Layers\n\nTo add a new layer, create a new directory in `src/layers/` with:\n\n1. **`index.js`** - Layer definition:\n\n```js\nimport { packageJson, files } from \"ember-apply\";\nimport { join } from \"node:path\";\n\nexport default {\n  label: \"My Feature\",\n  description: \"What this feature does\",\n\n  async run(project) {\n    // Copy files from files/ directory\n    await files.applyFolder(join(import.meta.dirname, \"files\"), project.directory);\n\n    await packageJson.addDependencies({ \"some-package\": \"^1.0.0\" }, project.directory);\n\n    await packageJson.addScripts({ \"my-script\": 'echo \"Hello\"' }, project.directory);\n  },\n};\n```\n\n2. **`files/`** directory - Template files to copy:\n   - Files will be copied to the target directory maintaining structure\n\nThe CLI will automatically discover and offer it as an option!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNullVoxPopuli%2Fember.nvp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNullVoxPopuli%2Fember.nvp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNullVoxPopuli%2Fember.nvp/lists"}