import assert from 'node:assert/strict';
import { join } from 'node:path';
import { createDir, writeMultipleFiles } from '../../utils/fs';
import { ng } from '../../utils/process';
import { updateJsonFile } from '../../utils/project';
export default function () {
// setup temp collection
const genRoot = join('node_modules/fake-schematics/');
return (
Promise.resolve()
.then(() => createDir(genRoot))
.then(() =>
writeMultipleFiles({
[join(genRoot, 'package.json')]: `
{
"schematics": "./collection.json"
}`,
[join(genRoot, 'collection.json')]: `
{
"schematics": {
"fake": {
"factory": "./fake",
"description": "Fake schematic",
"schema": "./fake-schema.json"
},
}
}`,
[join(genRoot, 'fake-schema.json')]: `
{
"$id": "FakeSchema",
"title": "Fake Schema",
"type": "object",
"required": ["a"],
"properties": {
"b": {
"type": "string",
"description": "b.",
"$default": {
"$source": "argv",
"index": 1
}
},
"a": {
"type": "string",
"description": "a.",
"$default": {
"$source": "argv",
"index": 0
}
},
"optC": {
"type": "string",
"description": "optC"
},
"optA": {
"type": "string",
"description": "optA"
},
"optB": {
"type": "string",
"description": "optB"
}
}
}`,
[join(genRoot, 'fake.js')]: `
function def(options) {
return (host, context) => {
return host;
};
}
exports.default = def;
`,
}),
)
.then(() => ng('generate', 'fake-schematics:fake', '--help'))
.then(({ stdout }) => {
assert.match(stdout, /ng generate fake-schematics:fake \[b\]/);
assert.match(stdout, /opt-a[\s\S]*opt-b[\s\S]*opt-c/);
})
// set up default collection.
.then(() =>
updateJsonFile('angular.json', (json) => {
json.cli = json.cli || ({} as any);
json.cli.schematicCollections = ['fake-schematics'];
}),
)
.then(() => ng('generate', 'fake', '--help'))
// verify same output
.then(({ stdout }) => {
assert.match(stdout, /ng generate fake \[b\]/);
assert.match(stdout, /opt-a[\s\S]*opt-b[\s\S]*opt-c/);
})
// should print all the available schematics in a collection
// when a collection has more than 1 schematic
.then(() =>
writeMultipleFiles({
[join(genRoot, 'collection.json')]: `
{
"schematics": {
"fake": {
"factory": "./fake",
"description": "Fake schematic",
"schema": "./fake-schema.json"
},
"fake-two": {
"factory": "./fake",
"description": "Fake schematic",
"schema": "./fake-schema.json"
},
}
}`,
}),
)
.then(() => ng('generate', '--help'))
.then(({ stdout }) => {
assert.match(stdout, /fake[\s\S]*fake-two/);
})
);
}