makit
Version:
Make in JavaScript done right!
99 lines (98 loc) • 3.54 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Target = void 0;
const context_1 = require("./context");
const util_1 = require("util");
const logger_1 = require("./utils/logger");
const io_1 = require("./io");
const rude_1 = require("./makefile/rude");
const inspectKey = Symbol.for('nodejs.util.inspect.custom') || 'inspect';
const logger = logger_1.Logger.getOrCreate();
var TargetState;
(function (TargetState) {
TargetState[TargetState["INIT"] = 0] = "INIT";
TargetState[TargetState["STARTED"] = 1] = "STARTED";
TargetState[TargetState["RESOLVED"] = 2] = "RESOLVED";
TargetState[TargetState["REJECTED"] = 3] = "REJECTED";
})(TargetState || (TargetState = {}));
class Target {
constructor(target, context, mtime, rule) {
this.state = TargetState.INIT;
this.pendingDependencyCount = 0;
this.promises = [];
this.name = target;
this.ctx = context;
this.mtime = mtime;
this.rule = rule;
}
addPromise(resolve, reject) {
if (this.state === TargetState.RESOLVED)
resolve(this.mtime);
else if (this.state === TargetState.REJECTED)
reject(this.error);
else
this.promises.push([resolve, reject]);
}
resolve() {
this.state = TargetState.RESOLVED;
while (this.promises.length) {
const [resolve] = this.promises.shift();
resolve(this.mtime);
}
}
reject(err) {
this.state = TargetState.REJECTED;
while (this.promises.length) {
const [, reject] = this.promises.shift();
reject(err);
}
this.error = err;
}
start() {
this.state = TargetState.STARTED;
}
reset() {
this.state = TargetState.INIT;
}
isStarted() {
return this.state >= TargetState.STARTED;
}
isReady() {
return this.state === TargetState.INIT && this.pendingDependencyCount <= 0;
}
isResolved() {
return this.state === TargetState.RESOLVED;
}
isFinished() {
return this.state === TargetState.RESOLVED || this.state === TargetState.REJECTED;
}
updateMtime() {
this.mtime = io_1.IO.getMTime().setModifiedTime(this.ctx.targetFullPath());
}
static create({ target, rule, match, root, fs, make }) {
const debug = target === '/Users/harttle/src/www-wise/cache/static/amd_modules/@searchfe/debug.js.inline';
const context = new context_1.Context({ target, match, root, fs, make });
const mtime = io_1.IO.getMTime().getModifiedTime(context.targetFullPath());
if (rule) {
context.dependencies.push(...rule.prerequisites.getPrerequisites(context));
}
return new Target(target, context, mtime, rule);
}
getDependencies() {
return this.ctx.dependencies;
}
async writeDependency() {
const filepath = rude_1.getDependencyFromTarget(this.ctx.target);
logger.debug('RUDE', 'writing', filepath, 'with', this.ctx.dynamicDependencies);
await this.ctx.outputFile(filepath, JSON.stringify(this.ctx.dynamicDependencies));
await io_1.IO.getMTime().setModifiedTime(this.ctx.toFullPath(filepath));
}
[inspectKey]() {
const deps = [
...this.ctx.dependencies,
...this.ctx.dynamicDependencies.map(dep => `${dep}(dynamic)`)
];
return logger_1.hlTarget(this.name) + ': ' + util_1.inspect(deps);
}
}
exports.Target = Target;