UNPKG

4.3 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = dev;
7
8var _project = require("./project");
9
10var _logger = require("./logger");
11
12var _utils = require("./utils");
13
14var babel = _interopRequireWildcard(require("@babel/core"));
15
16var fs = _interopRequireWildcard(require("fs-extra"));
17
18var _path = _interopRequireDefault(require("path"));
19
20function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
22function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
23
24let tsExtensionPattern = /tsx?$/;
25
26async function getTypeSystem(entrypoint) {
27 let content = await fs.readFile(entrypoint.source, "utf8");
28
29 if (tsExtensionPattern.test(entrypoint.source)) {
30 return ["typescript", content];
31 } // TODO: maybe we should write the flow symlink even if there isn't an
32 // comment so that if someone adds an comment they don't have to run preconstruct dev again
33
34
35 if (content.includes("@flow")) {
36 return ["flow", content];
37 }
38
39 return [null, content];
40}
41
42async function writeFlowFile(typeSystemPromise, entrypoint) {
43 let [typeSystem, content] = await typeSystemPromise;
44 if (typeSystem === null) return;
45
46 let cjsDistPath = _path.default.join(entrypoint.directory, entrypoint.main);
47
48 if (typeSystem === "flow") {
49 await fs.symlink(entrypoint.source, cjsDistPath + ".flow");
50 }
51
52 if (typeSystem === "typescript") {
53 let ast = await babel.parseAsync(content, {
54 filename: entrypoint.source,
55 sourceType: "module",
56 cwd: entrypoint.package.project.directory
57 });
58 let hasDefaultExport = false;
59
60 for (let statement of ast.program.body) {
61 if (statement.type === "ExportDefaultDeclaration" || statement.type === "ExportNamedDeclaration" && statement.specifiers.some(specifier => specifier.type === "ExportSpecifier" && specifier.exported.name === "default")) {
62 hasDefaultExport = true;
63 break;
64 }
65 }
66
67 await fs.writeFile(cjsDistPath + ".ts", (0, _utils.tsTemplate)(hasDefaultExport, _path.default.relative(_path.default.dirname(cjsDistPath), entrypoint.source).replace(/\.tsx?$/, "")));
68 }
69}
70
71async function dev(projectDir) {
72 let project = await _project.Project.create(projectDir);
73 project.packages.forEach(({
74 entrypoints
75 }) => entrypoints.forEach(x => x.strict()));
76 (0, _logger.info)("project is valid!");
77 let promises = [];
78 await Promise.all(project.packages.map(pkg => {
79 return Promise.all(pkg.entrypoints.map(async _entrypoint => {
80 let entrypoint = _entrypoint.strict();
81
82 let typeSystemPromise = getTypeSystem(entrypoint);
83 await fs.remove(_path.default.join(entrypoint.directory, "dist"));
84 await fs.ensureDir(_path.default.join(entrypoint.directory, "dist"));
85 let promises = [writeFlowFile(typeSystemPromise, entrypoint), fs.writeFile(_path.default.join(entrypoint.directory, entrypoint.main), `'use strict';
86
87let unregister = require('${require.resolve("@preconstruct/hook")}').___internalHook('${project.directory}');
88
89module.exports = require('${entrypoint.source}');
90
91unregister();
92`)];
93
94 if (entrypoint.module) {
95 promises.push(fs.symlink(entrypoint.source, _path.default.join(entrypoint.directory, entrypoint.module)));
96 }
97
98 let browserField = entrypoint.browser;
99
100 if (browserField) {
101 for (let key of Object.keys(browserField)) {
102 promises.push(fs.symlink(entrypoint.source, _path.default.join(entrypoint.directory, browserField[key])));
103 }
104 }
105
106 let rnField = entrypoint.reactNative;
107
108 if (rnField) {
109 for (let key of Object.keys(rnField)) {
110 promises.push(fs.symlink(entrypoint.source, _path.default.join(entrypoint.directory, rnField[key])));
111 }
112 }
113
114 return Promise.all(promises);
115 }));
116 }));
117 await Promise.all(promises);
118 (0, _logger.success)("created links!");
119}
\No newline at end of file