UNPKG

broccoli-eyeglass

Version:
254 lines 10.7 kB
import debugGenerator = require("debug"); import BroccoliPlugin = require("broccoli-plugin"); import FSTree = require("fs-tree-diff"); import type * as nodeSass from "node-sass"; import { EventEmitter } from "chained-emitter"; import DiskCache = require("sync-disk-cache"); import heimdall = require("heimdalljs"); export declare type SassImplementation = typeof nodeSass; interface CachedContents { contents: Record<string, string>; urls: Record<string, string>; } declare type CachedDependencies = Array<[string, string]>; declare class Entry { relativePath: string; basePath: string; mode: number; size: number; mtime: Date; constructor(path: string); isDirectory(): boolean; } export interface CompilationDetails { /** * The directory to which the sassFilename is relative. */ srcPath: string; /** * The path of the sass file being compiled (relative to srcPath). */ sassFilename: string; /** * The absolute path of the Sass file. */ fullSassFilename: string; /** * The directory where compiled css files are being written. */ destDir: string; /** * The CSS filename relative to the destDir. */ cssFilename: string; /** * The absolute path of the CSS file. * (note: the file is not there yet, obviously) */ fullCssFilename: string; /** * The options that will be used to compile the file. */ options: nodeSass.Options; } interface GenericCache { get(key: string): string | number | undefined; set(key: string, value: string | number): void; } export interface BroccoliSassOptions extends BroccoliPlugin.BroccoliPluginOptions { /** * Provide engines to this plugin and descendants of this plugin. */ engines?: { /** * The sass compiler to be used by this plugin. * If not provided, this plugin will attempt to require 'node-sass' and * then 'sass' (in that order, using the first one that it finds). */ sass?: typeof nodeSass; [engine: string]: unknown; }; /** * The directory to write css files to. Relative to the build output directory. */ cssDir: string; /** * When `true`, will discover sass files to compile that are found in the sass * directory. Defaults to true unless sourceFiles are specified. * Files beginning with an underscore are called "partials" and are not * discovered. */ discover?: boolean; /** * The directory to look for scss files to compile. Defaults to tree root. * */ sassDir?: string; /** * Force sass rendering to use node-sass's synchronous rendering. * Defaults to * `false`. * */ renderSync?: boolean; /** * Array of file names or glob patterns (relative to the sass directory) that * should be compiled. Note that file names must include the file extension * (unlike @import in Sass). E.g.: ['application.scss'] * */ sourceFiles?: Array<string>; /** * Set to the name of your application so that your cache is isolated from * other broccoli-eyeglass based builds. When falsy, persistent caching is * disabled. */ persistentCache?: string; /** * Integer. Set to the maximum number of listeners your use of eyeglass * compiler needs. Defaults to 10. Note: do not set * eyeglassCompiler.events.setMaxListeners() yourself as eyeglass has its own * listeners it uses internally. * */ maxListeners?: number; /** * @see OptionsGenerator */ optionsGenerator?: OptionsGenerator; /** * NOT YET IMPLEMENTED */ fullException?: boolean; /** * When true, console logging will occur for each css file that is built * along with timing information. */ verbose?: boolean; /** * This is a cache that can be provided to cache across multiple instances of * BroccoliSassCompiler. It can be a map, or some other cache store like * like the memory capped lru-cache. Only strings and numbers will be placed * as values in the cache. * * It is the responsibility of the caller to clear the session cache between * calls to build(). Failure to do so will cause inconsistent build output. * * If a session cache is not provided, a short lived cache will be used locally * for a single build's duration of one tree. */ sessionCache?: GenericCache; } declare type OptionsGeneratorCallback = (cssFile: string, options: nodeSass.Options) => void; /** * @param sassFile the sass file that will be compiled. * @param cssFile the default location where the css output will be written. * This can be overridden by passing a different path to the callback. * @param options The options that eyeglass will be given. These can be mutated. * Note: the options `file`, `data`, and `outFile` are not set and cannot be * set in the options generator. * @param cb This callback accepts a css filename and options to use for * compilation. This callback can be invoked 0 or more times. Each time it is * invoked, the sass file will be compiled to the provided css file name * (relative to the output directory) and the options provided. */ declare type OptionsGenerator = (sassFile: string, cssFile: string, options: nodeSass.Options, cb: OptionsGeneratorCallback) => unknown; export default class BroccoliSassCompiler extends BroccoliPlugin { private buildCount; private colors; private currentTree; private dependencies; private outputURLs; private outputs; protected cssDir: string; protected discover: boolean | undefined; protected fullException: boolean; protected maxListeners: number; protected options: nodeSass.Options; protected optionsGenerator: OptionsGenerator; protected persistentCache: DiskCache | undefined; protected renderSync: boolean; protected sassDir: string | undefined; protected sourceFiles: Array<string>; protected treeName: string | undefined; protected verbose: boolean; protected persistentCacheDebug: debugGenerator.Debugger; protected sessionCache: GenericCache | undefined; protected buildCache: GenericCache; protected sass: typeof nodeSass; events: EventEmitter; constructor(inputTree: BroccoliPlugin.BroccoliNode | Array<BroccoliPlugin.BroccoliNode>, options: BroccoliSassOptions & nodeSass.Options); /** * Wraps the node-style async render method with a promise. */ renderSassAsync(options: nodeSass.Options): Promise<nodeSass.Result>; /** * Wraps the sync render method with a promise that is either immediately * resolved or rejected. */ renderSassSync(options: nodeSass.SyncOptions): Promise<nodeSass.Result>; logCompilationSuccess(details: CompilationDetails, result: nodeSass.Result): void; logCompilationFailure(details: CompilationDetails, error: nodeSass.SassError): void; compileTree(srcPath: string, files: Array<string>, destDir: string, compilationTimer: heimdall.Cookie<SassRenderSchema>): Promise<void | Array<void | nodeSass.Result>>; compileSassFile(srcPath: string, sassFilename: string, destDir: string, compilationTimer: heimdall.Cookie<SassRenderSchema>): Array<Promise<void | nodeSass.Result>>; render(options: nodeSass.Options | nodeSass.SyncOptions): Promise<nodeSass.Result>; dependencyChanged(srcDir: string, dep: [string, string]): boolean; getFromCacheOrCompile(details: CompilationDetails, compilationTimer: heimdall.Cookie<SassRenderSchema>): Promise<void>; hashForFile(absolutePath: string): string; fileKey(file: string): string; keyForSourceFile(srcDir: string, relativeFilename: string, _options: nodeSass.Options): string; dependenciesKey(key: string): string; outputKey(key: string): string; handleCacheHit(details: CompilationDetails, inputAndOutputFiles: [Array<string>, CachedContents]): Promise<Array<void>>; scopedFileName(file: string): string; relativize(file: string): string; isOutputInTree(file: string): boolean; relativizeOutput(file: string): string; relativizeAll(files: Array<string>): Array<string>; hasDependenciesSet(file: string): boolean; dependenciesOf(file: string): Set<string>; outputsFrom(file: string): Set<string>; outputURLsFrom(file: string): Map<string, string>; /** * Some filenames returned from importers are not really files * on disk. These three prefixes are used in eyeglass. * Skipping a read on these files avoids a more expensive fs call * and exception handling. * @param filename a filename returned from an importer */ isNotFile(filename: string): boolean; hashDependencies(details: CompilationDetails): CachedDependencies; readOutputs(details: CompilationDetails): CachedContents; populateCache(key: string, details: CompilationDetails, _result: nodeSass.Result): void; handleCacheMiss(details: CompilationDetails, reason: Error | { message: string; stack?: Array<string>; }, key: string, compilationTimer: heimdall.Cookie<SassRenderSchema>): Promise<void>; compileCssFileMaybe(details: CompilationDetails, compilationTimer: heimdall.Cookie<SassRenderSchema>): Promise<void> | Promise<nodeSass.Result>; compileCssFile(details: CompilationDetails, compilationTimer: heimdall.Cookie<SassRenderSchema>): Promise<nodeSass.Result>; handleSuccess(details: CompilationDetails, result: nodeSass.Result): Promise<void>; handleFailure(details: CompilationDetails, error: nodeSass.SassError | null): Promise<nodeSass.Result>; filesInTree(srcPath: string): Array<string>; addSource(sassFilename: string, sourceFilename: string, httpPathToOutput: string): void; addOutput(sassFilename: string, outputFilename: string): void; clearOutputs(files: Array<string>): void; outputsFromOnly(inputs: Array<string>): Set<string>; addDependency(sassFilename: string, dependencyFilename: string): void; clearDependencies(files: Array<string>): void; knownDependencies(): Array<Entry>; hasKnownDependencies(): boolean; knownDependenciesTree(inputPath: string): FSTree; _reset(): void; _build(): Promise<void | Array<void | nodeSass.Result>>; build(): Promise<void | Array<void | nodeSass.Result>>; } declare class SassRenderSchema { numSassFiles: number; nodeSassTime: number; importCount: number; uniqueImportCount: number; cacheMissCount: number; cacheHitCount: number; constructor(); } export {}; //# sourceMappingURL=broccoli_sass_compiler.d.ts.map