UNPKG

@anolilab/package-json-utils

Version:

Shared utilities for parsing information from a package.json.

1 lines 10.6 kB
{"version":3,"sources":["../src/index.ts"],"names":["existsSync","realpathSync","module","dirname","join","cwd","env","exit","versions","getByPath","readPkgUp","packageJson","packagePath","atLatest","name","getPackageProperty","property","getPackageSubProperty","packageProperty","hasPackageProperty","hasPackageSubProperty","hasPackageProperties","properties","strict","hasPackageSubProperties","p","environmentIsSet","parseEnvironment","defaultValue","projectPath","appDirectory","fromRoot","hasFile","hasScripts","hasPeerDependency","hasPeerDependencies","hasDependency","hasDependencies","hasDevDependency","hasDevDependencies","hasAnyDep","arguments_","options","function_","hasTypescript","packageIsTypeModule","resolvePackage","packageName","targetModule","resolved","__require","isPackageAvailable","showMissingPackages","packages","s","element","unique","array","pkg"],"mappings":"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","sourcesContent":["import { existsSync, realpathSync } from \"node:fs\";\nimport module from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { cwd, env, exit, versions } from \"node:process\";\n\nimport { getByPath } from \"dot-path-value\";\nimport type { NormalizedPackageJson } from \"read-pkg\";\nimport readPkgUp from \"read-pkg-up\";\n\nconst { packageJson, path: packagePath } = readPkgUp.sync({\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n cwd: realpathSync(cwd()),\n}) ?? { packageJson: undefined, path: undefined };\n\nconst atLatest = (name: string): string => {\n if (!name.split(\"@\").includes(\"@\")) {\n return `${name}@latest`;\n }\n\n return name;\n};\n\nexport const getPackageProperty = <T = unknown>(property: string): T | undefined => {\n if (packageJson === undefined) {\n return undefined;\n }\n\n return getByPath(packageJson, property) as T | undefined;\n};\n\nexport const getPackageSubProperty =\n <T = unknown>(packageProperty: string) =>\n (property: string): T | undefined =>\n getPackageProperty<T>(`${packageProperty}.${property}`);\n\nexport const hasPackageProperty = (property: string): boolean => Boolean(packageJson !== undefined && getByPath(packageJson, property));\n\nexport const hasPackageSubProperty =\n (packageProperty: string) =>\n (property: string): boolean =>\n hasPackageProperty(`${packageProperty}.${property}`);\n\nexport const hasPackageProperties = (properties: string[], strict?: boolean): boolean => {\n if (strict) {\n return properties.every((property: string) => hasPackageProperty(property));\n }\n\n return properties.some((property: string) => hasPackageProperty(property));\n};\n\nexport const hasPackageSubProperties =\n (packageProperty: string) =>\n (properties: string[], strict?: boolean): boolean =>\n hasPackageProperties(\n properties.map((p) => `${packageProperty}.${p}`),\n strict,\n );\n\n// eslint-disable-next-line security/detect-object-injection\nexport const environmentIsSet = (name: string): boolean => Boolean(env[name] && env[name] !== \"undefined\");\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const parseEnvironment = <ReturnValue = any>(name: string, defaultValue: ReturnValue): ReturnValue => {\n if (environmentIsSet(name)) {\n try {\n // eslint-disable-next-line security/detect-object-injection,@typescript-eslint/no-unsafe-return\n return JSON.parse(env[name] ?? \"\");\n } catch {\n // eslint-disable-next-line security/detect-object-injection\n return env[name] as ReturnValue;\n }\n }\n\n return defaultValue;\n};\n\nexport const projectPath: string = packagePath ? dirname(packagePath) : \"\";\n// @deprecated Use `projectPath` instead.\nexport const appDirectory: string = projectPath;\nexport const fromRoot = (...p: string[]): string => join(projectPath, ...p);\n// eslint-disable-next-line security/detect-non-literal-fs-filename\nexport const hasFile = (...p: string[]): boolean => existsSync(fromRoot(...p));\n\nexport const hasScripts = hasPackageSubProperties(\"scripts\");\nexport const hasPeerDependency = hasPackageSubProperty(\"peerDependencies\");\nexport const hasPeerDependencies = hasPackageSubProperties(\"peerDependencies\");\nexport const hasDependency = hasPackageSubProperty(\"dependencies\");\nexport const hasDependencies = hasPackageSubProperties(\"dependencies\");\n// eslint-disable-next-line unicorn/prevent-abbreviations\nexport const hasDevDependency = hasPackageSubProperty(\"devDependencies\");\n// eslint-disable-next-line unicorn/prevent-abbreviations\nexport const hasDevDependencies = hasPackageSubProperties(\"devDependencies\");\n\nexport const hasAnyDep = (arguments_: string[], options?: { peerDeps?: boolean; strict?: boolean }): boolean =>\n [hasDependencies, hasDevDependencies, options?.peerDeps === false ? () => false : hasPeerDependencies].some((function_) =>\n function_(arguments_, options?.strict),\n );\n\nexport const hasTypescript: boolean = (hasDependency(\"typescript\") || hasDevDependency(\"typescript\")) && hasFile(\"tsconfig.json\");\n\nexport const packageIsTypeModule = hasPackageProperties([\"type\"]) && packageJson?.[\"type\"] === \"module\";\n\nexport const resolvePackage = (packageName: string): string | undefined => {\n // See https://yarnpkg.com/advanced/pnpapi\n if (versions[\"pnp\"]) {\n const targetModule = import.meta.url;\n // @ts-expect-error TS2339: Property 'findPnpApi' does not exist on type 'typeof Module'.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-assignment\n const targetPnp = module.findPnpApi(targetModule);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment\n const resolved = targetPnp.resolveRequest(packageName, targetModule);\n\n if (resolved) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return resolved;\n }\n } else if (packageIsTypeModule) {\n const targetModule = import.meta.url;\n // See https://nodejs.org/api/esm.html#esm_resolver_algorithm\n try {\n return module.createRequire(targetModule).resolve(packageName);\n } catch {\n return undefined;\n }\n }\n\n try {\n return require.resolve(packageName);\n } catch {\n return undefined;\n }\n};\n\nexport const isPackageAvailable = (packageName: string): boolean => {\n const resolved = resolvePackage(packageName);\n\n return resolved !== undefined;\n};\n\nexport const showMissingPackages = (\n packageName: string,\n packages: string[],\n options: {\n consoleType?: \"error\" | \"info\" | \"log\" | \"warn\";\n exit?: boolean;\n postMessage?: string;\n preMessage?: string;\n } = {},\n): void => {\n const s = packages.length === 1 ? \"\" : \"s\";\n\n console[options.consoleType ?? \"warn\"](`\\n${options.preMessage ?? \"\"}\n${packageName} could not find the following package${s}\n\n ${packages.join(\"\\n \")}\n\nTo install the missing package${s}, please run the following command:\n\n npm install ${packages.map((element) => atLatest(element)).join(\" \")} --save-dev\n\nor\n\n yarn add ${packages.map((element) => atLatest(element)).join(\" \")} --dev\n\nor\n\n pnpm add ${packages.map((element) => atLatest(element)).join(\" \")} -D\n${options.postMessage ?? \"\"}\\n\n`);\n\n if (env[\"NODE_ENV\"] !== \"test\" || options.exit === true) {\n exit(1);\n }\n};\n\nexport const unique = (array: unknown[]): unknown[] => [...new Set(array)];\n\n// eslint-disable-next-line unicorn/prevent-abbreviations\nexport const pkg = packageJson as NormalizedPackageJson | undefined;\n"]}