svelte-draft
Version:
Develop svelte app in typedraft
110 lines (109 loc) • 4.33 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const svelte = require("svelte/compiler");
const fs = require("fs");
const { resolve } = require("path");
const { transformSync } = require("@babel/core");
const traverse = require("@babel/traverse").default;
const generate = require("@babel/generator").default;
const traverseDirectory = require("filewalker");
function preprocessSvelte(path) {
return __awaiter(this, void 0, void 0, function* () {
const source = fs.readFileSync(path, "utf8");
const { code } = yield svelte.preprocess(source, {
script: ({ content, filename }) => {
const code = preprocessImport(content, filename);
return { code };
},
}, {
filename: path,
});
return code;
});
}
/**
* add .svelte in "import" if necessary
*/
function preprocessImport(content, filename) {
const ast = transformSync(content, {
filename,
ast: true,
}).ast;
traverse(ast, {
ImportDeclaration(astPath) {
var _a;
const sourceName = (_a = astPath.node.source) === null || _a === void 0 ? void 0 : _a.value;
if (!sourceName) {
return;
}
const importFrom = resolve(filename, "../", sourceName);
const svelteFile = importFrom + ".svelte";
if (fs.existsSync(svelteFile)) {
astPath.node.source.value += ".svelte";
}
},
});
const code = generate(ast).code;
return code;
}
function preprocessScript(content, filename) {
const ast = transformSync(content, {
filename,
ast: true,
}).ast;
traverse(ast, {
ImportDeclaration(astPath) {
var _a;
const sourceName = (_a = astPath.node.source) === null || _a === void 0 ? void 0 : _a.value;
if (!sourceName) {
return;
}
const importFrom = resolve(filename, "../", sourceName);
const svelteFile = importFrom + ".svelte";
if (fs.existsSync(svelteFile)) {
astPath.node.source.value += ".svelte";
}
},
ExportDeclaration(astPath) {
var _a;
const sourceName = (_a = astPath.node.source) === null || _a === void 0 ? void 0 : _a.value;
if (!sourceName) {
return;
}
const importFrom = resolve(filename, "../", sourceName);
const svelteFile = importFrom + ".svelte";
if (fs.existsSync(svelteFile)) {
astPath.node.source.value += ".svelte";
}
},
});
const code = generate(ast).code;
return code;
}
function addSvelteExtension(path) {
return __awaiter(this, void 0, void 0, function* () {
traverseDirectory(path)
.on("file", (relative, stats, absolute) => __awaiter(this, void 0, void 0, function* () {
if (absolute.endsWith(".svelte")) {
const code = yield preprocessSvelte(absolute);
fs.writeFileSync(absolute, code, "utf8");
}
else if (absolute.endsWith(".js")) {
const code = fs.readFileSync(absolute, "utf8");
const withExtension = preprocessScript(code, absolute);
fs.writeFileSync(absolute, withExtension, "utf8");
}
}))
.walk();
});
}
exports.addSvelteExtension = addSvelteExtension;