svelte-draft
Version:
Develop svelte app in typedraft
71 lines (70 loc) • 3.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const typedraft_1 = require("typedraft");
class JSXExpressionContainerVisitor {
Visit(container, generator) {
if (!container.parentPath.isJSXElement())
return;
const name = container.parentPath.get("openingElement").get("name");
if (!name.isJSXIdentifier())
return;
const tag_name = name.node.name;
if (tag_name === "each") {
const expression = container.get("expression");
if (expression.isArrowFunctionExpression()) {
generator.TraverseTag(expression.get("body"));
}
}
else if (tag_name === "await") {
const info = container.get("expression");
if (!info.isObjectExpression())
return;
const props = info.get("properties");
const loading = props.find(prop => prop.isObjectProperty() && prop.node.key.name === "loading");
const loading_jsx = loading === null || loading === void 0 ? void 0 : loading.get("value");
if (loading_jsx) {
generator.TraverseTag(loading_jsx);
}
const promise = props.find(prop => prop.isObjectProperty() && prop.node.key.name === "promise");
const promise_js = promise.get("value");
const [arg_last] = promise_js.get("arguments");
const callee = promise_js.get("callee");
const object = callee.get("object");
if (object.isIdentifier()) {
TraversePromiseClause("then", arg_last, generator);
}
else if (object.isCallExpression()) {
const [arg_first] = object.get("arguments");
TraversePromiseClause("then", arg_first, generator);
TraversePromiseClause("catch", arg_last, generator);
}
}
else if (tag_name === "debug") {
const to_debug = container.get("expression").get("elements");
const variable_list = to_debug.map(each => typedraft_1.ToString(each.node)).join(", ");
generator.Append(variable_list);
}
else if (tag_name === "raw-html") {
const node = container.get("expression").node;
generator.Append(typedraft_1.ToString(node));
}
else {
const expression = container.get("expression");
if (expression.isArrowFunctionExpression()) {
generator.TraverseTag(expression.get("body"));
}
else {
generator.Append(typedraft_1.ToString(container.node));
}
}
}
}
exports.JSXExpressionContainerVisitor = JSXExpressionContainerVisitor;
function TraversePromiseClause(name, path, generator) {
const jsx = path.get("body");
const clause = `{:${name} ${path.get("params").toString()}}`;
generator.Append("\n");
generator.Append(clause);
generator.Append("\n");
generator.TraverseTag(jsx);
}