skir 0.0.1

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 (141) hide show
  1. package/README.md +447 -0
  2. package/dist/casing.d.ts +8 -0
  3. package/dist/casing.d.ts.map +1 -0
  4. package/dist/casing.js +49 -0
  5. package/dist/casing.js.map +1 -0
  6. package/dist/casing.test.d.ts +2 -0
  7. package/dist/casing.test.d.ts.map +1 -0
  8. package/dist/casing.test.js +134 -0
  9. package/dist/casing.test.js.map +1 -0
  10. package/dist/command_line_parser.d.ts +33 -0
  11. package/dist/command_line_parser.d.ts.map +1 -0
  12. package/dist/command_line_parser.js +171 -0
  13. package/dist/command_line_parser.js.map +1 -0
  14. package/dist/command_line_parser.test.d.ts +2 -0
  15. package/dist/command_line_parser.test.d.ts.map +1 -0
  16. package/dist/command_line_parser.test.js +302 -0
  17. package/dist/command_line_parser.test.js.map +1 -0
  18. package/dist/compatibility_checker.d.ts +68 -0
  19. package/dist/compatibility_checker.d.ts.map +1 -0
  20. package/dist/compatibility_checker.js +328 -0
  21. package/dist/compatibility_checker.js.map +1 -0
  22. package/dist/compatibility_checker.test.d.ts +2 -0
  23. package/dist/compatibility_checker.test.d.ts.map +1 -0
  24. package/dist/compatibility_checker.test.js +528 -0
  25. package/dist/compatibility_checker.test.js.map +1 -0
  26. package/dist/compiler.d.ts +3 -0
  27. package/dist/compiler.d.ts.map +1 -0
  28. package/dist/compiler.js +358 -0
  29. package/dist/compiler.js.map +1 -0
  30. package/dist/config.d.ts +47 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +23 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/definition_finder.d.ts +12 -0
  35. package/dist/definition_finder.d.ts.map +1 -0
  36. package/dist/definition_finder.js +180 -0
  37. package/dist/definition_finder.js.map +1 -0
  38. package/dist/definition_finder.test.d.ts +2 -0
  39. package/dist/definition_finder.test.d.ts.map +1 -0
  40. package/dist/definition_finder.test.js +164 -0
  41. package/dist/definition_finder.test.js.map +1 -0
  42. package/dist/encoding.d.ts +2 -0
  43. package/dist/encoding.d.ts.map +1 -0
  44. package/dist/encoding.js +38 -0
  45. package/dist/encoding.js.map +1 -0
  46. package/dist/encoding.test.d.ts +2 -0
  47. package/dist/encoding.test.d.ts.map +1 -0
  48. package/dist/encoding.test.js +23 -0
  49. package/dist/encoding.test.js.map +1 -0
  50. package/dist/error_renderer.d.ts +10 -0
  51. package/dist/error_renderer.d.ts.map +1 -0
  52. package/dist/error_renderer.js +247 -0
  53. package/dist/error_renderer.js.map +1 -0
  54. package/dist/formatter.d.ts +3 -0
  55. package/dist/formatter.d.ts.map +1 -0
  56. package/dist/formatter.js +263 -0
  57. package/dist/formatter.js.map +1 -0
  58. package/dist/formatter.test.d.ts +2 -0
  59. package/dist/formatter.test.d.ts.map +1 -0
  60. package/dist/formatter.test.js +156 -0
  61. package/dist/formatter.test.js.map +1 -0
  62. package/dist/index.d.ts +6 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +5 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/index.test.d.ts +2 -0
  67. package/dist/index.test.d.ts.map +1 -0
  68. package/dist/index.test.js +14 -0
  69. package/dist/index.test.js.map +1 -0
  70. package/dist/io.d.ts +13 -0
  71. package/dist/io.d.ts.map +1 -0
  72. package/dist/io.js +22 -0
  73. package/dist/io.js.map +1 -0
  74. package/dist/language_server.d.ts +15 -0
  75. package/dist/language_server.d.ts.map +1 -0
  76. package/dist/language_server.js +248 -0
  77. package/dist/language_server.js.map +1 -0
  78. package/dist/literals.d.ts +13 -0
  79. package/dist/literals.d.ts.map +1 -0
  80. package/dist/literals.js +100 -0
  81. package/dist/literals.js.map +1 -0
  82. package/dist/literals.test.d.ts +2 -0
  83. package/dist/literals.test.d.ts.map +1 -0
  84. package/dist/literals.test.js +149 -0
  85. package/dist/literals.test.js.map +1 -0
  86. package/dist/module_collector.d.ts +3 -0
  87. package/dist/module_collector.d.ts.map +1 -0
  88. package/dist/module_collector.js +22 -0
  89. package/dist/module_collector.js.map +1 -0
  90. package/dist/module_set.d.ts +44 -0
  91. package/dist/module_set.d.ts.map +1 -0
  92. package/dist/module_set.js +1025 -0
  93. package/dist/module_set.js.map +1 -0
  94. package/dist/module_set.test.d.ts +2 -0
  95. package/dist/module_set.test.d.ts.map +1 -0
  96. package/dist/module_set.test.js +1330 -0
  97. package/dist/module_set.test.js.map +1 -0
  98. package/dist/parser.d.ts +6 -0
  99. package/dist/parser.d.ts.map +1 -0
  100. package/dist/parser.js +971 -0
  101. package/dist/parser.js.map +1 -0
  102. package/dist/parser.test.d.ts +2 -0
  103. package/dist/parser.test.d.ts.map +1 -0
  104. package/dist/parser.test.js +1366 -0
  105. package/dist/parser.test.js.map +1 -0
  106. package/dist/snapshotter.d.ts +6 -0
  107. package/dist/snapshotter.d.ts.map +1 -0
  108. package/dist/snapshotter.js +107 -0
  109. package/dist/snapshotter.js.map +1 -0
  110. package/dist/tokenizer.d.ts +4 -0
  111. package/dist/tokenizer.d.ts.map +1 -0
  112. package/dist/tokenizer.js +192 -0
  113. package/dist/tokenizer.js.map +1 -0
  114. package/dist/tokenizer.test.d.ts +2 -0
  115. package/dist/tokenizer.test.d.ts.map +1 -0
  116. package/dist/tokenizer.test.js +425 -0
  117. package/dist/tokenizer.test.js.map +1 -0
  118. package/dist/types.d.ts +375 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +2 -0
  121. package/dist/types.js.map +1 -0
  122. package/package.json +63 -0
  123. package/src/casing.ts +64 -0
  124. package/src/command_line_parser.ts +249 -0
  125. package/src/compatibility_checker.ts +470 -0
  126. package/src/compiler.ts +435 -0
  127. package/src/config.ts +28 -0
  128. package/src/definition_finder.ts +221 -0
  129. package/src/encoding.ts +32 -0
  130. package/src/error_renderer.ts +278 -0
  131. package/src/formatter.ts +274 -0
  132. package/src/index.ts +6 -0
  133. package/src/io.ts +33 -0
  134. package/src/language_server.ts +301 -0
  135. package/src/literals.ts +120 -0
  136. package/src/module_collector.ts +22 -0
  137. package/src/module_set.ts +1175 -0
  138. package/src/parser.ts +1122 -0
  139. package/src/snapshotter.ts +136 -0
  140. package/src/tokenizer.ts +216 -0
  141. package/src/types.ts +518 -0
@@ -0,0 +1,263 @@
1
+ export function formatModule(tokens) {
2
+ const sink = new CodeSink();
3
+ let inValue = false;
4
+ let indentDepth = 0;
5
+ const iterator = new TokenIterator(tokens);
6
+ const copyInlineComments = () => {
7
+ while (iterator.hasNext() &&
8
+ isComment(iterator.peek().text) &&
9
+ iterator.peek().line.lineNumber === iterator.current.line.lineNumber) {
10
+ // Preserve comments before line break.
11
+ sink.write(" " + iterator.next().text);
12
+ }
13
+ };
14
+ const breakLine = () => {
15
+ copyInlineComments();
16
+ const { lastLineOnlyHasWhitespaces } = sink;
17
+ if (iterator.hasNext()) {
18
+ const current = iterator.current;
19
+ const next = iterator.peek();
20
+ if (next.line.lineNumber >= current.line.lineNumber + 2) {
21
+ // Preserve double line breaks.
22
+ sink.write("\n");
23
+ }
24
+ }
25
+ if (!lastLineOnlyHasWhitespaces) {
26
+ sink.write("\n" + " ".repeat(indentDepth));
27
+ }
28
+ };
29
+ const breakLineAndIndent = () => {
30
+ ++indentDepth;
31
+ breakLine();
32
+ };
33
+ const unindent = () => {
34
+ --indentDepth;
35
+ sink.removeWhitespaceSuffix(" ");
36
+ };
37
+ while (iterator.hasNext()) {
38
+ const token = iterator.next();
39
+ switch (token.text) {
40
+ case "as":
41
+ case "const":
42
+ case "enum":
43
+ case "import":
44
+ case "method":
45
+ case "struct":
46
+ case "*":
47
+ case ":": {
48
+ sink.write(token.text + " ");
49
+ break;
50
+ }
51
+ case "from": {
52
+ sink.write(" from ");
53
+ break;
54
+ }
55
+ case "removed": {
56
+ if (iterator.hasNext() && iterator.peek().text === ";") {
57
+ sink.write("removed");
58
+ }
59
+ else {
60
+ sink.write("removed ");
61
+ }
62
+ break;
63
+ }
64
+ case "{": {
65
+ if (iterator.hasNext() && iterator.peek().text === "}") {
66
+ sink.write(inValue ? "{}" : " {}");
67
+ iterator.next();
68
+ if (!inValue) {
69
+ breakLine();
70
+ }
71
+ }
72
+ else {
73
+ sink.write(inValue ? "{" : " {");
74
+ breakLineAndIndent();
75
+ }
76
+ break;
77
+ }
78
+ case "{|": {
79
+ if (iterator.hasNext() && iterator.peek().text === "|}") {
80
+ sink.write(inValue ? "{||}" : " {||}");
81
+ iterator.next();
82
+ if (!inValue) {
83
+ breakLine();
84
+ }
85
+ }
86
+ else {
87
+ sink.write(inValue ? "{|" : " {|");
88
+ breakLineAndIndent();
89
+ }
90
+ break;
91
+ }
92
+ case "}": {
93
+ if (inValue) {
94
+ sink.maybeWriteTrailingComma();
95
+ breakLine();
96
+ }
97
+ unindent();
98
+ sink.write("}");
99
+ if (!inValue) {
100
+ breakLine();
101
+ }
102
+ break;
103
+ }
104
+ case "|}": {
105
+ if (inValue) {
106
+ sink.maybeWriteTrailingComma();
107
+ breakLine();
108
+ }
109
+ unindent();
110
+ sink.write("|}");
111
+ if (!inValue) {
112
+ breakLine();
113
+ }
114
+ break;
115
+ }
116
+ case "[": {
117
+ if (iterator.hasNext() && iterator.peek().text === "]") {
118
+ sink.write("[]");
119
+ iterator.next();
120
+ }
121
+ else {
122
+ sink.write("[");
123
+ if (inValue) {
124
+ breakLineAndIndent();
125
+ }
126
+ }
127
+ break;
128
+ }
129
+ case "]": {
130
+ if (inValue) {
131
+ sink.maybeWriteTrailingComma();
132
+ breakLine();
133
+ unindent();
134
+ }
135
+ sink.write("]");
136
+ break;
137
+ }
138
+ case ";": {
139
+ sink.write(";");
140
+ inValue = false;
141
+ breakLine();
142
+ break;
143
+ }
144
+ case "=": {
145
+ inValue = true;
146
+ sink.write(" = ");
147
+ break;
148
+ }
149
+ case ",": {
150
+ if (inValue) {
151
+ sink.write(",");
152
+ breakLine();
153
+ }
154
+ else {
155
+ sink.write(", ");
156
+ }
157
+ break;
158
+ }
159
+ default: {
160
+ if (isComment(token.text)) {
161
+ sink.writeComment(token.text);
162
+ breakLine();
163
+ }
164
+ else if (token.text.startsWith("'")) {
165
+ const unescapedDoubleQuoteRegex = /(?:^|[^\\])(?:\\\\)*"/;
166
+ if (unescapedDoubleQuoteRegex.test(token.text)) {
167
+ sink.write(token.text);
168
+ }
169
+ else {
170
+ // Switch to double quotes.
171
+ const unquoted = token.text.slice(1, -1);
172
+ sink.write(`"${unquoted}"`);
173
+ }
174
+ }
175
+ else {
176
+ sink.write(token.text);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ const result = sink.code;
182
+ if (indentDepth !== 0) {
183
+ throw new Error(`result=${result}`);
184
+ }
185
+ return result;
186
+ }
187
+ class TokenIterator {
188
+ constructor(tokens) {
189
+ this.tokens = tokens;
190
+ this.nextIndex = 0;
191
+ }
192
+ next() {
193
+ if (this.nextIndex < this.tokens.length) {
194
+ return this.tokens[this.nextIndex++];
195
+ }
196
+ throw new Error();
197
+ }
198
+ peek() {
199
+ if (this.nextIndex < this.tokens.length) {
200
+ return this.tokens[this.nextIndex];
201
+ }
202
+ throw new Error();
203
+ }
204
+ hasNext() {
205
+ return this.nextIndex < this.tokens.length;
206
+ }
207
+ get current() {
208
+ const index = this.nextIndex - 1;
209
+ if (index < this.tokens.length) {
210
+ return this.tokens[index];
211
+ }
212
+ throw new Error();
213
+ }
214
+ }
215
+ function isComment(token) {
216
+ return token.startsWith("//") || token.startsWith("/*");
217
+ }
218
+ class CodeSink {
219
+ constructor() {
220
+ this._code = "";
221
+ // Position after the last non-whitespace character which is not part of a
222
+ // comment.
223
+ this.endPosition = 0;
224
+ }
225
+ /** Writes a token possibly preceded or followed by whitespaces. */
226
+ write(text) {
227
+ const trimmed = text.trim();
228
+ if (trimmed && !isComment(trimmed)) {
229
+ this.endPosition = trimmed.endsWith(",")
230
+ ? 0
231
+ : this.code.length + text.trimEnd().length;
232
+ }
233
+ this._code += text;
234
+ }
235
+ writeComment(text) {
236
+ if (this.lastLineOnlyHasWhitespaces) {
237
+ this._code += text;
238
+ }
239
+ else {
240
+ this._code = this.code.trimEnd() + " " + text;
241
+ }
242
+ }
243
+ maybeWriteTrailingComma() {
244
+ if (this.endPosition === 0) {
245
+ return;
246
+ }
247
+ const { code } = this;
248
+ this._code =
249
+ code.slice(0, this.endPosition) + "," + code.slice(this.endPosition);
250
+ }
251
+ removeWhitespaceSuffix(suffix) {
252
+ if (this.code.endsWith(suffix)) {
253
+ this._code = this.code.slice(0, -suffix.length);
254
+ }
255
+ }
256
+ get lastLineOnlyHasWhitespaces() {
257
+ return /^$|\n\s*$/.test(this.code);
258
+ }
259
+ get code() {
260
+ return this._code;
261
+ }
262
+ }
263
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formatter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.test.d.ts","sourceRoot":"","sources":["../src/formatter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ import { expect } from "buckwheat";
2
+ import { describe, it } from "mocha";
3
+ import { formatModule } from "./formatter.js";
4
+ import { tokenizeModule } from "./tokenizer.js";
5
+ const UNFORMATTED_MODULE = `
6
+ /* module */ import A from 'module.skir'; import * as foo from 'module.skir';
7
+
8
+ struct Empty1 { }
9
+ struct Empty2 { //
10
+ } /*a*///
11
+
12
+ struct S1 {
13
+ a: int32;
14
+
15
+ //
16
+ /* aaa */
17
+ b: string;
18
+ removed;
19
+
20
+ enum E {
21
+
22
+
23
+ }
24
+ }
25
+
26
+ // doc for
27
+ // s2
28
+ struct S2 {
29
+ a : int32=0 /* a */;
30
+ b : string=1;//
31
+ c:[[x|foo.a.kind]?] ?;
32
+ removed 5, 10-12, 13;
33
+ }
34
+
35
+ enum E1 {
36
+ A;
37
+ B;
38
+ c: bool;
39
+ }
40
+ enum E2 {
41
+ A=1;
42
+ B=2;
43
+ }
44
+
45
+ method M(Request):Response;
46
+
47
+ /* a */const CONST: [Type] = [
48
+ 1, [], {}, {
49
+ "a" : true,
50
+ 'n\\\\"': null,
51
+ 'n\\"': null, // null
52
+ // c doc
53
+ 'c': [] // c
54
+ },
55
+ {||}, {|
56
+ "a": true,
57
+ |}
58
+ ];
59
+
60
+ struct S {
61
+ // a
62
+ }
63
+
64
+ struct S { // a
65
+ // b
66
+ /* c */} // d
67
+
68
+ // a
69
+
70
+ /* b */ // c
71
+
72
+ //d
73
+ `;
74
+ const EXPECTED_FORMATTED_MODULE = `/* module */
75
+ import A from "module.skir";
76
+ import * as foo from "module.skir";
77
+
78
+ struct Empty1 {}
79
+ struct Empty2 { //
80
+ } /*a*/ //
81
+
82
+ struct S1 {
83
+ a: int32;
84
+
85
+ //
86
+ /* aaa */
87
+ b: string;
88
+ removed;
89
+
90
+ enum E {}
91
+ }
92
+
93
+ // doc for
94
+ // s2
95
+ struct S2 {
96
+ a: int32 = 0 /* a */
97
+ ;
98
+ b: string = 1; //
99
+ c: [[x|foo.a.kind]?]?;
100
+ removed 5, 10-12, 13;
101
+ }
102
+
103
+ enum E1 {
104
+ A;
105
+ B;
106
+ c: bool;
107
+ }
108
+ enum E2 {
109
+ A = 1;
110
+ B = 2;
111
+ }
112
+
113
+ method M(Request): Response;
114
+
115
+ /* a */
116
+ const CONST: [Type] = [
117
+ 1,
118
+ [],
119
+ {},
120
+ {
121
+ "a": true,
122
+ 'n\\\\"': null,
123
+ "n\\"": null, // null
124
+ // c doc
125
+ "c": [], // c
126
+ },
127
+ {||},
128
+ {|
129
+ "a": true,
130
+ |},
131
+ ];
132
+
133
+ struct S {
134
+ // a
135
+ }
136
+
137
+ struct S { // a
138
+ // b
139
+ /* c */
140
+ } // d
141
+
142
+ // a
143
+
144
+ /* b */ // c
145
+
146
+ //d
147
+ `;
148
+ describe("formatModule", () => {
149
+ it("works", () => {
150
+ const tokens = tokenizeModule(UNFORMATTED_MODULE, "path/to/module", "keep-comments");
151
+ expect(tokens.errors).toMatch([]);
152
+ const formatted = formatModule(tokens.result);
153
+ expect(formatted).toMatch(EXPECTED_FORMATTED_MODULE);
154
+ });
155
+ });
156
+ //# sourceMappingURL=formatter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.test.js","sourceRoot":"","sources":["../src/formatter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoE1B,CAAC;AAEF,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEjC,CAAC;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACf,MAAM,MAAM,GAAG,cAAc,CAC3B,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,CAChB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type * from "./types.js";
2
+ export { capitalize, convertCase } from "./casing.js";
3
+ export { encodeInt32 } from "./encoding.js";
4
+ export { unquoteAndUnescape } from "./literals.js";
5
+ export { simpleHash } from "./parser.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { capitalize, convertCase } from "./casing.js";
2
+ export { encodeInt32 } from "./encoding.js";
3
+ export { unquoteAndUnescape } from "./literals.js";
4
+ export { simpleHash } from "./parser.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { expect } from "buckwheat";
2
+ import { describe, it } from "mocha";
3
+ import * as exports from "./index.js";
4
+ describe("index.ts", () => {
5
+ it("exports the right symbols", () => {
6
+ // The actual logic is covered in other unit tests.
7
+ // Here we just want to make sure the right symbols are exported.
8
+ let _;
9
+ expect(exports.convertCase("foo", "lowerCamel", "UPPER_UNDERSCORE")).toBe("FOO");
10
+ expect(exports.capitalize("foo")).toBe("Foo");
11
+ expect(exports.unquoteAndUnescape('"foo"')).toBe("foo");
12
+ });
13
+ });
14
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AAEtC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,mDAAmD;QACnD,iEAAiE;QACjE,IAAI,CAAiB,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CACvE,KAAK,CACN,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/io.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ export interface FileReader {
2
+ readTextFile(path: string): string | undefined;
3
+ }
4
+ export interface FileWriter {
5
+ writeTextFile(path: string, contents: string): void;
6
+ }
7
+ declare class RealFileSystem implements FileReader, FileWriter {
8
+ readTextFile(path: string): string | undefined;
9
+ writeTextFile(path: string, contents: string): void;
10
+ }
11
+ export declare const REAL_FILE_SYSTEM: RealFileSystem;
12
+ export {};
13
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD;AAED,cAAM,cAAe,YAAW,UAAU,EAAE,UAAU;IACpD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAgB9C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAGpD;AAED,eAAO,MAAM,gBAAgB,gBAAuB,CAAC"}
package/dist/io.js ADDED
@@ -0,0 +1,22 @@
1
+ import * as fs from "fs";
2
+ class RealFileSystem {
3
+ readTextFile(path) {
4
+ try {
5
+ return fs.readFileSync(path, "utf-8");
6
+ }
7
+ catch (error) {
8
+ if (error &&
9
+ typeof error === "object" &&
10
+ "code" in error &&
11
+ error.code === "ENOENT") {
12
+ return undefined;
13
+ }
14
+ throw error;
15
+ }
16
+ }
17
+ writeTextFile(path, contents) {
18
+ fs.writeFileSync(path, contents, "utf-8");
19
+ }
20
+ }
21
+ export const REAL_FILE_SYSTEM = new RealFileSystem();
22
+ //# sourceMappingURL=io.js.map
package/dist/io.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAUzB,MAAM,cAAc;IAClB,YAAY,CAAC,IAAY;QACvB,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,KAAK;gBACL,OAAO,KAAK,KAAK,QAAQ;gBACzB,MAAM,IAAI,KAAK;gBACf,KAAK,CAAC,IAAI,KAAK,QAAQ,EACvB,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,QAAgB;QAC1C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,cAAc,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare class LanguageServerModuleSet {
2
+ private readonly rootPath;
3
+ constructor(rootPath: string);
4
+ setFileContent(uri: string, content: string): void;
5
+ deleteFile(uri: string): void;
6
+ private reassignModulesToWorkspaces;
7
+ private parseSkirConfig;
8
+ private parseSkirModule;
9
+ /** Finds the workspace which contains the given module URI. */
10
+ private findModuleWorkspace;
11
+ private reassigneModulesTimeout?;
12
+ private readonly moduleBundles;
13
+ private readonly workspaces;
14
+ }
15
+ //# sourceMappingURL=language_server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language_server.d.ts","sourceRoot":"","sources":["../src/language_server.ts"],"names":[],"mappings":"AAeA,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE7C,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IA2BlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAuB7B,OAAO,CAAC,2BAA2B;IAoBnC,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,eAAe;IAmBvB,+DAA+D;IAC/D,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,uBAAuB,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;CAC5D"}