@imenam/mcp-feature-analyzer 1.0.19 → 1.0.21
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.
- package/README.md +22 -9
- package/dist/shared/follow-ups.d.ts +36 -0
- package/dist/shared/follow-ups.js +33 -0
- package/dist/shared/schemas/analysis.schema.d.ts +44 -1
- package/dist/shared/schemas/analysis.schema.js +7 -1
- package/dist/shared/schemas/api.schema.d.ts +13 -0
- package/dist/shared/schemas/api.schema.js +6 -0
- package/dist/shared/schemas/ipc.schema.d.ts +1 -1
- package/dist/shared/schemas/ipc.schema.js +1 -0
- package/dist/src/core/analysis-store.d.ts +10 -1
- package/dist/src/core/analysis-store.js +37 -1
- package/dist/src/core/follow-ups.d.ts +19 -0
- package/dist/src/core/follow-ups.js +85 -0
- package/dist/src/core/migrate.d.ts +7 -0
- package/dist/src/core/migrate.js +41 -1
- package/dist/src/core/review-actions.d.ts +16 -3
- package/dist/src/core/review-actions.js +25 -0
- package/dist/src/gui-worker.js +7 -1
- package/dist/src/index.js +23 -5
- package/dist/src/tools/create-analysis.d.ts +5 -1
- package/dist/src/tools/create-analysis.js +22 -4
- package/dist/src/tools/delete-analysis.d.ts +4 -1
- package/dist/src/tools/delete-analysis.js +11 -5
- package/dist/src/tools/format.d.ts +6 -0
- package/dist/src/tools/format.js +16 -1
- package/dist/src/tools/get-analysis.js +3 -1
- package/dist/src/tools/get-review-feedback.js +12 -5
- package/dist/src/tools/list-analyses.js +5 -0
- package/dist/src/tools/mark-feedback-processed.d.ts +2 -3
- package/dist/src/tools/mark-feedback-processed.js +5 -18
- package/gui/dist/assets/{angular-html-BG32ZSEg.js → angular-html-Cek_sXrk.js} +1 -1
- package/gui/dist/assets/{angular-ts-W997xU6j.js → angular-ts-UDyn2p3m.js} +1 -1
- package/gui/dist/assets/{apl-6ogEEQiK.js → apl-x_xlCIBP.js} +1 -1
- package/gui/dist/assets/{astro-DBxTz6gT.js → astro-DmQALJnP.js} +1 -1
- package/gui/dist/assets/{blade-PbZvkn0I.js → blade-pIl9LNwT.js} +1 -1
- package/gui/dist/assets/{c-C5-3wfrB.js → c-D0w4WEPA.js} +1 -1
- package/gui/dist/assets/{chapel-KHYeKJD5.js → chapel-DYhi5M_6.js} +1 -1
- package/gui/dist/assets/{cobol-D51AxaJB.js → cobol-Bi9NY2Z2.js} +1 -1
- package/gui/dist/assets/{coffee-4h6_4dhl.js → coffee-BW5DOyKl.js} +1 -1
- package/gui/dist/assets/{cpp-B63oWnHV.js → cpp-sz7PwxJX.js} +1 -1
- package/gui/dist/assets/{crystal-OG_TkIE7.js → crystal-d2FoewBA.js} +1 -1
- package/gui/dist/assets/{css-Csea3soR.js → css-BELRmmks.js} +1 -1
- package/gui/dist/assets/{edge-HBaaYuuJ.js → edge-mQnFjIkx.js} +1 -1
- package/gui/dist/assets/{elixir-DZlxxd9b.js → elixir-Dy83Pfni.js} +1 -1
- package/gui/dist/assets/{elm-DZAjSs9M.js → elm-CbWJN26n.js} +1 -1
- package/gui/dist/assets/{erb-BurFBvpV.js → erb-YoUGVS38.js} +1 -1
- package/gui/dist/assets/{git-rebase-B7wPwCu-.js → git-rebase-B1jMLAq6.js} +1 -1
- package/gui/dist/assets/{glimmer-js-Bgk8Z51T.js → glimmer-js-CEmA0NTT.js} +1 -1
- package/gui/dist/assets/{glimmer-ts-ldZtmANh.js → glimmer-ts-kGsWetmY.js} +1 -1
- package/gui/dist/assets/{glsl-7SImpJuS.js → glsl-BeGzr9bJ.js} +1 -1
- package/gui/dist/assets/{graphql-CJ0BLjCq.js → graphql-C6NIC2e-.js} +1 -1
- package/gui/dist/assets/{hack-D50FsJQB.js → hack-KEwBG4mT.js} +1 -1
- package/gui/dist/assets/{haml-xkw_a2ii.js → haml-CkZmvo0g.js} +1 -1
- package/gui/dist/assets/{handlebars-C0upK5dG.js → handlebars-Auwsmq4s.js} +1 -1
- package/gui/dist/assets/{html-derivative-BfB3QMj5.js → html-derivative-vuqQ6-H_.js} +1 -1
- package/gui/dist/assets/{html-CerDkvKq.js → html-oCOc0XdA.js} +1 -1
- package/gui/dist/assets/{http-pXaTY6-R.js → http--nPEUAue.js} +1 -1
- package/gui/dist/assets/{hurl-BNtMT88T.js → hurl-CtpqLncF.js} +1 -1
- package/gui/dist/assets/index-A6BLowRB.css +1 -0
- package/gui/dist/assets/index-B8qqkmWn.js +87 -0
- package/gui/dist/assets/{java-B3e3IyVz.js → java-DYzsoje1.js} +1 -1
- package/gui/dist/assets/{javascript-DgggYE1f.js → javascript-C9DLMJzT.js} +1 -1
- package/gui/dist/assets/{jinja-BHtm4gvT.js → jinja-bSnL04FA.js} +1 -1
- package/gui/dist/assets/{jison-B2YK1Y49.js → jison-Cn8E8V5z.js} +1 -1
- package/gui/dist/assets/{json-7jbWqmUr.js → json-d-QlpP_z.js} +1 -1
- package/gui/dist/assets/{jsx-BFPQ2oqh.js → jsx-CIpU_P-t.js} +1 -1
- package/gui/dist/assets/{julia-DX1Bsm0x.js → julia-DkcJm8gB.js} +1 -1
- package/gui/dist/assets/{just-D524YAex.js → just-DIrw6CS3.js} +1 -1
- package/gui/dist/assets/{latex-Dc0dzAGl.js → latex-BhxpsHBQ.js} +1 -1
- package/gui/dist/assets/{liquid-DXohsHev.js → liquid-C2rHX9Ca.js} +1 -1
- package/gui/dist/assets/{lua-G_rux6Ay.js → lua-7VPHhWYZ.js} +1 -1
- package/gui/dist/assets/{marko-BdidjG96.js → marko-CyYT4p0Z.js} +1 -1
- package/gui/dist/assets/{mdc-DxAZb3tM.js → mdc-BabtknzF.js} +1 -1
- package/gui/dist/assets/{nginx-CuvNT-q8.js → nginx-CFQwDuks.js} +1 -1
- package/gui/dist/assets/{nim-DuDgLkQa.js → nim-DpxcgIHl.js} +1 -1
- package/gui/dist/assets/{org-BJKUhgoL.js → org-Di1bzXp6.js} +1 -1
- package/gui/dist/assets/{perl-BdJ-pZH6.js → perl-CiesRDJJ.js} +1 -1
- package/gui/dist/assets/{php-DUOUy2DX.js → php-XqsiYIMC.js} +1 -1
- package/gui/dist/assets/{pug-WUnoGP-C.js → pug-aREWfnPz.js} +1 -1
- package/gui/dist/assets/{qml-Dl8tY0zd.js → qml-DW8nc6nh.js} +1 -1
- package/gui/dist/assets/{r-Ci9Hbbcn.js → r-D_yTXRZ0.js} +1 -1
- package/gui/dist/assets/{razor-0bx4DTys.js → razor-CyRfgle5.js} +1 -1
- package/gui/dist/assets/{regexp-C0ZlJfpq.js → regexp-Iw19WR-v.js} +1 -1
- package/gui/dist/assets/{rst-BC_vqA0U.js → rst-B_-k2S-N.js} +1 -1
- package/gui/dist/assets/{ruby-DPPk42YS.js → ruby-CuA36vF6.js} +1 -1
- package/gui/dist/assets/{sas-B8jfw3hR.js → sas-D1kb68o2.js} +1 -1
- package/gui/dist/assets/{scss-7mTWL496.js → scss-CqVwaT6R.js} +1 -1
- package/gui/dist/assets/{shellscript-CYNcJqc-.js → shellscript-ZH1qXABi.js} +1 -1
- package/gui/dist/assets/{shellsession-Dh2E3t_B.js → shellsession-C6Na6TIE.js} +1 -1
- package/gui/dist/assets/{soy-BVR-TmA2.js → soy-ByQ4bEBr.js} +1 -1
- package/gui/dist/assets/{sql-D3S51lwn.js → sql-CZ6S4qI7.js} +1 -1
- package/gui/dist/assets/{stata-BjuRTlAG.js → stata-BRy0gI05.js} +1 -1
- package/gui/dist/assets/{surrealql-BKRHdvyc.js → surrealql-lzF2k3Nd.js} +1 -1
- package/gui/dist/assets/{svelte-DIKo_e2T.js → svelte-kK73PgnC.js} +1 -1
- package/gui/dist/assets/{templ-DC42iqks.js → templ-6OIvTPYb.js} +1 -1
- package/gui/dist/assets/{tex-BZ2lfoiV.js → tex-CInwFac_.js} +1 -1
- package/gui/dist/assets/{ts-tags-o8CUeNFk.js → ts-tags-FsaaGgNy.js} +1 -1
- package/gui/dist/assets/{tsx-DeMh4Cat.js → tsx-PUBs9-s-.js} +1 -1
- package/gui/dist/assets/{twig-BUr_lvSK.js → twig-Bod5HEgw.js} +1 -1
- package/gui/dist/assets/{typescript-DeKHrHpS.js → typescript-DG8BYJBt.js} +1 -1
- package/gui/dist/assets/{typst-CcbUABTI.js → typst-D2jY-D59.js} +1 -1
- package/gui/dist/assets/{vue-html-soMMIiuc.js → vue-html-zYeGUz6E.js} +1 -1
- package/gui/dist/assets/{vue-JHDlnmNz.js → vue-r2mYghHk.js} +1 -1
- package/gui/dist/assets/{vue-vine-D8TZS6Lm.js → vue-vine-DWGog3Vg.js} +1 -1
- package/gui/dist/assets/{xml-9isD2blC.js → xml-CfWom5su.js} +1 -1
- package/gui/dist/assets/{xsl-chWKvWOz.js → xsl-BV2P-krQ.js} +1 -1
- package/gui/dist/assets/{yaml-DEY2M1js.js → yaml-C-iwSc7Q.js} +1 -1
- package/gui/dist/index.html +2 -2
- package/package.json +1 -1
- package/gui/dist/assets/index-CMjVOwnL.js +0 -87
- package/gui/dist/assets/index-CN9ojYe6.css +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Analysis } from "../../shared/schemas/analysis.schema.js";
|
|
2
|
-
import type { AddNoteBody, DeleteNoteBody, SetFileReviewedBody, SetFindingStatusBody, SubmitReviewBody, UpdateNoteBody } from "../../shared/schemas/api.schema.js";
|
|
3
|
-
import type { AnalysisStore } from "./analysis-store.js";
|
|
1
|
+
import type { Analysis, Editor } from "../../shared/schemas/analysis.schema.js";
|
|
2
|
+
import type { AddNoteBody, DeleteNoteBody, MarkProcessedBody, SetFileReviewedBody, SetFindingStatusBody, SubmitReviewBody, UpdateNoteBody } from "../../shared/schemas/api.schema.js";
|
|
3
|
+
import type { AnalysisStore, MutateOptions } from "./analysis-store.js";
|
|
4
4
|
/**
|
|
5
5
|
* Modifications faites par le relecteur depuis la GUI. Chacune passe par
|
|
6
6
|
* `store.mutate(id, "user", …, { baseRevision })` et renvoie l'analyse écrite.
|
|
@@ -25,6 +25,19 @@ export declare function addNote(store: AnalysisStore, analysisId: string, body:
|
|
|
25
25
|
export declare function updateNote(store: AnalysisStore, analysisId: string, noteId: string, body: UpdateNoteBody): Analysis;
|
|
26
26
|
/** Supprime une remarque et la retire de la sélection de la revue. */
|
|
27
27
|
export declare function deleteNote(store: AnalysisStore, analysisId: string, noteId: string, body: DeleteNoteBody): Analysis;
|
|
28
|
+
/** Analyse marquée traitée, et date du marquage qu'elle remplace s'il y en avait un. */
|
|
29
|
+
export interface MarkProcessedResult {
|
|
30
|
+
analysis: Analysis;
|
|
31
|
+
replaced: string | null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Marque traité le retour soumis d'une analyse : date, note facultative et
|
|
35
|
+
* auteur (`agent` par l'outil MCP, `user` depuis la GUI). Refusé tant que la
|
|
36
|
+
* revue n'est pas soumise ; un nouveau marquage remplace le précédent.
|
|
37
|
+
*/
|
|
38
|
+
export declare function markFeedbackProcessed(store: AnalysisStore, analysisId: string, editor: Editor, note: string | null, options?: MutateOptions): MarkProcessedResult;
|
|
39
|
+
/** Marque traité, depuis la GUI, le retour soumis d'une analyse. */
|
|
40
|
+
export declare function markProcessedByReviewer(store: AnalysisStore, analysisId: string, body: MarkProcessedBody): Analysis;
|
|
28
41
|
/**
|
|
29
42
|
* Soumet la revue : décision, points retenus et prompt calculé ici. La revue
|
|
30
43
|
* soumise est à traiter par l'agent. Une nouvelle soumission remplace la
|
|
@@ -86,6 +86,31 @@ export function deleteNote(store, analysisId, noteId, body) {
|
|
|
86
86
|
draft.review.selectedNoteIds = draft.review.selectedNoteIds.filter((id) => id !== noteId);
|
|
87
87
|
}, { baseRevision: body.baseRevision });
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Marque traité le retour soumis d'une analyse : date, note facultative et
|
|
91
|
+
* auteur (`agent` par l'outil MCP, `user` depuis la GUI). Refusé tant que la
|
|
92
|
+
* revue n'est pas soumise ; un nouveau marquage remplace le précédent.
|
|
93
|
+
*/
|
|
94
|
+
export function markFeedbackProcessed(store, analysisId, editor, note, options = {}) {
|
|
95
|
+
let replaced = null;
|
|
96
|
+
const analysis = store.mutate(analysisId, editor, (draft) => {
|
|
97
|
+
const review = draft.review;
|
|
98
|
+
if (review.state !== "submitted") {
|
|
99
|
+
const reopened = review.previousSubmission;
|
|
100
|
+
throw new AnalysisError(reopened
|
|
101
|
+
? `The review of analysis "${analysisId}" is not submitted: the reviewer reopened the feedback submitted at ${reopened.submittedAt} and is changing it. ` +
|
|
102
|
+
`Wait until it is submitted again, then read it with get_review_feedback.`
|
|
103
|
+
: `The review of analysis "${analysisId}" is not submitted yet: there is no feedback to mark processed.`);
|
|
104
|
+
}
|
|
105
|
+
replaced = review.processed?.at ?? null;
|
|
106
|
+
review.processed = { at: new Date().toISOString(), note, by: editor };
|
|
107
|
+
}, options);
|
|
108
|
+
return { analysis, replaced };
|
|
109
|
+
}
|
|
110
|
+
/** Marque traité, depuis la GUI, le retour soumis d'une analyse. */
|
|
111
|
+
export function markProcessedByReviewer(store, analysisId, body) {
|
|
112
|
+
return markFeedbackProcessed(store, analysisId, "user", body.note ?? null, { baseRevision: body.baseRevision }).analysis;
|
|
113
|
+
}
|
|
89
114
|
function assertKnownIds(label, ids, known) {
|
|
90
115
|
const knownSet = new Set(known);
|
|
91
116
|
const unknown = ids.filter((id) => !knownSet.has(id));
|
package/dist/src/gui-worker.js
CHANGED
|
@@ -7,7 +7,7 @@ import fs from "fs";
|
|
|
7
7
|
import { fileURLToPath } from "url";
|
|
8
8
|
import { randomUUID } from "crypto";
|
|
9
9
|
import { IPCMessageSchema, PUSHED_EVENT_TYPES } from "../shared/schemas/ipc.schema.js";
|
|
10
|
-
import { AddNoteBodySchema, DeleteNoteBodySchema, SetFileReviewedBodySchema, SetFindingStatusBodySchema, SubmitReviewBodySchema, UpdateNoteBodySchema, } from "../shared/schemas/api.schema.js";
|
|
10
|
+
import { AddNoteBodySchema, DeleteNoteBodySchema, MarkProcessedBodySchema, SetFileReviewedBodySchema, SetFindingStatusBodySchema, SubmitReviewBodySchema, UpdateNoteBodySchema, } from "../shared/schemas/api.schema.js";
|
|
11
11
|
import { resolveLogDir } from "./core/log-dir.js";
|
|
12
12
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
13
|
function findProjectRoot(startDir) {
|
|
@@ -276,6 +276,12 @@ app.post("/api/analyses/:id/review", async (c) => {
|
|
|
276
276
|
return read.response;
|
|
277
277
|
return forward(c, "SUBMIT_REVIEW", { analysisId: c.req.param("id"), body: read.body });
|
|
278
278
|
});
|
|
279
|
+
app.post("/api/analyses/:id/review/processed", async (c) => {
|
|
280
|
+
const read = await readBody(c, MarkProcessedBodySchema);
|
|
281
|
+
if ("response" in read)
|
|
282
|
+
return read.response;
|
|
283
|
+
return forward(c, "MARK_PROCESSED", { analysisId: c.req.param("id"), body: read.body });
|
|
284
|
+
});
|
|
279
285
|
/** Route d'API inconnue : 404 explicite plutôt que la page de la SPA. */
|
|
280
286
|
app.all("/api/*", (c) => c.json({ error: `Unknown API route: ${c.req.method} ${c.req.path}` }, 404));
|
|
281
287
|
// Fichiers statiques de la SPA
|
package/dist/src/index.js
CHANGED
|
@@ -16,9 +16,9 @@ import { DEFAULT_HEAD_REF, localRepo } from "./core/git.js";
|
|
|
16
16
|
import { agentRepo } from "./core/agent-repo.js";
|
|
17
17
|
import { EXEC_ARG, handleAgentExec } from "./core/gateway-exec.js";
|
|
18
18
|
import { resolveRole } from "./core/role.js";
|
|
19
|
-
import { addNote, deleteNote, setFileReviewed, setFindingStatus, submitReview, updateNote } from "./core/review-actions.js";
|
|
19
|
+
import { addNote, deleteNote, markProcessedByReviewer, setFileReviewed, setFindingStatus, submitReview, updateNote, } from "./core/review-actions.js";
|
|
20
20
|
import { GUI_REQUEST_TYPES, IPCMessageSchema } from "../shared/schemas/ipc.schema.js";
|
|
21
|
-
import { AddNoteRequestSchema, AnalysisRequestSchema, DeleteNoteRequestSchema, SetFileReviewedRequestSchema, SetFindingStatusRequestSchema, SubmitReviewRequestSchema, UpdateNoteRequestSchema, } from "../shared/schemas/api.schema.js";
|
|
21
|
+
import { AddNoteRequestSchema, AnalysisRequestSchema, DeleteNoteRequestSchema, SetFileReviewedRequestSchema, SetFindingStatusRequestSchema, SubmitReviewRequestSchema, MarkProcessedRequestSchema, UpdateNoteRequestSchema, } from "../shared/schemas/api.schema.js";
|
|
22
22
|
import { ANALYSIS_MODES, DIAGRAM_KINDS, EXPLANATION_SIDES, FINDING_KINDS, NODE_SHAPES, NODE_STATUSES, SEVERITIES, } from "../shared/schemas/analysis.schema.js";
|
|
23
23
|
import { errorResult, textResult } from "./tools/types.js";
|
|
24
24
|
import { createAnalysis } from "./tools/create-analysis.js";
|
|
@@ -37,6 +37,7 @@ import { DEFAULT_NODE_SHAPE, DEFAULT_NODE_STATUS, setDiagram } from "./tools/set
|
|
|
37
37
|
import { deleteDiagram } from "./tools/delete-diagram.js";
|
|
38
38
|
import { getReviewFeedback } from "./tools/get-review-feedback.js";
|
|
39
39
|
import { markFeedbackProcessed } from "./tools/mark-feedback-processed.js";
|
|
40
|
+
import { analysisLinks } from "./core/follow-ups.js";
|
|
40
41
|
import { deleteAnalysis } from "./tools/delete-analysis.js";
|
|
41
42
|
const __filename = fileURLToPath(import.meta.url);
|
|
42
43
|
const __dirname = path.dirname(__filename);
|
|
@@ -95,6 +96,7 @@ Concepts:
|
|
|
95
96
|
- An **explanation** describes what a block of added or removed code does and how it works, so that the reviewer understands it before judging it. It is not a finding: it judges nothing and asks for nothing. It is anchored on new-side lines (added code) or old-side lines (removed code), and shown in the diff above the lines it describes.
|
|
96
97
|
- A **diagram** is a flow, layers or mindmap picture of the feature. You give nodes and links only; the GUI lays them out.
|
|
97
98
|
- The **review** belongs to the reviewer: files marked reviewed, findings ignored, notes, and a submitted decision with a prompt for you.
|
|
99
|
+
- A **follow-up review** is a new analysis created with follow_up_of: it reviews the fixes for the submitted feedback of an earlier analysis. Each analysis has at most one follow-up, so the rounds form a chain.
|
|
98
100
|
|
|
99
101
|
Workflow:
|
|
100
102
|
1. list_analyses (with project) to find an analysis of the same feature: reuse it with update_analysis and refresh_analysis instead of creating a duplicate. Otherwise create_analysis with its project once the feature is developed.
|
|
@@ -105,7 +107,7 @@ Workflow:
|
|
|
105
107
|
6. set_diagram when a picture helps (impacted layers, process flow, concept tree).
|
|
106
108
|
7. Tell the user to review the analysis in the GUI (the link is in the tool results).
|
|
107
109
|
8. get_review_feedback to read the decision, the selected points and the prompt. list_analyses with review_state "to_process" lists the submitted reviews you have not handled yet; an approved review has nothing to process.
|
|
108
|
-
9. Fix the code, then refresh_analysis to recompute the diff for a new review round; re-anchor or rewrite the outdated findings and explanations. When the
|
|
110
|
+
9. Fix the code, then refresh_analysis to recompute the diff for a new review round; re-anchor or rewrite the outdated findings and explanations. When the fixes are in other commits (typically an analysis of one commit), create their follow-up review instead: create_analysis on the fix commits with follow_up_of set to the analysis you fixed; it marks that feedback processed and shows its points to the reviewer. When nothing needs a new review (answers given in the conversation), call mark_feedback_processed with a note saying how the feedback was handled.
|
|
109
111
|
|
|
110
112
|
Explanation rules:
|
|
111
113
|
- Write one for every added or removed block that is long (a function or a block of about 30 lines or more) or complex (non-trivial algorithm, state machine, concurrency, recursion, tricky regular expression or data transformation). A 100-line function always gets one.
|
|
@@ -183,8 +185,10 @@ function handleGuiRequest(msg) {
|
|
|
183
185
|
return { dataDir, version: APP_VERSION };
|
|
184
186
|
case "LIST_ANALYSES":
|
|
185
187
|
return store.list();
|
|
186
|
-
case "GET_ANALYSIS":
|
|
187
|
-
|
|
188
|
+
case "GET_ANALYSIS": {
|
|
189
|
+
const analysisId = parseRequest(AnalysisRequestSchema, msg.data).analysisId;
|
|
190
|
+
return { analysis: store.get(analysisId), links: analysisLinks(store, analysisId) };
|
|
191
|
+
}
|
|
188
192
|
case "GET_DIFF":
|
|
189
193
|
return { diff: store.getSnapshot(parseRequest(AnalysisRequestSchema, msg.data).analysisId) };
|
|
190
194
|
case "SET_FILE_REVIEWED": {
|
|
@@ -223,6 +227,12 @@ function handleGuiRequest(msg) {
|
|
|
223
227
|
afterUserMutation(analysis.id);
|
|
224
228
|
return { analysis };
|
|
225
229
|
}
|
|
230
|
+
case "MARK_PROCESSED": {
|
|
231
|
+
const request = parseRequest(MarkProcessedRequestSchema, msg.data);
|
|
232
|
+
const analysis = markProcessedByReviewer(store, request.analysisId, request.body);
|
|
233
|
+
afterUserMutation(analysis.id);
|
|
234
|
+
return { analysis };
|
|
235
|
+
}
|
|
226
236
|
default:
|
|
227
237
|
throw new Error(`GUI request ${msg.type} has no handler.`);
|
|
228
238
|
}
|
|
@@ -401,6 +411,12 @@ const TOOLS = [
|
|
|
401
411
|
},
|
|
402
412
|
request_text: { type: "string", description: REQUEST_TEXT_DOC },
|
|
403
413
|
request_source: { type: "string", description: `${REQUEST_SOURCE_DOC} Needs request_text.` },
|
|
414
|
+
follow_up_of: {
|
|
415
|
+
type: "string",
|
|
416
|
+
description: "Id of the analysis whose submitted feedback this new analysis follows up, typically an analysis of the fix commits. " +
|
|
417
|
+
"Its feedback is marked processed if it was still waiting for you, and the reviewer sees its points to check in the new review. " +
|
|
418
|
+
"Refused when that review is not submitted or already has a follow-up (one follow-up per analysis; follow up the latest round instead).",
|
|
419
|
+
},
|
|
404
420
|
},
|
|
405
421
|
required: ["repo_path", "project", "title", "mode"],
|
|
406
422
|
},
|
|
@@ -745,6 +761,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
745
761
|
return await withRepoAccess(exec, async (repoFor) => {
|
|
746
762
|
const mutation = await createAnalysis(store, params, repoFor);
|
|
747
763
|
notifyAnalysesListChanged();
|
|
764
|
+
if (typeof params.follow_up_of === "string")
|
|
765
|
+
notifyAnalysisChanged(params.follow_up_of.trim());
|
|
748
766
|
return afterMutation(mutation);
|
|
749
767
|
});
|
|
750
768
|
case "update_analysis":
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { AnalysisStore } from "../core/analysis-store.js";
|
|
2
2
|
import { type RepoAccess } from "../core/git.js";
|
|
3
3
|
import { type Args, type MutationResult } from "./types.js";
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Calcule et fige le diff du dépôt, lu par `repoFor(repo_path)` (git local par
|
|
6
|
+
* défaut), puis crée l'analyse. Avec `follow_up_of`, la nouvelle analyse est la
|
|
7
|
+
* revue de suivi de celle-ci, dont le retour est marqué traité s'il attendait l'agent.
|
|
8
|
+
*/
|
|
5
9
|
export declare function createAnalysis(store: AnalysisStore, args: Args, repoFor?: (repoPath: string) => RepoAccess): Promise<MutationResult>;
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import { assertCanFollowUp, markOriginFollowed } from "../core/follow-ups.js";
|
|
1
2
|
import { computeSnapshot, localRepo } from "../core/git.js";
|
|
2
3
|
import { ANALYSIS_MODES } from "../../shared/schemas/analysis.schema.js";
|
|
3
4
|
import { fileLine, fileTotals, snapshotLabel } from "./format.js";
|
|
4
5
|
import { optionalString, rejectUnknownFields, requireEnum, requireString, textResult, } from "./types.js";
|
|
5
|
-
const FIELDS = ["repo_path", "project", "title", "mode", "base", "head", "request_text", "request_source"];
|
|
6
|
-
/**
|
|
6
|
+
const FIELDS = ["repo_path", "project", "title", "mode", "base", "head", "request_text", "request_source", "follow_up_of"];
|
|
7
|
+
/**
|
|
8
|
+
* Calcule et fige le diff du dépôt, lu par `repoFor(repo_path)` (git local par
|
|
9
|
+
* défaut), puis crée l'analyse. Avec `follow_up_of`, la nouvelle analyse est la
|
|
10
|
+
* revue de suivi de celle-ci, dont le retour est marqué traité s'il attendait l'agent.
|
|
11
|
+
*/
|
|
7
12
|
export async function createAnalysis(store, args, repoFor = localRepo) {
|
|
8
13
|
rejectUnknownFields(args, FIELDS);
|
|
9
14
|
const repoPath = requireString(args, "repo_path");
|
|
@@ -17,14 +22,27 @@ export async function createAnalysis(store, args, repoFor = localRepo) {
|
|
|
17
22
|
if (requestSource !== undefined && requestText === undefined) {
|
|
18
23
|
throw new Error(`"request_source" describes the initial request: give "request_text" too.`);
|
|
19
24
|
}
|
|
25
|
+
const followUpOf = optionalString(args, "follow_up_of");
|
|
26
|
+
const origin = followUpOf === undefined ? null : assertCanFollowUp(store, followUpOf);
|
|
20
27
|
const computed = await computeSnapshot({ repoPath, mode, base, head }, repoFor(repoPath));
|
|
21
|
-
const analysis = store.create({
|
|
28
|
+
const analysis = store.create({
|
|
29
|
+
project,
|
|
30
|
+
title,
|
|
31
|
+
request: requestText === undefined ? null : { text: requestText, source: requestSource ?? null },
|
|
32
|
+
followUpOf: origin?.id ?? null,
|
|
33
|
+
}, computed);
|
|
22
34
|
const lines = [
|
|
23
35
|
`Created analysis "${analysis.title}" (id: ${analysis.id}) in project "${analysis.project}".`,
|
|
24
36
|
`Repository: ${analysis.repoPath}`,
|
|
25
37
|
`Diff: ${snapshotLabel(analysis)}`,
|
|
26
|
-
"",
|
|
27
38
|
];
|
|
39
|
+
if (origin !== null) {
|
|
40
|
+
const marked = markOriginFollowed(store, origin.id, analysis);
|
|
41
|
+
lines.push(`Follow-up of: "${origin.title}" (${origin.id}). The reviewer sees the points of its feedback to check in this new review.`, marked
|
|
42
|
+
? `Its feedback was waiting for you: it is now marked processed, with a note naming this follow-up.`
|
|
43
|
+
: `Its feedback was already processed or approved: its processing mark is unchanged.`);
|
|
44
|
+
}
|
|
45
|
+
lines.push("");
|
|
28
46
|
if (analysis.files.length === 0) {
|
|
29
47
|
lines.push("Changed files: none — the diff is empty. Check the mode and refs; delete this analysis with delete_analysis and create it again with the right ones.");
|
|
30
48
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { AnalysisStore } from "../core/analysis-store.js";
|
|
2
2
|
import { type Args, type MutationResult } from "./types.js";
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Supprime une analyse et son snapshot de diff. Sa revue de suivi, si elle en a
|
|
5
|
+
* une, est conservée et devient une première revue.
|
|
6
|
+
*/
|
|
4
7
|
export declare function deleteAnalysis(store: AnalysisStore, args: Args): MutationResult;
|
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
import { detachFollowUp } from "../core/follow-ups.js";
|
|
1
2
|
import { rejectUnknownFields, requireString, textResult } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Supprime une analyse et son snapshot de diff. Sa revue de suivi, si elle en a
|
|
5
|
+
* une, est conservée et devient une première revue.
|
|
6
|
+
*/
|
|
3
7
|
export function deleteAnalysis(store, args) {
|
|
4
8
|
rejectUnknownFields(args, ["analysis_id"]);
|
|
5
9
|
const id = requireString(args, "analysis_id");
|
|
10
|
+
store.get(id);
|
|
11
|
+
const detached = detachFollowUp(store, id);
|
|
6
12
|
store.delete(id);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
};
|
|
13
|
+
const lines = [`Deleted analysis ${id} and its diff snapshot. The repository is untouched.`];
|
|
14
|
+
if (detached !== null)
|
|
15
|
+
lines.push(`Its follow-up review ${detached} is kept and no longer refers to it.`);
|
|
16
|
+
return { result: textResult(lines.join("\n")), analysisId: id };
|
|
11
17
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Analysis, type Explanation, type FileEntry, type Finding, type Note, type Overview, type ReviewProgress, type ReviewProgressState, type Severity } from "../../shared/schemas/analysis.schema.js";
|
|
2
|
+
import type { AnalysisLinks } from "../../shared/follow-ups.js";
|
|
2
3
|
/** Sha abrégé à 7 caractères. */
|
|
3
4
|
export declare function shortSha(sha: string | null): string;
|
|
4
5
|
/** Refs d'une analyse : `branch master...HEAD` ou `working_tree (changes against HEAD)`. */
|
|
@@ -29,5 +30,10 @@ export declare function progressStateLabel(state: ReviewProgressState): string;
|
|
|
29
30
|
* ou `submitted, decision approve, nothing to process (7/7 files reviewed)`.
|
|
30
31
|
*/
|
|
31
32
|
export declare function progressLabel(progress: ReviewProgress): string;
|
|
33
|
+
/**
|
|
34
|
+
* Lignes de suivi d'une analyse : analyse suivie et revue de suivi, avec le rang
|
|
35
|
+
* dans la chaîne. Aucune ligne pour une analyse sans lien.
|
|
36
|
+
*/
|
|
37
|
+
export declare function followUpLines(links: Pick<AnalysisLinks, "previous" | "next" | "chain">, id: string): string[];
|
|
32
38
|
/** Bloc « Overview » : objectif, approche et points d'attention ; une ligne d'invitation quand il n'y en a pas. */
|
|
33
39
|
export declare function overviewLines(overview: Overview | null): string[];
|
package/dist/src/tools/format.js
CHANGED
|
@@ -83,10 +83,25 @@ export function progressLabel(progress) {
|
|
|
83
83
|
? "pending processing"
|
|
84
84
|
: progress.processed === null
|
|
85
85
|
? "nothing to process"
|
|
86
|
-
: `processed at ${progress.processed.at}`;
|
|
86
|
+
: `processed at ${progress.processed.at}${progress.processed.by === "user" ? " by the reviewer" : ""}`;
|
|
87
87
|
const decision = progress.state === "submitted" ? `, decision ${progress.decision}, ${processing}` : "";
|
|
88
88
|
return `${REVIEW_PROGRESS_TEXT[progress.state]}${decision} (${progress.reviewedFiles}/${progress.totalFiles} files reviewed)`;
|
|
89
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Lignes de suivi d'une analyse : analyse suivie et revue de suivi, avec le rang
|
|
92
|
+
* dans la chaîne. Aucune ligne pour une analyse sans lien.
|
|
93
|
+
*/
|
|
94
|
+
export function followUpLines(links, id) {
|
|
95
|
+
const lines = [];
|
|
96
|
+
const round = links.chain.findIndex((link) => link.id === id) + 1;
|
|
97
|
+
if (links.previous) {
|
|
98
|
+
lines.push(`Follow-up of: "${links.previous.title}" (${links.previous.id}) — round ${round} of ${links.chain.length}.`);
|
|
99
|
+
}
|
|
100
|
+
if (links.next) {
|
|
101
|
+
lines.push(`Followed by: "${links.next.title}" (${links.next.id}), review ${progressLabel(links.next.progress)}.`);
|
|
102
|
+
}
|
|
103
|
+
return lines;
|
|
104
|
+
}
|
|
90
105
|
/** Bloc « Overview » : objectif, approche et points d'attention ; une ligne d'invitation quand il n'y en a pas. */
|
|
91
106
|
export function overviewLines(overview) {
|
|
92
107
|
if (overview === null)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { summarize } from "../core/analysis-store.js";
|
|
2
|
+
import { analysisLinks } from "../core/follow-ups.js";
|
|
2
3
|
import { diagramQuality } from "../../shared/diagram-quality.js";
|
|
3
4
|
import { reviewProgress } from "../../shared/review-state.js";
|
|
4
5
|
import { sortBySeverity } from "../../shared/severity.js";
|
|
5
|
-
import { fileLine, explanationLine, fileTotals, findingLine, noteLocationLabel, overviewLines, progressLabel, severityCountsLabel, snapshotLabel, } from "./format.js";
|
|
6
|
+
import { fileLine, explanationLine, fileTotals, findingLine, followUpLines, noteLocationLabel, overviewLines, progressLabel, severityCountsLabel, snapshotLabel, } from "./format.js";
|
|
6
7
|
import { rejectUnknownFields, requireString, textResult } from "./types.js";
|
|
7
8
|
function noteLine(note) {
|
|
8
9
|
return `${note.id} — ${noteLocationLabel(note)} — ${note.text.replace(/\n/g, " / ")}`;
|
|
@@ -48,6 +49,7 @@ export function getAnalysis(store, args) {
|
|
|
48
49
|
`Repository: ${analysis.repoPath}`,
|
|
49
50
|
`Diff: ${snapshotLabel(analysis)}`,
|
|
50
51
|
`Revision ${analysis.revision}, last edited by ${analysis.lastEditor} at ${analysis.updatedAt}`,
|
|
52
|
+
...followUpLines(analysisLinks(store, analysis.id), analysis.id),
|
|
51
53
|
"",
|
|
52
54
|
];
|
|
53
55
|
if (analysis.request) {
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { analysisLinks } from "../core/follow-ups.js";
|
|
1
2
|
import { hasNoChanges, needsProcessing, recordSubmission, reviewProgress, submissionChanges } from "../../shared/review-state.js";
|
|
2
3
|
import { sortBySeverity } from "../../shared/severity.js";
|
|
3
4
|
import { findingLine, indentBlock, noteLocationLabel, overviewLines, progressLabel } from "./format.js";
|
|
4
5
|
import { rejectUnknownFields, requireString, textResult } from "./types.js";
|
|
5
|
-
/** `processed at <date> (note: …)`, `nothing to process (approved)` ou `not processed`. */
|
|
6
|
+
/** `processed at <date> by the agent (note: …)`, `nothing to process (approved)` ou `not processed`. */
|
|
6
7
|
function processingLabel(decision, processed) {
|
|
7
|
-
if (processed !== null)
|
|
8
|
-
|
|
8
|
+
if (processed !== null) {
|
|
9
|
+
const by = processed.by === "user" ? "the reviewer" : "the agent";
|
|
10
|
+
return `processed at ${processed.at} by ${by}${processed.note === null ? "" : ` (note: ${processed.note})`}`;
|
|
11
|
+
}
|
|
9
12
|
return decision === "approve" ? "nothing to process (approved)" : "not processed";
|
|
10
13
|
}
|
|
11
14
|
/** `submitted at <date>, decision <d>, processed at <date>…` : rappel d'une version soumise. */
|
|
@@ -104,8 +107,12 @@ export function getReviewFeedback(store, args) {
|
|
|
104
107
|
}
|
|
105
108
|
else {
|
|
106
109
|
lines.push("Next steps: address the points above in the repository. Then either call refresh_analysis to recompute the diff " +
|
|
107
|
-
"(it discards this feedback and starts a new review round), or, when the
|
|
108
|
-
|
|
110
|
+
"(it discards this feedback and starts a new review round), or, when the fixes are in other commits, create the follow-up review " +
|
|
111
|
+
`with create_analysis and follow_up_of "${analysis.id}" on those commits (it marks this feedback processed and shows these points ` +
|
|
112
|
+
"to the reviewer). When nothing needs a new review (answers given in the conversation), call mark_feedback_processed with a note.");
|
|
109
113
|
}
|
|
114
|
+
const next = analysisLinks(store, analysis.id).next;
|
|
115
|
+
if (next)
|
|
116
|
+
lines.push(`Follow-up review: "${next.title}" (${next.id}), review ${progressLabel(next.progress)}.`);
|
|
110
117
|
return textResult(lines.join("\n"));
|
|
111
118
|
}
|
|
@@ -45,6 +45,11 @@ function analysisLines(summary) {
|
|
|
45
45
|
];
|
|
46
46
|
if (processed?.note)
|
|
47
47
|
lines.push(` processing note: ${processed.note}`);
|
|
48
|
+
if (summary.followUpOf)
|
|
49
|
+
lines.push(` follow-up of: ${summary.followUpOf.id} (round ${summary.round})`);
|
|
50
|
+
if (summary.followedBy) {
|
|
51
|
+
lines.push(` followed by: ${summary.followedBy.id} — review ${progressLabel(summary.followedBy.progress)}`);
|
|
52
|
+
}
|
|
48
53
|
return lines;
|
|
49
54
|
}
|
|
50
55
|
/**
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { AnalysisStore } from "../core/analysis-store.js";
|
|
2
2
|
import { type Args, type MutationResult } from "./types.js";
|
|
3
3
|
/**
|
|
4
|
-
* Marque
|
|
5
|
-
* facultative. Le retour reste lisible avec get_review_feedback.
|
|
6
|
-
* que la revue n'est pas soumise ; un nouveau marquage remplace le précédent.
|
|
4
|
+
* Marque traité, au nom de l'agent, le retour soumis d'une analyse, avec la date
|
|
5
|
+
* et une note facultative. Le retour reste lisible avec get_review_feedback.
|
|
7
6
|
*/
|
|
8
7
|
export declare function markFeedbackProcessed(store: AnalysisStore, args: Args): MutationResult;
|
|
@@ -1,27 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { markFeedbackProcessed as markProcessed } from "../core/review-actions.js";
|
|
2
2
|
import { optionalString, rejectUnknownFields, requireString, textResult } from "./types.js";
|
|
3
3
|
/**
|
|
4
|
-
* Marque
|
|
5
|
-
* facultative. Le retour reste lisible avec get_review_feedback.
|
|
6
|
-
* que la revue n'est pas soumise ; un nouveau marquage remplace le précédent.
|
|
4
|
+
* Marque traité, au nom de l'agent, le retour soumis d'une analyse, avec la date
|
|
5
|
+
* et une note facultative. Le retour reste lisible avec get_review_feedback.
|
|
7
6
|
*/
|
|
8
7
|
export function markFeedbackProcessed(store, args) {
|
|
9
8
|
rejectUnknownFields(args, ["analysis_id", "note"]);
|
|
10
9
|
const id = requireString(args, "analysis_id");
|
|
11
10
|
const note = optionalString(args, "note") ?? null;
|
|
12
|
-
|
|
13
|
-
const updated = store.mutate(id, "agent", (draft) => {
|
|
14
|
-
const review = draft.review;
|
|
15
|
-
if (review.state !== "submitted") {
|
|
16
|
-
const reopened = review.previousSubmission;
|
|
17
|
-
throw new AnalysisError(reopened
|
|
18
|
-
? `The review of analysis "${id}" is not submitted: the reviewer reopened the feedback submitted at ${reopened.submittedAt} and is changing it. ` +
|
|
19
|
-
`Wait until it is submitted again, then read it with get_review_feedback.`
|
|
20
|
-
: `The review of analysis "${id}" is not submitted yet: there is no feedback to mark processed.`);
|
|
21
|
-
}
|
|
22
|
-
replaced = review.processed?.at ?? null;
|
|
23
|
-
review.processed = { at: new Date().toISOString(), note };
|
|
24
|
-
});
|
|
11
|
+
const { analysis: updated, replaced } = markProcessed(store, id, "agent", note);
|
|
25
12
|
const processed = updated.review.processed;
|
|
26
13
|
const lines = [
|
|
27
14
|
`Marked the feedback of "${updated.title}" (${updated.id}), submitted at ${updated.review.submittedAt}, as processed at ${processed.at}.`,
|
|
@@ -29,6 +16,6 @@ export function markFeedbackProcessed(store, args) {
|
|
|
29
16
|
];
|
|
30
17
|
if (replaced !== null)
|
|
31
18
|
lines.push(`This replaces the processing mark of ${replaced}.`);
|
|
32
|
-
lines.push("The feedback stays readable with get_review_feedback. If the reviewer changes the review, it becomes pending again.");
|
|
19
|
+
lines.push("The feedback stays readable with get_review_feedback. If the reviewer changes the review, it becomes pending again.", `If the fixes are in new commits, create their follow-up review with create_analysis and follow_up_of "${updated.id}".`);
|
|
33
20
|
return { result: textResult(lines.join("\n")), analysisId: updated.id };
|
|
34
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./index-CMjVOwnL.js";import{t}from"./html-CerDkvKq.js";var n=[Object.freeze(JSON.parse('{"injectionSelector":"L:text.html -comment","name":"angular-expression","patterns":[{"include":"#ngExpression"}],"repository":{"arrayLiteral":{"begin":"\\\\[","beginCaptures":{"0":{"name":"meta.brace.square.ts"}},"end":"]","endCaptures":{"0":{"name":"meta.brace.square.ts"}},"name":"meta.array.literal.ts","patterns":[{"include":"#ngExpression"},{"include":"#punctuationComma"}]},"booleanLiteral":{"patterns":[{"match":"(?<![$.])\\\\btrue\\\\b(?!\\\\$)","name":"constant.language.boolean.true.ts"},{"match":"(?<![$.])\\\\bfalse\\\\b(?!\\\\$)","name":"constant.language.boolean.false.ts"}]},"expressionOperator":{"patterns":[{"captures":{"1":{"name":"keyword.operator.logical.ts"},"2":{"name":"entity.name.function.pipe.ng"}},"match":"((?<!\\\\|)\\\\|(?!\\\\|))\\\\s?([-$0-9A-Z_a-z]*)"},{"match":"(?<![$.])\\\\b(let)\\\\b(?!\\\\$)","name":"storage.type.ts"},{"match":"(?<![$.])\\\\b(await)\\\\b(?!\\\\$)","name":"keyword.control.flow.ts"},{"match":"(?<![$.])\\\\bdelete\\\\b(?!\\\\$)","name":"keyword.operator.expression.delete.ts"},{"match":"(?<![$.])\\\\bin\\\\b(?!\\\\$)","name":"keyword.operator.expression.in.ts"},{"match":"(?<![$.])\\\\bof\\\\b(?!\\\\$)","name":"keyword.operator.expression.of.ts"},{"match":"(?<![$.])\\\\bif\\\\b(?!\\\\$)","name":"keyword.control.if.ts"},{"match":"(?<![$.])\\\\belse\\\\b(?!\\\\$)","name":"keyword.control.else.ts"},{"match":"(?<![$.])\\\\bthen\\\\b(?!\\\\$)","name":"keyword.control.then.ts"},{"match":"(?<![$.])\\\\binstanceof\\\\b(?!\\\\$)","name":"keyword.operator.expression.instanceof.ts"},{"match":"(?<![$.])\\\\bnew\\\\b(?!\\\\$)","name":"keyword.operator.new.ts"},{"match":"(?<![$.])\\\\bvoid\\\\b(?!\\\\$)","name":"keyword.operator.expression.void.ts"},{"begin":"(?<![$.])\\\\bas\\\\b(?!\\\\$)","beginCaptures":{"0":{"name":"storage.type.as.ts"}},"end":"(?=$|[]\\"\'),:;}])","patterns":[{"include":"#type"}]},{"match":"(?:\\\\*|(?<!\\\\()/|[-%+])=","name":"keyword.operator.assignment.compound.ts"},{"match":"(?:[\\\\&^]|<<|>>>??|\\\\|)=","name":"keyword.operator.assignment.compound.bitwise.ts"},{"match":"<<|>>>?","name":"keyword.operator.bitwise.shift.ts"},{"match":"[!=]==?","name":"keyword.operator.comparison.ts"},{"match":"<=|>=|<>|[<>]","name":"keyword.operator.relational.ts"},{"match":"!|&&|\\\\?\\\\?|\\\\|\\\\|","name":"keyword.operator.logical.ts"},{"match":"[\\\\&^|~]","name":"keyword.operator.bitwise.ts"},{"match":"=","name":"keyword.operator.assignment.ts"},{"match":"--","name":"keyword.operator.decrement.ts"},{"match":"\\\\+\\\\+","name":"keyword.operator.increment.ts"},{"match":"[-%*+/]","name":"keyword.operator.arithmetic.ts"},{"captures":{"1":{"name":"keyword.operator.arithmetic.ts"}},"match":"(?<=[$_[:alnum:]])\\\\s*(/)(?![*/])"},{"include":"#typeofOperator"}]},"functionCall":{"begin":"(?=(\\\\??\\\\.\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\()","end":"(?<=\\\\))(?!(\\\\??\\\\.\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\()","patterns":[{"match":"\\\\?","name":"punctuation.accessor.ts"},{"match":"\\\\.","name":"punctuation.accessor.ts"},{"match":"([$_[:alpha:]][$_[:alnum:]]*)","name":"entity.name.function.ts"},{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.typeparameters.begin.ts"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.typeparameters.end.ts"}},"name":"meta.type.parameters.ts","patterns":[{"include":"#type"},{"include":"#punctuationComma"}]},{"include":"#parenExpression"}]},"functionParameters":{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.parameters.begin.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.ts"}},"name":"meta.parameters.ts","patterns":[{"include":"#decorator"},{"include":"#parameterName"},{"include":"#variableInitializer"},{"match":",","name":"punctuation.separator.parameter.ts"}]},"identifiers":{"patterns":[{"match":"([$_[:alpha:]][$_[:alnum:]]*)(?=\\\\s*\\\\.\\\\s*prototype\\\\b(?!\\\\$))","name":"support.class.ts"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"constant.other.object.property.ts"},"3":{"name":"variable.other.object.property.ts"}},"match":"([!?]?\\\\.)\\\\s*(?:(\\\\p{upper}[$_\\\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\\\s*\\\\.\\\\s*[$_[:alpha:]][$_[:alnum:]]*)"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"entity.name.function.ts"}},"match":"(?:([!?]?\\\\.)\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)(?=\\\\s*=\\\\s*((async\\\\s+)|(function\\\\s*[(<])|(function\\\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\\\s*=>)|((<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)(\\\\s*:\\\\s*(.)*)?\\\\s*=>)))"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"constant.other.property.ts"}},"match":"([!?]?\\\\.)\\\\s*(\\\\p{upper}[$_\\\\d[:upper:]]*)(?![$_[:alnum:]])"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"variable.other.property.ts"}},"match":"([!?]?\\\\.)\\\\s*([$_[:alpha:]][$_[:alnum:]]*)"},{"captures":{"1":{"name":"constant.other.object.ts"},"2":{"name":"variable.other.object.ts"}},"match":"(?:(\\\\p{upper}[$_\\\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\\\s*\\\\.\\\\s*[$_[:alpha:]][$_[:alnum:]]*)"},{"match":"(\\\\p{upper}[$_\\\\d[:upper:]]*)(?![$_[:alnum:]])","name":"constant.character.other"},{"match":"[$_[:alpha:]][$_[:alnum:]]*","name":"variable.other.readwrite.ts"}]},"literal":{"name":"literal.ts","patterns":[{"include":"#numericLiteral"},{"include":"#booleanLiteral"},{"include":"#nullLiteral"},{"include":"#undefinedLiteral"},{"include":"#numericConstantLiteral"},{"include":"#arrayLiteral"},{"include":"#thisLiteral"}]},"ngExpression":{"name":"meta.expression.ng","patterns":[{"include":"#string"},{"include":"#literal"},{"include":"#ternaryExpression"},{"include":"#expressionOperator"},{"include":"#functionCall"},{"include":"#identifiers"},{"include":"#parenExpression"},{"include":"#punctuationComma"},{"include":"#punctuationSemicolon"},{"include":"#punctuationAccessor"}]},"nullLiteral":{"match":"(?<![$.])\\\\bnull\\\\b(?!\\\\$)","name":"constant.language.null.ts"},"numericConstantLiteral":{"patterns":[{"match":"(?<![$.])\\\\bNaN\\\\b(?!\\\\$)","name":"constant.language.nan.ts"},{"match":"(?<![$.])\\\\bInfinity\\\\b(?!\\\\$)","name":"constant.language.infinity.ts"}]},"numericLiteral":{"patterns":[{"match":"\\\\b(?<!\\\\$)0([Xx])\\\\h+\\\\b(?!\\\\$)","name":"constant.numeric.hex.ts"},{"match":"\\\\b(?<!\\\\$)0([Bb])[01]+\\\\b(?!\\\\$)","name":"constant.numeric.binary.ts"},{"match":"\\\\\\\\b(?<!\\\\$)0([Oo])?[0-7]+\\\\b(?!\\\\$)","name":"constant.numeric.octal.ts"},{"captures":{"0":{"name":"constant.numeric.decimal.ts"},"1":{"name":"meta.delimiter.decimal.period.ts"},"2":{"name":"meta.delimiter.decimal.period.ts"},"3":{"name":"meta.delimiter.decimal.period.ts"},"4":{"name":"meta.delimiter.decimal.period.ts"},"5":{"name":"meta.delimiter.decimal.period.ts"},"6":{"name":"meta.delimiter.decimal.period.ts"}},"match":"(?<!\\\\$)(?:\\\\b[0-9]+(\\\\.)[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+(\\\\.)[Ee][-+]?[0-9]+\\\\b|\\\\B(\\\\.)[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+(\\\\.)\\\\B|\\\\B(\\\\.)[0-9]+\\\\b|\\\\b[0-9]+\\\\b(?!\\\\.))(?!\\\\$)"}]},"parameterName":{"patterns":[{"captures":{"1":{"name":"storage.modifier.ts"},"2":{"name":"storage.modifier.ts"},"3":{"name":"keyword.operator.rest.ts"},"4":{"name":"entity.name.function.ts"},"5":{"name":"keyword.operator.optional.ts"}},"match":"(?:\\\\s*\\\\b(readonly)\\\\s+)?(?:\\\\s*\\\\b(p(?:ublic|rivate|rotected))\\\\s+)?(\\\\.\\\\.\\\\.)?\\\\s*(?<![:=])([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(\\\\??)(?=\\\\s*(=\\\\s*((async\\\\s+)|(function\\\\s*[(<])|(function\\\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\\\s*=>)|((<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)(\\\\s*:\\\\s*(.)*)?\\\\s*=>)))|(:\\\\s*((<)|(\\\\(\\\\s*((\\\\))|(\\\\.\\\\.\\\\.)|([$_[:alnum:]]+\\\\s*(([,:=?])|(\\\\)\\\\s*=>))))))))"},{"captures":{"1":{"name":"storage.modifier.ts"},"2":{"name":"storage.modifier.ts"},"3":{"name":"keyword.operator.rest.ts"},"4":{"name":"variable.parameter.ts"},"5":{"name":"keyword.operator.optional.ts"}},"match":"(?:\\\\s*\\\\b(readonly)\\\\s+)?(?:\\\\s*\\\\b(p(?:ublic|rivate|rotected))\\\\s+)?(\\\\.\\\\.\\\\.)?\\\\s*(?<![:=])([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(\\\\??)"}]},"parenExpression":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"patterns":[{"include":"#ngExpression"},{"include":"#punctuationComma"}]},"punctuationAccessor":{"match":"(?:\\\\?|!?)\\\\.","name":"punctuation.accessor.ts"},"punctuationComma":{"match":",","name":"punctuation.separator.comma.ts"},"punctuationSemicolon":{"match":";","name":"punctuation.terminator.statement.ts"},"qstringDouble":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ts"}},"end":"(\\")|([^\\\\n\\\\\\\\])$","endCaptures":{"1":{"name":"punctuation.definition.string.end.ts"},"2":{"name":"invalid.illegal.newline.ts"}},"name":"string.quoted.double.ts","patterns":[{"include":"#stringCharacterEscape"}]},"qstringSingle":{"begin":"\'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ts"}},"end":"(\')|([^\\\\n\\\\\\\\])$","endCaptures":{"1":{"name":"punctuation.definition.string.end.ts"},"2":{"name":"invalid.illegal.newline.ts"}},"name":"string.quoted.single.ts","patterns":[{"include":"#stringCharacterEscape"}]},"string":{"patterns":[{"include":"#qstringSingle"},{"include":"#qstringDouble"},{"include":"#templateLiteral"}]},"stringCharacterEscape":{"match":"\\\\\\\\(x\\\\h{2}|[012][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)","name":"constant.character.escape.ts"},"templateLiteral":{"patterns":[{"include":"#templateLiteralCall"},{"begin":"([$_[:alpha:]][$_[:alnum:]]*)?(`)","beginCaptures":{"1":{"name":"entity.name.function.tagged-template.ts"},"2":{"name":"string.template.ts punctuation.definition.string.template.begin.ts"}},"contentName":"string.template.ts","end":"`","endCaptures":{"0":{"name":"string.template.ts punctuation.definition.string.template.end.ts"}},"patterns":[{"include":"#templateLiteralSubstitutionElement"},{"include":"#stringCharacterEscape"}]}]},"templateLiteralCall":{"patterns":[{"begin":"(?=(([$_[:alpha:]][$_[:alnum:]]*\\\\s*\\\\??\\\\.\\\\s*)*|(\\\\??\\\\.\\\\s*)?)([$_[:alpha:]][$_[:alnum:]]*)(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)?`)","end":"(?=`)","patterns":[{"begin":"(?=(([$_[:alpha:]][$_[:alnum:]]*\\\\s*\\\\??\\\\.\\\\s*)*|(\\\\??\\\\.\\\\s*)?)([$_[:alpha:]][$_[:alnum:]]*))","end":"(?=(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)?`)","patterns":[{"include":"#support-function-call-identifiers"},{"match":"([$_[:alpha:]][$_[:alnum:]]*)","name":"entity.name.function.tagged-template.ts"}]},{"include":"#typeArguments"}]},{"begin":"([$_[:alpha:]][$_[:alnum:]]*)?\\\\s*(?=(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)`)","beginCaptures":{"1":{"name":"entity.name.function.tagged-template.ts"}},"end":"(?=`)","patterns":[{"include":"#typeArguments"}]}]},"templateLiteralSubstitutionElement":{"begin":"\\\\$\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.template-expression.begin.ts"}},"contentName":"meta.embedded.line.ts","end":"}","endCaptures":{"0":{"name":"punctuation.definition.template-expression.end.ts"}},"name":"meta.template.expression.ts","patterns":[{"include":"#ngExpression"}]},"ternaryExpression":{"begin":"(?!\\\\?\\\\.\\\\s*\\\\D)(\\\\?)(?!\\\\?)","beginCaptures":{"1":{"name":"keyword.operator.ternary.ts"}},"end":"\\\\s*(:)","endCaptures":{"1":{"name":"keyword.operator.ternary.ts"}},"patterns":[{"include":"#ngExpression"}]},"thisLiteral":{"match":"(?<![$.])\\\\bthis\\\\b(?!\\\\$)","name":"variable.language.this.ts"},"type":{"name":"meta.type.ts","patterns":[{"include":"#string"},{"include":"#numericLiteral"},{"include":"#typeBuiltinLiterals"},{"include":"#typeTuple"},{"include":"#typeObject"},{"include":"#typeOperators"},{"include":"#typeFnTypeParameters"},{"include":"#typeParenOrFunctionParameters"},{"include":"#typeName"}]},"typeAnnotation":{"begin":":","beginCaptures":{"0":{"name":"keyword.operator.type.annotation.ts"}},"end":"(?=$|[]),;}]|//|\\")|(?==[^>])|(?<=[]$)>_}[:alpha:]])\\\\s*(?=\\\\{)","name":"meta.type.annotation.ts","patterns":[{"include":"#type"}]},"typeArguments":{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.typeparameters.begin.ts"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.typeparameters.end.ts"}},"name":"meta.type.parameters.ts","patterns":[{"include":"#typeArgumentsBody"}]},"typeArgumentsBody":{"patterns":[{"captures":{"0":{"name":"keyword.operator.type.ts"}},"match":"(?<![$_[:alnum:]])(?:(?<=\\\\.\\\\.\\\\.)|(?<!\\\\.))(_)(?![$_[:alnum:]])(?:(?=\\\\.\\\\.\\\\.)|(?!\\\\.))"},{"include":"#type"},{"include":"#punctuationComma"}]},"typeBuiltinLiterals":{"match":"(?<![$.])\\\\b(this|true|false|undefined|null)\\\\b(?!\\\\$)","name":"support.type.builtin.ts"},"typeFnTypeParameters":{"patterns":[{"captures":{"1":{"name":"keyword.control.new.ts"}},"match":"(?<![$.])\\\\b(new)\\\\b(?=\\\\s*<)","name":"meta.type.constructor.ts"},{"begin":"(?<![$.])\\\\b(new)\\\\b\\\\s*(?=\\\\()","beginCaptures":{"1":{"name":"keyword.control.new.ts"}},"end":"(?<=\\\\))","name":"meta.type.constructor.ts","patterns":[{"include":"#functionParameters"}]},{"begin":"(?<=>)\\\\s*(?=\\\\()","end":"(?<=\\\\))","include":"#typeofOperator","name":"meta.type.function.ts","patterns":[{"include":"#functionParameters"}]},{"begin":"((?=\\\\(\\\\s*((\\\\))|(\\\\.\\\\.\\\\.)|([$_[:alnum:]]+\\\\s*(([,:=?])|(\\\\)\\\\s*=>))))))","end":"(?<=\\\\))","name":"meta.type.function.ts","patterns":[{"include":"#functionParameters"}]}]},"typeName":{"patterns":[{"captures":{"1":{"name":"entity.name.type.module.ts"},"2":{"name":"punctuation.accessor.ts"}},"match":"([$_[:alpha:]][$_[:alnum:]]*)\\\\s*([!?]?\\\\.)"},{"match":"[$_[:alpha:]][$_[:alnum:]]*","name":"entity.name.type.ts"}]},"typeObject":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"name":"meta.object.type.ts","patterns":[{"include":"#typeObjectMembers"}]},"typeObjectMembers":{"patterns":[{"include":"#typeAnnotation"},{"include":"#punctuationComma"},{"include":"#punctuationSemicolon"}]},"typeOperators":{"patterns":[{"include":"#typeofOperator"},{"match":"[\\\\&|]","name":"keyword.operator.type.ts"},{"match":"(?<![$.])\\\\bkeyof\\\\b(?!\\\\$)","name":"keyword.operator.expression.keyof.ts"}]},"typeParenOrFunctionParameters":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"name":"meta.type.paren.cover.ts","patterns":[{"include":"#type"},{"include":"#functionParameters"}]},"typeTuple":{"begin":"\\\\[","beginCaptures":{"0":{"name":"meta.brace.square.ts"}},"end":"]","endCaptures":{"0":{"name":"meta.brace.square.ts"}},"name":"meta.type.tuple.ts","patterns":[{"include":"#type"},{"include":"#punctuationComma"}]},"typeofOperator":{"match":"(?<![$.])\\\\btypeof\\\\b(?!\\\\$)","name":"keyword.operator.expression.typeof.ts"},"undefinedLiteral":{"match":"(?<![$.])\\\\bundefined\\\\b(?!\\\\$)","name":"constant.language.undefined.ts"},"variableInitializer":{"begin":"(?<![!=])(=)(?!=)","beginCaptures":{"1":{"name":"keyword.operator.assignment.ts"}},"end":"(?=$|[]),;}])","patterns":[{"include":"#ngExpression"}]}},"scopeName":"expression.ng"}'))],r=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment -expression.ng -meta.tag -source.css -source.js","name":"angular-let-declaration","patterns":[{"include":"#letDeclaration"}],"repository":{"letDeclaration":{"begin":"(@let)\\\\s+([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(=)?","beginCaptures":{"1":{"name":"storage.type.ng"},"2":{"name":"variable.other.constant.ng"},"3":{"name":"keyword.operator.assignment.ng"}},"end":"(?<=;)","name":"meta.definition.variable.ng","patterns":[{"include":"#letInitializer"}]},"letInitializer":{"begin":"\\\\s*","beginCaptures":{"0":{"name":"keyword.operator.assignment.ng"}},"contentName":"meta.definition.variable.initializer.ng","end":";","endCaptures":{"0":{"name":"punctuation.terminator.statement.ng"}},"patterns":[{"include":"expression.ng"}]}},"scopeName":"template.let.ng","embeddedLangs":["angular-expression"]}`)),i=[...n,r],a=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment","name":"angular-template","patterns":[{"include":"#interpolation"}],"repository":{"interpolation":{"begin":"\\\\{\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"contentName":"expression.ng","end":"}}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"patterns":[{"include":"expression.ng"}]}},"scopeName":"template.ng","embeddedLangs":["angular-expression"]}`)),o=[...n,a],s=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment -expression.ng -meta.tag -source.css -source.js","name":"angular-template-blocks","patterns":[{"include":"#block"}],"repository":{"block":{"begin":"(@)(if|else if|else|defer|placeholder|loading|error|switch|case|default|for|empty)\\\\s*","beginCaptures":{"1":{"patterns":[{"include":"#transition"}]},"2":{"name":"keyword.control.block.kind.ng"}},"end":"(?<=})","name":"control.block.ng","patterns":[{"include":"#blockExpression"},{"include":"#blockBody"}]},"blockBody":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"contentName":"control.block.body.ng","end":"}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"patterns":[{"include":"text.html.derivative.ng"},{"include":"template.ng"}]},"blockExpression":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"contentName":"control.block.expression.ng","end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"patterns":[{"include":"#blockExpressionOfClause"},{"include":"#blockExpressionLetBinding"},{"include":"#blockExpressionTrackClause"},{"include":"expression.ng"}]},"blockExpressionLetBinding":{"begin":"\\\\blet\\\\b","beginCaptures":{"0":{"name":"storage.type.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"blockExpressionOfClause":{"begin":"([$_[:alpha:]][$_[:alnum:]]*)\\\\s+(of)\\\\b","beginCaptures":{"1":{"name":"variable.other.constant.ng"},"2":{"name":"keyword.operator.expression.of.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"blockExpressionTrackClause":{"begin":"\\\\btrack\\\\b","beginCaptures":{"0":{"name":"keyword.control.track.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"transition":{"match":"@","name":"keyword.control.block.transition.ng"}},"scopeName":"template.blocks.ng","embeddedLangs":["angular-expression","angular-template"]}`)),c=[...n,...o,s],l=e({default:()=>d}),u=Object.freeze(JSON.parse(`{"displayName":"Angular HTML","injections":{"R:text.html - (comment.block, text.html meta.embedded, meta.tag.*.*.html, meta.tag.*.*.*.html, meta.tag.*.*.*.*.html)":{"patterns":[{"match":"<","name":"invalid.illegal.bad-angle-bracket.html"}]}},"name":"angular-html","patterns":[{"include":"text.html.basic#core-minus-invalid"},{"begin":"(</?)(\\\\w[^>\\\\s]*)(?<!/)","beginCaptures":{"1":{"name":"punctuation.definition.tag.begin.html"},"2":{"name":"entity.name.tag.html"}},"end":"((?: ?/)?>)","endCaptures":{"1":{"name":"punctuation.definition.tag.end.html"}},"name":"meta.tag.other.unrecognized.html.derivative","patterns":[{"include":"text.html.basic#attribute"}]}],"scopeName":"text.html.derivative.ng","embeddedLangs":["html","angular-expression","angular-let-declaration","angular-template","angular-template-blocks"]}`)),d=[...t,...n,...i,...o,...c,u];export{i as a,o as i,l as n,n as o,c as r,d as t};
|
|
1
|
+
import{t as e}from"./index-B8qqkmWn.js";import{t}from"./html-oCOc0XdA.js";var n=[Object.freeze(JSON.parse('{"injectionSelector":"L:text.html -comment","name":"angular-expression","patterns":[{"include":"#ngExpression"}],"repository":{"arrayLiteral":{"begin":"\\\\[","beginCaptures":{"0":{"name":"meta.brace.square.ts"}},"end":"]","endCaptures":{"0":{"name":"meta.brace.square.ts"}},"name":"meta.array.literal.ts","patterns":[{"include":"#ngExpression"},{"include":"#punctuationComma"}]},"booleanLiteral":{"patterns":[{"match":"(?<![$.])\\\\btrue\\\\b(?!\\\\$)","name":"constant.language.boolean.true.ts"},{"match":"(?<![$.])\\\\bfalse\\\\b(?!\\\\$)","name":"constant.language.boolean.false.ts"}]},"expressionOperator":{"patterns":[{"captures":{"1":{"name":"keyword.operator.logical.ts"},"2":{"name":"entity.name.function.pipe.ng"}},"match":"((?<!\\\\|)\\\\|(?!\\\\|))\\\\s?([-$0-9A-Z_a-z]*)"},{"match":"(?<![$.])\\\\b(let)\\\\b(?!\\\\$)","name":"storage.type.ts"},{"match":"(?<![$.])\\\\b(await)\\\\b(?!\\\\$)","name":"keyword.control.flow.ts"},{"match":"(?<![$.])\\\\bdelete\\\\b(?!\\\\$)","name":"keyword.operator.expression.delete.ts"},{"match":"(?<![$.])\\\\bin\\\\b(?!\\\\$)","name":"keyword.operator.expression.in.ts"},{"match":"(?<![$.])\\\\bof\\\\b(?!\\\\$)","name":"keyword.operator.expression.of.ts"},{"match":"(?<![$.])\\\\bif\\\\b(?!\\\\$)","name":"keyword.control.if.ts"},{"match":"(?<![$.])\\\\belse\\\\b(?!\\\\$)","name":"keyword.control.else.ts"},{"match":"(?<![$.])\\\\bthen\\\\b(?!\\\\$)","name":"keyword.control.then.ts"},{"match":"(?<![$.])\\\\binstanceof\\\\b(?!\\\\$)","name":"keyword.operator.expression.instanceof.ts"},{"match":"(?<![$.])\\\\bnew\\\\b(?!\\\\$)","name":"keyword.operator.new.ts"},{"match":"(?<![$.])\\\\bvoid\\\\b(?!\\\\$)","name":"keyword.operator.expression.void.ts"},{"begin":"(?<![$.])\\\\bas\\\\b(?!\\\\$)","beginCaptures":{"0":{"name":"storage.type.as.ts"}},"end":"(?=$|[]\\"\'),:;}])","patterns":[{"include":"#type"}]},{"match":"(?:\\\\*|(?<!\\\\()/|[-%+])=","name":"keyword.operator.assignment.compound.ts"},{"match":"(?:[\\\\&^]|<<|>>>??|\\\\|)=","name":"keyword.operator.assignment.compound.bitwise.ts"},{"match":"<<|>>>?","name":"keyword.operator.bitwise.shift.ts"},{"match":"[!=]==?","name":"keyword.operator.comparison.ts"},{"match":"<=|>=|<>|[<>]","name":"keyword.operator.relational.ts"},{"match":"!|&&|\\\\?\\\\?|\\\\|\\\\|","name":"keyword.operator.logical.ts"},{"match":"[\\\\&^|~]","name":"keyword.operator.bitwise.ts"},{"match":"=","name":"keyword.operator.assignment.ts"},{"match":"--","name":"keyword.operator.decrement.ts"},{"match":"\\\\+\\\\+","name":"keyword.operator.increment.ts"},{"match":"[-%*+/]","name":"keyword.operator.arithmetic.ts"},{"captures":{"1":{"name":"keyword.operator.arithmetic.ts"}},"match":"(?<=[$_[:alnum:]])\\\\s*(/)(?![*/])"},{"include":"#typeofOperator"}]},"functionCall":{"begin":"(?=(\\\\??\\\\.\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\()","end":"(?<=\\\\))(?!(\\\\??\\\\.\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\()","patterns":[{"match":"\\\\?","name":"punctuation.accessor.ts"},{"match":"\\\\.","name":"punctuation.accessor.ts"},{"match":"([$_[:alpha:]][$_[:alnum:]]*)","name":"entity.name.function.ts"},{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.typeparameters.begin.ts"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.typeparameters.end.ts"}},"name":"meta.type.parameters.ts","patterns":[{"include":"#type"},{"include":"#punctuationComma"}]},{"include":"#parenExpression"}]},"functionParameters":{"begin":"\\\\(","beginCaptures":{"0":{"name":"punctuation.definition.parameters.begin.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"punctuation.definition.parameters.end.ts"}},"name":"meta.parameters.ts","patterns":[{"include":"#decorator"},{"include":"#parameterName"},{"include":"#variableInitializer"},{"match":",","name":"punctuation.separator.parameter.ts"}]},"identifiers":{"patterns":[{"match":"([$_[:alpha:]][$_[:alnum:]]*)(?=\\\\s*\\\\.\\\\s*prototype\\\\b(?!\\\\$))","name":"support.class.ts"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"constant.other.object.property.ts"},"3":{"name":"variable.other.object.property.ts"}},"match":"([!?]?\\\\.)\\\\s*(?:(\\\\p{upper}[$_\\\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\\\s*\\\\.\\\\s*[$_[:alpha:]][$_[:alnum:]]*)"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"entity.name.function.ts"}},"match":"(?:([!?]?\\\\.)\\\\s*)?([$_[:alpha:]][$_[:alnum:]]*)(?=\\\\s*=\\\\s*((async\\\\s+)|(function\\\\s*[(<])|(function\\\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\\\s*=>)|((<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)(\\\\s*:\\\\s*(.)*)?\\\\s*=>)))"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"constant.other.property.ts"}},"match":"([!?]?\\\\.)\\\\s*(\\\\p{upper}[$_\\\\d[:upper:]]*)(?![$_[:alnum:]])"},{"captures":{"1":{"name":"punctuation.accessor.ts"},"2":{"name":"variable.other.property.ts"}},"match":"([!?]?\\\\.)\\\\s*([$_[:alpha:]][$_[:alnum:]]*)"},{"captures":{"1":{"name":"constant.other.object.ts"},"2":{"name":"variable.other.object.ts"}},"match":"(?:(\\\\p{upper}[$_\\\\d[:upper:]]*)|([$_[:alpha:]][$_[:alnum:]]*))(?=\\\\s*\\\\.\\\\s*[$_[:alpha:]][$_[:alnum:]]*)"},{"match":"(\\\\p{upper}[$_\\\\d[:upper:]]*)(?![$_[:alnum:]])","name":"constant.character.other"},{"match":"[$_[:alpha:]][$_[:alnum:]]*","name":"variable.other.readwrite.ts"}]},"literal":{"name":"literal.ts","patterns":[{"include":"#numericLiteral"},{"include":"#booleanLiteral"},{"include":"#nullLiteral"},{"include":"#undefinedLiteral"},{"include":"#numericConstantLiteral"},{"include":"#arrayLiteral"},{"include":"#thisLiteral"}]},"ngExpression":{"name":"meta.expression.ng","patterns":[{"include":"#string"},{"include":"#literal"},{"include":"#ternaryExpression"},{"include":"#expressionOperator"},{"include":"#functionCall"},{"include":"#identifiers"},{"include":"#parenExpression"},{"include":"#punctuationComma"},{"include":"#punctuationSemicolon"},{"include":"#punctuationAccessor"}]},"nullLiteral":{"match":"(?<![$.])\\\\bnull\\\\b(?!\\\\$)","name":"constant.language.null.ts"},"numericConstantLiteral":{"patterns":[{"match":"(?<![$.])\\\\bNaN\\\\b(?!\\\\$)","name":"constant.language.nan.ts"},{"match":"(?<![$.])\\\\bInfinity\\\\b(?!\\\\$)","name":"constant.language.infinity.ts"}]},"numericLiteral":{"patterns":[{"match":"\\\\b(?<!\\\\$)0([Xx])\\\\h+\\\\b(?!\\\\$)","name":"constant.numeric.hex.ts"},{"match":"\\\\b(?<!\\\\$)0([Bb])[01]+\\\\b(?!\\\\$)","name":"constant.numeric.binary.ts"},{"match":"\\\\\\\\b(?<!\\\\$)0([Oo])?[0-7]+\\\\b(?!\\\\$)","name":"constant.numeric.octal.ts"},{"captures":{"0":{"name":"constant.numeric.decimal.ts"},"1":{"name":"meta.delimiter.decimal.period.ts"},"2":{"name":"meta.delimiter.decimal.period.ts"},"3":{"name":"meta.delimiter.decimal.period.ts"},"4":{"name":"meta.delimiter.decimal.period.ts"},"5":{"name":"meta.delimiter.decimal.period.ts"},"6":{"name":"meta.delimiter.decimal.period.ts"}},"match":"(?<!\\\\$)(?:\\\\b[0-9]+(\\\\.)[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+(\\\\.)[Ee][-+]?[0-9]+\\\\b|\\\\B(\\\\.)[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+[Ee][-+]?[0-9]+\\\\b|\\\\b[0-9]+(\\\\.)\\\\B|\\\\B(\\\\.)[0-9]+\\\\b|\\\\b[0-9]+\\\\b(?!\\\\.))(?!\\\\$)"}]},"parameterName":{"patterns":[{"captures":{"1":{"name":"storage.modifier.ts"},"2":{"name":"storage.modifier.ts"},"3":{"name":"keyword.operator.rest.ts"},"4":{"name":"entity.name.function.ts"},"5":{"name":"keyword.operator.optional.ts"}},"match":"(?:\\\\s*\\\\b(readonly)\\\\s+)?(?:\\\\s*\\\\b(p(?:ublic|rivate|rotected))\\\\s+)?(\\\\.\\\\.\\\\.)?\\\\s*(?<![:=])([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(\\\\??)(?=\\\\s*(=\\\\s*((async\\\\s+)|(function\\\\s*[(<])|(function\\\\s+)|([$_[:alpha:]][$_[:alnum:]]*\\\\s*=>)|((<([^<>]|<[^<>]+>)+>\\\\s*)?\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)(\\\\s*:\\\\s*(.)*)?\\\\s*=>)))|(:\\\\s*((<)|(\\\\(\\\\s*((\\\\))|(\\\\.\\\\.\\\\.)|([$_[:alnum:]]+\\\\s*(([,:=?])|(\\\\)\\\\s*=>))))))))"},{"captures":{"1":{"name":"storage.modifier.ts"},"2":{"name":"storage.modifier.ts"},"3":{"name":"keyword.operator.rest.ts"},"4":{"name":"variable.parameter.ts"},"5":{"name":"keyword.operator.optional.ts"}},"match":"(?:\\\\s*\\\\b(readonly)\\\\s+)?(?:\\\\s*\\\\b(p(?:ublic|rivate|rotected))\\\\s+)?(\\\\.\\\\.\\\\.)?\\\\s*(?<![:=])([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(\\\\??)"}]},"parenExpression":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"patterns":[{"include":"#ngExpression"},{"include":"#punctuationComma"}]},"punctuationAccessor":{"match":"(?:\\\\?|!?)\\\\.","name":"punctuation.accessor.ts"},"punctuationComma":{"match":",","name":"punctuation.separator.comma.ts"},"punctuationSemicolon":{"match":";","name":"punctuation.terminator.statement.ts"},"qstringDouble":{"begin":"\\"","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ts"}},"end":"(\\")|([^\\\\n\\\\\\\\])$","endCaptures":{"1":{"name":"punctuation.definition.string.end.ts"},"2":{"name":"invalid.illegal.newline.ts"}},"name":"string.quoted.double.ts","patterns":[{"include":"#stringCharacterEscape"}]},"qstringSingle":{"begin":"\'","beginCaptures":{"0":{"name":"punctuation.definition.string.begin.ts"}},"end":"(\')|([^\\\\n\\\\\\\\])$","endCaptures":{"1":{"name":"punctuation.definition.string.end.ts"},"2":{"name":"invalid.illegal.newline.ts"}},"name":"string.quoted.single.ts","patterns":[{"include":"#stringCharacterEscape"}]},"string":{"patterns":[{"include":"#qstringSingle"},{"include":"#qstringDouble"},{"include":"#templateLiteral"}]},"stringCharacterEscape":{"match":"\\\\\\\\(x\\\\h{2}|[012][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)","name":"constant.character.escape.ts"},"templateLiteral":{"patterns":[{"include":"#templateLiteralCall"},{"begin":"([$_[:alpha:]][$_[:alnum:]]*)?(`)","beginCaptures":{"1":{"name":"entity.name.function.tagged-template.ts"},"2":{"name":"string.template.ts punctuation.definition.string.template.begin.ts"}},"contentName":"string.template.ts","end":"`","endCaptures":{"0":{"name":"string.template.ts punctuation.definition.string.template.end.ts"}},"patterns":[{"include":"#templateLiteralSubstitutionElement"},{"include":"#stringCharacterEscape"}]}]},"templateLiteralCall":{"patterns":[{"begin":"(?=(([$_[:alpha:]][$_[:alnum:]]*\\\\s*\\\\??\\\\.\\\\s*)*|(\\\\??\\\\.\\\\s*)?)([$_[:alpha:]][$_[:alnum:]]*)(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)?`)","end":"(?=`)","patterns":[{"begin":"(?=(([$_[:alpha:]][$_[:alnum:]]*\\\\s*\\\\??\\\\.\\\\s*)*|(\\\\??\\\\.\\\\s*)?)([$_[:alpha:]][$_[:alnum:]]*))","end":"(?=(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)?`)","patterns":[{"include":"#support-function-call-identifiers"},{"match":"([$_[:alpha:]][$_[:alnum:]]*)","name":"entity.name.function.tagged-template.ts"}]},{"include":"#typeArguments"}]},{"begin":"([$_[:alpha:]][$_[:alnum:]]*)?\\\\s*(?=(<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))(([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>|<\\\\s*(((keyof|infer|typeof|readonly)\\\\s+)|(([$_[:alpha:]][$_[:alnum:]]*|(\\\\{([^{}]|(\\\\{([^{}]|\\\\{[^{}]*})*}))*})|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(\\\\[([^]\\\\[]|(\\\\[([^]\\\\[]|\\\\[[^]\\\\[]*])*]))*])|(\'([^\'\\\\\\\\]|\\\\\\\\.)*\')|(\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\")|(`([^\\\\\\\\`]|\\\\\\\\.)*`))(?=\\\\s*([,.<>\\\\[]|=>|&(?!&)|\\\\|(?!\\\\|)))))([^(<>]|(\\\\(([^()]|(\\\\(([^()]|\\\\([^()]*\\\\))*\\\\)))*\\\\))|(?<==)>)*(?<!=)>))*(?<!=)>)*(?<!=)>\\\\s*)`)","beginCaptures":{"1":{"name":"entity.name.function.tagged-template.ts"}},"end":"(?=`)","patterns":[{"include":"#typeArguments"}]}]},"templateLiteralSubstitutionElement":{"begin":"\\\\$\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.template-expression.begin.ts"}},"contentName":"meta.embedded.line.ts","end":"}","endCaptures":{"0":{"name":"punctuation.definition.template-expression.end.ts"}},"name":"meta.template.expression.ts","patterns":[{"include":"#ngExpression"}]},"ternaryExpression":{"begin":"(?!\\\\?\\\\.\\\\s*\\\\D)(\\\\?)(?!\\\\?)","beginCaptures":{"1":{"name":"keyword.operator.ternary.ts"}},"end":"\\\\s*(:)","endCaptures":{"1":{"name":"keyword.operator.ternary.ts"}},"patterns":[{"include":"#ngExpression"}]},"thisLiteral":{"match":"(?<![$.])\\\\bthis\\\\b(?!\\\\$)","name":"variable.language.this.ts"},"type":{"name":"meta.type.ts","patterns":[{"include":"#string"},{"include":"#numericLiteral"},{"include":"#typeBuiltinLiterals"},{"include":"#typeTuple"},{"include":"#typeObject"},{"include":"#typeOperators"},{"include":"#typeFnTypeParameters"},{"include":"#typeParenOrFunctionParameters"},{"include":"#typeName"}]},"typeAnnotation":{"begin":":","beginCaptures":{"0":{"name":"keyword.operator.type.annotation.ts"}},"end":"(?=$|[]),;}]|//|\\")|(?==[^>])|(?<=[]$)>_}[:alpha:]])\\\\s*(?=\\\\{)","name":"meta.type.annotation.ts","patterns":[{"include":"#type"}]},"typeArguments":{"begin":"<","beginCaptures":{"0":{"name":"punctuation.definition.typeparameters.begin.ts"}},"end":">","endCaptures":{"0":{"name":"punctuation.definition.typeparameters.end.ts"}},"name":"meta.type.parameters.ts","patterns":[{"include":"#typeArgumentsBody"}]},"typeArgumentsBody":{"patterns":[{"captures":{"0":{"name":"keyword.operator.type.ts"}},"match":"(?<![$_[:alnum:]])(?:(?<=\\\\.\\\\.\\\\.)|(?<!\\\\.))(_)(?![$_[:alnum:]])(?:(?=\\\\.\\\\.\\\\.)|(?!\\\\.))"},{"include":"#type"},{"include":"#punctuationComma"}]},"typeBuiltinLiterals":{"match":"(?<![$.])\\\\b(this|true|false|undefined|null)\\\\b(?!\\\\$)","name":"support.type.builtin.ts"},"typeFnTypeParameters":{"patterns":[{"captures":{"1":{"name":"keyword.control.new.ts"}},"match":"(?<![$.])\\\\b(new)\\\\b(?=\\\\s*<)","name":"meta.type.constructor.ts"},{"begin":"(?<![$.])\\\\b(new)\\\\b\\\\s*(?=\\\\()","beginCaptures":{"1":{"name":"keyword.control.new.ts"}},"end":"(?<=\\\\))","name":"meta.type.constructor.ts","patterns":[{"include":"#functionParameters"}]},{"begin":"(?<=>)\\\\s*(?=\\\\()","end":"(?<=\\\\))","include":"#typeofOperator","name":"meta.type.function.ts","patterns":[{"include":"#functionParameters"}]},{"begin":"((?=\\\\(\\\\s*((\\\\))|(\\\\.\\\\.\\\\.)|([$_[:alnum:]]+\\\\s*(([,:=?])|(\\\\)\\\\s*=>))))))","end":"(?<=\\\\))","name":"meta.type.function.ts","patterns":[{"include":"#functionParameters"}]}]},"typeName":{"patterns":[{"captures":{"1":{"name":"entity.name.type.module.ts"},"2":{"name":"punctuation.accessor.ts"}},"match":"([$_[:alpha:]][$_[:alnum:]]*)\\\\s*([!?]?\\\\.)"},{"match":"[$_[:alpha:]][$_[:alnum:]]*","name":"entity.name.type.ts"}]},"typeObject":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"end":"}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"name":"meta.object.type.ts","patterns":[{"include":"#typeObjectMembers"}]},"typeObjectMembers":{"patterns":[{"include":"#typeAnnotation"},{"include":"#punctuationComma"},{"include":"#punctuationSemicolon"}]},"typeOperators":{"patterns":[{"include":"#typeofOperator"},{"match":"[\\\\&|]","name":"keyword.operator.type.ts"},{"match":"(?<![$.])\\\\bkeyof\\\\b(?!\\\\$)","name":"keyword.operator.expression.keyof.ts"}]},"typeParenOrFunctionParameters":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"name":"meta.type.paren.cover.ts","patterns":[{"include":"#type"},{"include":"#functionParameters"}]},"typeTuple":{"begin":"\\\\[","beginCaptures":{"0":{"name":"meta.brace.square.ts"}},"end":"]","endCaptures":{"0":{"name":"meta.brace.square.ts"}},"name":"meta.type.tuple.ts","patterns":[{"include":"#type"},{"include":"#punctuationComma"}]},"typeofOperator":{"match":"(?<![$.])\\\\btypeof\\\\b(?!\\\\$)","name":"keyword.operator.expression.typeof.ts"},"undefinedLiteral":{"match":"(?<![$.])\\\\bundefined\\\\b(?!\\\\$)","name":"constant.language.undefined.ts"},"variableInitializer":{"begin":"(?<![!=])(=)(?!=)","beginCaptures":{"1":{"name":"keyword.operator.assignment.ts"}},"end":"(?=$|[]),;}])","patterns":[{"include":"#ngExpression"}]}},"scopeName":"expression.ng"}'))],r=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment -expression.ng -meta.tag -source.css -source.js","name":"angular-let-declaration","patterns":[{"include":"#letDeclaration"}],"repository":{"letDeclaration":{"begin":"(@let)\\\\s+([$_[:alpha:]][$_[:alnum:]]*)\\\\s*(=)?","beginCaptures":{"1":{"name":"storage.type.ng"},"2":{"name":"variable.other.constant.ng"},"3":{"name":"keyword.operator.assignment.ng"}},"end":"(?<=;)","name":"meta.definition.variable.ng","patterns":[{"include":"#letInitializer"}]},"letInitializer":{"begin":"\\\\s*","beginCaptures":{"0":{"name":"keyword.operator.assignment.ng"}},"contentName":"meta.definition.variable.initializer.ng","end":";","endCaptures":{"0":{"name":"punctuation.terminator.statement.ng"}},"patterns":[{"include":"expression.ng"}]}},"scopeName":"template.let.ng","embeddedLangs":["angular-expression"]}`)),i=[...n,r],a=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment","name":"angular-template","patterns":[{"include":"#interpolation"}],"repository":{"interpolation":{"begin":"\\\\{\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"contentName":"expression.ng","end":"}}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"patterns":[{"include":"expression.ng"}]}},"scopeName":"template.ng","embeddedLangs":["angular-expression"]}`)),o=[...n,a],s=Object.freeze(JSON.parse(`{"injectTo":["text.html.derivative","text.html.derivative.ng","source.ts.ng"],"injectionSelector":"L:text.html -comment -expression.ng -meta.tag -source.css -source.js","name":"angular-template-blocks","patterns":[{"include":"#block"}],"repository":{"block":{"begin":"(@)(if|else if|else|defer|placeholder|loading|error|switch|case|default|for|empty)\\\\s*","beginCaptures":{"1":{"patterns":[{"include":"#transition"}]},"2":{"name":"keyword.control.block.kind.ng"}},"end":"(?<=})","name":"control.block.ng","patterns":[{"include":"#blockExpression"},{"include":"#blockBody"}]},"blockBody":{"begin":"\\\\{","beginCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"contentName":"control.block.body.ng","end":"}","endCaptures":{"0":{"name":"punctuation.definition.block.ts"}},"patterns":[{"include":"text.html.derivative.ng"},{"include":"template.ng"}]},"blockExpression":{"begin":"\\\\(","beginCaptures":{"0":{"name":"meta.brace.round.ts"}},"contentName":"control.block.expression.ng","end":"\\\\)","endCaptures":{"0":{"name":"meta.brace.round.ts"}},"patterns":[{"include":"#blockExpressionOfClause"},{"include":"#blockExpressionLetBinding"},{"include":"#blockExpressionTrackClause"},{"include":"expression.ng"}]},"blockExpressionLetBinding":{"begin":"\\\\blet\\\\b","beginCaptures":{"0":{"name":"storage.type.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"blockExpressionOfClause":{"begin":"([$_[:alpha:]][$_[:alnum:]]*)\\\\s+(of)\\\\b","beginCaptures":{"1":{"name":"variable.other.constant.ng"},"2":{"name":"keyword.operator.expression.of.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"blockExpressionTrackClause":{"begin":"\\\\btrack\\\\b","beginCaptures":{"0":{"name":"keyword.control.track.ng"}},"end":"(?=[$)])|(?<=;)","patterns":[{"include":"expression.ng"}]},"transition":{"match":"@","name":"keyword.control.block.transition.ng"}},"scopeName":"template.blocks.ng","embeddedLangs":["angular-expression","angular-template"]}`)),c=[...n,...o,s],l=e({default:()=>d}),u=Object.freeze(JSON.parse(`{"displayName":"Angular HTML","injections":{"R:text.html - (comment.block, text.html meta.embedded, meta.tag.*.*.html, meta.tag.*.*.*.html, meta.tag.*.*.*.*.html)":{"patterns":[{"match":"<","name":"invalid.illegal.bad-angle-bracket.html"}]}},"name":"angular-html","patterns":[{"include":"text.html.basic#core-minus-invalid"},{"begin":"(</?)(\\\\w[^>\\\\s]*)(?<!/)","beginCaptures":{"1":{"name":"punctuation.definition.tag.begin.html"},"2":{"name":"entity.name.tag.html"}},"end":"((?: ?/)?>)","endCaptures":{"1":{"name":"punctuation.definition.tag.end.html"}},"name":"meta.tag.other.unrecognized.html.derivative","patterns":[{"include":"text.html.basic#attribute"}]}],"scopeName":"text.html.derivative.ng","embeddedLangs":["html","angular-expression","angular-let-declaration","angular-template","angular-template-blocks"]}`)),d=[...t,...n,...i,...o,...c,u];export{i as a,o as i,l as n,n as o,c as r,d as t};
|