index.d.mts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import { Jiti, JitiOptions } from 'jiti';
  2. import { DownloadTemplateOptions } from 'giget';
  3. import { ChokidarOptions } from 'chokidar';
  4. import { diff } from 'ohash/utils';
  5. interface DotenvOptions {
  6. /**
  7. * The project root directory (either absolute or relative to the current working directory).
  8. */
  9. cwd: string;
  10. /**
  11. * What file to look in for environment variables (either absolute or relative
  12. * to the current working directory). For example, `.env`.
  13. */
  14. fileName?: string;
  15. /**
  16. * Whether to interpolate variables within .env.
  17. *
  18. * @example
  19. * ```env
  20. * BASE_DIR="/test"
  21. * # resolves to "/test/further"
  22. * ANOTHER_DIR="${BASE_DIR}/further"
  23. * ```
  24. */
  25. interpolate?: boolean;
  26. /**
  27. * An object describing environment variables (key, value pairs).
  28. */
  29. env?: NodeJS.ProcessEnv;
  30. }
  31. type Env = typeof process.env;
  32. /**
  33. * Load and interpolate environment variables into `process.env`.
  34. * If you need more control (or access to the values), consider using `loadDotenv` instead
  35. *
  36. */
  37. declare function setupDotenv(options: DotenvOptions): Promise<Env>;
  38. /** Load environment variables into an object. */
  39. declare function loadDotenv(options: DotenvOptions): Promise<Env>;
  40. declare global {
  41. var __c12_dotenv_vars__: Map<Record<string, any>, Set<string>>;
  42. }
  43. interface ConfigLayerMeta {
  44. name?: string;
  45. [key: string]: any;
  46. }
  47. type UserInputConfig = Record<string, any>;
  48. interface C12InputConfig<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> {
  49. $test?: T;
  50. $development?: T;
  51. $production?: T;
  52. $env?: Record<string, T>;
  53. $meta?: MT;
  54. }
  55. type InputConfig<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> = C12InputConfig<T, MT> & T;
  56. interface SourceOptions<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> {
  57. /** Custom meta for layer */
  58. meta?: MT;
  59. /** Layer config overrides */
  60. overrides?: T;
  61. [key: string]: any;
  62. /**
  63. * Options for cloning remote sources
  64. *
  65. * @see https://giget.unjs.io
  66. */
  67. giget?: DownloadTemplateOptions;
  68. /**
  69. * Install dependencies after cloning
  70. *
  71. * @see https://nypm.unjs.io
  72. */
  73. install?: boolean;
  74. /**
  75. * Token for cloning private sources
  76. *
  77. * @see https://giget.unjs.io#providing-token-for-private-repositories
  78. */
  79. auth?: string;
  80. }
  81. interface ConfigLayer<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> {
  82. config: T | null;
  83. source?: string;
  84. sourceOptions?: SourceOptions<T, MT>;
  85. meta?: MT;
  86. cwd?: string;
  87. configFile?: string;
  88. }
  89. interface ResolvedConfig<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> extends ConfigLayer<T, MT> {
  90. config: T;
  91. layers?: ConfigLayer<T, MT>[];
  92. cwd?: string;
  93. }
  94. interface ResolvableConfigContext<T extends UserInputConfig = UserInputConfig> {
  95. configs: Record<"overrides" | "main" | "rc" | "packageJson" | "defaultConfig", T | null | undefined>;
  96. }
  97. type MaybePromise<T> = T | Promise<T>;
  98. type ResolvableConfig<T extends UserInputConfig = UserInputConfig> = MaybePromise<T | null | undefined> | ((ctx: ResolvableConfigContext<T>) => MaybePromise<T | null | undefined>);
  99. interface LoadConfigOptions<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> {
  100. name?: string;
  101. cwd?: string;
  102. configFile?: string;
  103. rcFile?: false | string;
  104. globalRc?: boolean;
  105. dotenv?: boolean | DotenvOptions;
  106. envName?: string | false;
  107. packageJson?: boolean | string | string[];
  108. defaults?: T;
  109. defaultConfig?: ResolvableConfig<T>;
  110. overrides?: ResolvableConfig<T>;
  111. omit$Keys?: boolean;
  112. resolve?: (id: string, options: LoadConfigOptions<T, MT>) => null | undefined | ResolvedConfig<T, MT> | Promise<ResolvedConfig<T, MT> | undefined | null>;
  113. jiti?: Jiti;
  114. jitiOptions?: JitiOptions;
  115. giget?: false | DownloadTemplateOptions;
  116. merger?: (...sources: Array<T | null | undefined>) => T;
  117. extend?: false | {
  118. extendKey?: string | string[];
  119. };
  120. }
  121. type DefineConfig<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> = (input: InputConfig<T, MT>) => InputConfig<T, MT>;
  122. declare function createDefineConfig<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta>(): DefineConfig<T, MT>;
  123. declare const SUPPORTED_EXTENSIONS: string[];
  124. declare function loadConfig<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta>(options: LoadConfigOptions<T, MT>): Promise<ResolvedConfig<T, MT>>;
  125. type DiffEntries = ReturnType<typeof diff>;
  126. type ConfigWatcher<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> = ResolvedConfig<T, MT> & {
  127. watchingFiles: string[];
  128. unwatch: () => Promise<void>;
  129. };
  130. interface WatchConfigOptions<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta> extends LoadConfigOptions<T, MT> {
  131. chokidarOptions?: ChokidarOptions;
  132. debounce?: false | number;
  133. onWatch?: (event: {
  134. type: "created" | "updated" | "removed";
  135. path: string;
  136. }) => void | Promise<void>;
  137. acceptHMR?: (context: {
  138. getDiff: () => DiffEntries;
  139. newConfig: ResolvedConfig<T, MT>;
  140. oldConfig: ResolvedConfig<T, MT>;
  141. }) => void | boolean | Promise<void | boolean>;
  142. onUpdate?: (context: {
  143. getDiff: () => ReturnType<typeof diff>;
  144. newConfig: ResolvedConfig<T, MT>;
  145. oldConfig: ResolvedConfig<T, MT>;
  146. }) => void | Promise<void>;
  147. }
  148. declare function watchConfig<T extends UserInputConfig = UserInputConfig, MT extends ConfigLayerMeta = ConfigLayerMeta>(options: WatchConfigOptions<T, MT>): Promise<ConfigWatcher<T, MT>>;
  149. export { SUPPORTED_EXTENSIONS, createDefineConfig, loadConfig, loadDotenv, setupDotenv, watchConfig };
  150. export type { C12InputConfig, ConfigLayer, ConfigLayerMeta, ConfigWatcher, DefineConfig, DotenvOptions, Env, InputConfig, LoadConfigOptions, ResolvableConfig, ResolvableConfigContext, ResolvedConfig, SourceOptions, UserInputConfig, WatchConfigOptions };