@f12io/maple-language-core 0.0.2

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 (53) hide show
  1. package/README.md +42 -0
  2. package/dist/LanguageService.d.ts +104 -0
  3. package/dist/LanguageService.js +16 -0
  4. package/dist/LanguageService.js.map +1 -0
  5. package/dist/extractor.helper.d.ts +66 -0
  6. package/dist/extractor.helper.js +319 -0
  7. package/dist/extractor.helper.js.map +1 -0
  8. package/dist/formatter.d.ts +26 -0
  9. package/dist/formatter.js +206 -0
  10. package/dist/formatter.js.map +1 -0
  11. package/dist/index.d.ts +15 -0
  12. package/dist/index.js +50 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/language-definitions.d.ts +9 -0
  15. package/dist/language-definitions.js +35 -0
  16. package/dist/language-definitions.js.map +1 -0
  17. package/dist/languages/AngularLanguageService.d.ts +6 -0
  18. package/dist/languages/AngularLanguageService.js +66 -0
  19. package/dist/languages/AngularLanguageService.js.map +1 -0
  20. package/dist/languages/BaseLanguageService.d.ts +80 -0
  21. package/dist/languages/BaseLanguageService.js +409 -0
  22. package/dist/languages/BaseLanguageService.js.map +1 -0
  23. package/dist/languages/HtmlLanguageService.d.ts +5 -0
  24. package/dist/languages/HtmlLanguageService.js +29 -0
  25. package/dist/languages/HtmlLanguageService.js.map +1 -0
  26. package/dist/languages/JavascriptLanguageService.d.ts +10 -0
  27. package/dist/languages/JavascriptLanguageService.js +95 -0
  28. package/dist/languages/JavascriptLanguageService.js.map +1 -0
  29. package/dist/languages/PhpLanguageService.d.ts +22 -0
  30. package/dist/languages/PhpLanguageService.js +242 -0
  31. package/dist/languages/PhpLanguageService.js.map +1 -0
  32. package/dist/languages/RazorLanguageService.d.ts +33 -0
  33. package/dist/languages/RazorLanguageService.js +338 -0
  34. package/dist/languages/RazorLanguageService.js.map +1 -0
  35. package/dist/languages/ReactLanguageService.d.ts +6 -0
  36. package/dist/languages/ReactLanguageService.js +31 -0
  37. package/dist/languages/ReactLanguageService.js.map +1 -0
  38. package/dist/languages/SvelteLanguageService.d.ts +9 -0
  39. package/dist/languages/SvelteLanguageService.js +65 -0
  40. package/dist/languages/SvelteLanguageService.js.map +1 -0
  41. package/dist/languages/TwigLanguageService.d.ts +4 -0
  42. package/dist/languages/TwigLanguageService.js +12 -0
  43. package/dist/languages/TwigLanguageService.js.map +1 -0
  44. package/dist/languages/VueLanguageService.d.ts +6 -0
  45. package/dist/languages/VueLanguageService.js +36 -0
  46. package/dist/languages/VueLanguageService.js.map +1 -0
  47. package/dist/regex.d.ts +63 -0
  48. package/dist/regex.js +92 -0
  49. package/dist/regex.js.map +1 -0
  50. package/dist/registry.d.ts +7 -0
  51. package/dist/registry.js +86 -0
  52. package/dist/registry.js.map +1 -0
  53. package/package.json +38 -0
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseLanguageService = void 0;
4
+ const regex_1 = require("../regex");
5
+ const extractor_helper_1 = require("../extractor.helper");
6
+ const LanguageService_1 = require("../LanguageService");
7
+ class BaseLanguageService {
8
+ extractClasses(text) {
9
+ if (text.includes('maple-disable-file')) {
10
+ return [];
11
+ }
12
+ const disabledBlocks = (0, extractor_helper_1.getDisabledBlocks)(text);
13
+ const instances = [];
14
+ for (const region of this.collectRegions(text)) {
15
+ if ((0, extractor_helper_1.shouldSkipMatch)(text, region.anchor, disabledBlocks))
16
+ continue;
17
+ if (region.kind === 'class-text') {
18
+ this.extractAttributeClasses(text.substring(region.start, region.end), region.start, text, region.anchor, instances, disabledBlocks);
19
+ }
20
+ else {
21
+ this.extractExpressionRegion(text, region, instances, disabledBlocks);
22
+ }
23
+ }
24
+ // Canonical document order, independent of region discovery order
25
+ return (0, LanguageService_1.dedupeInstancesByStart)(instances).sort((a, b) => a.start - b.start);
26
+ }
27
+ /**
28
+ * Reports every maple region this language knows about. Subclasses add
29
+ * framework-specific regions on top of the base set (class attributes and
30
+ * opt-in comments).
31
+ */
32
+ collectRegions(text) {
33
+ const regions = [];
34
+ // Standard class attributes: class="...", className='...'
35
+ for (const match of text.matchAll(regex_1.STANDARD_ATTR_REGEX)) {
36
+ const quote = match[1];
37
+ const attrStart = match.index + match[0].indexOf(quote) + 1;
38
+ const closingQuoteIndex = (0, extractor_helper_1.findClosingQuote)(text, attrStart, quote);
39
+ if (closingQuoteIndex === -1)
40
+ continue;
41
+ regions.push({
42
+ start: attrStart,
43
+ end: closingQuoteIndex,
44
+ kind: 'class-text',
45
+ anchor: match.index,
46
+ });
47
+ }
48
+ // Opt-in expressions: /* maple */ <expression>
49
+ for (const optIn of (0, extractor_helper_1.findOptInRegions)(this, text)) {
50
+ regions.push({
51
+ start: optIn.regionStart,
52
+ end: optIn.regionEnd,
53
+ kind: 'expression',
54
+ anchor: optIn.matchIndex,
55
+ });
56
+ }
57
+ // Opt-in objects: /* maple */ { 'c-red': cond, p2: true }
58
+ for (const match of text.matchAll(regex_1.OPT_IN_OBJECT_START_REGEX)) {
59
+ const openBrace = match.index + match[0].length - 1;
60
+ const end = this.parseBalancedExpression(text, openBrace);
61
+ if (end === -1)
62
+ continue;
63
+ regions.push({
64
+ start: openBrace + 1,
65
+ end: end - 1,
66
+ kind: 'expression',
67
+ anchor: match.index,
68
+ includeObjectKeys: true,
69
+ });
70
+ }
71
+ return regions;
72
+ }
73
+ /**
74
+ * Extracts maple classes from an `expression` region: every string literal
75
+ * is class text (interpolated ones recurse through the language-specific
76
+ * extractor), plus unquoted object keys when the region asks for them.
77
+ */
78
+ extractExpressionRegion(text, region, instances, disabledBlocks) {
79
+ const expr = text.substring(region.start, region.end);
80
+ (0, extractor_helper_1.extractStringLiterals)(this, expr, region.start, text, region.anchor, instances, disabledBlocks, (val, off, txt, idx, literal) => this.extractAttributeClasses(val, off, txt, idx, instances, disabledBlocks, literal?.rawDelimiter));
81
+ if (region.includeObjectKeys) {
82
+ (0, extractor_helper_1.extractUnquotedObjectKeys)(expr, region.start, text, region.anchor, instances, disabledBlocks);
83
+ }
84
+ }
85
+ /**
86
+ * Scans a bracketed region starting at `openIndex`, skipping string
87
+ * literals via `matchStringLiteral` (so template literals and interpolated
88
+ * strings are opaque). Returns the index after the matching close, or -1.
89
+ */
90
+ parseBalancedExpression(text, openIndex) {
91
+ const open = text[openIndex];
92
+ const close = open === '(' ? ')' : open === '[' ? ']' : '}';
93
+ let depth = 1;
94
+ let i = openIndex + 1;
95
+ const limit = Math.min(text.length, openIndex + extractor_helper_1.MAX_SCAN_LENGTH);
96
+ while (i < limit) {
97
+ const literal = this.matchStringLiteral(text, i);
98
+ if (literal) {
99
+ i = literal.endIndex;
100
+ continue;
101
+ }
102
+ if (text[i] === open)
103
+ depth++;
104
+ else if (text[i] === close) {
105
+ depth--;
106
+ if (depth === 0)
107
+ return i + 1;
108
+ }
109
+ i++;
110
+ }
111
+ return -1;
112
+ }
113
+ extractAttributeClasses(value, offset, text, matchIndex, instances, disabledBlocks = [], stringDelimiter) {
114
+ const context = { stringDelimiter };
115
+ let currentStr = '';
116
+ let currentStart = offset;
117
+ let j = 0;
118
+ while (j < value.length) {
119
+ const interp = this.parseInterpolation(value, j, context);
120
+ if (interp) {
121
+ if (interp.isLiteral) {
122
+ currentStr += value.substring(j, interp.endIndex);
123
+ j = interp.endIndex;
124
+ continue;
125
+ }
126
+ (0, extractor_helper_1.pushInstance)(instances, currentStr, currentStart, text, matchIndex, disabledBlocks);
127
+ currentStr = '';
128
+ const innerExpr = value.substring(interp.innerExprStart, interp.innerExprEnd);
129
+ (0, extractor_helper_1.extractStringLiterals)(this, innerExpr, offset + interp.innerExprStart, text, matchIndex, instances, disabledBlocks, (val, off, txt, idx, literal) => this.extractAttributeClasses(val, off, txt, idx, instances, disabledBlocks, literal?.rawDelimiter));
130
+ j = interp.endIndex;
131
+ currentStart = offset + j;
132
+ continue;
133
+ }
134
+ if (value[j] === '{') {
135
+ const mapleInterpolationMatch = value
136
+ .substring(j)
137
+ .match(regex_1.MAPLE_INTERPOLATION_REGEX);
138
+ if (mapleInterpolationMatch && !value.substring(0, j).endsWith(' ')) {
139
+ currentStr += mapleInterpolationMatch[0];
140
+ j += mapleInterpolationMatch[0].length;
141
+ }
142
+ else {
143
+ currentStr += value[j];
144
+ j++;
145
+ }
146
+ }
147
+ else {
148
+ currentStr += value[j];
149
+ j++;
150
+ }
151
+ }
152
+ (0, extractor_helper_1.pushInstance)(instances, currentStr, currentStart, text, matchIndex, disabledBlocks);
153
+ }
154
+ parseInterpolation(value, index, context) {
155
+ return undefined;
156
+ }
157
+ getRenderedClassText(word) {
158
+ return word;
159
+ }
160
+ formatExpression(expr, baseIndent, maxClassesPerLine, formatClassesFn) {
161
+ return undefined;
162
+ }
163
+ matchStringLiteral(text, index) {
164
+ const ch = text[index];
165
+ if (ch === "'" || ch === '"') {
166
+ const end = (0, extractor_helper_1.skipStringLiteral)(text, index);
167
+ if (end < index + 2 || text[end - 1] !== ch)
168
+ return undefined;
169
+ return {
170
+ start: index,
171
+ contentStart: index + 1,
172
+ contentEnd: end - 1,
173
+ endIndex: end,
174
+ rawDelimiter: ch,
175
+ isInterpolated: false,
176
+ };
177
+ }
178
+ if (ch === '`') {
179
+ const end = this.skipTemplateLiteral(text, index);
180
+ if (end < index + 2 || text[end - 1] !== '`')
181
+ return undefined;
182
+ return {
183
+ start: index,
184
+ contentStart: index + 1,
185
+ contentEnd: end - 1,
186
+ endIndex: end,
187
+ rawDelimiter: '`',
188
+ isInterpolated: true,
189
+ };
190
+ }
191
+ return undefined;
192
+ }
193
+ getMultilineStringDelimiters(rawQuote, content) {
194
+ // Default policy is JavaScript-flavored (html/jsx/vue/svelte/twig opt-in
195
+ // strings live in scripts): template literals hold newlines; '/" strings
196
+ // are upgraded to template literals when that cannot change semantics.
197
+ if (rawQuote === '`') {
198
+ return { open: '`', close: '`' };
199
+ }
200
+ if ((rawQuote === "'" || rawQuote === '"') &&
201
+ !content.includes('`') &&
202
+ !content.includes('${') &&
203
+ !content.includes('\\')) {
204
+ return { open: '`', close: '`' };
205
+ }
206
+ return undefined;
207
+ }
208
+ tokenizeClassesWithIndices(str) {
209
+ const tokens = [];
210
+ let currentToken = '';
211
+ let tokenStart = -1;
212
+ let tokenHasInterpolation = false;
213
+ for (let i = 0; i < str.length; i++) {
214
+ const char = str[i];
215
+ const interp = this.parseInterpolation(str, i);
216
+ if (interp) {
217
+ if (tokenStart === -1)
218
+ tokenStart = i;
219
+ currentToken += str.substring(i, interp.endIndex);
220
+ i = interp.endIndex - 1;
221
+ if (!interp.isLiteral) {
222
+ tokenHasInterpolation = true;
223
+ }
224
+ continue;
225
+ }
226
+ if (char.trim() === '') {
227
+ if (currentToken) {
228
+ tokens.push({
229
+ value: currentToken,
230
+ start: tokenStart,
231
+ end: i,
232
+ hasInterpolation: tokenHasInterpolation,
233
+ });
234
+ currentToken = '';
235
+ tokenStart = -1;
236
+ tokenHasInterpolation = false;
237
+ }
238
+ continue;
239
+ }
240
+ if (tokenStart === -1) {
241
+ tokenStart = i;
242
+ }
243
+ currentToken += char;
244
+ }
245
+ if (currentToken) {
246
+ tokens.push({
247
+ value: currentToken,
248
+ start: tokenStart,
249
+ end: str.length,
250
+ hasInterpolation: tokenHasInterpolation,
251
+ });
252
+ }
253
+ return tokens;
254
+ }
255
+ formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn) {
256
+ const replacements = [];
257
+ (0, extractor_helper_1.extractStringLiterals)(this, cls, 0, cls, 0, [], [], (value, offset, _text, _matchIndex, literal) => {
258
+ const innerIndent = baseIndent + ' ';
259
+ const formatted = formatClassesFn(value, innerIndent, maxClassesPerLine);
260
+ if (formatted === value)
261
+ return;
262
+ // A multi-line result requires a string form that legally holds
263
+ // newlines; when none exists (e.g. escape-bearing C# $" strings)
264
+ // leave the string untouched rather than corrupt it.
265
+ if (formatted.includes('\n') &&
266
+ literal &&
267
+ !this.getMultilineStringDelimiters(literal.rawDelimiter, value)) {
268
+ return;
269
+ }
270
+ replacements.push({
271
+ start: offset,
272
+ end: offset + value.length,
273
+ replacement: formatted,
274
+ });
275
+ });
276
+ if (replacements.length === 0)
277
+ return cls;
278
+ // Apply bottom-up (right-to-left) to not mess up offsets
279
+ replacements.sort((a, b) => b.start - a.start);
280
+ let newCls = cls;
281
+ for (const r of replacements) {
282
+ const before = newCls.substring(0, r.start);
283
+ const after = newCls.substring(r.end);
284
+ newCls = before + r.replacement + after;
285
+ }
286
+ return newCls;
287
+ }
288
+ parseTernaryArms(expr) {
289
+ let i = 0;
290
+ let questionIndex = -1;
291
+ let ternaryDepth = 0;
292
+ while (i < expr.length) {
293
+ // Skip strings (language-specific via virtual method)
294
+ const stringEnd = this.skipStringAt(expr, i);
295
+ if (stringEnd > i) {
296
+ i = stringEnd;
297
+ continue;
298
+ }
299
+ const ch = expr[i];
300
+ // Skip balanced parens, braces, brackets
301
+ if (ch === '(' || ch === '[' || ch === '{') {
302
+ i = this.skipBalanced(expr, i);
303
+ continue;
304
+ }
305
+ // Match ternary ? (but not ?. or ??)
306
+ if (ch === '?' && expr[i + 1] !== '.' && expr[i + 1] !== '?') {
307
+ if (questionIndex === -1) {
308
+ questionIndex = i;
309
+ }
310
+ else {
311
+ ternaryDepth++;
312
+ }
313
+ }
314
+ else if (ch === ':' && questionIndex !== -1) {
315
+ if (ternaryDepth === 0) {
316
+ return {
317
+ condition: expr.substring(0, questionIndex).trim(),
318
+ consequent: expr.substring(questionIndex + 1, i).trim(),
319
+ alternate: expr.substring(i + 1).trim(),
320
+ };
321
+ }
322
+ else {
323
+ ternaryDepth--;
324
+ }
325
+ }
326
+ i++;
327
+ }
328
+ return undefined;
329
+ }
330
+ /**
331
+ * Scans a JS template literal starting at the backtick and returns the
332
+ * index after the closing backtick, honoring `${...}` holes (which may
333
+ * contain nested strings and template literals).
334
+ */
335
+ skipTemplateLiteral(expr, index) {
336
+ let j = index + 1;
337
+ while (j < expr.length) {
338
+ if (expr[j] === '\\') {
339
+ j += 2;
340
+ continue;
341
+ }
342
+ if (expr[j] === '$' && expr[j + 1] === '{') {
343
+ j += 2;
344
+ let braceDepth = 1;
345
+ while (j < expr.length && braceDepth > 0) {
346
+ const se = this.skipStringAt(expr, j);
347
+ if (se > j) {
348
+ j = se;
349
+ continue;
350
+ }
351
+ if (expr[j] === '{')
352
+ braceDepth++;
353
+ else if (expr[j] === '}')
354
+ braceDepth--;
355
+ if (braceDepth > 0)
356
+ j++;
357
+ }
358
+ if (j < expr.length)
359
+ j++; // skip closing }
360
+ continue;
361
+ }
362
+ if (expr[j] === '`')
363
+ return j + 1;
364
+ j++;
365
+ }
366
+ return expr.length;
367
+ }
368
+ skipStringAt(expr, index) {
369
+ const ch = expr[index];
370
+ if (ch === "'" || ch === '"') {
371
+ return (0, extractor_helper_1.skipStringLiteral)(expr, index);
372
+ }
373
+ return index;
374
+ }
375
+ /**
376
+ * Scans a bracketed region starting at `openIndex` (which must hold the
377
+ * opening char), skipping string literals via the language-specific
378
+ * `skipStringAt`. Returns the index just after the matching close, or -1
379
+ * when unbalanced.
380
+ */
381
+ parseBalanced(expr, openIndex) {
382
+ const open = expr[openIndex];
383
+ const close = open === '(' ? ')' : open === '[' ? ']' : '}';
384
+ let depth = 1;
385
+ let j = openIndex + 1;
386
+ while (j < expr.length) {
387
+ const se = this.skipStringAt(expr, j);
388
+ if (se > j) {
389
+ j = se;
390
+ continue;
391
+ }
392
+ if (expr[j] === open)
393
+ depth++;
394
+ else if (expr[j] === close) {
395
+ depth--;
396
+ if (depth === 0)
397
+ return j + 1;
398
+ }
399
+ j++;
400
+ }
401
+ return -1;
402
+ }
403
+ skipBalanced(expr, startIndex) {
404
+ const end = this.parseBalanced(expr, startIndex);
405
+ return end === -1 ? expr.length : end;
406
+ }
407
+ }
408
+ exports.BaseLanguageService = BaseLanguageService;
409
+ //# sourceMappingURL=BaseLanguageService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseLanguageService.js","sourceRoot":"","sources":["../../src/languages/BaseLanguageService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { BaseLanguageService, InterpolationContext, InterpolationMatch } from './BaseLanguageService';
2
+ export declare class HtmlLanguageService extends BaseLanguageService {
3
+ languageIds: string[];
4
+ protected parseInterpolation(value: string, index: number, context?: InterpolationContext): InterpolationMatch | undefined;
5
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HtmlLanguageService = void 0;
4
+ const BaseLanguageService_1 = require("./BaseLanguageService");
5
+ class HtmlLanguageService extends BaseLanguageService_1.BaseLanguageService {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.languageIds = ['html'];
9
+ }
10
+ parseInterpolation(value, index, context) {
11
+ // Angular/Twig interpolations: {{...}}
12
+ if (value.substring(index, index + 2) === '{{') {
13
+ // Balance from the first '{'; the second '{' nests, so the scan ends
14
+ // just after the matching '}}'. String literals inside the expression
15
+ // are skipped via the language-aware parseBalanced.
16
+ const end = this.parseBalanced(value, index);
17
+ if (end !== -1) {
18
+ return {
19
+ innerExprStart: index + 2, // The content inside {{
20
+ innerExprEnd: end - 2, // Before the }}
21
+ endIndex: end, // After the }}
22
+ };
23
+ }
24
+ }
25
+ return super.parseInterpolation(value, index, context);
26
+ }
27
+ }
28
+ exports.HtmlLanguageService = HtmlLanguageService;
29
+ //# sourceMappingURL=HtmlLanguageService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HtmlLanguageService.js","sourceRoot":"","sources":["../../src/languages/HtmlLanguageService.ts"],"names":[],"mappings":";;;AAAA,+DAI+B;AAE/B,MAAa,mBAAoB,SAAQ,yCAAmB;IAA5D;;QACE,gBAAW,GAAG,CAAC,MAAM,CAAC,CAAC;IAuBzB,CAAC;IArBW,kBAAkB,CAC1B,KAAa,EACb,KAAa,EACb,OAA8B;QAE9B,uCAAuC;QACvC,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,qEAAqE;YACrE,sEAAsE;YACtE,oDAAoD;YACpD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,OAAO;oBACL,cAAc,EAAE,KAAK,GAAG,CAAC,EAAE,wBAAwB;oBACnD,YAAY,EAAE,GAAG,GAAG,CAAC,EAAE,gBAAgB;oBACvC,QAAQ,EAAE,GAAG,EAAE,eAAe;iBAC/B,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CACF;AAxBD,kDAwBC"}
@@ -0,0 +1,10 @@
1
+ import { MapleRegion } from '../LanguageService';
2
+ import { BaseLanguageService, InterpolationContext, InterpolationMatch } from './BaseLanguageService';
3
+ export declare class JavascriptLanguageService extends BaseLanguageService {
4
+ languageIds: string[];
5
+ collectRegions(text: string): Array<MapleRegion>;
6
+ protected parseInterpolation(value: string, index: number, context?: InterpolationContext): InterpolationMatch | undefined;
7
+ protected skipStringAt(expr: string, index: number): number;
8
+ formatInterpolation(cls: string, baseIndent: string, maxClassesPerLine: number, formatClassesFn: (value: string, indent: string, maxClasses: number) => string): string;
9
+ formatExpression(expr: string, baseIndent: string, maxClassesPerLine: number, formatClassesFn: (value: string, indent: string, maxClasses: number) => string): string | undefined;
10
+ }
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JavascriptLanguageService = void 0;
4
+ const regex_1 = require("../regex");
5
+ const BaseLanguageService_1 = require("./BaseLanguageService");
6
+ class JavascriptLanguageService extends BaseLanguageService_1.BaseLanguageService {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.languageIds = ['javascript', 'typescript'];
10
+ }
11
+ collectRegions(text) {
12
+ const regions = super.collectRegions(text);
13
+ // Arguments of clsx(...), classNames(...), cva(...)
14
+ for (const match of text.matchAll(regex_1.UTILITY_FUNC_START_REGEX)) {
15
+ const openParen = match.index + match[0].length - 1;
16
+ const end = this.parseBalancedExpression(text, openParen);
17
+ if (end === -1)
18
+ continue;
19
+ regions.push({
20
+ start: openParen + 1,
21
+ end: end - 1,
22
+ kind: 'expression',
23
+ anchor: match.index,
24
+ includeObjectKeys: true,
25
+ });
26
+ }
27
+ return regions;
28
+ }
29
+ parseInterpolation(value, index, context) {
30
+ // JavaScript template literals: ${...}
31
+ if (value.substring(index, index + 2) === '${') {
32
+ const end = this.parseBalanced(value, index + 1);
33
+ if (end !== -1) {
34
+ return {
35
+ innerExprStart: index + 2,
36
+ innerExprEnd: end - 1,
37
+ endIndex: end,
38
+ };
39
+ }
40
+ }
41
+ return super.parseInterpolation(value, index, context);
42
+ }
43
+ skipStringAt(expr, index) {
44
+ if (expr[index] === '`') {
45
+ return this.skipTemplateLiteral(expr, index);
46
+ }
47
+ return super.skipStringAt(expr, index);
48
+ }
49
+ formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn) {
50
+ const startIndex = cls.indexOf('${');
51
+ if (startIndex === -1) {
52
+ return super.formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn);
53
+ }
54
+ const end = this.parseBalanced(cls, startIndex + 1);
55
+ if (end === -1) {
56
+ return super.formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn);
57
+ }
58
+ const prefix = cls.substring(0, startIndex);
59
+ const suffix = cls.substring(end);
60
+ const innerExpr = cls.substring(startIndex + 2, end - 1);
61
+ const formattedExpr = this.formatExpression(innerExpr, baseIndent, maxClassesPerLine, formatClassesFn);
62
+ if (formattedExpr === undefined) {
63
+ return super.formatInterpolation(cls, baseIndent, maxClassesPerLine, formatClassesFn);
64
+ }
65
+ return prefix + '${' + formattedExpr + '}' + suffix;
66
+ }
67
+ formatExpression(expr, baseIndent, maxClassesPerLine, formatClassesFn) {
68
+ const ternary = this.parseTernaryArms(expr);
69
+ if (!ternary)
70
+ return undefined;
71
+ // Only ternaries with template-literal arms can hold multi-line output
72
+ const consequentStr = ternary.consequent.trim();
73
+ const alternateStr = ternary.alternate.trim();
74
+ if (!consequentStr.startsWith('`') ||
75
+ !consequentStr.endsWith('`') ||
76
+ !alternateStr.startsWith('`') ||
77
+ !alternateStr.endsWith('`')) {
78
+ return undefined;
79
+ }
80
+ const consequentContent = consequentStr.slice(1, -1);
81
+ const alternateContent = alternateStr.slice(1, -1);
82
+ const exprIndent = baseIndent + ' ';
83
+ const formattedConsequent = formatClassesFn(consequentContent, exprIndent, maxClassesPerLine);
84
+ const formattedAlternate = formatClassesFn(alternateContent, exprIndent, maxClassesPerLine);
85
+ // Always return the reconstructed ternary to enforce consistent spacing
86
+ return (ternary.condition +
87
+ ' ? `' +
88
+ formattedConsequent +
89
+ '` : `' +
90
+ formattedAlternate +
91
+ '`');
92
+ }
93
+ }
94
+ exports.JavascriptLanguageService = JavascriptLanguageService;
95
+ //# sourceMappingURL=JavascriptLanguageService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JavascriptLanguageService.js","sourceRoot":"","sources":["../../src/languages/JavascriptLanguageService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { InterpolationContext, InterpolationMatch } from './BaseLanguageService';
2
+ import { HtmlLanguageService } from './HtmlLanguageService';
3
+ export declare class PhpLanguageService extends HtmlLanguageService {
4
+ languageIds: string[];
5
+ getMultilineStringDelimiters(rawQuote: string, content: string): {
6
+ open: string;
7
+ close: string;
8
+ } | undefined;
9
+ /**
10
+ * Finds the `?>` that closes a PHP block, skipping string literals so a
11
+ * `?>` inside '...' or "..." does not terminate the block early. Returns
12
+ * the index of the `?` or -1.
13
+ */
14
+ private findPhpCloseTag;
15
+ formatInterpolation(cls: string, baseIndent: string, maxClassesPerLine: number, formatClassesFn: (value: string, indent: string, maxClasses: number) => string): string;
16
+ private formatTernaryInterpolation;
17
+ formatExpression(expr: string, baseIndent: string, maxClassesPerLine: number, formatClassesFn: (value: string, indent: string, maxClasses: number) => string): string | undefined;
18
+ private formatPhpArm;
19
+ private reconstructPhpConcatenation;
20
+ private parsePhpConcatenation;
21
+ protected parseInterpolation(value: string, index: number, context?: InterpolationContext): InterpolationMatch | undefined;
22
+ }