Son CV dans un terminal web en Javascript!
https://terminal-cv.gregandev.fr
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
409 lines
11 KiB
409 lines
11 KiB
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.generator = exports.expressionsPrecedence = void 0;
|
|
|
|
function _astring() {
|
|
const data = require("astring");
|
|
|
|
_astring = function () {
|
|
return data;
|
|
};
|
|
|
|
return data;
|
|
}
|
|
|
|
const expressionsPrecedence = { ..._astring().EXPRESSIONS_PRECEDENCE,
|
|
// Babel extensions
|
|
NumericLiteral: _astring().EXPRESSIONS_PRECEDENCE.Literal,
|
|
StringLiteral: _astring().EXPRESSIONS_PRECEDENCE.Literal,
|
|
BooleanLiteral: _astring().EXPRESSIONS_PRECEDENCE.Literal,
|
|
NullLiteral: _astring().EXPRESSIONS_PRECEDENCE.Literal,
|
|
RegExpLiteral: _astring().EXPRESSIONS_PRECEDENCE.Literal,
|
|
BigIntLiteral: _astring().EXPRESSIONS_PRECEDENCE.Literal,
|
|
OptionalMemberExpression: _astring().EXPRESSIONS_PRECEDENCE.MemberExpression,
|
|
OptionalCallExpression: _astring().EXPRESSIONS_PRECEDENCE.CallExpression,
|
|
Import: _astring().EXPRESSIONS_PRECEDENCE.Identifier,
|
|
PrivateName: _astring().EXPRESSIONS_PRECEDENCE.Identifier
|
|
}; // Convert Babel's AST format to ESTree on the fly.
|
|
// See https://babeljs.io/docs/en/babel-parser#output
|
|
|
|
exports.expressionsPrecedence = expressionsPrecedence;
|
|
const generator = { ..._astring().GENERATOR,
|
|
|
|
Program(node, state) {
|
|
// Monkeypatch state to fix sourcemap filenames.
|
|
let map = state.map;
|
|
|
|
state.map = (str, node) => {
|
|
if (node != null && node.loc != null) {
|
|
state.mapping.source = node.loc.filename;
|
|
}
|
|
|
|
map.call(state, str, node);
|
|
};
|
|
|
|
if (node.interpreter) {
|
|
state.write(`#!${node.interpreter.value}\n`);
|
|
}
|
|
|
|
handleDirectives(node);
|
|
|
|
_astring().GENERATOR.Program.call(this, node, state);
|
|
},
|
|
|
|
BlockStatement(node, state) {
|
|
handleDirectives(node);
|
|
|
|
_astring().GENERATOR.BlockStatement.call(this, node, state);
|
|
},
|
|
|
|
NumericLiteral(node, state) {
|
|
node.type = 'Literal';
|
|
node.raw = getRaw(node);
|
|
this.Literal(node, state, true);
|
|
},
|
|
|
|
StringLiteral(node, state) {
|
|
node.type = 'Literal';
|
|
node.raw = getRaw(node);
|
|
this.Literal(node, state, true);
|
|
},
|
|
|
|
BooleanLiteral(node, state) {
|
|
node.type = 'Literal';
|
|
this.Literal(node, state, true);
|
|
},
|
|
|
|
NullLiteral(node, state) {
|
|
node.type = 'Literal';
|
|
node.raw = 'null';
|
|
node.value = null;
|
|
this.Literal(node, state, true);
|
|
},
|
|
|
|
RegExpLiteral(node, state) {
|
|
node.type = 'Literal';
|
|
node.raw = getRaw(node);
|
|
node.value = {};
|
|
node.regex = {
|
|
pattern: node.pattern,
|
|
flags: node.flags
|
|
};
|
|
|
|
_astring().GENERATOR.Literal(node, state);
|
|
},
|
|
|
|
BigIntLiteral(node, state) {
|
|
node.type = 'Literal';
|
|
node.raw = getRaw(node);
|
|
this.Literal(node, state, true);
|
|
},
|
|
|
|
ArrowFunctionExpression(node, state) {
|
|
if (node.body.type === 'OptionalMemberExpression' || node.body.type === 'OptionalCallExpression') {
|
|
// the ArrowFunctionExpression visitor in astring checks the type of the body
|
|
// Make sure they don't start with "O"
|
|
node.body.type = '_' + node.body.type;
|
|
}
|
|
|
|
_astring().GENERATOR.ArrowFunctionExpression.call(this, node, state);
|
|
},
|
|
|
|
ObjectProperty(node, state) {
|
|
node.type = 'Property';
|
|
node.kind = 'init';
|
|
|
|
if (node.shorthand) {
|
|
let id = node.value.type === 'Identifier' ? node.value : node.value.type === 'AssignmentPattern' && node.value.left.type === 'Identifier' ? node.value.left : null;
|
|
|
|
if (!id || id.name !== node.key.name) {
|
|
node.shorthand = false;
|
|
}
|
|
}
|
|
|
|
this.Property(node, state, true);
|
|
},
|
|
|
|
ObjectMethod(node, state) {
|
|
node.value = {
|
|
type: 'FunctionExpression',
|
|
id: node.id,
|
|
params: node.params,
|
|
body: node.body,
|
|
async: node.async,
|
|
generator: node.generator,
|
|
expression: node.expression
|
|
};
|
|
node.type = 'Property';
|
|
|
|
if (node.kind === 'method') {
|
|
node.kind = 'init';
|
|
}
|
|
|
|
this.Property(node, state, true);
|
|
},
|
|
|
|
ClassMethod(node, state) {
|
|
node.value = {
|
|
type: 'FunctionExpression',
|
|
id: node.id,
|
|
params: node.params,
|
|
body: node.body,
|
|
async: node.async,
|
|
generator: node.generator,
|
|
expression: node.expression
|
|
};
|
|
node.type = 'MethodDefinition';
|
|
this.MethodDefinition(node, state, true);
|
|
},
|
|
|
|
ClassPrivateMethod(node, state) {
|
|
node.value = {
|
|
type: 'FunctionExpression',
|
|
id: node.id,
|
|
params: node.params,
|
|
body: node.body,
|
|
async: node.async,
|
|
generator: node.generator,
|
|
expression: node.expression
|
|
};
|
|
node.type = 'MethodDefinition';
|
|
this.MethodDefinition(node, state, true);
|
|
},
|
|
|
|
ClassProperty(node, state) {
|
|
if (node.static) {
|
|
state.write('static ');
|
|
}
|
|
|
|
if (node.computed) {
|
|
state.write('[');
|
|
this[node.key.type](node.key, state);
|
|
state.write(']');
|
|
} else {
|
|
this[node.key.type](node.key, state);
|
|
}
|
|
|
|
if (node.value) {
|
|
state.write(' = ');
|
|
this[node.value.type](node.value, state, true);
|
|
}
|
|
|
|
state.write(';');
|
|
},
|
|
|
|
ClassPrivateProperty(node, state) {
|
|
if (node.static) {
|
|
state.write('static ');
|
|
}
|
|
|
|
this[node.key.type](node.key, state);
|
|
|
|
if (node.value) {
|
|
state.write(' = ');
|
|
this[node.value.type](node.value, state);
|
|
}
|
|
|
|
state.write(';');
|
|
},
|
|
|
|
PrivateName(node, state) {
|
|
state.write('#' + node.name, node);
|
|
},
|
|
|
|
Import(node, state) {
|
|
// astring doesn't support ImportExpression yet
|
|
state.write('import');
|
|
},
|
|
|
|
_OptionalMemberExpression(node, state) {
|
|
this.OptionalMemberExpression(node, state, true);
|
|
},
|
|
|
|
OptionalMemberExpression(node, state) {
|
|
node.optional = true;
|
|
node.type = 'MemberExpression';
|
|
|
|
_astring().GENERATOR.MemberExpression.call(this, node, state);
|
|
},
|
|
|
|
MemberExpression(node, state) {
|
|
if (node.optional) node.optional = false;
|
|
|
|
_astring().GENERATOR.MemberExpression.call(this, node, state);
|
|
},
|
|
|
|
_OptionalCallExpression(node, state) {
|
|
this.OptionalCallExpression(node, state, true);
|
|
},
|
|
|
|
OptionalCallExpression(node, state) {
|
|
node.optional = true;
|
|
node.type = 'CallExpression';
|
|
|
|
_astring().GENERATOR.CallExpression.call(this, node, state);
|
|
},
|
|
|
|
CallExpression(node, state) {
|
|
if (node.optional) node.optional = false;
|
|
|
|
_astring().GENERATOR.CallExpression.call(this, node, state);
|
|
},
|
|
|
|
ExportNamedDeclaration(node, state) {
|
|
if (node.source) {
|
|
let namespace = node.specifiers.find(specifier => specifier.type === 'ExportNamespaceSpecifier');
|
|
|
|
if (namespace) {
|
|
// Babel parser allows combining namespace specifiers and named specifiers
|
|
// e.g. `export * as foo, {bar} from 'other'`, but this is not supported by the spec.
|
|
if (node.specifiers.length > 1) {
|
|
throw new Error('Namespace specifiers cannot be combined with named specifiers');
|
|
}
|
|
|
|
node.type = 'ExportAllDeclaration';
|
|
node.exported = namespace.exported;
|
|
}
|
|
}
|
|
|
|
_astring().GENERATOR[node.type].call(this, node, state);
|
|
},
|
|
|
|
ReturnStatement(node, state) {
|
|
var _node$argument, _node$argument$leadin;
|
|
|
|
// Add parentheses if there are leading comments
|
|
if (((_node$argument = node.argument) === null || _node$argument === void 0 ? void 0 : (_node$argument$leadin = _node$argument.leadingComments) === null || _node$argument$leadin === void 0 ? void 0 : _node$argument$leadin.length) > 0) {
|
|
let indent = state.indent.repeat(state.indentLevel);
|
|
state.write('return (' + state.lineEnd);
|
|
state.write(indent + state.indent);
|
|
state.indentLevel++;
|
|
this[node.argument.type](node.argument, state);
|
|
state.indentLevel--;
|
|
state.write(state.lineEnd);
|
|
state.write(indent + ');');
|
|
} else {
|
|
_astring().GENERATOR.ReturnStatement.call(this, node, state);
|
|
}
|
|
},
|
|
|
|
ThrowStatement(node, state) {
|
|
var _node$argument2, _node$argument2$leadi;
|
|
|
|
// Add parentheses if there are leading comments
|
|
if (((_node$argument2 = node.argument) === null || _node$argument2 === void 0 ? void 0 : (_node$argument2$leadi = _node$argument2.leadingComments) === null || _node$argument2$leadi === void 0 ? void 0 : _node$argument2$leadi.length) > 0) {
|
|
let indent = state.indent.repeat(state.indentLevel);
|
|
state.write('throw (' + state.lineEnd);
|
|
state.write(indent + state.indent);
|
|
state.indentLevel++;
|
|
this[node.argument.type](node.argument, state);
|
|
state.indentLevel--;
|
|
state.write(state.lineEnd);
|
|
state.write(indent + ');');
|
|
} else {
|
|
_astring().GENERATOR.ThrowStatement.call(this, node, state);
|
|
}
|
|
}
|
|
|
|
}; // Make every node support comments. Important for preserving /*@__PURE__*/ comments for terser.
|
|
// TODO: contribute to astring.
|
|
|
|
exports.generator = generator;
|
|
|
|
for (let key in generator) {
|
|
let orig = generator[key];
|
|
|
|
generator[key] = function (node, state, skipComments) {
|
|
// These are printed by astring itself
|
|
if (node.trailingComments) {
|
|
for (let c of node.trailingComments) {
|
|
if (c.type === 'CommentLine' || c.type === 'LineComment') {
|
|
c.type = 'LineComment';
|
|
} else {
|
|
c.type = 'BlockComment';
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!skipComments && node.leadingComments && node.leadingComments.length > 0) {
|
|
formatComments(state, node.leadingComments);
|
|
}
|
|
|
|
orig.call(this, node, state);
|
|
};
|
|
}
|
|
|
|
function handleDirectives(node) {
|
|
if (node.directives) {
|
|
for (var i = node.directives.length - 1; i >= 0; i--) {
|
|
var directive = node.directives[i];
|
|
directive.type = 'ExpressionStatement';
|
|
directive.expression = directive.value;
|
|
directive.expression.type = 'Literal';
|
|
node.body.unshift(directive);
|
|
}
|
|
}
|
|
} // Copied from the astring source.
|
|
|
|
|
|
function formatComments(state, comments) {
|
|
// Writes into `state` the provided list of `comments`, with the given `indent` and `lineEnd` strings.
|
|
// Line comments will end with `"\n"` regardless of the value of `lineEnd`.
|
|
// Expects to start on a new unindented line.
|
|
const indent = state.indent.repeat(state.indentLevel);
|
|
const {
|
|
length
|
|
} = comments;
|
|
|
|
for (let i = 0; i < length; i++) {
|
|
const comment = comments[i];
|
|
|
|
if (comment.type === 'CommentLine' || comment.type === 'LineComment') {
|
|
// Line comment
|
|
state.write('// ' + comment.value.trim() + state.lineEnd, { ...comment,
|
|
type: 'LineComment'
|
|
});
|
|
state.write(indent);
|
|
} else {
|
|
// Block comment
|
|
state.write('/*');
|
|
reindent(state, comment.value, indent, state.lineEnd);
|
|
state.write('*/'); // Keep pure annotations on the same line
|
|
|
|
let value = comment.value.trim();
|
|
|
|
if (!((value === '#__PURE__' || value === '@__PURE__') && i === length - 1)) {
|
|
state.write(state.lineEnd);
|
|
state.write(indent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function reindent(state, text, indent, lineEnd) {
|
|
// Writes into `state` the `text` string reindented with the provided `indent`.
|
|
const lines = text.split('\n');
|
|
const end = lines.length - 1;
|
|
state.write(lines[0].trim());
|
|
|
|
if (end > 0) {
|
|
state.write(lineEnd);
|
|
|
|
for (let i = 1; i < end; i++) {
|
|
state.write(indent + lines[i].trim() + lineEnd);
|
|
}
|
|
|
|
state.write(indent + lines[end].trim());
|
|
}
|
|
}
|
|
|
|
function getRaw(node) {
|
|
let extra = node.extra;
|
|
|
|
if (extra && extra.raw != null && extra.rawValue != null && node.value === extra.rawValue) {
|
|
return extra.raw;
|
|
}
|
|
} |