All files RushHttpBuildCachePlugin.ts

0% Statements 0/11
100% Branches 0/0
0% Functions 0/4
0% Lines 0/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87                                                                                                                                                                             
import { Import } from '@rushstack/node-core-library';
import type { IRushPlugin, RushSession, RushConfiguration } from '@rushstack/rush-sdk';
import type { HttpBuildCacheProvider, IHttpBuildCacheProviderOptions } from './HttpBuildCacheProvider';
 
const HttpBuildCacheProviderModule: typeof import('./HttpBuildCacheProvider') = Import.lazy(
  './HttpBuildCacheProvider',
  require
);
 
const PLUGIN_NAME: string = 'HttpBuildCachePlugin';
 
/**
 * @public
 */
export interface IRushHttpBuildCachePluginConfig {
  /**
   * The URL of the server that stores the caches (e.g. "https://build-caches.example.com").
   */
  url: string;
 
  /**
   * The HTTP method to use when writing to the cache (defaults to PUT).
   */
  uploadMethod?: string;
 
  /**
   * An optional set of HTTP headers to pass to the cache server.
   */
  headers?: Record<string, string>;
 
  /**
   * An optional command that prints the endpoint's credentials to stdout. Provide the
   * command or script to execute and, optionally, any arguments to pass to the script.
   */
  tokenHandler?: {
    exec: string;
    args?: string[];
  };
 
  /**
   * Prefix for cache keys.
   */
  cacheKeyPrefix?: string;
 
  /**
   * If set to true, allow writing to the cache. Defaults to false.
   */
  isCacheWriteAllowed?: boolean;
}
 
/**
 * @public
 */
export class RushHttpBuildCachePlugin implements IRushPlugin {
  public readonly pluginName: string = PLUGIN_NAME;
 
  public apply(rushSession: RushSession, rushConfig: RushConfiguration): void {
    rushSession.hooks.initialize.tap(this.pluginName, () => {
      rushSession.registerCloudBuildCacheProviderFactory(
        'http',
        (buildCacheConfig): HttpBuildCacheProvider => {
          const config: IRushHttpBuildCachePluginConfig = (
            buildCacheConfig as typeof buildCacheConfig & {
              httpConfiguration: IRushHttpBuildCachePluginConfig;
            }
          ).httpConfiguration;
 
          const { url, uploadMethod, headers, tokenHandler, cacheKeyPrefix, isCacheWriteAllowed } = config;
 
          const options: IHttpBuildCacheProviderOptions = {
            pluginName: this.pluginName,
            rushProjectRoot: rushConfig.rushJsonFolder,
            url: url,
            uploadMethod: uploadMethod,
            headers: headers,
            tokenHandler: tokenHandler,
            cacheKeyPrefix: cacheKeyPrefix,
            isCacheWriteAllowed: !!isCacheWriteAllowed
          };
 
          return new HttpBuildCacheProviderModule.HttpBuildCacheProvider(options, rushSession);
        }
      );
    });
  }
}