{"version":3,"file":"index.cjs","names":[],"sources":["../src/default/custom-element-executor.ts","../src/default/file-copy-element-executor.ts","../src/default/file-remove-element-executor.ts","../src/default/file-symlink-element-executor.ts","../src/default/package-json-element-executor.ts","../src/helpers/discover-package-manager.function.ts","../src/helpers/is-managed-file.function.ts","../src/helpers/keep-only-first.function.ts","../src/plugin/autotool-plugin.options.ts","../src/plugin/autotool.function.options.ts","../src/types/get-assumed-final-install-location-of-package.function.ts"],"sourcesContent":["import type { AutotoolElementExecutor } from '../types/autotool-element-executor.interface.js';\nimport type {\n\tAutotoolElement,\n\tUntargetedAutotoolElement,\n} from '../types/autotool-element.interface.js';\n\nexport interface AutotoolElementCustom extends UntargetedAutotoolElement<'custom'> {\n\tapply: AutotoolElementExecutor<this>['execute'];\n}\n\nexport const isAutotoolElementCustom = (\n\telement: AutotoolElement,\n): element is AutotoolElementCustom => {\n\treturn element.executor === 'custom';\n};\n","import type { AutotoolElement } from 'autotool-plugin';\nimport type { BuiltInParserName } from 'prettier';\n\nexport type Transformer = (content: string) => string;\n\nexport interface AutotoolElementFileCopy extends AutotoolElement<'fileCopy'> {\n\t/**\n\t * Should be a relative path from the packages directory.\n\t */\n\tsourceFile: string;\n\n\t/**\n\t * The name of the declaring package, this will be used when an element\n\t * needs to read a file within the installed plugins node_module\n\t */\n\tsourcePluginPackageName: string;\n\n\t/**\n\t * Transform the file as it being distributed. It runs BEFORE subtituting\n\t * variables so you can add additional ones. Including the ones defined in\n\t * templateVariables.\n\t *\n\t * @defaultValue []\n\t */\n\ttransformers?: Transformer[];\n\n\t/**\n\t * Should the copied file be marked as executable by the current user\n\t *\n\t * Use this when distributing scripts\n\t *\n\t * @defaultValue false\n\t */\n\tmarkAsExecutable?: boolean;\n\n\t/**\n\t * When defined, right before writing the file, it will try to format\n\t * it using prettier and the users config. Use 'babel' for js/cjs files,\n\t * 'json' for .json, and so on.\n\t *\n\t * You can also just set it to true to guess the parser from the target\n\t * files extension\n\t *\n\t * @defaultValue undefined\n\t */\n\tformatWithPrettier?: true | BuiltInParserName | undefined;\n}\n\nexport const isAutotoolElementFileCopy = (\n\telement: AutotoolElement,\n): element is AutotoolElementFileCopy => {\n\treturn element.executor === 'fileCopy';\n};\n","import type { AutotoolElement } from 'autotool-plugin';\n\n/**\n * Removes the target file(s). Will conflict with 'fileCopy' if you try to\n * write and remove the same file.\n */\nexport type AutotoolElementFileRemove = AutotoolElement<'fileRemove'>;\n\nexport const isAutotoolElementFileRemove = (\n\telement: AutotoolElement,\n): element is AutotoolElementFileRemove => {\n\treturn element.executor === 'fileRemove';\n};\n","import type { AutotoolElement } from 'autotool-plugin';\n\nexport interface AutotoolElementFileSymlink extends AutotoolElement<'fileSymlink'> {\n\tsourceFile: string;\n\tsourcePluginPackageName: string;\n}\n\nexport const isAutotoolElementFileSymlink = (\n\telement: AutotoolElement,\n): element is AutotoolElementFileSymlink => {\n\treturn element.executor === 'fileSymlink';\n};\n","import type { ObjectKeyOrder } from '@alexaegis/common';\nimport type { PackageJson } from '@alexaegis/workspace-tools';\nimport type { UntargetedAutotoolElement } from 'autotool-plugin';\n\nexport interface AutotoolElementPackageJson extends UntargetedAutotoolElement<'packageJson'> {\n\tdata: PackageJson;\n\t/**\n\t * You can think of this as the power of this element. Higher passes\n\t * always overwrite lower ones. Can be used to forcefully remove/overwrite\n\t * things other plugins would define.\n\t *\n\t * @default 0\n\t */\n\tconsolidationPass?: number;\n\tsortingPreference?: ObjectKeyOrder;\n}\n\nexport const isAutotoolElementPackageJson = (\n\telement: UntargetedAutotoolElement,\n): element is AutotoolElementPackageJson => {\n\treturn element.executor === 'packageJson';\n};\n","import type { Awaitable } from '@alexaegis/common';\nimport { asyncMap } from '@alexaegis/common';\nimport type { RootWorkspacePackage } from '@alexaegis/workspace-tools';\nimport type { NormalizedAutotoolOptions } from 'autotool-plugin';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn';\n\nexport const installCommands: {\n\t[K in PackageManagerName]: `${K}${string}`;\n} = {\n\tnpm: 'npm install',\n\tpnpm: 'pnpm install',\n\tyarn: 'yarn install',\n};\n\ntype Evidence = (\n\trootWorkspacePackage: RootWorkspacePackage,\n\toptions: NormalizedAutotoolOptions,\n) => Awaitable<boolean>;\n\nconst evidenceMap: Record<PackageManagerName, Evidence[]> = {\n\tpnpm: [\n\t\t(rootWorkspacePackage) =>\n\t\t\texistsSync(join(rootWorkspacePackage.packagePath, 'pnpm-lock.yaml')),\n\t\t(rootWorkspacePackage) =>\n\t\t\trootWorkspacePackage.packageJson.packageManager?.startsWith('pnpm') ?? false,\n\t],\n\tnpm: [\n\t\t(rootWorkspacePackage) =>\n\t\t\texistsSync(join(rootWorkspacePackage.packagePath, 'package-lock.json')),\n\t\t(rootWorkspacePackage) =>\n\t\t\trootWorkspacePackage.packageJson.packageManager?.startsWith('npm') ?? false,\n\t],\n\tyarn: [\n\t\t(rootWorkspacePackage) => existsSync(join(rootWorkspacePackage.packagePath, 'yarn.lock')),\n\t\t(rootWorkspacePackage) =>\n\t\t\trootWorkspacePackage.packageJson.packageManager?.startsWith('yarn') ?? false,\n\t],\n};\n\nexport interface PackageManager<T extends PackageManagerName = PackageManagerName> {\n\tname: T;\n\tinstallCommand: (typeof installCommands)[T];\n}\n\n/**\n * Returns the most likely packageManager being used, or errors out if none\n * found.\n *\n * @throws if no package manager is found\n */\nexport const discoverPackageManager = async (\n\trootWorkspacePackage: RootWorkspacePackage,\n\toptions: NormalizedAutotoolOptions,\n): Promise<PackageManager> => {\n\toptions.logger.trace('gathering evidence...');\n\tconst results = await asyncMap(\n\t\tObject.entries(evidenceMap),\n\t\tasync ([packageManagerName, evidences]) => {\n\t\t\tconst evidenceFound = await asyncMap(\n\t\t\t\tevidences,\n\t\t\t\tasync (evidence) => await evidence(rootWorkspacePackage, options),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tpackageManagerName: packageManagerName as PackageManagerName,\n\t\t\t\tevidenceFound: evidenceFound.filter((result) => !!result).length,\n\t\t\t};\n\t\t},\n\t);\n\n\tresults.sort((a, b) => b.evidenceFound - a.evidenceFound);\n\n\toptions.logger.trace('evidence found', results);\n\n\tconst packageManagerWithMostEvidence = results[0]?.packageManagerName;\n\n\tif (!packageManagerWithMostEvidence) {\n\t\tthrow new Error('No package manager can be determined!');\n\t}\n\n\toptions.logger.trace('packageManagerWithMostEvidence', packageManagerWithMostEvidence);\n\n\treturn {\n\t\tname: packageManagerWithMostEvidence,\n\t\tinstallCommand: installCommands[packageManagerWithMostEvidence],\n\t};\n};\n","import { readFile } from 'node:fs/promises';\n\nexport const AUTOTOOL_MARK = 'managed-by-autotool';\n\n/**\n * @deprecated remove\n */\nexport const OLD_MARK = 'autogenerated';\n\nexport const isManagedContent = (content: string, mark = AUTOTOOL_MARK): boolean => {\n\treturn content.includes(mark) || content.includes(OLD_MARK);\n};\n\nexport const isManagedFile = async (path: string, mark = AUTOTOOL_MARK): Promise<boolean> => {\n\ttry {\n\t\tconst content = await readFile(path, { encoding: 'utf8' });\n\t\treturn isManagedContent(content, mark);\n\t} catch (error) {\n\t\t// The file not exists error is the only one we treat as valid\n\t\treturn (error as NodeJS.ErrnoException).code === 'ENOENT';\n\t}\n};\n","/**\n * A simple premade consolidator that keeps only the first element in an array\n * Useful for elements that wouldn't make a differents if multiple of them would\n * be applied to a single file like removing it\n */\nexport const keepOnlyFirst = <T>(elements: T[]): T[] => {\n\tconst first = elements[0];\n\treturn first ? [first] : [];\n};\n","import { normalizeDryOption, normalizeForceOption, type Defined } from '@alexaegis/common';\nimport { normalizeCwdOption } from '@alexaegis/fs';\nimport { normalizeLoggerOption } from '@alexaegis/logging';\nimport type { RootWorkspacePackage, WorkspacePackage } from '@alexaegis/workspace-tools';\nimport type { PackageManager } from '../helpers/discover-package-manager.function.js';\nimport type {\n\tAdditionalAutotoolOptions,\n\tNormalizedAdditionalAutotoolOptions,\n} from './autotool.function.options.js';\n\nexport const AUTOTOOL_PLUGIN_NAME_PREFIX = 'autotool-plugin';\n\nexport interface BaseAutotoolPluginOptions {\n\trootWorkspacePackage: RootWorkspacePackage;\n\tallWorkspacePackages: WorkspacePackage[];\n\tpackageManager: PackageManager;\n}\n\nexport type NormalizedBaseAutotoolPluginOptions = Defined<BaseAutotoolPluginOptions>;\n\nexport type AutotoolPluginOptions = AdditionalAutotoolOptions & BaseAutotoolPluginOptions;\nexport type NormalizedAutotoolPluginOptions = NormalizedAdditionalAutotoolOptions &\n\tNormalizedBaseAutotoolPluginOptions;\n\nexport const normalizeAutotoolPluginOptions = (\n\toptions: AutotoolPluginOptions,\n): NormalizedAutotoolPluginOptions => {\n\treturn {\n\t\t...normalizeCwdOption(options),\n\t\t...normalizeLoggerOption(options),\n\t\t...normalizeDryOption(options),\n\t\t...normalizeForceOption(options),\n\t\trootWorkspacePackage: options.rootWorkspacePackage,\n\t\tallWorkspacePackages: options.allWorkspacePackages,\n\t\tpackageManager: options.packageManager,\n\t};\n};\n","import {\n\tnormalizeDryOption,\n\tnormalizeForceOption,\n\tnormalizeRegExpLikeToRegExp,\n\ttype Defined,\n\ttype DryOption,\n\ttype ForceOption,\n\ttype NormalizedDryOption,\n\ttype NormalizedForceOption,\n} from '@alexaegis/common';\nimport { normalizeCwdOption, type CwdOption, type NormalizedCwdOption } from '@alexaegis/fs';\nimport {\n\tnormalizeLoggerOption,\n\ttype LoggerOption,\n\ttype NormalizedLoggerOption,\n} from '@alexaegis/logging';\nimport {\n\tnormalizeCollectWorkspacePackagesOptions,\n\ttype CollectWorkspacePackagesOptions,\n\ttype NormalizedCollectWorkspacePackagesOptions,\n} from '@alexaegis/workspace-tools';\n\nexport interface BaseAutotoolOptions {\n\tdryish?: boolean;\n\tlistPlugins?: boolean;\n\tenabledPlugins?: (string | RegExp)[] | undefined;\n\tdisabledPlugins?: (string | RegExp)[] | undefined;\n\n\t/**\n\t * Autotool can re-run itself if a plugin adds more plugins. This allows\n\t * the usage of meta-plugins that just add more plugins. The default value\n\t * is 3 meaning a meta plugin can install more meta plugins but those can't\n\t * install more meta plugins.\n\t *\n\t * To avoid infinite loops this option is lowered every time a new\n\t * recursion happens. If it's less than 0, autotool exits immediately,\n\t * breaking the loop.\n\t *\n\t * You usually don't want to change this value, but by changing it to 1\n\t * you can effectively disable recursion. Or you can increase it if your\n\t * setup needs it.\n\t *\n\t * @internal\n\t * @defaultValue 3\n\t */\n\tmaxAllowedRecursion?: number | undefined;\n}\n\nexport type AdditionalAutotoolOptions = CwdOption & LoggerOption & DryOption & ForceOption;\nexport type NormalizedAdditionalAutotoolOptions = NormalizedCwdOption &\n\tNormalizedLoggerOption &\n\tNormalizedDryOption &\n\tNormalizedForceOption;\n\nexport type AutotoolOptions = BaseAutotoolOptions &\n\tAdditionalAutotoolOptions &\n\tCollectWorkspacePackagesOptions;\n\nexport type NormalizedAutotoolOptions = Omit<\n\tDefined<BaseAutotoolOptions>,\n\t'enabledPlugins' | 'disabledPlugins'\n> & {\n\tenabledPlugins: RegExp[];\n\tdisabledPlugins: RegExp[];\n} & NormalizedAdditionalAutotoolOptions &\n\tNormalizedCollectWorkspacePackagesOptions;\n\n/**\n * Same as NormalizedAutotoolOptions but without options that are not relevant\n * or already normalized by the time an element is applied.\n */\nexport type AutotoolElementApplyOptions = Pick<BaseAutotoolOptions, 'maxAllowedRecursion'> &\n\tNormalizedAdditionalAutotoolOptions;\n\nexport const normalizeAutotoolOptions = (options?: AutotoolOptions): NormalizedAutotoolOptions => {\n\treturn {\n\t\t...normalizeCwdOption(options),\n\t\t...normalizeLoggerOption(options),\n\t\t...normalizeDryOption(options),\n\t\t...normalizeForceOption(options),\n\t\t...normalizeCollectWorkspacePackagesOptions(options),\n\t\tenabledPlugins: options?.enabledPlugins?.map(normalizeRegExpLikeToRegExp) ?? [],\n\t\tdisabledPlugins: options?.disabledPlugins?.map(normalizeRegExpLikeToRegExp) ?? [],\n\t\tdryish: options?.dryish ?? false,\n\t\tlistPlugins: options?.listPlugins ?? false,\n\t\tmaxAllowedRecursion: options?.maxAllowedRecursion ?? 3,\n\t};\n};\n","import type { RootWorkspacePackage } from '@alexaegis/workspace-tools';\nimport { join } from 'node:path';\n\nexport const getAssumedFinalInstallLocationOfPackage = (\n\trootWorkspacePackage: RootWorkspacePackage,\n\tpackageJsonName: string,\n): string => {\n\treturn join(rootWorkspacePackage.packagePath, 'node_modules', ...packageJsonName.split('/'));\n};\n"],"mappings":"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"}