UNPKG

7.13 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.djb2 = exports.getOutputFileNamesOfProjectReference = exports.iterateProjectReferences = exports.invertChangeRange = exports.hasParseErrors = exports.addUnique = exports.flatMap = exports.mapDefined = exports.hasSupportedExtension = exports.calculateChangeRange = exports.assertNever = exports.format = exports.unixifyPath = exports.resolveCachedResult = exports.arrayify = exports.emptyArray = exports.OFFSET_TO_NODE_MODULES = void 0;
4const json5 = require("json5");
5const yaml = require("js-yaml");
6const path = require("path");
7/**
8 * Number of .. until the containing node_modules.
9 * __dirname -> src
10 * .. -> project root
11 * ../.. -> node_modules (or @scope)
12 * ../../.. -> node_modules if @scoped package
13 */
14exports.OFFSET_TO_NODE_MODULES = 3;
15exports.emptyArray = [];
16function arrayify(maybeArr) {
17 return Array.isArray(maybeArr)
18 ? maybeArr
19 : maybeArr === undefined
20 ? exports.emptyArray
21 : [maybeArr];
22}
23exports.arrayify = arrayify;
24function resolveCachedResult(cache, key, cb) {
25 let result = cache.get(key);
26 if (result === undefined && !cache.has(key)) {
27 result = cb(key);
28 cache.set(key, result);
29 }
30 return result;
31}
32exports.resolveCachedResult = resolveCachedResult;
33function unixifyPath(p) {
34 return p.replace(/\\/g, '/');
35}
36exports.unixifyPath = unixifyPath;
37function format(value, fmt = "yaml" /* Yaml */) {
38 value = convertToPrintable(value) || {};
39 switch (fmt) {
40 case "json" /* Json */:
41 return JSON.stringify(value, undefined, 2);
42 case "json5" /* Json5 */:
43 return json5.stringify(value, undefined, 2);
44 case "yaml" /* Yaml */:
45 return yaml.dump(value, {
46 indent: 2,
47 schema: yaml.JSON_SCHEMA,
48 sortKeys: true,
49 });
50 default:
51 return assertNever(fmt);
52 }
53}
54exports.format = format;
55function convertToPrintable(value) {
56 if (value == undefined || typeof value !== 'object')
57 return value;
58 if (value instanceof Map) {
59 const obj = {};
60 for (const [k, v] of value)
61 if (v !== undefined)
62 obj[k] = v;
63 value = obj;
64 }
65 if (Array.isArray(value)) {
66 const result = mapDefined(value, convertToPrintable);
67 return result.length === 0 ? undefined : result;
68 }
69 const keys = Object.keys(value);
70 if (keys.length === 0)
71 return;
72 let added = false;
73 const newValue = {};
74 for (const key of keys) {
75 const converted = convertToPrintable(value[key]);
76 if (converted !== undefined) {
77 newValue[key] = converted;
78 added = true;
79 }
80 }
81 return added ? newValue : undefined;
82}
83function assertNever(v) {
84 throw new Error(`unexpected value '${v}'`);
85}
86exports.assertNever = assertNever;
87function calculateChangeRange(original, changed) {
88 const diff = changed.length - original.length;
89 let start = 0;
90 let end = original.length;
91 const minEnd = diff >= 0 ? end : changed.length;
92 for (; start < minEnd && original[start] === changed[start]; ++start)
93 ;
94 if (start !== minEnd) {
95 const maxStart = end - minEnd + start;
96 for (let changedEnd = changed.length; maxStart < end && original[end - 1] === changed[changedEnd - 1]; --end, --changedEnd)
97 ;
98 }
99 const length = end - start;
100 return {
101 span: {
102 start,
103 length,
104 },
105 newLength: length + diff,
106 };
107}
108exports.calculateChangeRange = calculateChangeRange;
109function hasSupportedExtension(fileName, extensions) {
110 const ext = path.extname(fileName);
111 return /^\.[jt]sx?$/.test(ext) || extensions !== undefined && extensions.includes(ext);
112}
113exports.hasSupportedExtension = hasSupportedExtension;
114function mapDefined(input, cb) {
115 const result = [];
116 for (const item of input) {
117 const current = cb(item);
118 if (current !== undefined)
119 result.push(current);
120 }
121 return result;
122}
123exports.mapDefined = mapDefined;
124function flatMap(input, cb) {
125 const result = [];
126 for (const item of input)
127 result.push(...cb(item));
128 return result;
129}
130exports.flatMap = flatMap;
131/**
132 * Adds an item to an array if it's not already included.
133 * @returns true if the item was not present in the array
134 * */
135function addUnique(arr, item) {
136 if (arr.includes(item))
137 return false;
138 arr.push(item);
139 return true;
140}
141exports.addUnique = addUnique;
142function hasParseErrors(sourceFile) {
143 return sourceFile.parseDiagnostics.length !== 0;
144}
145exports.hasParseErrors = hasParseErrors;
146function invertChangeRange(range) {
147 return {
148 span: {
149 start: range.span.start,
150 length: range.newLength,
151 },
152 newLength: range.span.length,
153 };
154}
155exports.invertChangeRange = invertChangeRange;
156function iterateProjectReferences(references) {
157 return iterateProjectReferencesWorker(references, []);
158}
159exports.iterateProjectReferences = iterateProjectReferences;
160function* iterateProjectReferencesWorker(references, seen) {
161 if (references === undefined)
162 return;
163 for (const ref of references) {
164 if (ref === undefined || !addUnique(seen, ref.sourceFile.fileName))
165 continue;
166 yield ref;
167 yield* iterateProjectReferencesWorker(ref.references, seen);
168 }
169}
170function getOutputFileNamesOfProjectReference(ref) {
171 const options = ref.commandLine.options;
172 const outFile = options.outFile || options.out;
173 if (outFile)
174 return [getOutFileDeclarationName(outFile)];
175 const projectDirectory = path.dirname(ref.sourceFile.fileName);
176 return mapDefined(ref.commandLine.fileNames, (fileName) => getDeclarationOutputName(fileName, options, projectDirectory));
177}
178exports.getOutputFileNamesOfProjectReference = getOutputFileNamesOfProjectReference;
179// TODO remove once https://github.com/Microsoft/TypeScript/issues/26410 is resolved
180function getDeclarationOutputName(fileName, options, projectDirectory) {
181 const extension = path.extname(fileName);
182 switch (extension) {
183 case '.tsx':
184 case '.js':
185 case '.jsx':
186 break;
187 case '.ts':
188 if (path.extname(fileName.slice(0, -extension.length)) !== '.d')
189 break;
190 // falls through: .d.ts files produce no output
191 default:
192 return;
193 }
194 fileName = fileName.slice(0, -extension.length) + '.d.ts';
195 return unixifyPath(path.resolve(options.declarationDir || options.outDir || projectDirectory, path.relative(options.rootDir || projectDirectory, fileName)));
196}
197function getOutFileDeclarationName(outFile) {
198 // outFile ignores declarationDir
199 return outFile.slice(0, -path.extname(outFile).length) + '.d.ts';
200}
201function djb2(str) {
202 let hash = 5381;
203 for (let i = 0; i < str.length; ++i)
204 hash = ((hash << 5) + hash) + str.charCodeAt(i);
205 return hash;
206}
207exports.djb2 = djb2;
208//# sourceMappingURL=utils.js.map
\No newline at end of file