From d10bf123b340b3b1da655fe548ae7e62b6a93418 Mon Sep 17 00:00:00 2001 From: Matt Travi Date: Mon, 26 Aug 2024 21:30:22 -0500 Subject: [PATCH] feat(project): update to account for breaking changes in the project plugin BREAKING CHANGE: breaking changes in the project plugin have resulted in updates in the public api of this package. refer to the example in the readme for details of updated input expectations --- .remarkrc.cjs | 4 +- README.md | 8 +- example.js | 8 +- package-lock.json | 74 ++++++------------- package.json | 9 ++- src/high-level.js | 28 ++++--- src/high-level.test.js | 2 +- src/scaffold.js | 11 ++- src/scaffold.test.js | 15 ++-- .../features/step_definitions/common-steps.js | 6 +- thirdparty-wrappers/write-yaml.js | 4 - 11 files changed, 70 insertions(+), 99 deletions(-) delete mode 100644 thirdparty-wrappers/write-yaml.js diff --git a/.remarkrc.cjs b/.remarkrc.cjs index 8d9c00c2..4db1f61f 100644 --- a/.remarkrc.cjs +++ b/.remarkrc.cjs @@ -1,6 +1,6 @@ // https://github.com/remarkjs/remark/tree/master/packages/remark-stringify#options exports.settings = { - listItemIndent: 1, + listItemIndent: 'one', emphasis: '_', strong: '_', bullet: '*', @@ -11,4 +11,4 @@ exports.plugins = [ '@form8ion/remark-lint-preset', ['remark-toc', {tight: true}], ['remark-usage', {heading: 'example'}] -]; \ No newline at end of file +]; diff --git a/README.md b/README.md index f1334978..ce88b704 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ $ npm install @form8ion/eslint-config-extender --save-prod ```javascript const {packageManagers} = await import('@form8ion/javascript-core'); +const githubPlugin = await import('@form8ion/github'); const {questionNames: projectQuestionNames} = await import('@form8ion/project'); const {scaffold: javascriptScaffolder, questionNames: jsQuestionNames} = await import('@form8ion/javascript'); const {scaffold, extendEslintConfig} = await import('./lib/index.mjs'); @@ -91,12 +92,7 @@ const {scaffold, extendEslintConfig} = await import('./lib/index.mjs'); [jsQuestionNames.CI_SERVICE]: 'Other', [jsQuestionNames.PROVIDE_EXAMPLE]: false }, - vcsHosts: { - GitHub: { - scaffolder: options => options, - prompt: ({decisions}) => ({[projectQuestionNames.REPO_OWNER]: decisions[projectQuestionNames.REPO_OWNER]}) - } - } + plugins: {vcsHosts: {GitHub: githubPlugin}} }, decisions => options => javascriptScaffolder({...options, decisions, unitTestFrameworks: {}}) ); diff --git a/example.js b/example.js index cf4cf4b5..17868009 100644 --- a/example.js +++ b/example.js @@ -20,6 +20,7 @@ td.when(execa('npm run generate:md && npm test', {shell: true})).thenReturn({std td.when(execa('npm', ['whoami'])).thenResolve({stdout: any.word()}); const {packageManagers} = await import('@form8ion/javascript-core'); +const githubPlugin = await import('@form8ion/github'); const {questionNames: projectQuestionNames} = await import('@form8ion/project'); const {scaffold: javascriptScaffolder, questionNames: jsQuestionNames} = await import('@form8ion/javascript'); const {scaffold, extendEslintConfig} = await import('./lib/index.mjs'); @@ -63,12 +64,7 @@ stubbedFs({node_modules: stubbedNodeModules}); [jsQuestionNames.CI_SERVICE]: 'Other', [jsQuestionNames.PROVIDE_EXAMPLE]: false }, - vcsHosts: { - GitHub: { - scaffolder: options => options, - prompt: ({decisions}) => ({[projectQuestionNames.REPO_OWNER]: decisions[projectQuestionNames.REPO_OWNER]}) - } - } + plugins: {vcsHosts: {GitHub: githubPlugin}} }, decisions => options => javascriptScaffolder({...options, decisions, unitTestFrameworks: {}}) ); diff --git a/package-lock.json b/package-lock.json index eb4001c9..31696fd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,20 +9,21 @@ "version": "0.0.0-semantically-released", "license": "MIT", "dependencies": { + "@form8ion/config-file": "^1.1.2", + "@form8ion/core": "^4.7.1", "@form8ion/javascript": "^12.0.0", "@form8ion/javascript-core": "^11.0.0", - "@form8ion/project": "^18.0.0", - "deepmerge": "^4.2.2", - "write-yaml": "^1.0.0" + "@form8ion/project": "^19.0.1", + "deepmerge": "^4.2.2" }, "devDependencies": { "@cucumber/cucumber": "10.8.0", "@form8ion/commitlint-config": "1.0.76", "@form8ion/eslint-config": "7.0.9", "@form8ion/eslint-config-cucumber": "1.4.1", + "@form8ion/github": "2.0.0", "@form8ion/remark-lint-preset": "6.0.3", "@travi/any": "3.1.2", - "@travi/github-scaffolder": "10.3.1", "ban-sensitive-files": "1.10.4", "c8": "10.1.2", "chai": "5.1.1", @@ -1841,9 +1842,9 @@ } }, "node_modules/@form8ion/core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@form8ion/core/-/core-4.4.1.tgz", - "integrity": "sha512-GGctHNb5FVw8oMe/I8ZuW9wvdRVbwrdw9MHLb+RIHihGK0k6vsttcThNPEZyWn3PpKefjUIJmz5+xVTUU8BMSQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@form8ion/core/-/core-4.7.1.tgz", + "integrity": "sha512-mIcMwO5ql6NDt5kFQAWH0cnmakKnF3YvLOL+KmfJXn9zO2BPTmzEnJ68gUcIG2J5gPJmxg1rRAB4d2X/Cm2PjQ==", "license": "MIT", "dependencies": { "@hapi/hoek": "^11.0.2", @@ -1925,16 +1926,17 @@ } }, "node_modules/@form8ion/github": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@form8ion/github/-/github-1.4.1.tgz", - "integrity": "sha512-bdAYf1R/0yFt+f154Om//CKx0TDWCtcZhpvn8L9TYBu6ZqWQxFQnbSVMQAi1M6BM6hh//IBb3hb6LYItwZfvLA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@form8ion/github/-/github-2.0.0.tgz", + "integrity": "sha512-Ko/LTjzzN8AwlgbZNAwt5AKVb+iTf5fFD5e/RCEP3J5lSkXDRtErrG9IZ2ohQwg1zKds1yMYFm76qFzTXm2GWw==", "dev": true, "license": "MIT", "dependencies": { - "@form8ion/core": "^4.3.0", - "@form8ion/repository-settings": "^1.1.3", + "@form8ion/core": "^4.6.1", + "@form8ion/repository-settings": "^1.1.4", "@octokit/rest": "^20.0.0", "@travi/cli-messages": "^1.1.1", + "deepmerge": "^4.3.1", "lodash.zip": "^4.2.0", "octokit-auth-netrc": "^3.1.1" }, @@ -2090,12 +2092,12 @@ } }, "node_modules/@form8ion/project": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@form8ion/project/-/project-18.3.0.tgz", - "integrity": "sha512-C0K7Gwm3ytnvQWujnKeUenKbBydlZoLvcvqzuMFmYPvSZAzM/TD+evTebce8s2/7gRJUr75Izo9wN95stD7hmw==", + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/@form8ion/project/-/project-19.0.1.tgz", + "integrity": "sha512-dKEG9dZ7giPpA32uATWi7VK5YqODEl9txZPB18N8MMtWBrBSgfZbeR8gxGyVCHbyx9pPzPmSnA7MHA8qvFfDuA==", "license": "MIT", "dependencies": { - "@form8ion/core": "^4.3.0", + "@form8ion/core": "^4.6.0", "@form8ion/execa-wrapper": "^1.0.0", "@form8ion/git": "^1.2.0", "@form8ion/overridable-prompts": "^1.1.0", @@ -2197,9 +2199,9 @@ } }, "node_modules/@form8ion/repository-settings": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@form8ion/repository-settings/-/repository-settings-1.1.3.tgz", - "integrity": "sha512-IHZ40EkNQ4abBtT5flqJExAniHpgV4erF8XTzBaowGfk3nyAbeU3MR1P9SNGQt/CCmkyOBNQ7k34XNjZ/WMNmA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@form8ion/repository-settings/-/repository-settings-1.1.4.tgz", + "integrity": "sha512-8j7fCcSvehTDUuX7E0SEdepNAFKvo9OG1Vo+aycqhf7etljPgPSs4j07vaB/KdsE6zF+DBrEbyOSP1wCGH7Dhg==", "dev": true, "license": "MIT", "dependencies": { @@ -4353,21 +4355,6 @@ "log-symbols": "4.1.0" } }, - "node_modules/@travi/github-scaffolder": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@travi/github-scaffolder/-/github-scaffolder-10.3.1.tgz", - "integrity": "sha512-M2sj4e4iqKw/jtJf+wWRaGT1Q9IpOGQo/u6UMHRMJ4PQzX+1CzBidybhiIn1wmDeZnZ1829HR8dbQmS9a9mv4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@form8ion/github": "^1.4.1", - "@form8ion/overridable-prompts": "^1.1.0", - "git-config": "0.0.7" - }, - "engines": { - "node": "^18.17 || >=20.6.1" - } - }, "node_modules/@travi/language-scaffolder-prompts": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@travi/language-scaffolder-prompts/-/language-scaffolder-prompts-1.3.0.tgz", @@ -10332,16 +10319,6 @@ "node": ">= 6" } }, - "node_modules/git-config": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/git-config/-/git-config-0.0.7.tgz", - "integrity": "sha512-LidZlYZXWzVjS+M3TEwhtYBaYwLeOZrXci1tBgqp/vDdZTBMl02atvwb6G35L64ibscYoPnxfbwwUS+VZAISLA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "iniparser": "~1.0.5" - } - }, "node_modules/git-raw-commits": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", @@ -11246,15 +11223,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/iniparser": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/iniparser/-/iniparser-1.0.5.tgz", - "integrity": "sha512-i40MWqgTU6h/70NtMsDVVDLjDYWwcIR1yIEVDPfxZIJno9z9L4s83p/V7vAu2i48Vj0gpByrkGFub7ko9XvPrw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", diff --git a/package.json b/package.json index 51fbe9b5..fec7f7a6 100644 --- a/package.json +++ b/package.json @@ -53,20 +53,21 @@ "provenance": true }, "dependencies": { + "@form8ion/config-file": "^1.1.2", + "@form8ion/core": "^4.7.1", "@form8ion/javascript": "^12.0.0", "@form8ion/javascript-core": "^11.0.0", - "@form8ion/project": "^18.0.0", - "deepmerge": "^4.2.2", - "write-yaml": "^1.0.0" + "@form8ion/project": "^19.0.1", + "deepmerge": "^4.2.2" }, "devDependencies": { "@cucumber/cucumber": "10.8.0", "@form8ion/commitlint-config": "1.0.76", "@form8ion/eslint-config": "7.0.9", "@form8ion/eslint-config-cucumber": "1.4.1", + "@form8ion/github": "2.0.0", "@form8ion/remark-lint-preset": "6.0.3", "@travi/any": "3.1.2", - "@travi/github-scaffolder": "10.3.1", "ban-sensitive-files": "1.10.4", "c8": "10.1.2", "chai": "5.1.1", diff --git a/src/high-level.js b/src/high-level.js index be9f8095..90ef379e 100644 --- a/src/high-level.js +++ b/src/high-level.js @@ -1,7 +1,7 @@ import deepmerge from 'deepmerge'; import {questionNames as jsQuestionNames} from '@form8ion/javascript'; import {dialects} from '@form8ion/javascript-core'; -import {scaffold, questionNames as projectQuestionNames} from '@form8ion/project'; +import {questionNames as projectQuestionNames, scaffold} from '@form8ion/project'; import {PLUGIN_NAME} from './constants.js'; @@ -13,17 +13,21 @@ export default function (options, javascriptScaffolderFactory) { options, { decisions: {[projectQuestionNames.PROJECT_LANGUAGE]: javaScriptLanguageChoice}, - languages: { - [javaScriptLanguageChoice]: javascriptScaffolderFactory({ - ...options.decisions, - [jsQuestionNames.PROJECT_TYPE]: 'Package', - [jsQuestionNames.PROJECT_TYPE_CHOICE]: PLUGIN_NAME, - [jsQuestionNames.UNIT_TESTS]: false, - [jsQuestionNames.INTEGRATION_TESTS]: false, - [jsQuestionNames.CONFIGURE_LINTING]: false, - [jsQuestionNames.DIALECT]: dialects.COMMON_JS, - [jsQuestionNames.SHOULD_BE_SCOPED]: true - }) + plugins: { + languages: { + [javaScriptLanguageChoice]: { + scaffold: javascriptScaffolderFactory({ + ...options.decisions, + [jsQuestionNames.PROJECT_TYPE]: 'Package', + [jsQuestionNames.PROJECT_TYPE_CHOICE]: PLUGIN_NAME, + [jsQuestionNames.UNIT_TESTS]: false, + [jsQuestionNames.INTEGRATION_TESTS]: false, + [jsQuestionNames.CONFIGURE_LINTING]: false, + [jsQuestionNames.DIALECT]: dialects.COMMON_JS, + [jsQuestionNames.SHOULD_BE_SCOPED]: true + }) + } + } } } ) diff --git a/src/high-level.test.js b/src/high-level.test.js index f95bb32f..8a71df1c 100644 --- a/src/high-level.test.js +++ b/src/high-level.test.js @@ -39,7 +39,7 @@ describe('high-level scaffolder', () => { expect(projectScaffolder.scaffold).toHaveBeenCalledWith({ ...options, decisions: {...providedDecisions, [projectScaffolder.questionNames.PROJECT_LANGUAGE]: 'JavaScript'}, - languages: {JavaScript: jsScaffolder} + plugins: {languages: {JavaScript: {scaffold: jsScaffolder}}} }); }); }); diff --git a/src/scaffold.js b/src/scaffold.js index e82137e1..c054a959 100644 --- a/src/scaffold.js +++ b/src/scaffold.js @@ -1,12 +1,17 @@ import {promises as fs} from 'node:fs'; - -import writeYaml from '../thirdparty-wrappers/write-yaml.js'; +import {fileTypes} from '@form8ion/core'; +import {write} from '@form8ion/config-file'; export default async function ({projectRoot, scope, projectName}) { const configShortName = projectName.substring('eslint-config-'.length); await Promise.all([ - writeYaml(`${projectRoot}/.eslintrc.yml`, {root: true, extends: [`@${scope}`, '.']}), + write({ + format: fileTypes.YAML, + path: projectRoot, + name: 'eslint', + config: {root: true, extends: [`@${scope}`, '.']} + }), fs.writeFile( `${projectRoot}/index.js`, `module.exports = {extends: '@form8ion/${configShortName}'};\n` diff --git a/src/scaffold.test.js b/src/scaffold.test.js index ad5128e1..e1788b40 100644 --- a/src/scaffold.test.js +++ b/src/scaffold.test.js @@ -1,9 +1,10 @@ import {promises as fs} from 'node:fs'; +import {fileTypes} from '@form8ion/core'; +import {write} from '@form8ion/config-file'; import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest'; import any from '@travi/any'; -import * as writeYaml from '../thirdparty-wrappers/write-yaml.js'; import scaffold from './scaffold.js'; describe('scaffold', () => { @@ -11,7 +12,7 @@ describe('scaffold', () => { beforeEach(() => { vi.mock('node:fs'); - vi.mock('../thirdparty-wrappers/write-yaml'); + vi.mock('@form8ion/config-file'); }); afterEach(() => { @@ -25,10 +26,12 @@ describe('scaffold', () => { const {scripts, dependencies, devDependencies, nextSteps} = await scaffold({projectRoot, projectName, scope}); - expect(writeYaml.default).toHaveBeenCalledWith( - `${projectRoot}/.eslintrc.yml`, - {root: true, extends: [`@${scope}`, '.']} - ); + expect(write).toHaveBeenCalledWith({ + path: projectRoot, + format: fileTypes.YAML, + name: 'eslint', + config: {root: true, extends: [`@${scope}`, '.']} + }); expect(fs.writeFile).toHaveBeenCalledWith( `${projectRoot}/index.js`, `module.exports = {extends: '@form8ion/${configShortName}'};\n` diff --git a/test/integration/features/step_definitions/common-steps.js b/test/integration/features/step_definitions/common-steps.js index ab1fe07f..6375ef90 100644 --- a/test/integration/features/step_definitions/common-steps.js +++ b/test/integration/features/step_definitions/common-steps.js @@ -1,6 +1,6 @@ import {dirname, resolve} from 'node:path'; import {fileURLToPath} from 'node:url'; -import {prompt, scaffold as githubScaffolder} from '@travi/github-scaffolder'; +import * as githubPlugin from '@form8ion/github'; import stubbedFs from 'mock-fs'; import nock from 'nock'; @@ -88,7 +88,9 @@ When('the high-level scaffolder is executed', async function () { [jsQuestionNames.SCOPE]: scope, [jsQuestionNames.PROVIDE_EXAMPLE]: false }, - vcsHosts: {[gitHubVcsHostChoice]: {scaffolder: githubScaffolder, prompt}} + plugins: { + vcsHosts: {[gitHubVcsHostChoice]: githubPlugin} + } }, decisions => options => scaffoldJs({ ...options, diff --git a/thirdparty-wrappers/write-yaml.js b/thirdparty-wrappers/write-yaml.js deleted file mode 100644 index 300f04ac..00000000 --- a/thirdparty-wrappers/write-yaml.js +++ /dev/null @@ -1,4 +0,0 @@ -import {promisify} from 'util'; -import yaml from 'write-yaml'; - -export default promisify(yaml);