UNPKG

@blainehansen/macro-ts

Version:

An ergonomic typescript compiler that enables typesafe syntactic macros.

112 lines 5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MacroTsConfig = exports.CompilationEnvironment = exports.ScriptTarget = void 0; const ts = require("typescript"); const c = require("@ts-std/codec"); const monads_1 = require("@ts-std/monads"); const utils_1 = require("./utils"); exports.ScriptTarget = c.wrap("ScriptTarget", input => { if (typeof input !== "string") return (0, monads_1.Err)(`invalid target: ${input}`); if (input.toLowerCase() === "json") return (0, monads_1.Err)(`the JSON target isn't supported`); if (input in ts.ScriptTarget) return (0, monads_1.Ok)(ts.ScriptTarget[input]); return (0, monads_1.Err)(`invalid target: ${input}`); }); var CompilationEnvironment; (function (CompilationEnvironment) { const fullDecoder = c.object({ platform: c.literals("browser", "webworker", "node", "anywhere"), target: exports.ScriptTarget }); CompilationEnvironment.decoder = c.wrap("CompilationEnvironment", env => { if (typeof env !== "string") return fullDecoder.decode(env); switch (env) { case "legacybrowser": return (0, monads_1.Ok)({ platform: "browser", target: ts.ScriptTarget.ES5 }); case "modernbrowser": return (0, monads_1.Ok)({ platform: "browser", target: ts.ScriptTarget.Latest }); case "webworker": return (0, monads_1.Ok)({ platform: "webworker", target: ts.ScriptTarget.Latest }); case "node": return (0, monads_1.Ok)({ platform: "node", target: ts.ScriptTarget.Latest }); case "anywhere": return (0, monads_1.Ok)({ platform: "anywhere", target: ts.ScriptTarget.Latest }); } return (0, monads_1.Err)(`invalid environment shorthand: ${env}`); }); function key({ platform, target }) { return `${platform}-${ts.ScriptTarget[target].toLowerCase()}`; } CompilationEnvironment.key = key; const latestLib = (0, utils_1.exec)(() => { for (const key of Object.keys(ts.ScriptTarget)) { const value = ts.ScriptTarget[key]; if (key !== "Latest" && value === ts.ScriptTarget.Latest) return `lib.${key.toLowerCase()}.d.ts`; } throw new Error("There isn't a ts.ScriptTarget that isn't Latest but is equivalent to Latest"); }); function options({ platform, target }) { const lib = []; if (target >= ts.ScriptTarget.ES2015) lib.push("lib.es2015.d.ts"); if (target === ts.ScriptTarget.Latest) lib.push(latestLib); else if (target > ts.ScriptTarget.ES2015) lib.push(`lib.${ts.ScriptTarget[target].toLowerCase()}.d.ts`); switch (platform) { case "node": return { module: ts.ModuleKind.CommonJS, lib }; case "anywhere": return { module: ts.ModuleKind.ES2015, lib, types: [] }; case "browser": case "webworker": lib.push(platform === "browser" ? "lib.dom.d.ts" : "lib.webworker.d.ts"); return { module: ts.ModuleKind.ES2015, lib, types: [] }; } } CompilationEnvironment.options = options; })(CompilationEnvironment = exports.CompilationEnvironment || (exports.CompilationEnvironment = {})); const StringNonEmptyOrSingle = utils_1.NonEmptyOrSingle.decoder(c.string); const RawMacroTsConfigDecoder = c.object({ macros: c.optional(c.string), packages: c.array(c.object({ location: c.string, entry: StringNonEmptyOrSingle, exclude: c.optional(StringNonEmptyOrSingle), environment: utils_1.NonEmptyOrSingle.decoder(CompilationEnvironment.decoder), dev: c.optional(c.boolean) })) }); var MacroTsConfig; (function (MacroTsConfig) { MacroTsConfig.decoder = c.wrap("MacroTsConfig", input => { const decodeResult = RawMacroTsConfigDecoder.decode(input); if (decodeResult.is_err()) return decodeResult; const rawConfig = decodeResult.value; const packages = {}; for (const pkg of rawConfig.packages) { const { location } = pkg; if (location in packages) return (0, monads_1.Err)(location); packages[location] = pkg; } return (0, monads_1.Ok)({ ...rawConfig, packages }); }); function decode(obj) { return MacroTsConfig.decoder.decode(obj); } MacroTsConfig.decode = decode; function selectPackageForPath(path, { packages }) { const longestLocation = (0, utils_1.longestMatchingStem)(path, Object.keys(packages)); if (longestLocation === undefined) return undefined; return packages[longestLocation]; } MacroTsConfig.selectPackageForPath = selectPackageForPath; })(MacroTsConfig = exports.MacroTsConfig || (exports.MacroTsConfig = {})); //# sourceMappingURL=config.js.map