@upleveled/preflight 1.23.6 → 1.23.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -102,7 +102,7 @@ async function eslintCheck() {
102
102
  return linesWithoutDuplicates;
103
103
  }, []).join('\n')}
104
104
 
105
- Open these files in your editor - there should be problems to fix.
105
+ Open these files in your editor - there should be problems to fix
106
106
  `);
107
107
  }
108
108
  }
@@ -119,22 +119,23 @@ const title$2 = 'ESLint config is latest version';
119
119
  async function eslintConfigIsValid() {
120
120
  const {
121
121
  stdout: remoteVersion
122
- } = await execaCommand('npm show @upleveled/eslint-config-upleveled version');
122
+ } = await execaCommand('npm show eslint-config-upleveled version');
123
123
  let localVersion;
124
124
 
125
125
  try {
126
- const eslintConfigPackageJsonPath = require$1.resolve('@upleveled/eslint-config-upleveled/package.json');
126
+ const eslintConfigPackageJsonPath = require$1.resolve('eslint-config-upleveled/package.json');
127
127
 
128
128
  localVersion = JSON.parse(await promises.readFile(eslintConfigPackageJsonPath, 'utf-8')).version;
129
129
  } catch (err) {}
130
130
 
131
131
  if (typeof localVersion === 'undefined') {
132
- throw new Error(`The UpLeveled ESLint config has not been installed. Please install using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled
132
+ throw new Error(`The UpLeveled ESLint Config has not been installed - please install using the instructions on https://www.npmjs.com/package/eslint-config-upleveled
133
133
  `);
134
134
  }
135
135
 
136
136
  if (semver.gt(remoteVersion, localVersion)) {
137
- throw new Error(`Your current version of the UpLeveled ESLint config (${localVersion}) is out of date. The latest version is ${remoteVersion}. Upgrade by running all lines of the install instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled`);
137
+ throw new Error(`Your current version of the UpLeveled ESLint Config (${localVersion}) is older than the latest version ${remoteVersion} - upgrade by running all lines of the install instructions on https://www.npmjs.com/package/eslint-config-upleveled
138
+ `);
138
139
  }
139
140
 
140
141
  let eslintConfigMatches;
@@ -142,17 +143,17 @@ async function eslintConfigIsValid() {
142
143
  try {
143
144
  eslintConfigMatches = (await promises.readFile('./.eslintrc.cjs', 'utf-8')).trim() === `/** @type {import('@typescript-eslint/utils').TSESLint.Linter.Config} */
144
145
  const config = {
145
- extends: ['@upleveled/upleveled'],
146
+ extends: ['upleveled'],
146
147
  };
147
148
 
148
149
  module.exports = config;`;
149
150
  } catch (err) {
150
- throw new Error(`Error reading your .eslintrc.cjs file. Please reinstall the config using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled
151
+ throw new Error(`Error reading your .eslintrc.cjs file - please reinstall the config using the instructions on https://www.npmjs.com/package/eslint-config-upleveled
151
152
  `);
152
153
  }
153
154
 
154
155
  if (!eslintConfigMatches) {
155
- throw new Error(`Your ESLint config file .eslintrc.cjs does not match the configuration file template. Please reinstall the config using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled
156
+ throw new Error(`Your ESLint config file .eslintrc.cjs does not match the configuration file template - please reinstall the config using the instructions on https://www.npmjs.com/package/eslint-config-upleveled
156
157
  `);
157
158
  }
158
159
 
@@ -175,7 +176,7 @@ module.exports = config;`;
175
176
  throw new Error(`ESLint has been disabled in the following files:
176
177
  ${eslintDisableOccurrences.join('\n')}
177
178
 
178
- Remove all comments disabling or modifying ESLint rule configuration (eg. eslint-disable and eslint-disable-next-line comments) and fix the problems.
179
+ Remove all comments disabling or modifying ESLint rule configuration (eg. eslint-disable and eslint-disable-next-line comments) and fix the problems
179
180
  `);
180
181
  }
181
182
  }
@@ -352,7 +353,12 @@ async function noUnusedAndMissingDependencies() {
352
353
  '@testing-library/user-event', // Tailwind CSS
353
354
  '@tailwindcss/jit', 'autoprefixer', 'postcss', 'tailwindcss', // Sass (eg. in create-react-app)
354
355
  'sass', // ESLint configuration
355
- 'babel-eslint', 'eslint-config-next', // Testing
356
+ 'babel-eslint', 'eslint-config-next', // TODO: Remove this once depcheck issue is fixed:
357
+ // PR: https://github.com/depcheck/depcheck/pull/790
358
+ // Issue: https://github.com/depcheck/depcheck/issues/791
359
+ //
360
+ // Stylelint configuration
361
+ 'stylelint', 'stylelint-config-upleveled', // Testing
356
362
  'babel-jest', 'cypress', 'jest', 'jest-environment-jsdom', 'jest-puppeteer', 'playwright', 'puppeteer', // TypeScript
357
363
  'typescript', '@types/*', // Next.js
358
364
  'sharp'].join(',');
@@ -383,14 +389,14 @@ async function noUnusedAndMissingDependencies() {
383
389
 
384
390
  if (missingDependenciesStdout) {
385
391
  /**
386
- * Temporary workaround to filter out @upleveled/eslint-config-upleveled peer dependencies
392
+ * Temporary workaround to filter out eslint-config-upleveled peer dependencies
387
393
  * not listed in `package.json`, which are flagged as missing dependencies by depcheck
388
394
  *
389
395
  * TODO: Remove this variable once this depcheck issue is fixed:
390
396
  * https://github.com/depcheck/depcheck/issues/789
391
397
  */
392
398
  const missingDependenciesStdoutFiltered = missingDependenciesStdout.split('\n').filter(missingDependency => {
393
- return !(missingDependency.includes('./.eslintrc.cjs') && ['@next/eslint-plugin-next', '@typescript-eslint/eslint-plugin', '@typescript-eslint/parser', '@upleveled/eslint-plugin-upleveled', 'eslint-config-react-app', 'eslint-import-resolver-typescript', 'eslint-plugin-import', 'eslint-plugin-jsx-a11y', 'eslint-plugin-jsx-expressions', 'eslint-plugin-react-hooks', 'eslint-plugin-react', 'eslint-plugin-security', 'eslint-plugin-sonarjs', 'eslint-plugin-unicorn'].some(excludedDependency => missingDependency.includes(excludedDependency)));
399
+ return !(missingDependency.includes('./.eslintrc.cjs') && ['@next/eslint-plugin-next', '@typescript-eslint/eslint-plugin', '@typescript-eslint/parser', 'eslint-plugin-upleveled', 'eslint-config-react-app', 'eslint-import-resolver-typescript', 'eslint-plugin-import', 'eslint-plugin-jsx-a11y', 'eslint-plugin-jsx-expressions', 'eslint-plugin-react-hooks', 'eslint-plugin-react', 'eslint-plugin-security', 'eslint-plugin-sonarjs', 'eslint-plugin-unicorn'].some(excludedDependency => missingDependency.includes(excludedDependency)));
394
400
  }).join('\n');
395
401
 
396
402
  if (missingDependenciesStdoutFiltered) {
@@ -471,7 +477,7 @@ async function preflightIsLatestVersion() {
471
477
  } = await execaCommand('npm show @upleveled/preflight version');
472
478
 
473
479
  if (semver.gt(remoteVersion, preflightPackageJson.version)) {
474
- throw new Error(`Your current version of Preflight (${preflightPackageJson.version}) is out of date. The latest version is ${remoteVersion}. Upgrade with:
480
+ throw new Error(`Your current version of Preflight (${preflightPackageJson.version}) is older than the latest version ${remoteVersion} - upgrade with:
475
481
 
476
482
  ${commandExample(`${os.platform() === 'linux' ? 'sudo ' : ''}yarn global add @upleveled/preflight`)}
477
483
  `);
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.esm.js","sources":["../src/util/commandExample.ts","../src/util/isDrone.ts","../src/checks/allChangesCommittedToGit.ts","../src/util/normalizeNewline.ts","../src/checks/eslint.ts","../src/checks/eslintConfigIsValid.ts","../src/util/randomUserAgent.ts","../src/checks/linkOnGithubAbout.ts","../src/checks/nodeModulesIgnoredFromGit.ts","../src/util/packageJson.ts","../src/checks/noDependencyProblems/nextJsProjectHasSharpInstalled.ts","../src/checks/noDependencyProblems/noDependenciesWithoutTypes.ts","../src/util/preflightBinPath.ts","../src/checks/noDependencyProblems/noUnusedDependencies.ts","../src/checks/noExtraneousFilesCommittedToGit.ts","../src/checks/noSecretsCommittedToGit.ts","../src/checks/preflightIsLatestVersion.ts","../src/checks/prettier.ts","../src/checks/projectFolderNameMatchesCorrectFormat.ts","../src/checks/useSinglePackageManager.ts","../src/index.ts"],"sourcesContent":["import chalk from 'chalk';\n\n// https://www.compart.com/en/unicode/U+2800\n// eslint-disable-next-line security/detect-bidi-characters -- Intentional use of unusual character for formatting\nconst emptyBrailleCharacter = '‎';\n\nexport default function commandExample(command: string) {\n return `${emptyBrailleCharacter} ${chalk.dim('$')} ${command}`;\n}\n","import { execaCommand } from 'execa';\n\nexport async function isDrone() {\n const { stdout } = await execaCommand('cat /etc/os-release', {\n reject: false,\n });\n return /Alpine Linux/.test(stdout);\n}\n","import { promises as fs } from 'node:fs';\nimport { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\nimport { isDrone } from '../util/isDrone';\n\nexport const title = 'All changes committed to Git';\n\nexport default async function allChangesCommittedToGit() {\n const { stdout: replSlug } = await execaCommand('echo $REPL_SLUG');\n\n const isRunningInReplIt = replSlug !== '';\n\n if (isRunningInReplIt) {\n await fs.writeFile('.git/info/exclude', '.replit\\n');\n }\n\n const { stdout } = await execaCommand('git status --porcelain');\n\n if (stdout !== '') {\n const onlyYarnLockModifiedOnDrone =\n stdout.trim() === 'M yarn.lock' && (await isDrone());\n throw new Error(\n `Some changes have not been committed to Git:\n ${stdout}${\n onlyYarnLockModifiedOnDrone\n ? `\n\n The only file with changes is the yarn.lock file, indicating that npm was incorrectly used in addition to Yarn (eg. an \"npm install\" command was run). To fix this, force regeneration of the yarn.lock file locally with the following command and then commit the changes:\n\n ${commandExample('yarn --force')}`\n : ''\n }\n `,\n );\n }\n}\n","const CRLF = '\\r\\n';\n\nexport default function normalizeNewline(input: string) {\n if (typeof input !== 'string') {\n throw new TypeError(`Expected a \\`string\\`, got \\`${typeof input}\\``);\n }\n\n return input.replace(new RegExp(CRLF, 'g'), '\\n');\n}\n","import { execaCommand } from 'execa';\nimport normalizeNewline from '../util/normalizeNewline';\n\nexport const title = 'ESLint';\n\nexport default async function eslintCheck() {\n try {\n await execaCommand('yarn eslint . --max-warnings 0 --format compact');\n } catch (error) {\n const { stdout } = error as { stdout: string };\n const lines = stdout.split('\\n');\n\n // If no ESLint problems detected, throw the error\n if (!/^\\d+ problems?$/.test(lines[lines.length - 2]!)) {\n throw error;\n }\n\n throw new Error(\n `ESLint problems found in the following files:\n ${normalizeNewline(stdout)\n .split('\\n')\n // Match lines starting with slashes (macOS, Linux) or drive letters (Windows)\n .filter((line) => /^(\\/|[A-Z]:\\\\)/.test(line))\n // Strip out the filename\n .map((line) => line.match(/^(([A-Z]:)?[^:]+):/)?.[1])\n // Remove duplicate filenames\n .reduce((linesWithoutDuplicates: string[], line) => {\n if (line && !linesWithoutDuplicates.includes(line)) {\n linesWithoutDuplicates.push(line);\n }\n return linesWithoutDuplicates;\n }, [])\n .join('\\n')}\n\n Open these files in your editor - there should be problems to fix.\n `,\n );\n }\n}\n","import { promises as fs } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { execaCommand } from 'execa';\nimport readdirp from 'readdirp';\nimport semver from 'semver';\n\nconst require = createRequire(`${process.cwd()}/`);\n\nexport const title = 'ESLint config is latest version';\n\nexport default async function eslintConfigIsValid() {\n const { stdout: remoteVersion } = await execaCommand(\n 'npm show @upleveled/eslint-config-upleveled version',\n );\n\n let localVersion;\n\n try {\n const eslintConfigPackageJsonPath = require.resolve(\n '@upleveled/eslint-config-upleveled/package.json',\n );\n\n localVersion = JSON.parse(\n await fs.readFile(eslintConfigPackageJsonPath, 'utf-8'),\n ).version;\n } catch (err) {}\n\n if (typeof localVersion === 'undefined') {\n throw new Error(\n `The UpLeveled ESLint config has not been installed. Please install using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled\n `,\n );\n }\n\n if (semver.gt(remoteVersion, localVersion)) {\n throw new Error(\n `Your current version of the UpLeveled ESLint config (${localVersion}) is out of date. The latest version is ${remoteVersion}. Upgrade by running all lines of the install instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled`,\n );\n }\n\n let eslintConfigMatches;\n\n try {\n eslintConfigMatches =\n (await fs.readFile('./.eslintrc.cjs', 'utf-8')).trim() ===\n `/** @type {import('@typescript-eslint/utils').TSESLint.Linter.Config} */\nconst config = {\n extends: ['@upleveled/upleveled'],\n};\n\nmodule.exports = config;`;\n } catch (err) {\n throw new Error(\n `Error reading your .eslintrc.cjs file. Please reinstall the config using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled\n `,\n );\n }\n\n if (!eslintConfigMatches) {\n throw new Error(\n `Your ESLint config file .eslintrc.cjs does not match the configuration file template. Please reinstall the config using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled\n `,\n );\n }\n\n const eslintDisableOccurrences = [];\n\n for await (const { path } of readdirp('.', {\n directoryFilter: ['!.git', '!.next', '!node_modules'],\n fileFilter: ['*.js', '*.jsx', '*.ts', '*.tsx'],\n })) {\n const fileContents = await fs.readFile(path, 'utf-8');\n if (/eslint-disable|eslint [a-z0-9@/-]+: (0|off)/.test(fileContents)) {\n eslintDisableOccurrences.push(path);\n }\n }\n\n if (eslintDisableOccurrences.length > 0) {\n throw new Error(\n `ESLint has been disabled in the following files:\n ${eslintDisableOccurrences.join('\\n')}\n\n Remove all comments disabling or modifying ESLint rule configuration (eg. eslint-disable and eslint-disable-next-line comments) and fix the problems.\n `,\n );\n }\n}\n","import userAgents from 'top-user-agents';\n\nexport default function randomUserAgent() {\n const randomIndex = Math.floor(Math.random() * (userAgents.length - 1));\n return userAgents[randomIndex]!;\n}\n","import cheerio from 'cheerio';\nimport type { Element } from 'domhandler';\nimport { execaCommand } from 'execa';\nimport fetch from 'node-fetch';\nimport randomUserAgent from '../util/randomUserAgent';\n\nexport const title = 'GitHub repo has deployed project link under About';\n\nexport default async function linkOnGithubAbout() {\n const { stdout } = await execaCommand('git remote get-url origin');\n\n const repoUrl = stdout\n .replace('git@github.com:', 'https://github.com/')\n .replace('.git', '');\n\n const html = await (await fetch(repoUrl)).text();\n\n const $ = cheerio.load(html);\n\n const urlInAboutSection = $('h2')\n .filter(function (this: Element) {\n return $(this).text().trim() === 'About';\n })\n .nextAll('div')\n .filter(function (this: Element) {\n return $(this).children('.octicon.octicon-link').length > 0;\n })\n .children('.octicon.octicon-link')\n .next()\n .children('a[href]')\n .attr('href');\n\n if (!urlInAboutSection) {\n throw new Error(\n `Deployed project link not found in About section on ${repoUrl}. Click on the cog symbol to the right of the About heading and paste the Repl.it / Netlify / Fly.io link in the Website box.`,\n );\n }\n\n const response = await fetch(urlInAboutSection, {\n headers: {\n // For repl.it\n 'user-agent': randomUserAgent(),\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Project link in About section on ${repoUrl} is not returning a proper status code: the link returns status code ${response.status} (${response.statusText}).`,\n );\n }\n}\n","import { promises as fs } from 'node:fs';\nimport { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\nimport normalizeNewline from '../util/normalizeNewline';\n\nexport const title = 'node_modules/ folder ignored in Git';\n\nexport default async function nodeModulesIgnoredFromGit() {\n if ((await execaCommand('git ls-files node_modules/')).stdout !== '') {\n throw new Error(\n `node_modules/ folder committed to Git. Remove it using:\n\n ${commandExample('git rm -r --cached node_modules')}\n `,\n );\n }\n\n if ((await execaCommand('git ls-files .gitignore')).stdout !== '.gitignore') {\n throw new Error('.gitignore file not found');\n }\n\n const nodeModulesInGitignore = normalizeNewline(\n await fs.readFile('./.gitignore', 'utf8'),\n )\n .split('\\n')\n .reduce((found, line) => found || /^\\/?node_modules\\/?$/.test(line), false);\n\n if (!nodeModulesInGitignore) {\n throw new Error('node_modules not found in .gitignore');\n }\n}\n","import { promises as fs } from 'node:fs';\nimport { URL } from 'node:url';\n\ntype PackageJson = {\n name: string;\n version: string;\n description?: string;\n keywords?: string;\n homepage?: string;\n bugs?: {\n email?: string;\n url?: string;\n };\n license?: string;\n author?:\n | string\n | {\n name: string;\n email?: string;\n url?: string;\n };\n contributors?:\n | string[]\n | {\n name: string;\n email?: string;\n url?: string;\n }[];\n files?: string[];\n main?: string;\n browser?: string;\n bin?: Record<string, string>;\n man?: string;\n directories?: {\n lib?: string;\n bin?: string;\n man?: string;\n doc?: string;\n example?: string;\n test?: string;\n };\n repository?: {\n type?: 'git';\n url?: string;\n directory?: string;\n };\n scripts?: Record<string, string>;\n config?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n bundledDependencies?: string[];\n engines?: Record<string, string>;\n os?: string[];\n cpu?: string[];\n};\n\nexport const projectPackageJson = JSON.parse(\n await fs.readFile('package.json', 'utf-8'),\n) as PackageJson;\n\nexport const preflightPackageJson = JSON.parse(\n await fs.readFile(new URL('../package.json', import.meta.url), 'utf-8'),\n) as PackageJson;\n","import commandExample from '../../util/commandExample';\nimport { projectPackageJson } from '../../util/packageJson';\n\nexport const title = 'Next.js project has sharp installed';\n\nexport default function nextJsProjectHasSharpInstalled() {\n const dependenciesPackageNames = Object.keys(\n projectPackageJson.dependencies!,\n );\n if (\n dependenciesPackageNames.includes('next') &&\n !dependenciesPackageNames.includes('sharp')\n ) {\n throw new Error(\n `Next.js projects should have sharp installed for better image optimization. Install it with:\n\n ${commandExample('yarn add sharp')}\n `,\n );\n }\n}\n","import { existsSync, promises as fs } from 'node:fs';\nimport algoliasearch from 'algoliasearch';\nimport pReduce from 'p-reduce';\nimport commandExample from '../../util/commandExample';\nimport { projectPackageJson } from '../../util/packageJson';\n\nconst client = algoliasearch(\n // Application ID and API key specific to UpLeveled\n // Preflight. Please don't use anywhere else without\n // asking Algolia's permission.\n 'OFCNCOG2CU', // Application ID\n 'ec73550aa8b2936dab436d4e02144784', // API Key\n);\nconst index = client.initIndex('npm-search');\n\ninterface AlgoliaObj {\n types?: {\n definitelyTyped?: string;\n };\n}\n\nexport const title = 'No dependencies without types';\n\n// This is a naive check for matching @types/<pkg name> packages\n// that the student hasn't yet installed. It is not intended to\n// be an exhaustive check for any types for all packages.\n//\n// It attempts to address scenarios such as this with\n// `styled-components`:\n//\n// https://learn.upleveled.io/courses/btcmp-l-webfs-gen-0/modules/122-cheatsheet-css-in-js/#eslint-errors-with-styled-components\nexport default async function noDependenciesWithoutTypes() {\n const { devDependencies = {}, dependencies = {} } = projectPackageJson;\n\n const dependenciesWithMissingTypes = await pReduce(\n Object.keys(dependencies),\n async (filteredDependencies: [string, string][], dependency: string) => {\n try {\n const packageJsonPath = require.resolve(`${dependency}/package.json`);\n\n const modulePackageJson = JSON.parse(\n await fs.readFile(packageJsonPath, 'utf-8'),\n );\n\n // If the keys \"types\" or \"typings\" are in the module's `package.json`, bail out\n if ('types' in modulePackageJson || 'typings' in modulePackageJson) {\n return filteredDependencies;\n }\n } catch (err) {}\n\n let indexDTsPath;\n\n try {\n indexDTsPath = require.resolve(`${dependency}/index.d.ts`);\n } catch (err) {}\n\n // If the index.d.ts file exists inside the module's directory, bail out\n if (indexDTsPath && existsSync(indexDTsPath)) {\n return filteredDependencies;\n }\n\n const results = await index.getObject<AlgoliaObj>(dependency, {\n attributesToRetrieve: ['types'],\n });\n\n const definitelyTypedPackageName = results.types?.definitelyTyped;\n\n if (definitelyTypedPackageName) {\n // If a matching `@types/<package name>` has been already installed in devDependencies, bail out\n if (Object.keys(devDependencies).includes(definitelyTypedPackageName)) {\n return filteredDependencies;\n }\n\n filteredDependencies.push([dependency, definitelyTypedPackageName]);\n }\n\n return filteredDependencies;\n },\n [],\n );\n\n if (dependenciesWithMissingTypes.length > 0) {\n throw new Error(\n `Dependencies found without types. Add the missing types with:\n\n ${commandExample(\n `yarn add --dev ${dependenciesWithMissingTypes\n .map(([, definitelyTypedPackageName]) => definitelyTypedPackageName)\n .join(' ')}`,\n )}\n\n If the dependencies above are already in your package.json, check that they have not been incorrectly installed as regular dependencies in the \"dependencies\" object - they should be installed inside \"devDependencies\" (using the --dev flag mentioned above). To fix this situation, remove the dependencies and run the command above exactly.\n `,\n );\n }\n}\n","import { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { execaCommand } from 'execa';\n\nconst { stdout: preflightBinPath } = await execaCommand(`yarn bin`, {\n cwd: dirname(fileURLToPath(import.meta.url)),\n});\n\nexport default preflightBinPath;\n","import { execaCommand } from 'execa';\nimport commandExample from '../../util/commandExample';\nimport preflightBinPath from '../../util/preflightBinPath';\n\nexport const title = 'No unused dependencies';\n\nexport default async function noUnusedAndMissingDependencies() {\n const ignoredPackagePatterns = [\n // Unused dependency detected in https://github.com/upleveled/next-portfolio-dev\n '@graphql-codegen/cli',\n\n // Unused dependency detected in create-react-app\n '@testing-library/user-event',\n\n // Tailwind CSS\n '@tailwindcss/jit',\n 'autoprefixer',\n 'postcss',\n 'tailwindcss',\n\n // Sass (eg. in create-react-app)\n 'sass',\n\n // ESLint configuration\n 'babel-eslint',\n 'eslint-config-next',\n\n // Testing\n 'babel-jest',\n 'cypress',\n 'jest',\n 'jest-environment-jsdom',\n 'jest-puppeteer',\n 'playwright',\n 'puppeteer',\n\n // TypeScript\n 'typescript',\n '@types/*',\n\n // Next.js\n 'sharp',\n ].join(',');\n\n try {\n await execaCommand(\n `${preflightBinPath}/depcheck --ignores=\"${ignoredPackagePatterns}\"`,\n );\n } catch (error) {\n const { stdout } = error as { stdout: string };\n if (\n !stdout.startsWith('Unused dependencies') &&\n !stdout.startsWith('Unused devDependencies') &&\n !stdout.startsWith('Missing dependencies')\n ) {\n throw error;\n }\n\n const [unusedDependenciesStdout, missingDependenciesStdout] = stdout.split(\n 'Missing dependencies',\n );\n\n const messages = [];\n\n if (unusedDependenciesStdout) {\n messages.push(`Unused dependencies found:\n ${unusedDependenciesStdout\n .split('\\n')\n .filter((str: string) => str.includes('* '))\n .join('\\n')}\n\n Remove these dependencies by running the following command for each dependency:\n\n ${commandExample('pnpm remove <dependency name here>')}\n `);\n }\n\n if (missingDependenciesStdout) {\n /**\n * Temporary workaround to filter out @upleveled/eslint-config-upleveled peer dependencies\n * not listed in `package.json`, which are flagged as missing dependencies by depcheck\n *\n * TODO: Remove this variable once this depcheck issue is fixed:\n * https://github.com/depcheck/depcheck/issues/789\n */\n const missingDependenciesStdoutFiltered = missingDependenciesStdout\n .split('\\n')\n .filter((missingDependency) => {\n return !(\n missingDependency.includes('./.eslintrc.cjs') &&\n [\n '@next/eslint-plugin-next',\n '@typescript-eslint/eslint-plugin',\n '@typescript-eslint/parser',\n '@upleveled/eslint-plugin-upleveled',\n 'eslint-config-react-app',\n 'eslint-import-resolver-typescript',\n 'eslint-plugin-import',\n 'eslint-plugin-jsx-a11y',\n 'eslint-plugin-jsx-expressions',\n 'eslint-plugin-react-hooks',\n 'eslint-plugin-react',\n 'eslint-plugin-security',\n 'eslint-plugin-sonarjs',\n 'eslint-plugin-unicorn',\n ].some((excludedDependency) =>\n missingDependency.includes(excludedDependency),\n )\n );\n })\n .join('\\n');\n\n if (missingDependenciesStdoutFiltered) {\n messages.push(`Missing dependencies found:\n ${missingDependenciesStdoutFiltered\n .split('\\n')\n .filter((str: string) => str.includes('* '))\n .join('\\n')}\n\n Add these missing dependencies by running the following command for each dependency:\n\n ${commandExample('pnpm add <dependency name here>')}\n `);\n }\n }\n\n if (messages.length > 0) throw new Error(messages.join('\\n\\n'));\n }\n}\n","import { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\n\nexport const title = 'No extraneous files committed to Git';\n\nexport default async function noExtraneousFilesCommittedToGit() {\n const { stdout } = await execaCommand(\n 'git ls-files .DS_Store yarn-error.log npm-debug.log',\n );\n\n if (stdout !== '') {\n throw new Error(\n `Extraneous files committed to Git:\n ${stdout}\n\n Remove these files from your repo by running the following command for each file:\n\n ${commandExample('git rm --cached <filename here>')}\n\n Once you've removed all files, make sure that it doesn't happen again by adding the filenames above to your .gitignore file.\n `,\n );\n }\n}\n","import { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\n\nexport const title = 'No secrets committed to Git';\n\nexport default async function noSecretsCommittedToGit() {\n const { stdout } = await execaCommand('git ls-files .env .env*.local');\n\n if (stdout !== '') {\n throw new Error(\n `Secrets committed to Git 😱:\n ${stdout}\n\n Remove these files from your repo by installing BFG from the System Setup Guide (see Optional Software at the bottom) and running it on each of your files like this:\n\n ${commandExample('bfg --delete-files <filename here>')}\n\n Once you've done this for every secret file, then force push to your repository:\n\n ${commandExample('git push --force')}\n\n More info: https://docs.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository\n\n Finally, make sure that this doesn't happen again by adding the filenames above to your .gitignore file.\n `,\n );\n }\n}\n","import os from 'node:os';\nimport { execaCommand } from 'execa';\nimport semver from 'semver';\nimport commandExample from '../util/commandExample';\nimport { preflightPackageJson } from '../util/packageJson';\n\nexport const title = 'Preflight is latest version';\n\nexport default async function preflightIsLatestVersion() {\n const { stdout: remoteVersion } = await execaCommand(\n 'npm show @upleveled/preflight version',\n );\n\n if (semver.gt(remoteVersion, preflightPackageJson.version)) {\n throw new Error(\n `Your current version of Preflight (${\n preflightPackageJson.version\n }) is out of date. The latest version is ${remoteVersion}. Upgrade with:\n\n ${commandExample(\n `${\n os.platform() === 'linux' ? 'sudo ' : ''\n }yarn global add @upleveled/preflight`,\n )}\n `,\n );\n }\n}\n","import { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { execaCommand } from 'execa';\nimport normalizeNewline from '../util/normalizeNewline';\n\nexport const title = 'Prettier';\n\nexport default async function prettierCheck() {\n try {\n await execaCommand(\n `yarn --silent prettier --list-different ${process.cwd()}/**/*.{js,jsx,ts,jsx} --ignore-path ${process.cwd()}/.eslintignore --config ${process.cwd()}/prettier.config.cjs --end-of-line auto`,\n { cwd: dirname(fileURLToPath(import.meta.url)) },\n );\n } catch (error) {\n const { stdout, stderr } = error as { stdout: string; stderr: string };\n\n const stderrWithoutPackageJsonWarning = stderr.replace(\n /warning [/.\\\\]*package\\.json: No license field[\\r\\n]*/g,\n '',\n );\n\n if (!stdout || stderrWithoutPackageJsonWarning) {\n throw error;\n }\n\n const ignoredFilePatterns = [\n // File from create-react-app not matching our formatting\n // https://github.com/facebook/create-react-app/blob/fdbde1f3c256b43d5386b5ae3a75083dbd8f0aff/packages/cra-template/template/src/reportWebVitals.js\n /src[/\\\\]reportWebVitals\\.js$/,\n\n // Files from create-next-app not matching our formatting\n // https://github.com/vercel/next.js/blob/5a73859fe8d3659d52e169f97188ae422e0d2ace/packages/create-next-app/templates/default/pages/api/hello.js\n /pages[/\\\\]api[/\\\\]hello\\.js$/,\n // https://github.com/vercel/next.js/blob/aacfa79ddf88e4e1488b63ac253af27110f0a151/packages/create-next-app/templates/default/pages/_app.js\n /pages[/\\\\]_app\\.js$/,\n ];\n\n const unformattedFiles = normalizeNewline(stdout)\n .split('\\n')\n .map((file) =>\n // Make paths relative to the project instead of Preflight, eg:\n // before: ../../../../../../projects/random-color-generator-react-app/src/reportWebVitals.js\n // after: random-color-generator-react-app/src/reportWebVitals.js\n file.replace(/^([A-Z]:|\\.\\.[/\\\\])[a-zA-Z0-9-_/.\\\\ ]*projects[/\\\\]/, ''),\n )\n .filter(\n (file) =>\n !ignoredFilePatterns.some((ignoredFilePattern) =>\n ignoredFilePattern.test(file),\n ),\n );\n\n if (unformattedFiles.length > 0) {\n throw new Error(\n `Prettier has not been run in the following files:\n ${unformattedFiles.join('\\n')}\n\n For each of the files above, open the file in your editor and save the file. This will format the file with Prettier, which will cause changes to appear in Git.\n\n In some very uncommon cases (this probably doesn't apply to you), the mismatch may come from inconsistent end of line characters. Read more here: https://github.com/upleveled/answers/issues/31\n `,\n );\n }\n }\n}\n","import path from 'node:path';\nimport commandExample from '../util/commandExample';\n\nexport const title = 'Project folder name matches correct format';\n\nexport default function projectFolderNameMatchesCorrectFormat() {\n const currentDirectoryName = path.basename(process.cwd());\n const lowercaseHyphenedDirectoryName = currentDirectoryName\n .toLowerCase()\n .replaceAll(' ', '-');\n\n if (currentDirectoryName !== lowercaseHyphenedDirectoryName) {\n throw new Error(\n `Project directory name \"${currentDirectoryName}\" doesn't match the correct format (no spaces or uppercase letters).\n\n Rename the directory to the correct name \"${lowercaseHyphenedDirectoryName}\" with the following sequence of commands:\n\n ${commandExample('cd ..')}\n ${commandExample(\n `mv ${currentDirectoryName} ${lowercaseHyphenedDirectoryName}`,\n )}\n ${commandExample(`cd ${lowercaseHyphenedDirectoryName}`)}\n `,\n );\n }\n}\n","import { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\n\nexport const title = 'Use single package manager';\n\nexport default async function useSinglePackageManager() {\n const { stdout } = await execaCommand('git ls-files package-lock.json');\n\n if (stdout !== '') {\n throw new Error(\n `package-lock.json file committed to Git. Remove it with:\n\n ${commandExample('git rm --cached <filename>')}\n\n After you've removed it, you can delete the file with:\n\n ${commandExample('rm <filename>')}\n\n The presence of this file indicates that npm was incorrectly used in addition to Yarn (eg. an \"npm install\" command was run). In order to avoid issues with the state of the yarn.lock file, we suggest also forcing regeneration this file with the following command:\n\n ${commandExample('yarn --force')}\n `,\n );\n }\n}\n","import { Listr } from 'listr2';\nimport * as allChangesCommittedToGit from './checks/allChangesCommittedToGit.js';\nimport * as eslint from './checks/eslint.js';\nimport * as eslintConfigIsValid from './checks/eslintConfigIsValid.js';\nimport * as linkOnGithubAbout from './checks/linkOnGithubAbout.js';\nimport * as nodeModulesIgnoredFromGit from './checks/nodeModulesIgnoredFromGit.js';\nimport * as nextJsProjectHasSharpInstalled from './checks/noDependencyProblems/nextJsProjectHasSharpInstalled.js';\nimport * as noDependenciesWithoutTypes from './checks/noDependencyProblems/noDependenciesWithoutTypes.js';\nimport * as noUnusedAndMissingDependencies from './checks/noDependencyProblems/noUnusedDependencies.js';\nimport * as noExtraneousFilesCommittedToGit from './checks/noExtraneousFilesCommittedToGit.js';\nimport * as noSecretsCommittedToGit from './checks/noSecretsCommittedToGit.js';\nimport * as preflightIsLatestVersion from './checks/preflightIsLatestVersion.js';\nimport * as prettier from './checks/prettier.js';\nimport * as projectFolderNameMatchesCorrectFormat from './checks/projectFolderNameMatchesCorrectFormat.js';\nimport * as useSinglePackageManager from './checks/useSinglePackageManager.js';\nimport { CtxParam } from './types/CtxParam.js';\nimport { TaskParam } from './types/TaskParam.js';\nimport {\n preflightPackageJson,\n projectPackageJson,\n} from './util/packageJson.js';\n\nconsole.log(`🚀 UpLeveled Preflight v${preflightPackageJson.version}`);\n\nconst listrTasks = [\n // ======= Sync Tasks =======\n // Git\n allChangesCommittedToGit,\n nodeModulesIgnoredFromGit,\n noExtraneousFilesCommittedToGit,\n noSecretsCommittedToGit,\n\n // Package managers\n useSinglePackageManager,\n\n // Project setup\n projectFolderNameMatchesCorrectFormat,\n\n // ======= Async Tasks =======\n // Dependencies\n {\n title: 'No dependency problems',\n task: (ctx: CtxParam, task: TaskParam): Listr =>\n task.newListr([\n ...(!projectPackageJson.dependencies ||\n !Object.keys(projectPackageJson.dependencies).includes('next')\n ? []\n : [\n {\n title: nextJsProjectHasSharpInstalled.title,\n task: nextJsProjectHasSharpInstalled.default,\n },\n ]),\n {\n title: noUnusedAndMissingDependencies.title,\n task: noUnusedAndMissingDependencies.default,\n },\n {\n title: noDependenciesWithoutTypes.title,\n task: noDependenciesWithoutTypes.default,\n },\n ]),\n },\n\n // GitHub\n linkOnGithubAbout,\n\n // Linting\n eslint,\n prettier,\n\n // Version and configuration checks\n eslintConfigIsValid,\n preflightIsLatestVersion,\n].map((module) => {\n if ('task' in module) return module;\n return {\n title: module.title,\n task: module.default,\n };\n});\n\nawait new Listr(listrTasks, {\n exitOnError: false,\n rendererOptions: {\n collapseErrors: false,\n removeEmptyLines: false,\n formatOutput: 'wrap',\n },\n fallbackRenderer: 'verbose',\n concurrent: 5,\n}).run();\n"],"names":["emptyBrailleCharacter","commandExample","command","chalk","dim","isDrone","stdout","execaCommand","reject","test","title","allChangesCommittedToGit","replSlug","isRunningInReplIt","fs","writeFile","onlyYarnLockModifiedOnDrone","trim","Error","CRLF","normalizeNewline","input","TypeError","replace","RegExp","eslintCheck","error","lines","split","length","filter","line","map","match","reduce","linesWithoutDuplicates","includes","push","join","require","createRequire","process","cwd","eslintConfigIsValid","remoteVersion","localVersion","eslintConfigPackageJsonPath","resolve","JSON","parse","readFile","version","err","semver","gt","eslintConfigMatches","eslintDisableOccurrences","path","readdirp","directoryFilter","fileFilter","fileContents","randomUserAgent","randomIndex","Math","floor","random","userAgents","linkOnGithubAbout","repoUrl","html","fetch","text","$","cheerio","load","urlInAboutSection","nextAll","children","next","attr","response","headers","ok","status","statusText","nodeModulesIgnoredFromGit","nodeModulesInGitignore","found","projectPackageJson","preflightPackageJson","URL","import","meta","url","nextJsProjectHasSharpInstalled","dependenciesPackageNames","Object","keys","dependencies","client","algoliasearch","index","initIndex","noDependenciesWithoutTypes","devDependencies","dependenciesWithMissingTypes","pReduce","filteredDependencies","dependency","packageJsonPath","modulePackageJson","indexDTsPath","existsSync","results","getObject","attributesToRetrieve","definitelyTypedPackageName","types","definitelyTyped","preflightBinPath","dirname","fileURLToPath","noUnusedAndMissingDependencies","ignoredPackagePatterns","startsWith","unusedDependenciesStdout","missingDependenciesStdout","messages","str","missingDependenciesStdoutFiltered","missingDependency","some","excludedDependency","noExtraneousFilesCommittedToGit","noSecretsCommittedToGit","preflightIsLatestVersion","os","platform","prettierCheck","stderr","stderrWithoutPackageJsonWarning","ignoredFilePatterns","unformattedFiles","file","ignoredFilePattern","projectFolderNameMatchesCorrectFormat","currentDirectoryName","basename","lowercaseHyphenedDirectoryName","toLowerCase","replaceAll","useSinglePackageManager","console","log","listrTasks","task","ctx","newListr","eslint","prettier","module","default","Listr","exitOnError","rendererOptions","collapseErrors","removeEmptyLines","formatOutput","fallbackRenderer","concurrent","run"],"mappings":";;;;;;;;;;;;;;;;AAGA;;AACA,MAAMA,qBAAqB,GAAG,GAA9B;SAEwBC,eAAeC;AACrC,YAAUF,0BAA0BG,KAAK,CAACC,GAAN,CAAU,GAAV,KAAkBF,SAAtD;AACD;;ACNM,eAAeG,OAAf;AACL,QAAM;AAAEC,IAAAA;AAAF,MAAa,MAAMC,YAAY,CAAC,qBAAD,EAAwB;AAC3DC,IAAAA,MAAM,EAAE;AADmD,GAAxB,CAArC;AAGA,SAAO,eAAeC,IAAf,CAAoBH,MAApB,CAAP;AACD;;ACFM,MAAMI,KAAK,GAAG,8BAAd;AAEP,AAAe,eAAeC,wBAAf;AACb,QAAM;AAAEL,IAAAA,MAAM,EAAEM;AAAV,MAAuB,MAAML,YAAY,CAAC,iBAAD,CAA/C;AAEA,QAAMM,iBAAiB,GAAGD,QAAQ,KAAK,EAAvC;;AAEA,MAAIC,iBAAJ,EAAuB;AACrB,UAAMC,QAAE,CAACC,SAAH,CAAa,mBAAb,EAAkC,WAAlC,CAAN;AACD;;AAED,QAAM;AAAET,IAAAA;AAAF,MAAa,MAAMC,YAAY,CAAC,wBAAD,CAArC;;AAEA,MAAID,MAAM,KAAK,EAAf,EAAmB;AACjB,UAAMU,2BAA2B,GAC/BV,MAAM,CAACW,IAAP,OAAkB,aAAlB,KAAoC,MAAMZ,OAAO,EAAjD,CADF;AAEA,UAAM,IAAIa,KAAJ;UAEAZ,SACFU,2BAA2B;;;;UAKzBf,cAAc,CAAC,cAAD,GALW,GAMvB;OATF,CAAN;AAaD;AACF;;;;;;;;ACnCD,MAAMkB,IAAI,GAAG,MAAb;AAEA,SAAwBC,iBAAiBC;AACvC,MAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC7B,UAAM,IAAIC,SAAJ,iCAA8C,OAAOD,SAArD,CAAN;AACD;;AAED,SAAOA,KAAK,CAACE,OAAN,CAAc,IAAIC,MAAJ,CAAWL,IAAX,EAAiB,GAAjB,CAAd,EAAqC,IAArC,CAAP;AACD;;ACLM,MAAMT,OAAK,GAAG,QAAd;AAEP,AAAe,eAAee,WAAf;AACb,MAAI;AACF,UAAMlB,YAAY,CAAC,kDAAD,CAAlB;AACD,GAFD,CAEE,OAAOmB,KAAP,EAAc;AACd,UAAM;AAAEpB,MAAAA;AAAF,QAAaoB,KAAnB;AACA,UAAMC,KAAK,GAAGrB,MAAM,CAACsB,KAAP,CAAa,IAAb,CAAd,CAFc;;AAKd,QAAI,CAAC,kBAAkBnB,IAAlB,CAAuBkB,KAAK,CAACA,KAAK,CAACE,MAAN,GAAe,CAAhB,CAA5B,CAAL,EAAuD;AACrD,YAAMH,KAAN;AACD;;AAED,UAAM,IAAIR,KAAJ;UAEAE,gBAAgB,CAACd,MAAD,CAAhB,CACCsB,KADD,CACO,IADP;AAAA,KAGCE,MAHD,CAGSC,IAAD,IAAU,iBAAiBtB,IAAjB,CAAsBsB,IAAtB,CAHlB;AAAA,KAKCC,GALD,CAKMD,IAAD;AAAA;;AAAA,4BAAUA,IAAI,CAACE,KAAL,CAAW,oBAAX,CAAV,qBAAU,YAAmC,CAAnC,CAAV;AAAA,KALL;AAAA,KAOCC,MAPD,CAOQ,CAACC,sBAAD,EAAmCJ,IAAnC;AACN,UAAIA,IAAI,IAAI,CAACI,sBAAsB,CAACC,QAAvB,CAAgCL,IAAhC,CAAb,EAAoD;AAClDI,QAAAA,sBAAsB,CAACE,IAAvB,CAA4BN,IAA5B;AACD;;AACD,aAAOI,sBAAP;AACD,KAZD,EAYG,EAZH,EAaCG,IAbD,CAaM,IAbN;;;OAFA,CAAN;AAoBD;AACF;;;;;;;;AChCD,MAAMC,SAAO,gBAAGC,aAAa,iBAAIC,OAAO,CAACC,GAAR,KAAJ,CAA7B;;AAEA,AAAO,MAAMhC,OAAK,GAAG,iCAAd;AAEP,AAAe,eAAeiC,mBAAf;AACb,QAAM;AAAErC,IAAAA,MAAM,EAAEsC;AAAV,MAA4B,MAAMrC,YAAY,CAClD,qDADkD,CAApD;AAIA,MAAIsC,YAAJ;;AAEA,MAAI;AACF,UAAMC,2BAA2B,GAAGP,SAAO,CAACQ,OAAR,CAClC,iDADkC,CAApC;;AAIAF,IAAAA,YAAY,GAAGG,IAAI,CAACC,KAAL,CACb,MAAMnC,QAAE,CAACoC,QAAH,CAAYJ,2BAAZ,EAAyC,OAAzC,CADO,EAEbK,OAFF;AAGD,GARD,CAQE,OAAOC,GAAP,EAAY;;AAEd,MAAI,OAAOP,YAAP,KAAwB,WAA5B,EAAyC;AACvC,UAAM,IAAI3B,KAAJ;OAAA,CAAN;AAID;;AAED,MAAImC,MAAM,CAACC,EAAP,CAAUV,aAAV,EAAyBC,YAAzB,CAAJ,EAA4C;AAC1C,UAAM,IAAI3B,KAAJ,yDACoD2B,uDAAuDD,6IAD3G,CAAN;AAGD;;AAED,MAAIW,mBAAJ;;AAEA,MAAI;AACFA,IAAAA,mBAAmB,GACjB,CAAC,MAAMzC,QAAE,CAACoC,QAAH,CAAY,iBAAZ,EAA+B,OAA/B,CAAP,EAAgDjC,IAAhD;;;;;yBADF;AAQD,GATD,CASE,OAAOmC,GAAP,EAAY;AACZ,UAAM,IAAIlC,KAAJ;OAAA,CAAN;AAID;;AAED,MAAI,CAACqC,mBAAL,EAA0B;AACxB,UAAM,IAAIrC,KAAJ;OAAA,CAAN;AAID;;AAED,QAAMsC,wBAAwB,GAAG,EAAjC;;AAEA,aAAW,MAAM;AAAEC,IAAAA;AAAF,GAAjB,IAA6BC,QAAQ,CAAC,GAAD,EAAM;AACzCC,IAAAA,eAAe,EAAE,CAAC,OAAD,EAAU,QAAV,EAAoB,eAApB,CADwB;AAEzCC,IAAAA,UAAU,EAAE,CAAC,MAAD,EAAS,OAAT,EAAkB,MAAlB,EAA0B,OAA1B;AAF6B,GAAN,CAArC,EAGI;AACF,UAAMC,YAAY,GAAG,MAAM/C,QAAE,CAACoC,QAAH,CAAYO,IAAZ,EAAkB,OAAlB,CAA3B;;AACA,QAAI,8CAA8ChD,IAA9C,CAAmDoD,YAAnD,CAAJ,EAAsE;AACpEL,MAAAA,wBAAwB,CAACnB,IAAzB,CAA8BoB,IAA9B;AACD;AACF;;AAED,MAAID,wBAAwB,CAAC3B,MAAzB,GAAkC,CAAtC,EAAyC;AACvC,UAAM,IAAIX,KAAJ;UAEAsC,wBAAwB,CAAClB,IAAzB,CAA8B,IAA9B;;;OAFA,CAAN;AAOD;AACF;;;;;;;;SCpFuBwB;AACtB,QAAMC,WAAW,GAAGC,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,MAAiBC,UAAU,CAACtC,MAAX,GAAoB,CAArC,CAAX,CAApB;AACA,SAAOsC,UAAU,CAACJ,WAAD,CAAjB;AACD;;ACCM,MAAMrD,OAAK,GAAG,mDAAd;AAEP,AAAe,eAAe0D,iBAAf;AACb,QAAM;AAAE9D,IAAAA;AAAF,MAAa,MAAMC,YAAY,CAAC,2BAAD,CAArC;AAEA,QAAM8D,OAAO,GAAG/D,MAAM,CACnBiB,OADa,CACL,iBADK,EACc,qBADd,EAEbA,OAFa,CAEL,MAFK,EAEG,EAFH,CAAhB;AAIA,QAAM+C,IAAI,GAAG,MAAM,CAAC,MAAMC,KAAK,CAACF,OAAD,CAAZ,EAAuBG,IAAvB,EAAnB;AAEA,QAAMC,CAAC,GAAGC,OAAO,CAACC,IAAR,CAAaL,IAAb,CAAV;AAEA,QAAMM,iBAAiB,GAAGH,CAAC,CAAC,IAAD,CAAD,CACvB3C,MADuB,CAChB;AACN,WAAO2C,CAAC,CAAC,IAAD,CAAD,CAAQD,IAAR,GAAevD,IAAf,OAA0B,OAAjC;AACD,GAHuB,EAIvB4D,OAJuB,CAIf,KAJe,EAKvB/C,MALuB,CAKhB;AACN,WAAO2C,CAAC,CAAC,IAAD,CAAD,CAAQK,QAAR,CAAiB,uBAAjB,EAA0CjD,MAA1C,GAAmD,CAA1D;AACD,GAPuB,EAQvBiD,QARuB,CAQd,uBARc,EASvBC,IATuB,GAUvBD,QAVuB,CAUd,SAVc,EAWvBE,IAXuB,CAWlB,MAXkB,CAA1B;;AAaA,MAAI,CAACJ,iBAAL,EAAwB;AACtB,UAAM,IAAI1D,KAAJ,wDACmDmD,sIADnD,CAAN;AAGD;;AAED,QAAMY,QAAQ,GAAG,MAAMV,KAAK,CAACK,iBAAD,EAAoB;AAC9CM,IAAAA,OAAO,EAAE;AACP;AACA,oBAAcpB,eAAe;AAFtB;AADqC,GAApB,CAA5B;;AAOA,MAAI,CAACmB,QAAQ,CAACE,EAAd,EAAkB;AAChB,UAAM,IAAIjE,KAAJ,qCACgCmD,+EAA+EY,QAAQ,CAACG,WAAWH,QAAQ,CAACI,cAD5I,CAAN;AAGD;AACF;;;;;;;;AC7CM,MAAM3E,OAAK,GAAG,qCAAd;AAEP,AAAe,eAAe4E,yBAAf;AACb,MAAI,CAAC,MAAM/E,YAAY,CAAC,4BAAD,CAAnB,EAAmDD,MAAnD,KAA8D,EAAlE,EAAsE;AACpE,UAAM,IAAIY,KAAJ;;UAGAjB,cAAc,CAAC,iCAAD;OAHd,CAAN;AAMD;;AAED,MAAI,CAAC,MAAMM,YAAY,CAAC,yBAAD,CAAnB,EAAgDD,MAAhD,KAA2D,YAA/D,EAA6E;AAC3E,UAAM,IAAIY,KAAJ,CAAU,2BAAV,CAAN;AACD;;AAED,QAAMqE,sBAAsB,GAAGnE,gBAAgB,CAC7C,MAAMN,QAAE,CAACoC,QAAH,CAAY,cAAZ,EAA4B,MAA5B,CADuC,CAAhB,CAG5BtB,KAH4B,CAGtB,IAHsB,EAI5BM,MAJ4B,CAIrB,CAACsD,KAAD,EAAQzD,IAAR,KAAiByD,KAAK,IAAI,uBAAuB/E,IAAvB,CAA4BsB,IAA5B,CAJL,EAIwC,KAJxC,CAA/B;;AAMA,MAAI,CAACwD,sBAAL,EAA6B;AAC3B,UAAM,IAAIrE,KAAJ,CAAU,sCAAV,CAAN;AACD;AACF;;;;;;;;AC4BM,MAAMuE,kBAAkB,gBAAGzC,IAAI,CAACC,KAAL,CAChC,mBAAMnC,QAAE,CAACoC,QAAH,CAAY,cAAZ,EAA4B,OAA5B,CAD0B,CAA3B;AAIP,AAAO,MAAMwC,oBAAoB,gBAAG1C,IAAI,CAACC,KAAL,CAClC,mBAAMnC,QAAE,CAACoC,QAAH,eAAY,IAAIyC,GAAJ,CAAQ,iBAAR,EAA2BC,MAAM,CAACC,IAAP,CAAYC,GAAvC,CAAZ,EAAyD,OAAzD,CAD4B,CAA7B;;AC3DA,MAAMpF,OAAK,GAAG,qCAAd;AAEP,SAAwBqF;AACtB,QAAMC,wBAAwB,GAAGC,MAAM,CAACC,IAAP,CAC/BT,kBAAkB,CAACU,YADY,CAAjC;;AAGA,MACEH,wBAAwB,CAAC5D,QAAzB,CAAkC,MAAlC,KACA,CAAC4D,wBAAwB,CAAC5D,QAAzB,CAAkC,OAAlC,CAFH,EAGE;AACA,UAAM,IAAIlB,KAAJ;;UAGAjB,cAAc,CAAC,gBAAD;OAHd,CAAN;AAMD;AACF;;ACdD,MAAMmG,MAAM,gBAAGC,aAAa;AAE1B;AACA;AACA,YAJ0B;AAK1B,kCAL0B,CAA5B;AAOA,MAAMC,KAAK,gBAAGF,MAAM,CAACG,SAAP,CAAiB,YAAjB,CAAd;AAQA,AAAO,MAAM7F,OAAK,GAAG,+BAAd;AAGP;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,AAAe,eAAe8F,0BAAf;AACb,QAAM;AAAEC,IAAAA,eAAe,GAAG,EAApB;AAAwBN,IAAAA,YAAY,GAAG;AAAvC,MAA8CV,kBAApD;AAEA,QAAMiB,4BAA4B,GAAG,MAAMC,OAAO,CAChDV,MAAM,CAACC,IAAP,CAAYC,YAAZ,CADgD,EAEhD,OAAOS,oBAAP,EAAiDC,UAAjD;;;AACE,QAAI;AACF,YAAMC,eAAe,GAAGvE,OAAO,CAACQ,OAAR,IAAmB8D,yBAAnB,CAAxB;;AAEA,YAAME,iBAAiB,GAAG/D,IAAI,CAACC,KAAL,CACxB,MAAMnC,QAAE,CAACoC,QAAH,CAAY4D,eAAZ,EAA6B,OAA7B,CADkB,CAA1B,CAHE;;AAQF,UAAI,WAAWC,iBAAX,IAAgC,aAAaA,iBAAjD,EAAoE;AAClE,eAAOH,oBAAP;AACD;AACF,KAXD,CAWE,OAAOxD,GAAP,EAAY;;AAEd,QAAI4D,YAAJ;;AAEA,QAAI;AACFA,MAAAA,YAAY,GAAGzE,OAAO,CAACQ,OAAR,IAAmB8D,uBAAnB,CAAf;AACD,KAFD,CAEE,OAAOzD,GAAP,EAAY;;;AAGd,QAAI4D,YAAY,IAAIC,UAAU,CAACD,YAAD,CAA9B,EAA8C;AAC5C,aAAOJ,oBAAP;AACD;;AAED,UAAMM,OAAO,GAAG,MAAMZ,KAAK,CAACa,SAAN,CAA4BN,UAA5B,EAAwC;AAC5DO,MAAAA,oBAAoB,EAAE,CAAC,OAAD;AADsC,KAAxC,CAAtB;AAIA,UAAMC,0BAA0B,qBAAGH,OAAO,CAACI,KAAX,qBAAG,eAAeC,eAAlD;;AAEA,QAAIF,0BAAJ,EAAgC;AAC9B;AACA,UAAIpB,MAAM,CAACC,IAAP,CAAYO,eAAZ,EAA6BrE,QAA7B,CAAsCiF,0BAAtC,CAAJ,EAAuE;AACrE,eAAOT,oBAAP;AACD;;AAEDA,MAAAA,oBAAoB,CAACvE,IAArB,CAA0B,CAACwE,UAAD,EAAaQ,0BAAb,CAA1B;AACD;;AAED,WAAOT,oBAAP;AACD,GA3C+C,EA4ChD,EA5CgD,CAAlD;;AA+CA,MAAIF,4BAA4B,CAAC7E,MAA7B,GAAsC,CAA1C,EAA6C;AAC3C,UAAM,IAAIX,KAAJ;;QAGFjB,cAAc,mBACIyG,4BAA4B,CAC3C1E,GADe,CACX,CAAC,GAAGqF,0BAAH,CAAD,KAAoCA,0BADzB,EAEf/E,IAFe,CAEV,GAFU,GADJ;;;OAHZ,CAAN;AAYD;AACF;;AC3FD,MAAM;AAAEhC,EAAAA,MAAM,EAAEkH;AAAV,IAA+B,mBAAMjH,YAAY,WAAA,EAAa;AAClEmC,EAAAA,GAAG,eAAE+E,OAAO,eAACC,aAAa,CAAC9B,MAAM,CAACC,IAAP,CAAYC,GAAb,CAAd;AADsD,CAAb,CAAvD;;ACAO,MAAMpF,OAAK,GAAG,wBAAd;AAEP,AAAe,eAAeiH,8BAAf;AACb,QAAMC,sBAAsB,GAAG;AAE7B,wBAF6B;AAK7B,+BAL6B;AAQ7B,oBAR6B,EAS7B,cAT6B,EAU7B,SAV6B,EAW7B,aAX6B;AAc7B,QAd6B;AAiB7B,gBAjB6B,EAkB7B,oBAlB6B;AAqB7B,cArB6B,EAsB7B,SAtB6B,EAuB7B,MAvB6B,EAwB7B,wBAxB6B,EAyB7B,gBAzB6B,EA0B7B,YA1B6B,EA2B7B,WA3B6B;AA8B7B,cA9B6B,EA+B7B,UA/B6B;AAkC7B,SAlC6B,EAmC7BtF,IAnC6B,CAmCxB,GAnCwB,CAA/B;;AAqCA,MAAI;AACF,UAAM/B,YAAY,IACbiH,wCAAwCI,yBAD3B,CAAlB;AAGD,GAJD,CAIE,OAAOlG,KAAP,EAAc;AACd,UAAM;AAAEpB,MAAAA;AAAF,QAAaoB,KAAnB;;AACA,QACE,CAACpB,MAAM,CAACuH,UAAP,CAAkB,qBAAlB,CAAD,IACA,CAACvH,MAAM,CAACuH,UAAP,CAAkB,wBAAlB,CADD,IAEA,CAACvH,MAAM,CAACuH,UAAP,CAAkB,sBAAlB,CAHH,EAIE;AACA,YAAMnG,KAAN;AACD;;AAED,UAAM,CAACoG,wBAAD,EAA2BC,yBAA3B,IAAwDzH,MAAM,CAACsB,KAAP,CAC5D,sBAD4D,CAA9D;AAIA,UAAMoG,QAAQ,GAAG,EAAjB;;AAEA,QAAIF,wBAAJ,EAA8B;AAC5BE,MAAAA,QAAQ,CAAC3F,IAAT;UACIyF,wBAAwB,CACvBlG,KADD,CACO,IADP,EAECE,MAFD,CAESmG,GAAD,IAAiBA,GAAG,CAAC7F,QAAJ,CAAa,IAAb,CAFzB,EAGCE,IAHD,CAGM,IAHN;;;;UAOArC,cAAc,CAAC,oCAAD;OARlB;AAUD;;AAED,QAAI8H,yBAAJ,EAA+B;AAC7B;;;;;;;AAOA,YAAMG,iCAAiC,GAAGH,yBAAyB,CAChEnG,KADuC,CACjC,IADiC,EAEvCE,MAFuC,CAE/BqG,iBAAD;AACN,eAAO,EACLA,iBAAiB,CAAC/F,QAAlB,CAA2B,iBAA3B,KACA,CACE,0BADF,EAEE,kCAFF,EAGE,2BAHF,EAIE,oCAJF,EAKE,yBALF,EAME,mCANF,EAOE,sBAPF,EAQE,wBARF,EASE,+BATF,EAUE,2BAVF,EAWE,qBAXF,EAYE,wBAZF,EAaE,uBAbF,EAcE,uBAdF,EAeEgG,IAfF,CAeQC,kBAAD,IACLF,iBAAiB,CAAC/F,QAAlB,CAA2BiG,kBAA3B,CAhBF,CAFK,CAAP;AAqBD,OAxBuC,EAyBvC/F,IAzBuC,CAyBlC,IAzBkC,CAA1C;;AA2BA,UAAI4F,iCAAJ,EAAuC;AACrCF,QAAAA,QAAQ,CAAC3F,IAAT;UACE6F,iCAAiC,CAChCtG,KADD,CACO,IADP,EAECE,MAFD,CAESmG,GAAD,IAAiBA,GAAG,CAAC7F,QAAJ,CAAa,IAAb,CAFzB,EAGCE,IAHD,CAGM,IAHN;;;;UAOArC,cAAc,CAAC,iCAAD;OARhB;AAUD;AACF;;AAED,QAAI+H,QAAQ,CAACnG,MAAT,GAAkB,CAAtB,EAAyB,MAAM,IAAIX,KAAJ,CAAU8G,QAAQ,CAAC1F,IAAT,CAAc,MAAd,CAAV,CAAN;AAC1B;AACF;;AC7HM,MAAM5B,OAAK,GAAG,sCAAd;AAEP,AAAe,eAAe4H,+BAAf;AACb,QAAM;AAAEhI,IAAAA;AAAF,MAAa,MAAMC,YAAY,CACnC,qDADmC,CAArC;;AAIA,MAAID,MAAM,KAAK,EAAf,EAAmB;AACjB,UAAM,IAAIY,KAAJ;UAEAZ;;;;UAIAL,cAAc,CAAC,iCAAD;;;OANd,CAAN;AAWD;AACF;;;;;;;;ACpBM,MAAMS,OAAK,GAAG,6BAAd;AAEP,AAAe,eAAe6H,uBAAf;AACb,QAAM;AAAEjI,IAAAA;AAAF,MAAa,MAAMC,YAAY,CAAC,+BAAD,CAArC;;AAEA,MAAID,MAAM,KAAK,EAAf,EAAmB;AACjB,UAAM,IAAIY,KAAJ;UAEAZ;;;;UAIAL,cAAc,CAAC,oCAAD;;;;UAIdA,cAAc,CAAC,kBAAD;;;;;OAVd,CAAN;AAiBD;AACF;;;;;;;;ACrBM,MAAMS,OAAK,GAAG,6BAAd;AAEP,AAAe,eAAe8H,wBAAf;AACb,QAAM;AAAElI,IAAAA,MAAM,EAAEsC;AAAV,MAA4B,MAAMrC,YAAY,CAClD,uCADkD,CAApD;;AAIA,MAAI8C,MAAM,CAACC,EAAP,CAAUV,aAAV,EAAyB8C,oBAAoB,CAACvC,OAA9C,CAAJ,EAA4D;AAC1D,UAAM,IAAIjC,KAAJ,uCAEFwE,oBAAoB,CAACvC,kDACoBP;;UAEvC3C,cAAc,IAEZwI,EAAE,CAACC,QAAH,OAAkB,OAAlB,GAA4B,OAA5B,GAAsC,wCAF1B;OALd,CAAN;AAYD;AACF;;;;;;;;ACtBM,MAAMhI,OAAK,GAAG,UAAd;AAEP,AAAe,eAAeiI,aAAf;AACb,MAAI;AACF,UAAMpI,YAAY,4CAC2BkC,OAAO,CAACC,GAAR,yCAAoDD,OAAO,CAACC,GAAR,6BAAwCD,OAAO,CAACC,GAAR,2CADvH,EAEhB;AAAEA,MAAAA,GAAG,EAAE+E,OAAO,CAACC,aAAa,CAAC9B,MAAM,CAACC,IAAP,CAAYC,GAAb,CAAd;AAAd,KAFgB,CAAlB;AAID,GALD,CAKE,OAAOpE,KAAP,EAAc;AACd,UAAM;AAAEpB,MAAAA,MAAF;AAAUsI,MAAAA;AAAV,QAAqBlH,KAA3B;AAEA,UAAMmH,+BAA+B,GAAGD,MAAM,CAACrH,OAAP,CACtC,wDADsC,EAEtC,EAFsC,CAAxC;;AAKA,QAAI,CAACjB,MAAD,IAAWuI,+BAAf,EAAgD;AAC9C,YAAMnH,KAAN;AACD;;AAED,UAAMoH,mBAAmB,GAAG;AAE1B;AACA,kCAH0B;AAM1B;AACA,kCAP0B;AAS1B,yBAT0B,CAA5B;AAYA,UAAMC,gBAAgB,GAAG3H,gBAAgB,CAACd,MAAD,CAAhB,CACtBsB,KADsB,CAChB,IADgB,EAEtBI,GAFsB,CAEjBgH,IAAD;AAEH;AACA;AACAA,IAAAA,IAAI,CAACzH,OAAL,CAAa,qDAAb,EAAoE,EAApE,CANqB,EAQtBO,MARsB,CASpBkH,IAAD,IACE,CAACF,mBAAmB,CAACV,IAApB,CAA0Ba,kBAAD,IACxBA,kBAAkB,CAACxI,IAAnB,CAAwBuI,IAAxB,CADD,CAVkB,CAAzB;;AAeA,QAAID,gBAAgB,CAAClH,MAAjB,GAA0B,CAA9B,EAAiC;AAC/B,YAAM,IAAIX,KAAJ;YAEA6H,gBAAgB,CAACzG,IAAjB,CAAsB,IAAtB;;;;;SAFA,CAAN;AASD;AACF;AACF;;;;;;;;AC7DM,MAAM5B,OAAK,GAAG,4CAAd;AAEP,SAAwBwI;AACtB,QAAMC,oBAAoB,GAAG1F,IAAI,CAAC2F,QAAL,CAAc3G,OAAO,CAACC,GAAR,EAAd,CAA7B;AACA,QAAM2G,8BAA8B,GAAGF,oBAAoB,CACxDG,WADoC,GAEpCC,UAFoC,CAEzB,GAFyB,EAEpB,GAFoB,CAAvC;;AAIA,MAAIJ,oBAAoB,KAAKE,8BAA7B,EAA6D;AAC3D,UAAM,IAAInI,KAAJ,4BACuBiI;;oDAEmBE;;UAE1CpJ,cAAc,CAAC,OAAD;UACdA,cAAc,OACRkJ,wBAAwBE,gCADhB;UAGdpJ,cAAc,OAAOoJ,gCAAP;OATd,CAAN;AAYD;AACF;;;;;;;;ACtBM,MAAM3I,OAAK,GAAG,4BAAd;AAEP,AAAe,eAAe8I,uBAAf;AACb,QAAM;AAAElJ,IAAAA;AAAF,MAAa,MAAMC,YAAY,CAAC,gCAAD,CAArC;;AAEA,MAAID,MAAM,KAAK,EAAf,EAAmB;AACjB,UAAM,IAAIY,KAAJ;;UAGAjB,cAAc,CAAC,4BAAD;;;;UAIdA,cAAc,CAAC,eAAD;;;;UAIdA,cAAc,CAAC,cAAD;OAXd,CAAN;AAcD;AACF;;;;;;;;ACFDwJ,OAAO,CAACC,GAAR,4BAAuChE,oBAAoB,CAACvC,SAA5D;AAEA,MAAMwG,UAAU,gBAAG;AAEjB;AACAhJ,0BAHiB,EAIjB2E,2BAJiB,EAKjBgD,iCALiB,EAMjBC,yBANiB;AASjBiB,yBATiB;AAYjBN,uCAZiB;AAejB;AACA;AACExI,EAAAA,KAAK,EAAE,wBADT;AAEEkJ,EAAAA,IAAI,EAAE,CAACC,GAAD,EAAgBD,IAAhB,KACJA,IAAI,CAACE,QAAL,CAAc,CACZ,IAAI,CAACrE,kBAAkB,CAACU,YAApB,IACJ,CAACF,MAAM,CAACC,IAAP,CAAYT,kBAAkB,CAACU,YAA/B,EAA6C/D,QAA7C,CAAsD,MAAtD,CADG,GAEA,EAFA,GAGA,CACE;AACE1B,IAAAA,KAAK,EAAEqF,OADT;AAEE6D,IAAAA,IAAI,EAAE7D;AAFR,GADF,CAHJ,CADY,EAUZ;AACErF,IAAAA,KAAK,EAAEiH,OADT;AAEEiC,IAAAA,IAAI,EAAEjC;AAFR,GAVY,EAcZ;AACEjH,IAAAA,KAAK,EAAE8F,OADT;AAEEoD,IAAAA,IAAI,EAAEpD;AAFR,GAdY,CAAd;AAHJ,CAhBiB;AAyCjBpC,mBAzCiB;AA4CjB2F,MA5CiB,EA6CjBC,QA7CiB;AAgDjBrH,qBAhDiB,EAiDjB6F,0BAjDiB,EAkDjBxG,GAlDiB,CAkDZiI,MAAD;AACJ,MAAI,UAAUA,MAAd,EAAsB,OAAOA,MAAP;AACtB,SAAO;AACLvJ,IAAAA,KAAK,EAAEuJ,MAAM,CAACvJ,KADT;AAELkJ,IAAAA,IAAI,EAAEK,MAAM,CAACC;AAFR,GAAP;AAID,CAxDkB,CAAnB;AA0DA,MAAM,IAAIC,KAAJ,CAAUR,UAAV,EAAsB;AAC1BS,EAAAA,WAAW,EAAE,KADa;AAE1BC,EAAAA,eAAe,EAAE;AACfC,IAAAA,cAAc,EAAE,KADD;AAEfC,IAAAA,gBAAgB,EAAE,KAFH;AAGfC,IAAAA,YAAY,EAAE;AAHC,GAFS;AAO1BC,EAAAA,gBAAgB,EAAE,SAPQ;AAQ1BC,EAAAA,UAAU,EAAE;AARc,CAAtB,EASHC,GATG,EAAN"}
1
+ {"version":3,"file":"preflight.esm.js","sources":["../src/util/commandExample.ts","../src/util/isDrone.ts","../src/checks/allChangesCommittedToGit.ts","../src/util/normalizeNewline.ts","../src/checks/eslint.ts","../src/checks/eslintConfigIsValid.ts","../src/util/randomUserAgent.ts","../src/checks/linkOnGithubAbout.ts","../src/checks/nodeModulesIgnoredFromGit.ts","../src/util/packageJson.ts","../src/checks/noDependencyProblems/nextJsProjectHasSharpInstalled.ts","../src/checks/noDependencyProblems/noDependenciesWithoutTypes.ts","../src/util/preflightBinPath.ts","../src/checks/noDependencyProblems/noUnusedDependencies.ts","../src/checks/noExtraneousFilesCommittedToGit.ts","../src/checks/noSecretsCommittedToGit.ts","../src/checks/preflightIsLatestVersion.ts","../src/checks/prettier.ts","../src/checks/projectFolderNameMatchesCorrectFormat.ts","../src/checks/useSinglePackageManager.ts","../src/index.ts"],"sourcesContent":["import chalk from 'chalk';\n\n// https://www.compart.com/en/unicode/U+2800\n// eslint-disable-next-line security/detect-bidi-characters -- Intentional use of unusual character for formatting\nconst emptyBrailleCharacter = '‎';\n\nexport default function commandExample(command: string) {\n return `${emptyBrailleCharacter} ${chalk.dim('$')} ${command}`;\n}\n","import { execaCommand } from 'execa';\n\nexport async function isDrone() {\n const { stdout } = await execaCommand('cat /etc/os-release', {\n reject: false,\n });\n return /Alpine Linux/.test(stdout);\n}\n","import { promises as fs } from 'node:fs';\nimport { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\nimport { isDrone } from '../util/isDrone';\n\nexport const title = 'All changes committed to Git';\n\nexport default async function allChangesCommittedToGit() {\n const { stdout: replSlug } = await execaCommand('echo $REPL_SLUG');\n\n const isRunningInReplIt = replSlug !== '';\n\n if (isRunningInReplIt) {\n await fs.writeFile('.git/info/exclude', '.replit\\n');\n }\n\n const { stdout } = await execaCommand('git status --porcelain');\n\n if (stdout !== '') {\n const onlyYarnLockModifiedOnDrone =\n stdout.trim() === 'M yarn.lock' && (await isDrone());\n throw new Error(\n `Some changes have not been committed to Git:\n ${stdout}${\n onlyYarnLockModifiedOnDrone\n ? `\n\n The only file with changes is the yarn.lock file, indicating that npm was incorrectly used in addition to Yarn (eg. an \"npm install\" command was run). To fix this, force regeneration of the yarn.lock file locally with the following command and then commit the changes:\n\n ${commandExample('yarn --force')}`\n : ''\n }\n `,\n );\n }\n}\n","const CRLF = '\\r\\n';\n\nexport default function normalizeNewline(input: string) {\n if (typeof input !== 'string') {\n throw new TypeError(`Expected a \\`string\\`, got \\`${typeof input}\\``);\n }\n\n return input.replace(new RegExp(CRLF, 'g'), '\\n');\n}\n","import { execaCommand } from 'execa';\nimport normalizeNewline from '../util/normalizeNewline';\n\nexport const title = 'ESLint';\n\nexport default async function eslintCheck() {\n try {\n await execaCommand('yarn eslint . --max-warnings 0 --format compact');\n } catch (error) {\n const { stdout } = error as { stdout: string };\n const lines = stdout.split('\\n');\n\n // If no ESLint problems detected, throw the error\n if (!/^\\d+ problems?$/.test(lines[lines.length - 2]!)) {\n throw error;\n }\n\n throw new Error(\n `ESLint problems found in the following files:\n ${normalizeNewline(stdout)\n .split('\\n')\n // Match lines starting with slashes (macOS, Linux) or drive letters (Windows)\n .filter((line) => /^(\\/|[A-Z]:\\\\)/.test(line))\n // Strip out the filename\n .map((line) => line.match(/^(([A-Z]:)?[^:]+):/)?.[1])\n // Remove duplicate filenames\n .reduce((linesWithoutDuplicates: string[], line) => {\n if (line && !linesWithoutDuplicates.includes(line)) {\n linesWithoutDuplicates.push(line);\n }\n return linesWithoutDuplicates;\n }, [])\n .join('\\n')}\n\n Open these files in your editor - there should be problems to fix\n `,\n );\n }\n}\n","import { promises as fs } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { execaCommand } from 'execa';\nimport readdirp from 'readdirp';\nimport semver from 'semver';\n\nconst require = createRequire(`${process.cwd()}/`);\n\nexport const title = 'ESLint config is latest version';\n\nexport default async function eslintConfigIsValid() {\n const { stdout: remoteVersion } = await execaCommand(\n 'npm show eslint-config-upleveled version',\n );\n\n let localVersion;\n\n try {\n const eslintConfigPackageJsonPath = require.resolve(\n 'eslint-config-upleveled/package.json',\n );\n\n localVersion = JSON.parse(\n await fs.readFile(eslintConfigPackageJsonPath, 'utf-8'),\n ).version;\n } catch (err) {}\n\n if (typeof localVersion === 'undefined') {\n throw new Error(\n `The UpLeveled ESLint Config has not been installed - please install using the instructions on https://www.npmjs.com/package/eslint-config-upleveled\n `,\n );\n }\n\n if (semver.gt(remoteVersion, localVersion)) {\n throw new Error(\n `Your current version of the UpLeveled ESLint Config (${localVersion}) is older than the latest version ${remoteVersion} - upgrade by running all lines of the install instructions on https://www.npmjs.com/package/eslint-config-upleveled\n `,\n );\n }\n\n let eslintConfigMatches;\n\n try {\n eslintConfigMatches =\n (await fs.readFile('./.eslintrc.cjs', 'utf-8')).trim() ===\n `/** @type {import('@typescript-eslint/utils').TSESLint.Linter.Config} */\nconst config = {\n extends: ['upleveled'],\n};\n\nmodule.exports = config;`;\n } catch (err) {\n throw new Error(\n `Error reading your .eslintrc.cjs file - please reinstall the config using the instructions on https://www.npmjs.com/package/eslint-config-upleveled\n `,\n );\n }\n\n if (!eslintConfigMatches) {\n throw new Error(\n `Your ESLint config file .eslintrc.cjs does not match the configuration file template - please reinstall the config using the instructions on https://www.npmjs.com/package/eslint-config-upleveled\n `,\n );\n }\n\n const eslintDisableOccurrences = [];\n\n for await (const { path } of readdirp('.', {\n directoryFilter: ['!.git', '!.next', '!node_modules'],\n fileFilter: ['*.js', '*.jsx', '*.ts', '*.tsx'],\n })) {\n const fileContents = await fs.readFile(path, 'utf-8');\n if (/eslint-disable|eslint [a-z0-9@/-]+: (0|off)/.test(fileContents)) {\n eslintDisableOccurrences.push(path);\n }\n }\n\n if (eslintDisableOccurrences.length > 0) {\n throw new Error(\n `ESLint has been disabled in the following files:\n ${eslintDisableOccurrences.join('\\n')}\n\n Remove all comments disabling or modifying ESLint rule configuration (eg. eslint-disable and eslint-disable-next-line comments) and fix the problems\n `,\n );\n }\n}\n","import userAgents from 'top-user-agents';\n\nexport default function randomUserAgent() {\n const randomIndex = Math.floor(Math.random() * (userAgents.length - 1));\n return userAgents[randomIndex]!;\n}\n","import cheerio from 'cheerio';\nimport type { Element } from 'domhandler';\nimport { execaCommand } from 'execa';\nimport fetch from 'node-fetch';\nimport randomUserAgent from '../util/randomUserAgent';\n\nexport const title = 'GitHub repo has deployed project link under About';\n\nexport default async function linkOnGithubAbout() {\n const { stdout } = await execaCommand('git remote get-url origin');\n\n const repoUrl = stdout\n .replace('git@github.com:', 'https://github.com/')\n .replace('.git', '');\n\n const html = await (await fetch(repoUrl)).text();\n\n const $ = cheerio.load(html);\n\n const urlInAboutSection = $('h2')\n .filter(function (this: Element) {\n return $(this).text().trim() === 'About';\n })\n .nextAll('div')\n .filter(function (this: Element) {\n return $(this).children('.octicon.octicon-link').length > 0;\n })\n .children('.octicon.octicon-link')\n .next()\n .children('a[href]')\n .attr('href');\n\n if (!urlInAboutSection) {\n throw new Error(\n `Deployed project link not found in About section on ${repoUrl}. Click on the cog symbol to the right of the About heading and paste the Repl.it / Netlify / Fly.io link in the Website box.`,\n );\n }\n\n const response = await fetch(urlInAboutSection, {\n headers: {\n // For repl.it\n 'user-agent': randomUserAgent(),\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Project link in About section on ${repoUrl} is not returning a proper status code: the link returns status code ${response.status} (${response.statusText}).`,\n );\n }\n}\n","import { promises as fs } from 'node:fs';\nimport { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\nimport normalizeNewline from '../util/normalizeNewline';\n\nexport const title = 'node_modules/ folder ignored in Git';\n\nexport default async function nodeModulesIgnoredFromGit() {\n if ((await execaCommand('git ls-files node_modules/')).stdout !== '') {\n throw new Error(\n `node_modules/ folder committed to Git. Remove it using:\n\n ${commandExample('git rm -r --cached node_modules')}\n `,\n );\n }\n\n if ((await execaCommand('git ls-files .gitignore')).stdout !== '.gitignore') {\n throw new Error('.gitignore file not found');\n }\n\n const nodeModulesInGitignore = normalizeNewline(\n await fs.readFile('./.gitignore', 'utf8'),\n )\n .split('\\n')\n .reduce((found, line) => found || /^\\/?node_modules\\/?$/.test(line), false);\n\n if (!nodeModulesInGitignore) {\n throw new Error('node_modules not found in .gitignore');\n }\n}\n","import { promises as fs } from 'node:fs';\nimport { URL } from 'node:url';\n\ntype PackageJson = {\n name: string;\n version: string;\n description?: string;\n keywords?: string;\n homepage?: string;\n bugs?: {\n email?: string;\n url?: string;\n };\n license?: string;\n author?:\n | string\n | {\n name: string;\n email?: string;\n url?: string;\n };\n contributors?:\n | string[]\n | {\n name: string;\n email?: string;\n url?: string;\n }[];\n files?: string[];\n main?: string;\n browser?: string;\n bin?: Record<string, string>;\n man?: string;\n directories?: {\n lib?: string;\n bin?: string;\n man?: string;\n doc?: string;\n example?: string;\n test?: string;\n };\n repository?: {\n type?: 'git';\n url?: string;\n directory?: string;\n };\n scripts?: Record<string, string>;\n config?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n bundledDependencies?: string[];\n engines?: Record<string, string>;\n os?: string[];\n cpu?: string[];\n};\n\nexport const projectPackageJson = JSON.parse(\n await fs.readFile('package.json', 'utf-8'),\n) as PackageJson;\n\nexport const preflightPackageJson = JSON.parse(\n await fs.readFile(new URL('../package.json', import.meta.url), 'utf-8'),\n) as PackageJson;\n","import commandExample from '../../util/commandExample';\nimport { projectPackageJson } from '../../util/packageJson';\n\nexport const title = 'Next.js project has sharp installed';\n\nexport default function nextJsProjectHasSharpInstalled() {\n const dependenciesPackageNames = Object.keys(\n projectPackageJson.dependencies!,\n );\n if (\n dependenciesPackageNames.includes('next') &&\n !dependenciesPackageNames.includes('sharp')\n ) {\n throw new Error(\n `Next.js projects should have sharp installed for better image optimization. Install it with:\n\n ${commandExample('yarn add sharp')}\n `,\n );\n }\n}\n","import { existsSync, promises as fs } from 'node:fs';\nimport algoliasearch from 'algoliasearch';\nimport pReduce from 'p-reduce';\nimport commandExample from '../../util/commandExample';\nimport { projectPackageJson } from '../../util/packageJson';\n\nconst client = algoliasearch(\n // Application ID and API key specific to UpLeveled\n // Preflight. Please don't use anywhere else without\n // asking Algolia's permission.\n 'OFCNCOG2CU', // Application ID\n 'ec73550aa8b2936dab436d4e02144784', // API Key\n);\nconst index = client.initIndex('npm-search');\n\ninterface AlgoliaObj {\n types?: {\n definitelyTyped?: string;\n };\n}\n\nexport const title = 'No dependencies without types';\n\n// This is a naive check for matching @types/<pkg name> packages\n// that the student hasn't yet installed. It is not intended to\n// be an exhaustive check for any types for all packages.\n//\n// It attempts to address scenarios such as this with\n// `styled-components`:\n//\n// https://learn.upleveled.io/courses/btcmp-l-webfs-gen-0/modules/122-cheatsheet-css-in-js/#eslint-errors-with-styled-components\nexport default async function noDependenciesWithoutTypes() {\n const { devDependencies = {}, dependencies = {} } = projectPackageJson;\n\n const dependenciesWithMissingTypes = await pReduce(\n Object.keys(dependencies),\n async (filteredDependencies: [string, string][], dependency: string) => {\n try {\n const packageJsonPath = require.resolve(`${dependency}/package.json`);\n\n const modulePackageJson = JSON.parse(\n await fs.readFile(packageJsonPath, 'utf-8'),\n );\n\n // If the keys \"types\" or \"typings\" are in the module's `package.json`, bail out\n if ('types' in modulePackageJson || 'typings' in modulePackageJson) {\n return filteredDependencies;\n }\n } catch (err) {}\n\n let indexDTsPath;\n\n try {\n indexDTsPath = require.resolve(`${dependency}/index.d.ts`);\n } catch (err) {}\n\n // If the index.d.ts file exists inside the module's directory, bail out\n if (indexDTsPath && existsSync(indexDTsPath)) {\n return filteredDependencies;\n }\n\n const results = await index.getObject<AlgoliaObj>(dependency, {\n attributesToRetrieve: ['types'],\n });\n\n const definitelyTypedPackageName = results.types?.definitelyTyped;\n\n if (definitelyTypedPackageName) {\n // If a matching `@types/<package name>` has been already installed in devDependencies, bail out\n if (Object.keys(devDependencies).includes(definitelyTypedPackageName)) {\n return filteredDependencies;\n }\n\n filteredDependencies.push([dependency, definitelyTypedPackageName]);\n }\n\n return filteredDependencies;\n },\n [],\n );\n\n if (dependenciesWithMissingTypes.length > 0) {\n throw new Error(\n `Dependencies found without types. Add the missing types with:\n\n ${commandExample(\n `yarn add --dev ${dependenciesWithMissingTypes\n .map(([, definitelyTypedPackageName]) => definitelyTypedPackageName)\n .join(' ')}`,\n )}\n\n If the dependencies above are already in your package.json, check that they have not been incorrectly installed as regular dependencies in the \"dependencies\" object - they should be installed inside \"devDependencies\" (using the --dev flag mentioned above). To fix this situation, remove the dependencies and run the command above exactly.\n `,\n );\n }\n}\n","import { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { execaCommand } from 'execa';\n\nconst { stdout: preflightBinPath } = await execaCommand(`yarn bin`, {\n cwd: dirname(fileURLToPath(import.meta.url)),\n});\n\nexport default preflightBinPath;\n","import { execaCommand } from 'execa';\nimport commandExample from '../../util/commandExample';\nimport preflightBinPath from '../../util/preflightBinPath';\n\nexport const title = 'No unused dependencies';\n\nexport default async function noUnusedAndMissingDependencies() {\n const ignoredPackagePatterns = [\n // Unused dependency detected in https://github.com/upleveled/next-portfolio-dev\n '@graphql-codegen/cli',\n\n // Unused dependency detected in create-react-app\n '@testing-library/user-event',\n\n // Tailwind CSS\n '@tailwindcss/jit',\n 'autoprefixer',\n 'postcss',\n 'tailwindcss',\n\n // Sass (eg. in create-react-app)\n 'sass',\n\n // ESLint configuration\n 'babel-eslint',\n 'eslint-config-next',\n\n // TODO: Remove this once depcheck issue is fixed:\n // PR: https://github.com/depcheck/depcheck/pull/790\n // Issue: https://github.com/depcheck/depcheck/issues/791\n //\n // Stylelint configuration\n 'stylelint',\n 'stylelint-config-upleveled',\n\n // Testing\n 'babel-jest',\n 'cypress',\n 'jest',\n 'jest-environment-jsdom',\n 'jest-puppeteer',\n 'playwright',\n 'puppeteer',\n\n // TypeScript\n 'typescript',\n '@types/*',\n\n // Next.js\n 'sharp',\n ].join(',');\n\n try {\n await execaCommand(\n `${preflightBinPath}/depcheck --ignores=\"${ignoredPackagePatterns}\"`,\n );\n } catch (error) {\n const { stdout } = error as { stdout: string };\n if (\n !stdout.startsWith('Unused dependencies') &&\n !stdout.startsWith('Unused devDependencies') &&\n !stdout.startsWith('Missing dependencies')\n ) {\n throw error;\n }\n\n const [unusedDependenciesStdout, missingDependenciesStdout] = stdout.split(\n 'Missing dependencies',\n );\n\n const messages = [];\n\n if (unusedDependenciesStdout) {\n messages.push(`Unused dependencies found:\n ${unusedDependenciesStdout\n .split('\\n')\n .filter((str: string) => str.includes('* '))\n .join('\\n')}\n\n Remove these dependencies by running the following command for each dependency:\n\n ${commandExample('pnpm remove <dependency name here>')}\n `);\n }\n\n if (missingDependenciesStdout) {\n /**\n * Temporary workaround to filter out eslint-config-upleveled peer dependencies\n * not listed in `package.json`, which are flagged as missing dependencies by depcheck\n *\n * TODO: Remove this variable once this depcheck issue is fixed:\n * https://github.com/depcheck/depcheck/issues/789\n */\n const missingDependenciesStdoutFiltered = missingDependenciesStdout\n .split('\\n')\n .filter((missingDependency) => {\n return !(\n missingDependency.includes('./.eslintrc.cjs') &&\n [\n '@next/eslint-plugin-next',\n '@typescript-eslint/eslint-plugin',\n '@typescript-eslint/parser',\n 'eslint-plugin-upleveled',\n 'eslint-config-react-app',\n 'eslint-import-resolver-typescript',\n 'eslint-plugin-import',\n 'eslint-plugin-jsx-a11y',\n 'eslint-plugin-jsx-expressions',\n 'eslint-plugin-react-hooks',\n 'eslint-plugin-react',\n 'eslint-plugin-security',\n 'eslint-plugin-sonarjs',\n 'eslint-plugin-unicorn',\n ].some((excludedDependency) =>\n missingDependency.includes(excludedDependency),\n )\n );\n })\n .join('\\n');\n\n if (missingDependenciesStdoutFiltered) {\n messages.push(`Missing dependencies found:\n ${missingDependenciesStdoutFiltered\n .split('\\n')\n .filter((str: string) => str.includes('* '))\n .join('\\n')}\n\n Add these missing dependencies by running the following command for each dependency:\n\n ${commandExample('pnpm add <dependency name here>')}\n `);\n }\n }\n\n if (messages.length > 0) throw new Error(messages.join('\\n\\n'));\n }\n}\n","import { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\n\nexport const title = 'No extraneous files committed to Git';\n\nexport default async function noExtraneousFilesCommittedToGit() {\n const { stdout } = await execaCommand(\n 'git ls-files .DS_Store yarn-error.log npm-debug.log',\n );\n\n if (stdout !== '') {\n throw new Error(\n `Extraneous files committed to Git:\n ${stdout}\n\n Remove these files from your repo by running the following command for each file:\n\n ${commandExample('git rm --cached <filename here>')}\n\n Once you've removed all files, make sure that it doesn't happen again by adding the filenames above to your .gitignore file.\n `,\n );\n }\n}\n","import { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\n\nexport const title = 'No secrets committed to Git';\n\nexport default async function noSecretsCommittedToGit() {\n const { stdout } = await execaCommand('git ls-files .env .env*.local');\n\n if (stdout !== '') {\n throw new Error(\n `Secrets committed to Git 😱:\n ${stdout}\n\n Remove these files from your repo by installing BFG from the System Setup Guide (see Optional Software at the bottom) and running it on each of your files like this:\n\n ${commandExample('bfg --delete-files <filename here>')}\n\n Once you've done this for every secret file, then force push to your repository:\n\n ${commandExample('git push --force')}\n\n More info: https://docs.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository\n\n Finally, make sure that this doesn't happen again by adding the filenames above to your .gitignore file.\n `,\n );\n }\n}\n","import os from 'node:os';\nimport { execaCommand } from 'execa';\nimport semver from 'semver';\nimport commandExample from '../util/commandExample';\nimport { preflightPackageJson } from '../util/packageJson';\n\nexport const title = 'Preflight is latest version';\n\nexport default async function preflightIsLatestVersion() {\n const { stdout: remoteVersion } = await execaCommand(\n 'npm show @upleveled/preflight version',\n );\n\n if (semver.gt(remoteVersion, preflightPackageJson.version)) {\n throw new Error(\n `Your current version of Preflight (${\n preflightPackageJson.version\n }) is older than the latest version ${remoteVersion} - upgrade with:\n\n ${commandExample(\n `${\n os.platform() === 'linux' ? 'sudo ' : ''\n }yarn global add @upleveled/preflight`,\n )}\n `,\n );\n }\n}\n","import { dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { execaCommand } from 'execa';\nimport normalizeNewline from '../util/normalizeNewline';\n\nexport const title = 'Prettier';\n\nexport default async function prettierCheck() {\n try {\n await execaCommand(\n `yarn --silent prettier --list-different ${process.cwd()}/**/*.{js,jsx,ts,jsx} --ignore-path ${process.cwd()}/.eslintignore --config ${process.cwd()}/prettier.config.cjs --end-of-line auto`,\n { cwd: dirname(fileURLToPath(import.meta.url)) },\n );\n } catch (error) {\n const { stdout, stderr } = error as { stdout: string; stderr: string };\n\n const stderrWithoutPackageJsonWarning = stderr.replace(\n /warning [/.\\\\]*package\\.json: No license field[\\r\\n]*/g,\n '',\n );\n\n if (!stdout || stderrWithoutPackageJsonWarning) {\n throw error;\n }\n\n const ignoredFilePatterns = [\n // File from create-react-app not matching our formatting\n // https://github.com/facebook/create-react-app/blob/fdbde1f3c256b43d5386b5ae3a75083dbd8f0aff/packages/cra-template/template/src/reportWebVitals.js\n /src[/\\\\]reportWebVitals\\.js$/,\n\n // Files from create-next-app not matching our formatting\n // https://github.com/vercel/next.js/blob/5a73859fe8d3659d52e169f97188ae422e0d2ace/packages/create-next-app/templates/default/pages/api/hello.js\n /pages[/\\\\]api[/\\\\]hello\\.js$/,\n // https://github.com/vercel/next.js/blob/aacfa79ddf88e4e1488b63ac253af27110f0a151/packages/create-next-app/templates/default/pages/_app.js\n /pages[/\\\\]_app\\.js$/,\n ];\n\n const unformattedFiles = normalizeNewline(stdout)\n .split('\\n')\n .map((file) =>\n // Make paths relative to the project instead of Preflight, eg:\n // before: ../../../../../../projects/random-color-generator-react-app/src/reportWebVitals.js\n // after: random-color-generator-react-app/src/reportWebVitals.js\n file.replace(/^([A-Z]:|\\.\\.[/\\\\])[a-zA-Z0-9-_/.\\\\ ]*projects[/\\\\]/, ''),\n )\n .filter(\n (file) =>\n !ignoredFilePatterns.some((ignoredFilePattern) =>\n ignoredFilePattern.test(file),\n ),\n );\n\n if (unformattedFiles.length > 0) {\n throw new Error(\n `Prettier has not been run in the following files:\n ${unformattedFiles.join('\\n')}\n\n For each of the files above, open the file in your editor and save the file. This will format the file with Prettier, which will cause changes to appear in Git.\n\n In some very uncommon cases (this probably doesn't apply to you), the mismatch may come from inconsistent end of line characters. Read more here: https://github.com/upleveled/answers/issues/31\n `,\n );\n }\n }\n}\n","import path from 'node:path';\nimport commandExample from '../util/commandExample';\n\nexport const title = 'Project folder name matches correct format';\n\nexport default function projectFolderNameMatchesCorrectFormat() {\n const currentDirectoryName = path.basename(process.cwd());\n const lowercaseHyphenedDirectoryName = currentDirectoryName\n .toLowerCase()\n .replaceAll(' ', '-');\n\n if (currentDirectoryName !== lowercaseHyphenedDirectoryName) {\n throw new Error(\n `Project directory name \"${currentDirectoryName}\" doesn't match the correct format (no spaces or uppercase letters).\n\n Rename the directory to the correct name \"${lowercaseHyphenedDirectoryName}\" with the following sequence of commands:\n\n ${commandExample('cd ..')}\n ${commandExample(\n `mv ${currentDirectoryName} ${lowercaseHyphenedDirectoryName}`,\n )}\n ${commandExample(`cd ${lowercaseHyphenedDirectoryName}`)}\n `,\n );\n }\n}\n","import { execaCommand } from 'execa';\nimport commandExample from '../util/commandExample';\n\nexport const title = 'Use single package manager';\n\nexport default async function useSinglePackageManager() {\n const { stdout } = await execaCommand('git ls-files package-lock.json');\n\n if (stdout !== '') {\n throw new Error(\n `package-lock.json file committed to Git. Remove it with:\n\n ${commandExample('git rm --cached <filename>')}\n\n After you've removed it, you can delete the file with:\n\n ${commandExample('rm <filename>')}\n\n The presence of this file indicates that npm was incorrectly used in addition to Yarn (eg. an \"npm install\" command was run). In order to avoid issues with the state of the yarn.lock file, we suggest also forcing regeneration this file with the following command:\n\n ${commandExample('yarn --force')}\n `,\n );\n }\n}\n","import { Listr } from 'listr2';\nimport * as allChangesCommittedToGit from './checks/allChangesCommittedToGit.js';\nimport * as eslint from './checks/eslint.js';\nimport * as eslintConfigIsValid from './checks/eslintConfigIsValid.js';\nimport * as linkOnGithubAbout from './checks/linkOnGithubAbout.js';\nimport * as nodeModulesIgnoredFromGit from './checks/nodeModulesIgnoredFromGit.js';\nimport * as nextJsProjectHasSharpInstalled from './checks/noDependencyProblems/nextJsProjectHasSharpInstalled.js';\nimport * as noDependenciesWithoutTypes from './checks/noDependencyProblems/noDependenciesWithoutTypes.js';\nimport * as noUnusedAndMissingDependencies from './checks/noDependencyProblems/noUnusedDependencies.js';\nimport * as noExtraneousFilesCommittedToGit from './checks/noExtraneousFilesCommittedToGit.js';\nimport * as noSecretsCommittedToGit from './checks/noSecretsCommittedToGit.js';\nimport * as preflightIsLatestVersion from './checks/preflightIsLatestVersion.js';\nimport * as prettier from './checks/prettier.js';\nimport * as projectFolderNameMatchesCorrectFormat from './checks/projectFolderNameMatchesCorrectFormat.js';\nimport * as useSinglePackageManager from './checks/useSinglePackageManager.js';\nimport { CtxParam } from './types/CtxParam.js';\nimport { TaskParam } from './types/TaskParam.js';\nimport {\n preflightPackageJson,\n projectPackageJson,\n} from './util/packageJson.js';\n\nconsole.log(`🚀 UpLeveled Preflight v${preflightPackageJson.version}`);\n\nconst listrTasks = [\n // ======= Sync Tasks =======\n // Git\n allChangesCommittedToGit,\n nodeModulesIgnoredFromGit,\n noExtraneousFilesCommittedToGit,\n noSecretsCommittedToGit,\n\n // Package managers\n useSinglePackageManager,\n\n // Project setup\n projectFolderNameMatchesCorrectFormat,\n\n // ======= Async Tasks =======\n // Dependencies\n {\n title: 'No dependency problems',\n task: (ctx: CtxParam, task: TaskParam): Listr =>\n task.newListr([\n ...(!projectPackageJson.dependencies ||\n !Object.keys(projectPackageJson.dependencies).includes('next')\n ? []\n : [\n {\n title: nextJsProjectHasSharpInstalled.title,\n task: nextJsProjectHasSharpInstalled.default,\n },\n ]),\n {\n title: noUnusedAndMissingDependencies.title,\n task: noUnusedAndMissingDependencies.default,\n },\n {\n title: noDependenciesWithoutTypes.title,\n task: noDependenciesWithoutTypes.default,\n },\n ]),\n },\n\n // GitHub\n linkOnGithubAbout,\n\n // Linting\n eslint,\n prettier,\n\n // Version and configuration checks\n eslintConfigIsValid,\n preflightIsLatestVersion,\n].map((module) => {\n if ('task' in module) return module;\n return {\n title: module.title,\n task: module.default,\n };\n});\n\nawait new Listr(listrTasks, {\n exitOnError: false,\n rendererOptions: {\n collapseErrors: false,\n removeEmptyLines: false,\n formatOutput: 'wrap',\n },\n fallbackRenderer: 'verbose',\n concurrent: 5,\n}).run();\n"],"names":["emptyBrailleCharacter","commandExample","command","chalk","dim","isDrone","stdout","execaCommand","reject","test","title","allChangesCommittedToGit","replSlug","isRunningInReplIt","fs","writeFile","onlyYarnLockModifiedOnDrone","trim","Error","CRLF","normalizeNewline","input","TypeError","replace","RegExp","eslintCheck","error","lines","split","length","filter","line","map","match","reduce","linesWithoutDuplicates","includes","push","join","require","createRequire","process","cwd","eslintConfigIsValid","remoteVersion","localVersion","eslintConfigPackageJsonPath","resolve","JSON","parse","readFile","version","err","semver","gt","eslintConfigMatches","eslintDisableOccurrences","path","readdirp","directoryFilter","fileFilter","fileContents","randomUserAgent","randomIndex","Math","floor","random","userAgents","linkOnGithubAbout","repoUrl","html","fetch","text","$","cheerio","load","urlInAboutSection","nextAll","children","next","attr","response","headers","ok","status","statusText","nodeModulesIgnoredFromGit","nodeModulesInGitignore","found","projectPackageJson","preflightPackageJson","URL","import","meta","url","nextJsProjectHasSharpInstalled","dependenciesPackageNames","Object","keys","dependencies","client","algoliasearch","index","initIndex","noDependenciesWithoutTypes","devDependencies","dependenciesWithMissingTypes","pReduce","filteredDependencies","dependency","packageJsonPath","modulePackageJson","indexDTsPath","existsSync","results","getObject","attributesToRetrieve","definitelyTypedPackageName","types","definitelyTyped","preflightBinPath","dirname","fileURLToPath","noUnusedAndMissingDependencies","ignoredPackagePatterns","startsWith","unusedDependenciesStdout","missingDependenciesStdout","messages","str","missingDependenciesStdoutFiltered","missingDependency","some","excludedDependency","noExtraneousFilesCommittedToGit","noSecretsCommittedToGit","preflightIsLatestVersion","os","platform","prettierCheck","stderr","stderrWithoutPackageJsonWarning","ignoredFilePatterns","unformattedFiles","file","ignoredFilePattern","projectFolderNameMatchesCorrectFormat","currentDirectoryName","basename","lowercaseHyphenedDirectoryName","toLowerCase","replaceAll","useSinglePackageManager","console","log","listrTasks","task","ctx","newListr","eslint","prettier","module","default","Listr","exitOnError","rendererOptions","collapseErrors","removeEmptyLines","formatOutput","fallbackRenderer","concurrent","run"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@upleveled/preflight",
3
- "version": "1.23.6",
3
+ "version": "1.23.8",
4
4
  "author": "UpLeveled (https://github.com/upleveled)",
5
5
  "contributors": [
6
6
  "José Fernando Höwer Barbosa <josehowerupn@gmail.com>",
@@ -51,7 +51,7 @@
51
51
  "babel-jest": "29.5.0",
52
52
  "eslint": "8.38.0",
53
53
  "eslint-config-react-app": "7.0.1",
54
- "eslint-config-upleveled": "4.0.12",
54
+ "eslint-config-upleveled": "4.0.13",
55
55
  "eslint-import-resolver-typescript": "3.5.5",
56
56
  "eslint-plugin-cypress": "2.13.2",
57
57
  "eslint-plugin-flowtype": "8.0.3",
@@ -80,7 +80,7 @@
80
80
  "cheerio": "1.0.0-rc.12",
81
81
  "depcheck": "1.4.3",
82
82
  "execa": "7.1.1",
83
- "listr2": "6.2.0",
83
+ "listr2": "6.3.1",
84
84
  "node-fetch": "3.3.1",
85
85
  "p-reduce": "3.0.0",
86
86
  "patch-package": "6.5.1",
@@ -32,7 +32,7 @@ export default async function eslintCheck() {
32
32
  }, [])
33
33
  .join('\n')}
34
34
 
35
- Open these files in your editor - there should be problems to fix.
35
+ Open these files in your editor - there should be problems to fix
36
36
  `,
37
37
  );
38
38
  }
@@ -10,14 +10,14 @@ export const title = 'ESLint config is latest version';
10
10
 
11
11
  export default async function eslintConfigIsValid() {
12
12
  const { stdout: remoteVersion } = await execaCommand(
13
- 'npm show @upleveled/eslint-config-upleveled version',
13
+ 'npm show eslint-config-upleveled version',
14
14
  );
15
15
 
16
16
  let localVersion;
17
17
 
18
18
  try {
19
19
  const eslintConfigPackageJsonPath = require.resolve(
20
- '@upleveled/eslint-config-upleveled/package.json',
20
+ 'eslint-config-upleveled/package.json',
21
21
  );
22
22
 
23
23
  localVersion = JSON.parse(
@@ -27,14 +27,15 @@ export default async function eslintConfigIsValid() {
27
27
 
28
28
  if (typeof localVersion === 'undefined') {
29
29
  throw new Error(
30
- `The UpLeveled ESLint config has not been installed. Please install using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled
30
+ `The UpLeveled ESLint Config has not been installed - please install using the instructions on https://www.npmjs.com/package/eslint-config-upleveled
31
31
  `,
32
32
  );
33
33
  }
34
34
 
35
35
  if (semver.gt(remoteVersion, localVersion)) {
36
36
  throw new Error(
37
- `Your current version of the UpLeveled ESLint config (${localVersion}) is out of date. The latest version is ${remoteVersion}. Upgrade by running all lines of the install instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled`,
37
+ `Your current version of the UpLeveled ESLint Config (${localVersion}) is older than the latest version ${remoteVersion} - upgrade by running all lines of the install instructions on https://www.npmjs.com/package/eslint-config-upleveled
38
+ `,
38
39
  );
39
40
  }
40
41
 
@@ -45,20 +46,20 @@ export default async function eslintConfigIsValid() {
45
46
  (await fs.readFile('./.eslintrc.cjs', 'utf-8')).trim() ===
46
47
  `/** @type {import('@typescript-eslint/utils').TSESLint.Linter.Config} */
47
48
  const config = {
48
- extends: ['@upleveled/upleveled'],
49
+ extends: ['upleveled'],
49
50
  };
50
51
 
51
52
  module.exports = config;`;
52
53
  } catch (err) {
53
54
  throw new Error(
54
- `Error reading your .eslintrc.cjs file. Please reinstall the config using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled
55
+ `Error reading your .eslintrc.cjs file - please reinstall the config using the instructions on https://www.npmjs.com/package/eslint-config-upleveled
55
56
  `,
56
57
  );
57
58
  }
58
59
 
59
60
  if (!eslintConfigMatches) {
60
61
  throw new Error(
61
- `Your ESLint config file .eslintrc.cjs does not match the configuration file template. Please reinstall the config using the instructions on https://www.npmjs.com/package/@upleveled/eslint-config-upleveled
62
+ `Your ESLint config file .eslintrc.cjs does not match the configuration file template - please reinstall the config using the instructions on https://www.npmjs.com/package/eslint-config-upleveled
62
63
  `,
63
64
  );
64
65
  }
@@ -80,7 +81,7 @@ module.exports = config;`;
80
81
  `ESLint has been disabled in the following files:
81
82
  ${eslintDisableOccurrences.join('\n')}
82
83
 
83
- Remove all comments disabling or modifying ESLint rule configuration (eg. eslint-disable and eslint-disable-next-line comments) and fix the problems.
84
+ Remove all comments disabling or modifying ESLint rule configuration (eg. eslint-disable and eslint-disable-next-line comments) and fix the problems
84
85
  `,
85
86
  );
86
87
  }
@@ -25,6 +25,14 @@ export default async function noUnusedAndMissingDependencies() {
25
25
  'babel-eslint',
26
26
  'eslint-config-next',
27
27
 
28
+ // TODO: Remove this once depcheck issue is fixed:
29
+ // PR: https://github.com/depcheck/depcheck/pull/790
30
+ // Issue: https://github.com/depcheck/depcheck/issues/791
31
+ //
32
+ // Stylelint configuration
33
+ 'stylelint',
34
+ 'stylelint-config-upleveled',
35
+
28
36
  // Testing
29
37
  'babel-jest',
30
38
  'cypress',
@@ -77,7 +85,7 @@ export default async function noUnusedAndMissingDependencies() {
77
85
 
78
86
  if (missingDependenciesStdout) {
79
87
  /**
80
- * Temporary workaround to filter out @upleveled/eslint-config-upleveled peer dependencies
88
+ * Temporary workaround to filter out eslint-config-upleveled peer dependencies
81
89
  * not listed in `package.json`, which are flagged as missing dependencies by depcheck
82
90
  *
83
91
  * TODO: Remove this variable once this depcheck issue is fixed:
@@ -92,7 +100,7 @@ export default async function noUnusedAndMissingDependencies() {
92
100
  '@next/eslint-plugin-next',
93
101
  '@typescript-eslint/eslint-plugin',
94
102
  '@typescript-eslint/parser',
95
- '@upleveled/eslint-plugin-upleveled',
103
+ 'eslint-plugin-upleveled',
96
104
  'eslint-config-react-app',
97
105
  'eslint-import-resolver-typescript',
98
106
  'eslint-plugin-import',
@@ -15,7 +15,7 @@ export default async function preflightIsLatestVersion() {
15
15
  throw new Error(
16
16
  `Your current version of Preflight (${
17
17
  preflightPackageJson.version
18
- }) is out of date. The latest version is ${remoteVersion}. Upgrade with:
18
+ }) is older than the latest version ${remoteVersion} - upgrade with:
19
19
 
20
20
  ${commandExample(
21
21
  `${