@flamework-experimental/transformer 2.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +66 -0
  2. package/flamework-schema.json +76 -0
  3. package/flamework.config.schema.json +197 -0
  4. package/out/classes/buildInfo.js +467 -0
  5. package/out/classes/diagnostics.js +110 -0
  6. package/out/classes/logger.js +201 -0
  7. package/out/classes/nodeMetadata.js +232 -0
  8. package/out/classes/transformState.js +623 -0
  9. package/out/index.js +75 -0
  10. package/out/transformations/expressions/transformAccessExpression.js +35 -0
  11. package/out/transformations/expressions/transformBinaryExpression.js +57 -0
  12. package/out/transformations/expressions/transformCallExpression.js +33 -0
  13. package/out/transformations/expressions/transformDeleteExpression.js +22 -0
  14. package/out/transformations/expressions/transformNewExpression.js +17 -0
  15. package/out/transformations/expressions/transformUnaryExpression.js +63 -0
  16. package/out/transformations/macros/intrinsics/components.js +64 -0
  17. package/out/transformations/macros/intrinsics/env.js +31 -0
  18. package/out/transformations/macros/intrinsics/guards.js +43 -0
  19. package/out/transformations/macros/intrinsics/inlining.js +22 -0
  20. package/out/transformations/macros/intrinsics/networking.js +131 -0
  21. package/out/transformations/macros/intrinsics/parameters.js +81 -0
  22. package/out/transformations/macros/intrinsics/paths.js +42 -0
  23. package/out/transformations/macros/updateComponentConfig.js +409 -0
  24. package/out/transformations/plugins/nodeFactory.js +159 -0
  25. package/out/transformations/plugins/pluginHost.js +235 -0
  26. package/out/transformations/plugins/typeFacade.js +242 -0
  27. package/out/transformations/statements/transformClassDeclaration.js +282 -0
  28. package/out/transformations/transformExpression.js +34 -0
  29. package/out/transformations/transformFile.js +78 -0
  30. package/out/transformations/transformNetworkingCall.js +566 -0
  31. package/out/transformations/transformNode.js +27 -0
  32. package/out/transformations/transformStatement.js +57 -0
  33. package/out/transformations/transformStatementList.js +64 -0
  34. package/out/transformations/transformUserMacro.js +698 -0
  35. package/out/transformer.js +52 -0
  36. package/out/util/cache.js +10 -0
  37. package/out/util/constants.js +5 -0
  38. package/out/util/diagnosticsUtils.js +112 -0
  39. package/out/util/env.js +267 -0
  40. package/out/util/factory.js +583 -0
  41. package/out/util/functions/addLeadingComment.js +13 -0
  42. package/out/util/functions/arePathsEqual.js +14 -0
  43. package/out/util/functions/assert.js +17 -0
  44. package/out/util/functions/buildGuardFromType.js +713 -0
  45. package/out/util/functions/buildInstanceShape.js +156 -0
  46. package/out/util/functions/buildSerializerFromType.js +2309 -0
  47. package/out/util/functions/createPathTranslator.js +54 -0
  48. package/out/util/functions/emitTypescriptMismatch.js +80 -0
  49. package/out/util/functions/getDeclarationName.js +23 -0
  50. package/out/util/functions/getDeclarationOfType.js +7 -0
  51. package/out/util/functions/getIndexExpression.js +16 -0
  52. package/out/util/functions/getInstanceTypeFromType.js +75 -0
  53. package/out/util/functions/getNodeList.js +6 -0
  54. package/out/util/functions/getPackageJson.js +44 -0
  55. package/out/util/functions/getSuperClasses.js +51 -0
  56. package/out/util/functions/isAttributesAccess.js +23 -0
  57. package/out/util/functions/isCleanBuildDirectory.js +13 -0
  58. package/out/util/functions/isDefinedType.js +16 -0
  59. package/out/util/functions/isPathDescendantOf.js +25 -0
  60. package/out/util/functions/isTupleType.js +10 -0
  61. package/out/util/functions/parseCommandLine.js +31 -0
  62. package/out/util/functions/shuffle.js +39 -0
  63. package/out/util/functions/tryResolve.js +15 -0
  64. package/out/util/functions/validateConstraintMetadata.js +60 -0
  65. package/out/util/packages.js +12 -0
  66. package/out/util/projectConfig.js +221 -0
  67. package/out/util/schema.js +80 -0
  68. package/out/util/tsInternals.js +16 -0
  69. package/out/util/uid.js +227 -0
  70. package/package.json +45 -0
  71. package/rojo-schema.json +34 -0
  72. package/types.d.ts +4 -0
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ var __values = (this && this.__values) || function(o) {
3
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
+ if (m) return m.call(o);
5
+ if (o && typeof o.length === "number") return {
6
+ next: function () {
7
+ if (o && i >= o.length) o = void 0;
8
+ return { value: o && o[i++], done: !o };
9
+ }
10
+ };
11
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
+ };
13
+ var __read = (this && this.__read) || function (o, n) {
14
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
15
+ if (!m) return o;
16
+ var i = m.call(o), r, ar = [], e;
17
+ try {
18
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
19
+ }
20
+ catch (error) { e = { error: error }; }
21
+ finally {
22
+ try {
23
+ if (r && !r.done && (m = i["return"])) m.call(i);
24
+ }
25
+ finally { if (e) throw e.error; }
26
+ }
27
+ return ar;
28
+ };
29
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
30
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
31
+ if (ar || !(i in from)) {
32
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
33
+ ar[i] = from[i];
34
+ }
35
+ }
36
+ return to.concat(ar || Array.prototype.slice.call(from));
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.Logger = void 0;
43
+ var chalk_1 = __importDefault(require("chalk"));
44
+ function getTime() {
45
+ var hrTime = process.hrtime();
46
+ return hrTime[0] * 1000 + hrTime[1] / 1e6;
47
+ }
48
+ var Logger = /** @class */ (function () {
49
+ function Logger() {
50
+ }
51
+ Logger.timer = function (name) {
52
+ this.queueTimer();
53
+ this.timers.push([name, getTime()]);
54
+ };
55
+ Logger.timerEnd = function () {
56
+ var timer = this.timers.pop();
57
+ if (!timer)
58
+ return;
59
+ var currentValue = this.timerTotals.get(timer[0]);
60
+ if (!currentValue)
61
+ this.timerTotals.set(timer[0], (currentValue = [0, 0]));
62
+ currentValue[0] += getTime() - timer[1];
63
+ currentValue[1]++;
64
+ };
65
+ Logger.queueTimer = function () {
66
+ var _this = this;
67
+ if (this.timerHandle !== undefined) {
68
+ this.timerHandle.refresh();
69
+ return;
70
+ }
71
+ this.timerHandle = setTimeout(function () {
72
+ var e_1, _a;
73
+ var totals = _this.timerTotals;
74
+ _this.timerTotals = new Map();
75
+ try {
76
+ for (var totals_1 = __values(totals), totals_1_1 = totals_1.next(); !totals_1_1.done; totals_1_1 = totals_1.next()) {
77
+ var _b = __read(totals_1_1.value, 2), name_1 = _b[0], _c = __read(_b[1], 2), total = _c[0], count = _c[1];
78
+ console.log("Timer '".concat(name_1, "' took ").concat(total.toFixed(2), "ms (").concat(count, ")"));
79
+ }
80
+ }
81
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
82
+ finally {
83
+ try {
84
+ if (totals_1_1 && !totals_1_1.done && (_a = totals_1.return)) _a.call(totals_1);
85
+ }
86
+ finally { if (e_1) throw e_1.error; }
87
+ }
88
+ });
89
+ };
90
+ Logger.write = function (message) {
91
+ process.stdout.write(message);
92
+ };
93
+ Logger.writeLine = function () {
94
+ var e_2, _a;
95
+ var messages = [];
96
+ for (var _i = 0; _i < arguments.length; _i++) {
97
+ messages[_i] = arguments[_i];
98
+ }
99
+ if (!this.debug)
100
+ return;
101
+ try {
102
+ for (var messages_1 = __values(messages), messages_1_1 = messages_1.next(); !messages_1_1.done; messages_1_1 = messages_1.next()) {
103
+ var message = messages_1_1.value;
104
+ var text = typeof message === "string" ? "".concat(message) : "".concat(JSON.stringify(message, undefined, "\t"));
105
+ var flameworkPrefix = "[".concat(chalk_1.default.gray("Flamework"), "]: ");
106
+ this.write("".concat(flameworkPrefix).concat(text.replace(/\n/g, "\n".concat(flameworkPrefix)), "\n"));
107
+ }
108
+ }
109
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
110
+ finally {
111
+ try {
112
+ if (messages_1_1 && !messages_1_1.done && (_a = messages_1.return)) _a.call(messages_1);
113
+ }
114
+ finally { if (e_2) throw e_2.error; }
115
+ }
116
+ };
117
+ Logger.writeLineIfVerbose = function () {
118
+ var messages = [];
119
+ for (var _i = 0; _i < arguments.length; _i++) {
120
+ messages[_i] = arguments[_i];
121
+ }
122
+ if (this.verbose)
123
+ return this.writeLine.apply(this, __spreadArray([], __read(messages), false));
124
+ };
125
+ Logger.info = function () {
126
+ var messages = [];
127
+ for (var _i = 0; _i < arguments.length; _i++) {
128
+ messages[_i] = arguments[_i];
129
+ }
130
+ this.writeLine.apply(this, __spreadArray([], __read(messages.map(function (x) { return chalk_1.default.blue(x); })), false));
131
+ };
132
+ Logger.infoIfVerbose = function () {
133
+ var messages = [];
134
+ for (var _i = 0; _i < arguments.length; _i++) {
135
+ messages[_i] = arguments[_i];
136
+ }
137
+ if (this.verbose)
138
+ return this.info.apply(this, __spreadArray([], __read(messages), false));
139
+ };
140
+ Logger.warn = function () {
141
+ var messages = [];
142
+ for (var _i = 0; _i < arguments.length; _i++) {
143
+ messages[_i] = arguments[_i];
144
+ }
145
+ this.writeLine.apply(this, __spreadArray([], __read(messages.map(function (x) { return chalk_1.default.yellow(x); })), false));
146
+ };
147
+ Logger.warnIfVerbose = function () {
148
+ var messages = [];
149
+ for (var _i = 0; _i < arguments.length; _i++) {
150
+ messages[_i] = arguments[_i];
151
+ }
152
+ if (this.verbose)
153
+ return this.warn.apply(this, __spreadArray([], __read(messages), false));
154
+ };
155
+ Logger.error = function () {
156
+ var messages = [];
157
+ for (var _i = 0; _i < arguments.length; _i++) {
158
+ messages[_i] = arguments[_i];
159
+ }
160
+ this.writeLine.apply(this, __spreadArray([], __read(messages.map(function (x) { return chalk_1.default.red(x); })), false));
161
+ };
162
+ Logger.benchmark = function (label) {
163
+ if (!this.debug)
164
+ return;
165
+ var depth = this.benchmarkLabels.length;
166
+ this.benchmarkLabels.push({
167
+ start: new Date().getTime(),
168
+ label: label,
169
+ });
170
+ this.benchmarkOutput += "".concat("\t".repeat(depth), "Begin ").concat(label, "\n");
171
+ };
172
+ Logger.benchmarkEnd = function () {
173
+ if (!this.debug)
174
+ return;
175
+ var label = this.benchmarkLabels.pop();
176
+ var depth = this.benchmarkLabels.length;
177
+ if (!label)
178
+ throw new Error("Unexpected benchmarkEnd()");
179
+ var timeDifference = new Date().getTime() - label.start;
180
+ this.benchmarkOutput += "".concat("\t".repeat(depth), "End ").concat(label.label, " (").concat(timeDifference, "ms)\n");
181
+ if (depth === 0) {
182
+ this.info(this.benchmarkOutput);
183
+ this.benchmarkOutput = "";
184
+ }
185
+ };
186
+ Logger.debug = true;
187
+ Logger.verbose = process.argv.includes("--verbose");
188
+ Logger.timerTotals = new Map();
189
+ Logger.timers = new Array();
190
+ Logger.benchmarkLabels = [];
191
+ Logger.benchmarkOutput = "";
192
+ (function () {
193
+ // Workaround for vscode PTY not having color highlighting.
194
+ if (process.env.VSCODE_CWD !== undefined) {
195
+ // ANSI 256
196
+ chalk_1.default.level = 2;
197
+ }
198
+ })();
199
+ return Logger;
200
+ }());
201
+ exports.Logger = Logger;
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ var __values = (this && this.__values) || function(o) {
3
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
+ if (m) return m.call(o);
5
+ if (o && typeof o.length === "number") return {
6
+ next: function () {
7
+ if (o && i >= o.length) o = void 0;
8
+ return { value: o && o[i++], done: !o };
9
+ }
10
+ };
11
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.NodeMetadata = void 0;
18
+ var typescript_1 = __importDefault(require("typescript"));
19
+ var factory_1 = require("../util/factory");
20
+ var NodeMetadata = /** @class */ (function () {
21
+ function NodeMetadata(state, node) {
22
+ this.set = new Set();
23
+ this.symbols = new Map();
24
+ this.types = new Map();
25
+ this.trace = new Map();
26
+ this.parse(state, node);
27
+ }
28
+ NodeMetadata.fromSymbol = function (state, symbol) {
29
+ if (symbol.valueDeclaration) {
30
+ return NodeMetadata.fromCache(state, symbol.valueDeclaration);
31
+ }
32
+ };
33
+ NodeMetadata.fromCache = function (state, node) {
34
+ var existing = NodeMetadata.metadataCache.get(node);
35
+ if (existing) {
36
+ return existing;
37
+ }
38
+ var metadata = new NodeMetadata(state, node);
39
+ NodeMetadata.metadataCache.set(node, metadata);
40
+ return metadata;
41
+ };
42
+ NodeMetadata.prototype.parseText = function (text, node) {
43
+ var e_1, _a;
44
+ try {
45
+ for (var _b = __values(text.trim().replace(/\s+/, " ").split(" ")), _c = _b.next(); !_c.done; _c = _b.next()) {
46
+ var name_1 = _c.value;
47
+ this.set.add(name_1);
48
+ this.trace.set(name_1, node);
49
+ }
50
+ }
51
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
52
+ finally {
53
+ try {
54
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
55
+ }
56
+ finally { if (e_1) throw e_1.error; }
57
+ }
58
+ };
59
+ NodeMetadata.prototype.parseMetadata = function (state, tag) {
60
+ var e_2, _a;
61
+ if (typeof tag.comment === "string") {
62
+ this.parseText(tag.comment, tag);
63
+ }
64
+ else if (tag.comment) {
65
+ try {
66
+ for (var _b = __values(tag.comment), _c = _b.next(); !_c.done; _c = _b.next()) {
67
+ var comment = _c.value;
68
+ if (typescript_1.default.isJSDocLinkLike(comment)) {
69
+ if (!comment.name)
70
+ continue;
71
+ var symbol = state.getSymbol(comment.name);
72
+ if (!symbol)
73
+ continue;
74
+ var type = symbol.flags & typescript_1.default.SymbolFlags.TypeAlias
75
+ ? state.typeChecker.getDeclaredTypeOfSymbol(symbol)
76
+ : state.typeChecker.getTypeAtLocation(comment.name);
77
+ var symbols = this.symbols.get(comment.text);
78
+ var types = this.types.get(comment.text);
79
+ if (!types)
80
+ this.types.set(comment.text, (types = []));
81
+ if (!symbols)
82
+ this.symbols.set(comment.text, (symbols = []));
83
+ symbols.push(symbol);
84
+ types.push(type);
85
+ this.trace.set(symbol, comment);
86
+ this.trace.set(type, comment);
87
+ }
88
+ else {
89
+ this.parseText(comment.text, comment);
90
+ }
91
+ }
92
+ }
93
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
94
+ finally {
95
+ try {
96
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
97
+ }
98
+ finally { if (e_2) throw e_2.error; }
99
+ }
100
+ }
101
+ };
102
+ NodeMetadata.prototype.parse = function (state, node) {
103
+ var e_3, _a, e_4, _b, e_5, _c, e_6, _d, e_7, _e, e_8, _f;
104
+ var _g, _h;
105
+ var tags = typescript_1.default.getJSDocTags(node);
106
+ try {
107
+ for (var tags_1 = __values(tags), tags_1_1 = tags_1.next(); !tags_1_1.done; tags_1_1 = tags_1.next()) {
108
+ var tag = tags_1_1.value;
109
+ if (tag.tagName.text === "metadata") {
110
+ this.parseMetadata(state, tag);
111
+ }
112
+ }
113
+ }
114
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
115
+ finally {
116
+ try {
117
+ if (tags_1_1 && !tags_1_1.done && (_a = tags_1.return)) _a.call(tags_1);
118
+ }
119
+ finally { if (e_3) throw e_3.error; }
120
+ }
121
+ var decorators = typescript_1.default.canHaveDecorators(node) ? typescript_1.default.getDecorators(node) : undefined;
122
+ if (decorators) {
123
+ try {
124
+ for (var decorators_1 = __values(decorators), decorators_1_1 = decorators_1.next(); !decorators_1_1.done; decorators_1_1 = decorators_1.next()) {
125
+ var decorator = decorators_1_1.value;
126
+ var expression = decorator.expression;
127
+ var symbol = state.getSymbol(factory_1.f.is.call(expression) ? expression.expression : expression);
128
+ if (!symbol || !symbol.declarations)
129
+ continue;
130
+ try {
131
+ for (var _j = (e_5 = void 0, __values(symbol.declarations)), _k = _j.next(); !_k.done; _k = _j.next()) {
132
+ var declaration = _k.value;
133
+ this.parse(state, declaration);
134
+ }
135
+ }
136
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
137
+ finally {
138
+ try {
139
+ if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
140
+ }
141
+ finally { if (e_5) throw e_5.error; }
142
+ }
143
+ }
144
+ }
145
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
146
+ finally {
147
+ try {
148
+ if (decorators_1_1 && !decorators_1_1.done && (_b = decorators_1.return)) _b.call(decorators_1);
149
+ }
150
+ finally { if (e_4) throw e_4.error; }
151
+ }
152
+ }
153
+ if (typescript_1.default.isClassElement(node) && node.name) {
154
+ // Interfaces are able to request metadata for their own property/methods.
155
+ var name_2 = typescript_1.default.getNameFromPropertyName(node.name);
156
+ if (name_2 && typescript_1.default.isClassLike(node.parent)) {
157
+ var implementNodes = typescript_1.default.getEffectiveImplementsTypeNodes(node.parent);
158
+ if (implementNodes) {
159
+ try {
160
+ for (var implementNodes_1 = __values(implementNodes), implementNodes_1_1 = implementNodes_1.next(); !implementNodes_1_1.done; implementNodes_1_1 = implementNodes_1.next()) {
161
+ var implement = implementNodes_1_1.value;
162
+ var symbol = state.getSymbol(implement.expression);
163
+ var member = (_g = symbol === null || symbol === void 0 ? void 0 : symbol.members) === null || _g === void 0 ? void 0 : _g.get(typescript_1.default.escapeLeadingUnderscores(name_2));
164
+ if (member && member.declarations) {
165
+ try {
166
+ for (var _l = (e_7 = void 0, __values(member.declarations)), _m = _l.next(); !_m.done; _m = _l.next()) {
167
+ var declaration = _m.value;
168
+ this.parse(state, declaration);
169
+ }
170
+ }
171
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
172
+ finally {
173
+ try {
174
+ if (_m && !_m.done && (_e = _l.return)) _e.call(_l);
175
+ }
176
+ finally { if (e_7) throw e_7.error; }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
182
+ finally {
183
+ try {
184
+ if (implementNodes_1_1 && !implementNodes_1_1.done && (_d = implementNodes_1.return)) _d.call(implementNodes_1);
185
+ }
186
+ finally { if (e_6) throw e_6.error; }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ else if (typescript_1.default.isClassLike(node)) {
192
+ // Interfaces are able to request metadata for the object it is implemented on.
193
+ var implementNodes = typescript_1.default.getEffectiveImplementsTypeNodes(node);
194
+ if (implementNodes) {
195
+ try {
196
+ for (var implementNodes_2 = __values(implementNodes), implementNodes_2_1 = implementNodes_2.next(); !implementNodes_2_1.done; implementNodes_2_1 = implementNodes_2.next()) {
197
+ var implement = implementNodes_2_1.value;
198
+ var symbol = state.getSymbol(implement.expression);
199
+ if (symbol && ((_h = symbol.declarations) === null || _h === void 0 ? void 0 : _h[0])) {
200
+ this.parse(state, symbol.declarations[0]);
201
+ }
202
+ }
203
+ }
204
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
205
+ finally {
206
+ try {
207
+ if (implementNodes_2_1 && !implementNodes_2_1.done && (_f = implementNodes_2.return)) _f.call(implementNodes_2);
208
+ }
209
+ finally { if (e_8) throw e_8.error; }
210
+ }
211
+ }
212
+ }
213
+ };
214
+ NodeMetadata.prototype.isRequested = function (metadata) {
215
+ if (this.set.has("~".concat(metadata))) {
216
+ return false;
217
+ }
218
+ return this.set.has(metadata) || this.set.has("*");
219
+ };
220
+ NodeMetadata.prototype.getSymbol = function (key) {
221
+ return this.symbols.get(key);
222
+ };
223
+ NodeMetadata.prototype.getType = function (key) {
224
+ return this.types.get(key);
225
+ };
226
+ NodeMetadata.prototype.getTrace = function (name) {
227
+ return this.trace.get(name);
228
+ };
229
+ NodeMetadata.metadataCache = new WeakMap();
230
+ return NodeMetadata;
231
+ }());
232
+ exports.NodeMetadata = NodeMetadata;