@repka-kit/ts
Version:
Next generation build tools for monorepo: lint, bundle and package your TypeScript projects
541 lines (537 loc) • 18.5 kB
TypeScript
// Generated by dts-bundle-generator v8.0.1
import { ChildProcess, SpawnOptions } from 'child_process';
import fg from 'fast-glob';
import { InputPluginOption, Plugin, ResolveIdHook, RollupWatchOptions } from 'rollup';
export type PackageJsonExports = JsonPrimitive | {
[keyOrCondition: string]: PackageJsonExports;
};
export type JsonPrimitive = boolean | number | string | null;
export type JsonObject = {
[key: string]: JsonType | JsonPrimitive;
};
export type JsonType = JsonObject | JsonPrimitive;
export type PackageJson = {
name?: string;
version?: string;
type?: string;
types?: string;
typings?: string;
main?: string;
scripts?: Record<string, string>;
exports?: PackageJsonExports;
bin?: string | Record<string, string>;
dependencies?: Record<string, string>;
devDependencies?: Record<string, string>;
peerDependencies?: Record<string, string>;
} & Record<string, JsonType>;
/**
* Normalized and validated config that is typically built
* from package.json of the package being linted, bundled or
* tested
*
* The config is designed for Node.js npm packages/libraries or CLI's
*/
export type NodePackageConfig = {
/**
* Name of the package as specified in package.json
*/
name: string;
/**
* Version of the package as specified in package.json
*/
version: string;
/**
* Entry points of the package that can be imported/executed
* by the consumers. These are specified via "exports" value
* of the package.json. Entry points represents one or more
* chunks to be bundled and need to point to the TypeScript
* source code relative to the package root.
*
* After bundling, the entry points would be written to `./dist`
* directory and for every input entry point there is going to be
* an output entry point in `./dist/package.json` "exports" value
* and those would point to the bundled chunks in the published
* version of the package.
*/
entryPoints: Array<PackageExportsEntryPoint>;
/**
* Entry points of the package that can be executed using
* command line and installed into node_modules/.bin. These
* are specified, as usual, via package.json "bin" value.
* The paths are relative to the package root and should
* point to the TypeScript source code of the bin with
* "shebang" at the top.
*
* The "shebang" is a special comment at the top of the file
* that tells the system how to execute the file.
*
* For example:
*
* ```TypeScript
* #!/usr/bin/env tsx
* ```
*
* The above shebang tells the environment to execute
* the file using "tsx" executable - which will transform
* the TypeScript source code into JavaScript and execute
* it via node.
*
* The shebang is optional and if not specified - the "bin"
* will not be executable at dev-time.
*
* After bundling, the bin entry points would be written to
* `./dist/bin` directory and for every input bin entry point
* there is going to be an output bin entry point in
* `./dist/package.json` "bin" value and those would point
* to the bundled chunks in the published version of the
* package.
*
* After building the package - the bundled version of the
* code will have the shebang added automatically and point
* to "node".
*/
binEntryPoints: Array<PackageBinEntryPoint>;
/**
* Entry points of the package that couldn't be parsed and were
* ignored - they should be rendered out as is.
*/
ignoredEntryPoints?: Record<string, PackageJsonExports>;
/**
* Bin entry points of the package that couldn't be parsed and were
* ignored - they should be rendered out as is.
*/
ignoredBinEntryPoints?: Record<string, string>;
/**
* Package dependencies of the package where the key
* is package name and value is the version of the package.
*
* NOTE: Version is as is and can be dependency
* manager specific, ie "workspace:*" when pnpm is used
*/
dependencies: Record<string, string>;
/**
* Dev-time only dependencies of the package
*/
devDependencies: Record<string, string>;
};
/**
* Represents single bundled entry from package.json exports object
*
* ```json
* ".": "./src/index.ts",
* "./feature": "./src/feature/index.ts",
* "./configs/*": {
* "bundle": "./src/configs/*.ts",
* "default": "./dist/configs/*"
* }
* ```
* Contains at least 2 entries, where
* `"."` and `"./feature"` - are entry points,
* `"./src/index.ts"`, `"./src/feature/index.ts"` - are source paths, etc.
*
* This can also expand to more entries depending on the contents of the
* "./src/configs" directory. The `*.ts` files are going to be bundled because
* the "bundle" condition is present.
*/
export type PackageExportsEntryPoint = {
/**
* Package entry point, when the "exports" field is a string this
* will be "." otherwise it will be the key of the entry point
* in the "exports" object.
*/
entryPoint: string;
/**
* Path to the module this entry point represents
*/
sourcePath: string;
/**
* Path to the output module where the entry point chunk will be written
*/
outputPath: string;
/**
* Chunk name generated from the entry point and source path
* that can be used to identify the chunk in the bundle when
* it's being built by rollup.
*/
chunkName: string;
};
/**
* Represents single entry from package.json bin object
*
* ```json
* "jest": "./src/bin/jest.ts",
* "prettier": "./src/bin/prettier.ts",
* ```
*/
export type PackageBinEntryPoint = {
/**
* Name of the bin file
*/
binName: string;
/**
* Path to the source file of the bin
*/
sourceFilePath: string;
/**
* Output format
*/
format: "cjs" | "esm";
};
export type BuildEntryPointsResult = {
entryPoints: PackageExportsEntryPoint[];
ignoredEntryPoints?: Record<string, PackageJsonExports>;
};
export type BuildBinEntryPointsResult = {
binEntryPoints: PackageBinEntryPoint[];
ignoredBinEntryPoints?: Record<string, string>;
};
export type BuilderDeps = {
buildConfig: () => NodePackageConfig | Promise<NodePackageConfig>;
readPackageJson: () => PackageJson | Promise<PackageJson>;
buildEntryPoints: () => BuildEntryPointsResult | Promise<BuildEntryPointsResult>;
buildBinEntryPoints: () => BuildBinEntryPointsResult | Promise<BuildBinEntryPointsResult>;
};
export type PackageConfigBuilder = (opts: BuilderDeps) => BuilderDeps;
export type CopyOptsExtra = Pick<fg.Options, "cwd" | "deep" | "dot" | "onlyDirectories">;
export type CopyGlobOpts = {
/**
* Source directory
*/
source?: string;
/**
* One or more patterns inside directory.
*
* NOTE: the directory structure of the matched files/directories is going to be retained
* relative to the source directory
*/
include: string[];
exclude?: string[];
destination: string;
accessError?: "ignore" | "throw" | "overwrite";
existsError?: "ignore" | "throw" | "overwrite";
options?: CopyOptsExtra & {
dryRun?: boolean;
verbose?: boolean;
};
};
export type CopyOpts = CopyGlobOpts;
export declare function copyFiles(opts: CopyOpts): Promise<void>;
export type DefaultRollupConfigBuildOpts = {
external?: string[];
resolveId?: ResolveIdHook;
plugins?: InputPluginOption;
/**
* https://esbuild.github.io/api/#minify
*/
minify?: boolean;
analyze?: boolean;
};
export type RollupOptionsBuilder = (opts: RollupOptionsBuilderOpts) => Promise<RollupWatchOptions[]> | RollupWatchOptions[];
export type RollupOptionsBuilderOpts = {
config: NodePackageConfig;
defaultRollupConfig: (opts?: DefaultRollupConfigBuildOpts) => RollupWatchOptions;
};
export type TaskOpts<Key extends string, Args, State> = {
/**
* A key identifying task options
*/
name: Key;
/**
* Arguments passed by user to task options function
*/
args: Args;
/**
* Function that executes the task
*/
execute?: TaskExecuteFn<State>;
/**
* Function that executes the task in watch mode
*/
watch?: TaskWatchFn<State>;
};
export type TaskExecuteFn<State> = () => Promise<State>;
export type TaskWatchFn<State> = (state: State) => Promise<unknown>;
export type BuiltTaskOpts<Key extends string, Args, State> = TaskOpts<Key, Args, State>;
export type BuildOpts = {
/**
* Extra externals which are not listed in dependencies or those
* listed which are not explicitly referenced in the code
*/
externals?: string[];
/**
* Module resolution function, in case you have weird dependencies
* that do not resolve on their own, have them setup here
*/
resolveId?: ResolveIdHook;
/**
* Entries in package.json "exports" represent inputs for Rollup.
*
* If you have a need fine tune configuration for entries defined
* in package.json "exports" prop - you can do that in this callback.
*/
buildExportsConfig?: RollupOptionsBuilder;
/**
* Entries in package.json "bin" represent extra inputs for Rollup.
* Unlike "exports" - these entries require special handling, because
* they can be used as CLI commands during dev-time as well by
* consumers.
*
* If you have a need to fine-tune configuration entries defined
* in package.json "bin" prop - you can do that in this callback.
*/
buildBinsConfig?: RollupOptionsBuilder;
/**
* If you have a need to create extra bundles with different
* non-standard parameters, have a function here return those
* configs
*/
extraRollupConfigs?: RollupOptionsBuilder;
/**
* Rollup plugins to inject into every bundle config
*/
plugins?: Plugin[];
/**
* Override core configuration options that are normally read from package.json
*/
packageConfig?: PackageConfigBuilder;
/**
* Override output package.json - the output package.json is built from your
* regular package.json, but written to the `./dist` directory. This
* package.json should be used to publish your package.
*
* This eliminates dependencies that were already bundled up to the output
* by rollup, but you might want to override some extra details.
*/
outputPackageJson?: (packageJson: Record<string, JsonType>) => Record<string, JsonType>;
/**
* One or more copy operations to perform after the build is complete
* and the output package.json is written. This will also watch files
* for changes and copy them over as they change.
*/
copy?: Array<Pick<CopyOpts, "source" | "include" | "exclude" | "destination">>;
};
export declare function buildForNode(opts?: BuildOpts): BuiltTaskOpts<"build", BuildOpts | undefined, RollupWatchOptions[]>;
export type TextFilter = {
text: string;
replaceWith?: string;
} | {
regExp: RegExp;
extractGroup: number;
} | {
regExp: RegExp;
replaceWith?: string;
};
export type TextFilters = TextFilter[];
export declare function createFilter(filters: TextFilters): ((data: string) => string | undefined) | undefined;
export declare function filterAndPrint(childProcess: ChildProcess, filters: TextFilters): ChildProcess;
/**
* SetDifference (same as Exclude)
* @desc Set difference of given union types `A` and `B`
* @example
* // Expect: "1"
* SetDifference<'1' | '2' | '3', '2' | '3' | '4'>;
*
* // Expect: string | number
* SetDifference<string | number | (() => void), Function>;
*/
export declare type SetDifference<A, B> = A extends B ? never : A;
/**
* Intersection
* @desc From `T` pick properties that exist in `U`
* @example
* type Props = { name: string; age: number; visible: boolean };
* type DefaultProps = { age: number };
*
* // Expect: { age: number; }
* type DuplicateProps = Intersection<Props, DefaultProps>;
*/
export declare type Intersection<T extends object, U extends object> = Pick<T, Extract<keyof T, keyof U> & Extract<keyof U, keyof T>>;
/**
* Diff
* @desc From `T` remove properties that exist in `U`
* @example
* type Props = { name: string; age: number; visible: boolean };
* type DefaultProps = { age: number };
*
* // Expect: { name: string; visible: boolean; }
* type DiffProps = Diff<Props, DefaultProps>;
*/
export declare type Diff<T extends object, U extends object> = Pick<T, SetDifference<keyof T, keyof U>>;
/**
* Assign
* @desc From `U` assign properties to `T` (just like object assign)
* @example
* type Props = { name: string; age: number; visible: boolean };
* type NewProps = { age: string; other: string };
*
* // Expect: { name: string; age: number; visible: boolean; other: string; }
* type ExtendedProps = Assign<Props, NewProps>;
*/
export declare type Assign<T extends object, U extends object, I = Diff<T, U> & Intersection<U, T> & Diff<U, T>> = Pick<I, keyof I>;
export type SpawnToPromiseOpts = {
/**
* Specify exit codes which should not result in throwing an error when
* the process has finished, e.g. specifying `[0]` means if process finished
* with zero exit code then the promise will resolve instead of rejecting.
*
* Alternatively, specify `inherit` to save status code to the current `process.exitCode`
*
* Alternatively, completely ignore the exit code (e.g. you follow up and interrogate
* the process code manually afterwards)
*/
exitCodes: number[] | "inherit" | "any";
};
export type SharedOpts = Pick<SpawnOptions, "cwd">;
export type SpawnArgs<E extends object> = [
command: string,
args: ReadonlyArray<string>,
options: Assign<SpawnOptions, E>
];
export type SpawnOptionsWithExtra<E extends object = SpawnToPromiseOpts> = Assign<SpawnOptions, E>;
export type SpawnParameterMix<E extends object = SpawnToPromiseOpts> = [
cp: ChildProcess,
extraOpts: Assign<E, SharedOpts>
] | SpawnArgs<E>;
export declare function isSpawnArgs<E extends object>(args: SpawnParameterMix<E>): args is SpawnArgs<E>;
export declare function spawnWithSpawnParameters<E extends object>(parameters: SpawnParameterMix<E>): {
child: ChildProcess;
command: string;
args: readonly string[];
opts: Assign<SpawnOptions, E>;
};
export declare function spawnToPromise(...parameters: SpawnParameterMix): Promise<void>;
export type SpawnResultOpts = {
output?: Array<"stdout" | "stderr"> | [
"stdout" | "stderr",
...Array<"stdout" | "stderr">
];
buffers?: {
combined?: string[];
stdout?: string[];
stderr?: string[];
};
} & SpawnToPromiseOpts;
export type SpawnResultReturn = {
pid?: number;
output: string[];
stdout: string;
stderr: string;
status: number | null;
signal: NodeJS.Signals | null;
error?: Error | undefined;
};
export declare function spawnResult(...parameters: SpawnParameterMix<SpawnResultOpts>): Promise<SpawnResultReturn>;
export declare function spawnOutput(...parameters: SpawnParameterMix<SpawnResultOpts>): Promise<string>;
export declare function spawnOutputConditional(...parameters: SpawnParameterMix<SpawnResultOpts & {
/**
* By default will output to `stderr` when spawn result failed with an error, when
* status code is not zero or when `Logger.logLevel` is `debug`
*/
shouldOutput?: (result: SpawnResultReturn) => boolean;
}>): Promise<SpawnResultReturn>;
export declare const copy: (opts: {
source?: string;
include: string[];
exclude?: string[];
destination: string;
}) => BuiltTaskOpts<"copy", {
source?: string | undefined;
include: string[];
exclude?: string[] | undefined;
destination: string;
}, void>;
export type DeclarationsOpts = {
/**
* Override core configuration options that are normally read from package.json
*/
packageConfig?: PackageConfigBuilder;
/**
* Ignore TypeScript errors in dependencies when generating declarations
*/
unstable_ignoreTypeScriptErrors?: boolean;
/**
* Skip TypeScript type checking for dependencies
*/
unstable_skipDependencies?: string[];
};
export declare function declarations(opts?: DeclarationsOpts): BuiltTaskOpts<"declarations", undefined, void>;
export declare function integrationTest(opts?: {
processArgs?: string[];
}): BuiltTaskOpts<"integration", undefined, void>;
/**
* Lint using eslint, no customizations possible, other than
* via creating custom `eslint.config.mjs` in a directory.
*
* `Status: Minimum implemented`
*
* TODO: Allow specifying type of package: web app requires
* different linting compared to a published npm package.
*/
export declare function lint(opts?: {
processArgs: string[];
}): BuiltTaskOpts<"lint", undefined, void>;
declare const levels: readonly [
"debug",
"info",
"warn",
"error",
"fatal"
];
export type LogLevel = typeof levels[number];
export type Params = Parameters<typeof console.log>;
export type Logger = {
logLevel: LogLevel;
debug(...params: Params): void;
info(...params: Params): void;
log(...params: Params): void;
tip(...params: Params): void;
warn(...params: Params): void;
error(...params: Params): void;
fatal(...params: Params): void;
};
export declare const createLogger: (deps?: {
getVerbosityConfig: () => "debug" | "info" | "warn" | "error" | "fatal" | "off";
log: (message?: any, ...optionalParams: any[]) => void;
error: (message?: any, ...optionalParams: any[]) => void;
shouldEnableTip: () => boolean;
}) => Logger;
export declare const configureDefaultLogger: (factory: () => Logger) => void;
/**
* Default logger instance can be configured once at startup
*/
export declare const logger: Logger;
export type BivarianceHack<Args extends unknown[], Result> = {
bivarianceHack(...args: Args): Result;
}["bivarianceHack"];
export declare function unitTest(opts?: {
processArgs: string[];
}): BuiltTaskOpts<"test", undefined, void>;
export type TaskOf<T extends BivarianceHack<unknown[], TaskOpts<string, unknown, any>>> = ReturnType<T>;
export type LintTask = TaskOf<typeof lint>;
export type BuildForNodeTask = TaskOf<typeof buildForNode>;
export type UnitTestTask = TaskOf<typeof unitTest>;
export type IntegrationTestTask = TaskOf<typeof integrationTest>;
export type DeclarationsTask = TaskOf<typeof declarations>;
export type CopyTask = TaskOf<typeof copy>;
export type AllTaskTypes = LintTask | BuildForNodeTask | UnitTestTask | IntegrationTestTask | DeclarationsTask | CopyTask;
export type Task = AllTaskTypes | TaskExecuteFn<unknown>;
/**
* Declare how your package is linted, built, bundled and published
* by specifying task parameters specific to your package.
*
* The order of execution of tasks is bespoke and depends on the task.
*
* Some tasks also accept parameters from process.argv, for example
* `lint` or `test` allow you to specify which files need linting or
* testing. Use `--help` parameter to determine what is possible.
*/
export declare function pipeline<Args extends [
Task,
...Task[]
]>(...tasks: Args): Promise<void>;
export declare function runTsScript(opts: {
location: string;
importMetaUrl?: URL;
args?: string[];
}): Promise<SpawnResultReturn>;
export {};