Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ This will cause `npx` to download the `makes` tool, along with the `aurelia` sca

Use the preset picker to quickly choose a profile, including **Lean Modern Frontend** (TypeScript + Vite + Tailwind + Vitest + Storybook). When picking sample code, you can select **Blank app** for a clean, empty app shell (no demo markup) or use the minimal/router samples as before.

Generated projects use pinned Aurelia package versions from `aurelia-versions.js`, rather than npm dist-tags. Before releasing this scaffold, run `npm run update-aurelia-versions` to refresh those pins from npm.

## Plugin projects (Vite + Webpack)

Plugin templates support Vite or Webpack. The Vite plugin build uses Vite's library mode (Rollup under the hood) and injects component CSS into the JS bundle so consumers don't need to import a separate CSS file. The dev-app still runs on the selected bundler for local testing.
Expand Down
36 changes: 36 additions & 0 deletions __test__/after-task.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,42 @@ test('"after" task only prints summary in unattended mode and here mode', async
);
});

test('"after" task prints build command when dev server is omitted', async t => {
const prompts = {
select() {
t.fail('should not call me');
}
};

function run(cmd, args) {
t.fail('should not call me');
}

let printOut = '';
await after({
unattended: true,
here: false,
prompts,
run,
properties: {name: 'my-app'},
features: ['a', 'no-dev-server'],
notDefaultFeatures: ['a', 'no-dev-server'],
ansiColors
}, {
_isAvailable: isAvailable,
_log(m) {
printOut += m + '\n';
}
});

t.is(printOut,
'\nGet Started\n' +
'cd my-app\n' +
'npm install\n' +
'npm run build\n\n'
);
});

test('"after" task installs deps with npm, and prints summary', async t => {
const prompts = {
select(opts) {
Expand Down
21 changes: 21 additions & 0 deletions __test__/aurelia-versions.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
const test = require('ava');
const {
AURELIA_PACKAGE_VERSIONS,
TEMPLATE_PROPERTY_BY_PACKAGE,
TEMPLATE_PROPERTIES,
} = require('../aurelia-versions');

test('Aurelia package versions expose template properties', t => {
for (const [pkg, property] of Object.entries(TEMPLATE_PROPERTY_BY_PACKAGE)) {
t.truthy(AURELIA_PACKAGE_VERSIONS[pkg]);
t.is(TEMPLATE_PROPERTIES[property], AURELIA_PACKAGE_VERSIONS[pkg]);
}
});

test('Aurelia package versions are exact pins', t => {
for (const version of Object.values(AURELIA_PACKAGE_VERSIONS)) {
t.false(version === 'latest');
t.false(version === 'dev');
t.false(/^[~^]/.test(version));
}
});
16 changes: 14 additions & 2 deletions __test__/before-task.spec.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const test = require('ava');
const before = require('../before');
const {TEMPLATE_PROPERTIES} = require('../aurelia-versions');

test('"before" task does nothing in unattended mode', async t => {
const prompts = {
Expand All @@ -9,7 +10,9 @@ test('"before" task does nothing in unattended mode', async t => {
};

const result = await before({unattended: true, prompts});
t.is(result, undefined);
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES
});
});

test('"before" task can select default-esnext preset', async t => {
Expand All @@ -22,6 +25,7 @@ test('"before" task can select default-esnext preset', async t => {

const result = await before({unattended: false, prompts});
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES,
silentQuestions: true,
preselectedFeatures: ['app', 'vite', 'babel', 'vitest']
});
Expand All @@ -39,6 +43,7 @@ test('"before" task can select default-typescript preset', async t => {

const result = await before({unattended: false, prompts});
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES,
silentQuestions: true,
preselectedFeatures: ['app', 'vite', 'typescript', 'vitest']
});
Expand All @@ -54,6 +59,7 @@ test('"before" task can select minimal-esnext preset', async t => {

const result = await before({unattended: false, prompts});
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES,
silentQuestions: true,
preselectedFeatures: ['app', 'vite', 'babel', 'no-unit-tests', 'app-blank', 'css']
});
Expand All @@ -69,6 +75,7 @@ test('"before" task can select minimal-typescript preset', async t => {

const result = await before({unattended: false, prompts});
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES,
silentQuestions: true,
preselectedFeatures: ['app', 'vite', 'typescript', 'no-unit-tests', 'app-blank', 'css']
});
Expand All @@ -84,6 +91,7 @@ test('"before" task can select lean-modern-frontend preset', async t => {

const result = await before({unattended: false, prompts});
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES,
silentQuestions: true,
preselectedFeatures: ['app', 'vite', 'typescript', 'vitest', 'tailwindcss', 'storybook', 'app-min']
});
Expand All @@ -98,6 +106,7 @@ test('"before" task can select default-esnext-plugin preset', async t => {

const result = await before({ unattended: false, prompts });
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES,
silentQuestions: true,
preselectedFeatures: ['plugin', 'vite', 'babel', 'shadow-dom', 'vitest']
});
Expand All @@ -115,6 +124,7 @@ test('"before" task can select default-typescript-plugin preset', async t => {

const result = await before({ unattended: false, prompts });
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES,
silentQuestions: true,
preselectedFeatures: ['plugin', 'vite', 'typescript', 'shadow-dom', 'vitest']
});
Expand All @@ -130,5 +140,7 @@ test('"before" task can select no preset', async t => {
};

const result = await before({unattended: false, prompts});
t.is(result, undefined);
t.deepEqual(result, {
predefinedProperties: TEMPLATE_PROPERTIES
});
});
36 changes: 33 additions & 3 deletions __test__/questions.spec.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,37 @@
const test = require('ava');
const {possibleFeatureSelections} = require('makes');
const questions = require('../questions');

// This test does nothing but make sure questions.js can be loaded.
test('questions array can be loaded', t => {
t.true(Array.isArray(questions));
test('questionnaire does not ask for Aurelia release tags', t => {
t.false(questions.some(question =>
question.message === 'What Aurelia 2 release would you like to use?'
));
});

test('questionnaire can opt out of app dev server', t => {
const selections = possibleFeatureSelections(questions);

t.true(selections.some(features =>
features.includes('app') &&
features.includes('vite') &&
features.includes('no-dev-server')
));
});

test('questionnaire does not offer Playwright without a dev server', t => {
const selections = possibleFeatureSelections(questions);

t.false(selections.some(features =>
features.includes('no-dev-server') &&
features.includes('playwright')
));
});

test('dev server opt-out is only offered for app projects', t => {
const selections = possibleFeatureSelections(questions);

t.false(selections.some(features =>
features.includes('plugin') &&
features.includes('no-dev-server')
));
});
2 changes: 1 addition & 1 deletion app-with-router/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"dependencies": {
"@aurelia/router": /* @if latest */"latest"/* @endif *//* @if dev */"dev"/* @endif */,
"@aurelia/router": "/* @echo aureliaRouterVersion */",
}
}
37 changes: 37 additions & 0 deletions aurelia-versions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const AURELIA_PACKAGE_VERSIONS = {
'aurelia': '2.0.0-rc.1',
'@aurelia/router': '2.0.0-rc.1',
'@aurelia/testing': '2.0.0-rc.1',
'@aurelia/vite-plugin': '2.0.0-rc.1',
'@aurelia/webpack-loader': '2.0.0-rc.1',
'@aurelia/plugin-gulp': '2.0.0-rc.1',
'@aurelia/parcel-transformer': '2.0.0-rc.1',
'@aurelia/babel-jest': '2.0.0-rc.1',
'@aurelia/ts-jest': '2.0.0-rc.1',
'@aurelia/storybook': '2.2.1',
};

const TEMPLATE_PROPERTY_BY_PACKAGE = {
'aurelia': 'aureliaVersion',
'@aurelia/router': 'aureliaRouterVersion',
'@aurelia/testing': 'aureliaTestingVersion',
'@aurelia/vite-plugin': 'aureliaVitePluginVersion',
'@aurelia/webpack-loader': 'aureliaWebpackLoaderVersion',
'@aurelia/plugin-gulp': 'aureliaPluginGulpVersion',
'@aurelia/parcel-transformer': 'aureliaParcelTransformerVersion',
'@aurelia/babel-jest': 'aureliaBabelJestVersion',
'@aurelia/ts-jest': 'aureliaTsJestVersion',
'@aurelia/storybook': 'aureliaStorybookVersion',
};

const TEMPLATE_PROPERTIES = Object.entries(TEMPLATE_PROPERTY_BY_PACKAGE)
.reduce((properties, [pkg, property]) => {
properties[property] = AURELIA_PACKAGE_VERSIONS[pkg];
return properties;
}, {});

module.exports = {
AURELIA_PACKAGE_VERSIONS,
TEMPLATE_PROPERTY_BY_PACKAGE,
TEMPLATE_PROPERTIES,
};
16 changes: 14 additions & 2 deletions before.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// Use "before" task to ask user to select a preset (to skip questionnaire).

const {TEMPLATE_PROPERTIES} = require('./aurelia-versions');

const PRESETS = {
'default-esnext': ['app', 'vite', 'babel', 'vitest'],
'default-typescript': ['app', 'vite', 'typescript', 'vitest'],
Expand Down Expand Up @@ -28,9 +30,16 @@ if (isNodejsOutdated()) {
process.exit(1);
}

module.exports = async function({unattended, prompts, ansiColors}) {
module.exports = async function({unattended, prompts, ansiColors, predefinedProperties = {}}) {
const versionProperties = {
predefinedProperties: {
...predefinedProperties,
...TEMPLATE_PROPERTIES,
}
};

// don't ask when running in silent mode.
if (unattended) return;
if (unattended) return versionProperties;

const preset = await prompts.select({
message: 'Would you like to use the default setup or customize your choices?',
Expand Down Expand Up @@ -74,9 +83,12 @@ module.exports = async function({unattended, prompts, ansiColors}) {
const preselectedFeatures = PRESETS[preset];
if (preselectedFeatures) {
return {
...versionProperties,
silentQuestions: true, // skip following questionnaire
preselectedFeatures
};
}
}

return versionProperties;
};
6 changes: 3 additions & 3 deletions common/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,16 @@
},
"license": "UNLICENSED",
"dependencies": {
"aurelia": /* @if latest */"latest"/* @endif *//* @if dev */"dev"/* @endif */,
"@aurelia/router": /* @if latest */"latest"/* @endif *//* @if dev */"dev"/* @endif */,
"aurelia": "/* @echo aureliaVersion */",
"@aurelia/router": "/* @echo aureliaRouterVersion */",
// @if browser-ie11
"promise-polyfill": "^8.3.0",
// @endif
},
"devDependencies": {
"eslint": "^9.17.0",
"globals": "^15.14.0",
"@aurelia/testing": /* @if latest */"latest"/* @endif *//* @if dev */"dev"/* @endif */,
"@aurelia/testing": "/* @echo aureliaTestingVersion */",
"stylelint": "^16.12.0",
// @if css || tailwindcss
"stylelint-config-standard": "^36.0.1",
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion dumber/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"devDependencies": {
"@aurelia/plugin-gulp": /* @if latest */"latest"/* @endif *//* @if dev */"dev"/* @endif */,
"@aurelia/plugin-gulp": "/* @echo aureliaPluginGulpVersion */",
"gulp": "^4.0.2",
"gulp-dumber": "^3.0.0",
// @if babel
Expand Down
4 changes: 2 additions & 2 deletions jest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
"jest-environment-jsdom": "^29.7.0",
"jest-transform-stub": "^2.0.0",
// @if babel
"@aurelia/babel-jest": /* @if latest */"latest"/* @endif *//* @if dev */"dev"/* @endif */,
"@aurelia/babel-jest": "/* @echo aureliaBabelJestVersion */",
// @endif
// @if typescript
"@types/jest": "^29.5.14",
"@aurelia/ts-jest": /* @if latest */"latest"/* @endif *//* @if dev */"dev"/* @endif */,
"@aurelia/ts-jest": "/* @echo aureliaTsJestVersion */",
// @endif
},
"scripts": {
Expand Down
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@
},
"scripts": {
"check-upgrade": "node check-upgrade.js",
"check-aurelia-versions": "node scripts/check-aurelia-versions.js",
"update-aurelia-versions": "node scripts/check-aurelia-versions.js --write",
"test": "ava \"__test__/**/*\"",
"test:e2e": "ava --fail-fast --timeout 8m -v e2e-test.js",
"preversion": "npm test",
"preversion": "npm run check-aurelia-versions && npm test",
"version": "standard-changelog && git add CHANGELOG.md",
"postversion": "git push && git push --tags"
},
Expand Down
2 changes: 1 addition & 1 deletion parcel/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"source": "index.html",
"devDependencies": {
"@aurelia/parcel-transformer": /* @if !dev */"latest"/* @endif *//* @if dev */"dev"/* @endif */,
"@aurelia/parcel-transformer": "/* @echo aureliaParcelTransformerVersion */",
// @if tailwindcss
"tailwindcss": "^4.1.10",
"@tailwindcss/postcss": "^4.1.10",
Expand Down
7 changes: 0 additions & 7 deletions questions.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,6 @@ module.exports = [
{ value: 'plugin', title: 'Plugin', hint: 'An Aurelia 2 plugin project' },
]
},
{
message: 'What Aurelia 2 release would you like to use?',
choices: [
{value: 'latest', title: 'Latest', hint: 'Target latest v2.x.x release'},
{value: 'dev', title: 'Dev (nightly)', hint: 'Target nightly development release'},
]
},
{
message: 'Which bundler would you like to use?',
choices: [
Expand Down
Loading
Loading