@storm-stack/core
Version:
A build toolkit and runtime used by Storm Software in TypeScript applications
1 lines • 15.8 kB
Source Map (JSON)
{"version":3,"sources":["../../src/base/compiler.ts"],"names":["Compiler","WeakMap","log","cacheDir","context","options","extendLog","joinPaths","cachePath","existsSync","createDirectorySync","transform","fileName","code","shouldSkip","LogLevelLabel","TRACE","getString","source","getSourceFile","onPreTransform","id","Promise","resolve","skipAllTransforms","unimport","skipTransformUnimport","vfs","isRuntimeFile","injectImports","JSON","stringify","onPostTransform","transpile","transpiled","ERROR","Error","outputText","compile","compiled","skipCache","getCache","transformed","setCache","getResult","sourceFile","generateSourceMap","cache","get","set","delete","process","env","STORM_STACK_LOCAL","workspaceRoot","resolvePackage","isParentPath","includes"],"mappings":"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","file":"chunk-3IE55BNO.cjs","sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Storm Stack\n\n This code was released as part of the Storm Stack project. Storm Stack\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/storm-stack.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/storm-stack\n Documentation: https://docs.stormsoftware.com/projects/storm-stack\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { LogLevelLabel } from \"@storm-software/config-tools/types\";\nimport { createDirectorySync } from \"@stryke/fs/helpers\";\nimport { existsSync } from \"@stryke/path/exists\";\nimport { isParentPath } from \"@stryke/path/is-parent-path\";\nimport { joinPaths } from \"@stryke/path/join-paths\";\nimport { resolvePackage } from \"@stryke/path/resolve\";\nimport type MagicString from \"magic-string\";\nimport { transform } from \"../lib/babel/transform\";\nimport { extendLog } from \"../lib/logger\";\nimport { transpile } from \"../lib/typescript/transpile\";\nimport { getCache, setCache } from \"../lib/utilities/cache\";\nimport { getSourceFile, getString } from \"../lib/utilities/source-file\";\nimport { generateSourceMap } from \"../lib/utilities/source-map\";\nimport {\n CompilerInterface,\n CompilerOptions,\n CompilerResult,\n SourceFile,\n TranspilerOptions\n} from \"../types/compiler\";\nimport { LogFn } from \"../types/config\";\nimport { Context } from \"../types/context\";\n\nexport class Compiler implements CompilerInterface {\n #cache: WeakMap<SourceFile, string> = new WeakMap();\n\n #options: CompilerOptions;\n\n #corePath: string | undefined;\n\n /**\n * The logger function to use\n */\n protected log: LogFn;\n\n /**\n * The cache directory\n */\n protected cacheDir: string;\n\n /**\n * Create a new compiler instance.\n *\n * @param context - The compiler context.\n * @param options - The compiler options.\n */\n constructor(context: Context, options: CompilerOptions = {}) {\n this.log = extendLog(context.log, \"compiler\");\n this.#options = options;\n\n this.cacheDir = joinPaths(context.cachePath, \"compiler\");\n if (!existsSync(this.cacheDir)) {\n createDirectorySync(this.cacheDir);\n }\n }\n\n /**\n * Transform the module.\n *\n * @param context - The compiler context.\n * @param fileName - The name of the file to compile.\n * @param code - The source code to compile.\n * @param options - The transpile options.\n * @returns The transpiled module.\n */\n public async transform(\n context: Context,\n fileName: string,\n code: string | MagicString,\n options: CompilerOptions = {}\n ): Promise<string> {\n if (await this.shouldSkip(context, fileName, code)) {\n this.log(LogLevelLabel.TRACE, `Skipping transform for ${fileName}`);\n return getString(code);\n }\n\n this.log(LogLevelLabel.TRACE, `Transforming ${fileName}`);\n\n let source = getSourceFile(fileName, code);\n\n if (options.onPreTransform) {\n this.log(\n LogLevelLabel.TRACE,\n `Running onPreTransform hook for ${source.id}`\n );\n\n source = await Promise.resolve(options.onPreTransform(context, source));\n }\n\n if (this.#options.onPreTransform) {\n this.log(\n LogLevelLabel.TRACE,\n `Running onPreTransform hook for ${source.id}`\n );\n\n source = await Promise.resolve(\n this.#options.onPreTransform(context, source)\n );\n }\n\n if (!options.skipAllTransforms) {\n if (\n context.unimport &&\n !options.skipTransformUnimport &&\n !context.vfs.isRuntimeFile(fileName)\n ) {\n source = await context.unimport.injectImports(source);\n }\n\n this.log(\n LogLevelLabel.TRACE,\n `Running transforms for ${source.id} with options: ${JSON.stringify(\n options\n )}`\n );\n\n source = await transform(this.log, context, source, options);\n this.log(LogLevelLabel.TRACE, `Transformed: ${source.id}`);\n }\n\n if (this.#options.onPostTransform) {\n this.log(\n LogLevelLabel.TRACE,\n `Running onPostTransform hook for ${source.id}`\n );\n\n source = await Promise.resolve(\n this.#options.onPostTransform(context, source)\n );\n }\n\n if (options.onPostTransform) {\n this.log(\n LogLevelLabel.TRACE,\n `Running onPostTransform hook for ${source.id}`\n );\n\n source = await Promise.resolve(options.onPostTransform(context, source));\n }\n\n return getString(source.code);\n }\n\n /**\n * Transpile the module.\n *\n * @param context - The compiler context.\n * @param id - The name of the file to compile.\n * @param code - The source code to compile.\n * @returns The transpiled module.\n */\n public async transpile(\n context: Context,\n id: string,\n code: string | MagicString,\n options: TranspilerOptions = {}\n ): Promise<string> {\n this.log(\n LogLevelLabel.TRACE,\n `Transpiling ${id} module with TypeScript compiler`\n );\n\n const transpiled = transpile(context, id, getString(code), options);\n if (transpiled === null) {\n this.log(LogLevelLabel.ERROR, `Transform is null: ${id}`);\n\n throw new Error(`Transform is null: ${id}`);\n } else {\n this.log(LogLevelLabel.TRACE, `Transformed: ${id}`);\n }\n\n return transpiled.outputText;\n }\n\n /**\n * Compile the source code.\n *\n * @param context - The compiler context.\n * @param id - The name of the file to compile.\n * @param code - The source code to compile.\n * @returns The compiled source code and source map.\n */\n public async compile(\n context: Context,\n id: string,\n code: string | MagicString,\n options: CompilerOptions = {}\n ): Promise<string> {\n this.log(LogLevelLabel.TRACE, `Compiling ${id}`);\n\n const source = getSourceFile(id, code);\n\n let compiled: string | undefined;\n if (!options.skipCache) {\n compiled = await this.getCache(context, source);\n if (compiled) {\n this.log(LogLevelLabel.TRACE, `Cache hit: ${source.id}`);\n } else {\n this.log(LogLevelLabel.TRACE, `Cache miss: ${source.id}`);\n }\n }\n\n if (!compiled) {\n const transformed = await this.transform(\n context,\n source.id,\n source.code,\n options\n );\n\n compiled = await this.transpile(context, id, transformed, options);\n await this.setCache(context, source, compiled);\n }\n\n return compiled;\n }\n\n /**\n * Get the result of the compiler.\n *\n * @param sourceFile - The source file.\n * @param transpiled - The transpiled source code.\n * @returns The result of the compiler.\n */\n public getResult(\n sourceFile: SourceFile,\n transpiled?: string\n ): CompilerResult {\n return generateSourceMap(sourceFile.id, sourceFile.code, transpiled);\n }\n\n protected async getCache(context: Context, sourceFile: SourceFile) {\n let cache = this.#cache.get(sourceFile);\n if (cache) {\n return cache;\n }\n\n if (context.options.skipCache) {\n return;\n }\n\n cache = await getCache(sourceFile, this.cacheDir);\n if (cache) {\n this.#cache.set(sourceFile, cache);\n }\n\n return cache;\n }\n\n protected async setCache(\n context: Context,\n sourceFile: SourceFile,\n transpiled?: string\n ) {\n if (transpiled) {\n this.#cache.set(sourceFile, transpiled);\n } else {\n this.#cache.delete(sourceFile);\n }\n\n if (context.options.skipCache) {\n return;\n }\n\n return setCache(sourceFile, this.cacheDir, transpiled);\n }\n\n protected async shouldSkip(\n context: Context,\n id: string,\n code: string | MagicString\n ): Promise<boolean> {\n if (!this.#corePath) {\n this.#corePath = process.env.STORM_STACK_LOCAL\n ? joinPaths(context.options.workspaceRoot, \"packages/core\")\n : await resolvePackage(\"@storm-stack/core\");\n if (!this.#corePath) {\n throw new Error(\n \"Could not resolve @storm-stack/core package location.\"\n );\n }\n }\n\n if (\n (process.env.STORM_STACK_LOCAL && isParentPath(id, this.#corePath)) ||\n getString(code).includes(\"/* @storm-ignore */\") ||\n getString(code).includes(\"/* @storm-disable */\")\n ) {\n return true;\n }\n\n return false;\n }\n}\n"]}