@blainehansen/macro-ts
Version:
An ergonomic typescript compiler that enables typesafe syntactic macros.
112 lines • 5 kB
JavaScript
;
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