diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..e3d0565 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,23 @@ +env: + browser: true + es2021: true +extends: + - eslint:recommended + - plugin:@typescript-eslint/recommended + - prettier +parser: '@typescript-eslint/parser' +parserOptions: + ecmaVersion: latest + sourceType: module +plugins: + - '@typescript-eslint' +rules: + indent: + - warn + - 2 + linebreak-style: + - error + - unix + semi: + - error + - always diff --git a/package.json b/package.json index 1b04cb0..9d03d22 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,11 @@ "build:examples": "pnpm -r --filter {examples/*} build", "build:types": "pnpm -r --filter !{examples/*} exec -- tsup --dts-only", "dev": "pnpm -r --parallel --filter !{examples/*} dev", - "lint": "prettier --check --plugin-search-dir=. .", + "lint:eslint": "eslint packages/**/src", + "lint:prettier": "prettier --check --plugin-search-dir=. .", + "lint": "pnpm lint:prettier && pnpm lint:eslint", "lint:fix": "pnpm lint:fix:prettier", - "lint:fix:prettier": "prettier --write --plugin-search-dir=. .", + "lint:fix:prettier": "pretty-quick --staged", "play": "cd examples/sveltekit && pnpm dev", "play:build": "pnpm build && cd examples/sveltekit && pnpm build", "prepublish:ci": "pnpm -r update", @@ -38,9 +40,9 @@ "dependencies": { "@flatbread/config": "workspace:*", "@flatbread/core": "workspace:*", + "@flatbread/resolver-svimg": "workspace:*", "@flatbread/source-filesystem": "workspace:*", "@flatbread/transformer-markdown": "workspace:*", - "@flatbread/resolver-svimg": "workspace:*", "flatbread": "workspace:*" }, "devDependencies": { @@ -49,14 +51,16 @@ "@types/node": "16.11.47", "ava": "4.3.1", "bumpp": "8.2.1", + "eslint": "7", "esno": "0.16.3", "export-size": "0.5.2", - "husky": "7.0.4", + "husky": "8.0.1", "kleur": "4.1.5", "npkill": "0.8.3", "prettier": "2.7.1", + "pretty-quick": "3.1.3", "ts-node": "10.9.1", - "tsconfig-paths": "3.14.1", + "tsconfig-paths": "4.0.0", "tsup": "6.2.1", "typescript": "4.7.4" }, @@ -66,5 +70,10 @@ "graphql": "^16.0.1" } } + }, + "husky": { + "hooks": { + "pre-commit": "lint:fix" + } } } diff --git a/packages/core/src/generators/schema.ts b/packages/core/src/generators/schema.ts index d8f2428..e791c71 100644 --- a/packages/core/src/generators/schema.ts +++ b/packages/core/src/generators/schema.ts @@ -82,7 +82,7 @@ export async function generateSchema( /** * @todo potentially able to remove this **/ - let queries: RootQueries = { + const queries: RootQueries = { maybeReturnsSingleItem: [], maybeReturnsList: [], }; diff --git a/packages/core/src/resolvers/arguments.ts b/packages/core/src/resolvers/arguments.ts index 9c727db..195c0c8 100644 --- a/packages/core/src/resolvers/arguments.ts +++ b/packages/core/src/resolvers/arguments.ts @@ -83,7 +83,7 @@ const resolveQueryArgs = async ( * */ function buildFilterQueryFragment(filterSetManifest: TargetAndComparator) { - let filterToQuery = []; + const filterToQuery = []; for (const filter of filterSetManifest) { let graphQLFieldAccessor = ''; diff --git a/packages/core/src/utils/deepEntries.ts b/packages/core/src/utils/deepEntries.ts index 02198ed..856c36b 100644 --- a/packages/core/src/utils/deepEntries.ts +++ b/packages/core/src/utils/deepEntries.ts @@ -14,7 +14,7 @@ const deepEntries = ( stack: any[] = [] ): [string[], any] => { if (typeOf(obj) === 'object') { - for (let [key, value] of Object.entries(obj)) { + for (const [key, value] of Object.entries(obj)) { stack = deepEntries(value, [...path, key], stack); } } else { diff --git a/packages/core/src/utils/sift.ts b/packages/core/src/utils/sift.ts index 05b1b89..0a47574 100644 --- a/packages/core/src/utils/sift.ts +++ b/packages/core/src/utils/sift.ts @@ -26,9 +26,9 @@ const createFilterFunction = ( // Filter args transformed to logical expressions. filterSetManifest ??= generateFilterSetManifest(filterArgs); - let evaluatedFilterSet: boolean[] = []; + const evaluatedFilterSet: boolean[] = []; - for (let { path, comparator } of filterSetManifest) { + for (const { path, comparator } of filterSetManifest) { // Retrieve the value of interest from the node. const needle = get(node, path, undefined); // Compare the value of interest to the target value, and store the result of the evaluated expression. diff --git a/packages/core/src/utils/typeOf.ts b/packages/core/src/utils/typeOf.ts index 401d6a8..249fc62 100644 --- a/packages/core/src/utils/typeOf.ts +++ b/packages/core/src/utils/typeOf.ts @@ -9,7 +9,10 @@ export default function typeOf(obj?: T) { return (obj + '').toLowerCase(); } // implicit toString() conversion - var deepType = Object.prototype.toString.call(obj).slice(8, -1).toLowerCase(); + const deepType = Object.prototype.toString + .call(obj) + .slice(8, -1) + .toLowerCase(); if (deepType === 'generatorfunction') { return 'function'; } diff --git a/packages/flatbread/src/cli/runner.ts b/packages/flatbread/src/cli/runner.ts index 3dd756f..e16bb0f 100644 --- a/packages/flatbread/src/cli/runner.ts +++ b/packages/flatbread/src/cli/runner.ts @@ -26,7 +26,7 @@ export default function orchestrateProcesses({ packageManager = null, }: OrchestraOptions) { const pkgManager = packageManager || detectPkgManager(process.cwd()); - let serverModulePath = 'node_modules/flatbread/dist/graphql/server.js'; + const serverModulePath = 'node_modules/flatbread/dist/graphql/server.js'; process.cwd(); const gql = fork(resolve(process.cwd(), serverModulePath), [''], { @@ -36,7 +36,7 @@ export default function orchestrateProcesses({ FLATBREAD_PORT: String(flatbreadPort), }, }); - let runningScripts = [gql]; + const runningScripts = [gql]; gql.on('message', (msg) => { if (msg === 'flatbread-gql-ready') { @@ -49,7 +49,7 @@ export default function orchestrateProcesses({ runningScripts.push(targetProcess); // Exit the parent process when the target process exits - for (let script of runningScripts) { + for (const script of runningScripts) { script.on('close', () => { process.exit(); }); diff --git a/packages/source-filesystem/src/index.ts b/packages/source-filesystem/src/index.ts index 461cf0d..a100177 100644 --- a/packages/source-filesystem/src/index.ts +++ b/packages/source-filesystem/src/index.ts @@ -45,13 +45,10 @@ async function getAllNodes( ): Promise> { const nodeEntries = await Promise.all( allContentTypes.map( - async (contentType): Promise> => - new Promise(async (res) => - res([ - contentType.collection, - await getNodesFromDirectory(contentType.path, config), - ]) - ) + async (contentType): Promise> => [ + contentType.collection, + await getNodesFromDirectory(contentType.path, config), + ] ) ); diff --git a/packages/source-filesystem/src/utils/gatherFileNodes.ts b/packages/source-filesystem/src/utils/gatherFileNodes.ts index 8f88063..0fc11df 100644 --- a/packages/source-filesystem/src/utils/gatherFileNodes.ts +++ b/packages/source-filesystem/src/utils/gatherFileNodes.ts @@ -56,7 +56,7 @@ export default async function gatherFileNodes( // for each segment - gather names for capture groups // and calculate what to remove from matches ex: [name].md => remove .md from match const segments = globs.map((branch) => { - let index = branch.indexOf(']'); + const index = branch.indexOf(']'); if (index === -1) return null; return { name: branch.slice(0, index), diff --git a/packages/transformer-markdown/README.md b/packages/transformer-markdown/README.md index 59d78b4..80e1bb1 100644 --- a/packages/transformer-markdown/README.md +++ b/packages/transformer-markdown/README.md @@ -70,18 +70,6 @@ export interface MarkdownTransformerConfig { markdown?: MarkdownConfig; } -/** - * An engine may either be an object with parse and - * (optionally) stringify methods, or a function that will - * be used for parsing only. - */ -export type LanguageEngine = - | { - parse: (input: string) => object; - stringify?: (data: object) => string; - } - | ((input: string) => object); - /** * User-configurable options for the [gray-matter](https://www.npmjs.com/package/gray-matter) frontmatter parser. */ diff --git a/packages/transformer-markdown/src/processors/markdown.ts b/packages/transformer-markdown/src/processors/markdown.ts index 9066e9e..269b70a 100644 --- a/packages/transformer-markdown/src/processors/markdown.ts +++ b/packages/transformer-markdown/src/processors/markdown.ts @@ -28,6 +28,7 @@ const applyPlugins = ( ): Processor => { plugins.forEach((plugin) => { if (Array.isArray(plugin)) { + // TODO: is this a bug? if (plugin[1] && plugin[1]) processor.use(plugin[0] as Plugin, plugin[1]); else processor.use(plugin[0]); } else { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb5161f..30e1129 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,15 +14,17 @@ importers: '@types/node': 16.11.47 ava: 4.3.1 bumpp: 8.2.1 + eslint: '7' esno: 0.16.3 export-size: 0.5.2 flatbread: workspace:* - husky: 7.0.4 + husky: 8.0.1 kleur: 4.1.5 npkill: 0.8.3 prettier: 2.7.1 + pretty-quick: 3.1.3 ts-node: 10.9.1 - tsconfig-paths: 3.14.1 + tsconfig-paths: 4.0.0 tsup: 6.2.1 typescript: 4.7.4 dependencies: @@ -34,18 +36,20 @@ importers: flatbread: link:packages/flatbread devDependencies: '@ava/typescript': 3.0.1 - '@nrwl/workspace': 14.4.3_smctqoihuzenbtrlchgo45iqz4 + '@nrwl/workspace': 14.4.3_hj57mkirywhhrouwm6k7xyidr4 '@types/node': 16.11.47 ava: 4.3.1_@ava+typescript@3.0.1 bumpp: 8.2.1 + eslint: 7.32.0 esno: 0.16.3 export-size: 0.5.2 - husky: 7.0.4 + husky: 8.0.1 kleur: 4.1.5 npkill: 0.8.3 prettier: 2.7.1 + pretty-quick: 3.1.3_prettier@2.7.1 ts-node: 10.9.1_ow5yu25silzxcp7pmv7jv4j54m - tsconfig-paths: 3.14.1 + tsconfig-paths: 4.0.0 tsup: 6.2.1_6oasmw356qmm23djlsjgkwvrtm typescript: 4.7.4 @@ -1345,7 +1349,7 @@ packages: - utf-8-validate dev: true - /@nrwl/linter/14.4.3_6oasmw356qmm23djlsjgkwvrtm: + /@nrwl/linter/14.4.3_xgmoxuro6i7fojtypsdylu6wnu: resolution: {integrity: sha512-Ek2q2QWr2p8+MjQKPYxezqgj/1J98r3pUTRsSUiF4fWnCpCZcSNljUJbuF/FyJbPxJCWjBAYqlengk9/UKh4PA==} peerDependencies: eslint: ^8.0.0 @@ -1356,6 +1360,7 @@ packages: '@nrwl/devkit': 14.4.3_nx@14.4.3 '@nrwl/jest': 14.4.3_3ya5rbo4dsss4clcyh7y4zldgi '@phenomnomnominal/tsquery': 4.1.1_typescript@4.7.4 + eslint: 7.32.0 nx: 14.4.3 tmp: 0.2.1 tslib: 2.4.0 @@ -1381,7 +1386,7 @@ packages: - '@swc/core' dev: true - /@nrwl/workspace/14.4.3_smctqoihuzenbtrlchgo45iqz4: + /@nrwl/workspace/14.4.3_hj57mkirywhhrouwm6k7xyidr4: resolution: {integrity: sha512-kXRgvikyEzFTwIr34ARP2m4suRtQIVt/M7vVNJGmR4f7NrwvHbofmoD8JdOnPtTfbbqE1RhtcWr/7TECM05JXA==} peerDependencies: prettier: ^2.6.2 @@ -1391,7 +1396,7 @@ packages: dependencies: '@nrwl/devkit': 14.4.3_nx@14.4.3 '@nrwl/jest': 14.4.3_3ya5rbo4dsss4clcyh7y4zldgi - '@nrwl/linter': 14.4.3_6oasmw356qmm23djlsjgkwvrtm + '@nrwl/linter': 14.4.3_xgmoxuro6i7fojtypsdylu6wnu '@parcel/watcher': 2.0.4 chalk: 4.1.0 chokidar: 3.5.3 @@ -1778,6 +1783,10 @@ packages: /@types/mime/1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + /@types/minimatch/3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + /@types/mri/1.1.1: resolution: {integrity: sha512-nJOuiTlsvmClSr3+a/trTSx4DTuY/VURsWGKSf/eeavh0LRMqdsK60ti0TlwM5iHiGOK3/Ibkxsbr7i9rzGreA==} dev: true @@ -2367,6 +2376,11 @@ packages: '@babel/runtime-corejs3': 7.18.9 dev: true + /array-differ/3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + dev: true + /array-find-index/1.0.2: resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} engines: {node: '>=0.10.0'} @@ -2417,6 +2431,11 @@ packages: engines: {node: '>=8.0.0'} dev: true + /arrify/2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + dev: true + /arrify/3.0.0: resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} engines: {node: '>=12'} @@ -2815,6 +2834,14 @@ packages: supports-color: 5.5.0 dev: true + /chalk/3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + /chalk/4.1.0: resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} engines: {node: '>=10'} @@ -4453,6 +4480,21 @@ packages: /eventemitter3/4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + /execa/4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /execa/5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -4829,6 +4871,13 @@ packages: engines: {node: '>=8.0.0'} dev: true + /get-stream/5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -5232,14 +5281,19 @@ packages: - supports-color dev: true + /human-signals/1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + /human-signals/2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /husky/7.0.4: - resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} - engines: {node: '>=12'} + /husky/8.0.1: + resolution: {integrity: sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==} + engines: {node: '>=14'} hasBin: true dev: true @@ -6847,6 +6901,17 @@ packages: /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /multimatch/4.0.0: + resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} + engines: {node: '>=8'} + dependencies: + '@types/minimatch': 3.0.5 + array-differ: 3.0.0 + array-union: 2.1.0 + arrify: 2.0.1 + minimatch: 3.1.2 + dev: true + /mz/2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -7532,6 +7597,22 @@ packages: parse-ms: 2.1.0 dev: true + /pretty-quick/3.1.3_prettier@2.7.1: + resolution: {integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==} + engines: {node: '>=10.13'} + hasBin: true + peerDependencies: + prettier: '>=2.0.0' + dependencies: + chalk: 3.0.0 + execa: 4.1.0 + find-up: 4.1.0 + ignore: 5.2.0 + mri: 1.2.0 + multimatch: 4.0.0 + prettier: 2.7.1 + dev: true + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -8820,6 +8901,14 @@ packages: strip-bom: 3.0.0 dev: true + /tsconfig-paths/4.0.0: + resolution: {integrity: sha512-SLBg2GBKlR6bVtMgJJlud/o3waplKtL7skmLkExomIiaAtLGtVsoXIqP3SYdjbcH9lq/KVv7pMZeCBpLYOit6Q==} + dependencies: + json5: 2.2.1 + minimist: 1.2.6 + strip-bom: 3.0.0 + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true