@tailor-platform/sdk 1.39.0 → 1.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +7 -10
  3. package/dist/{env-CgI46oPS.d.mts → actor-B2oEmlTc.d.mts} +9 -9
  4. package/dist/application-CEeKm4R-.mjs +4 -0
  5. package/dist/{application-DhQrXEld.mjs → application-C_LFXkKJ.mjs} +148 -148
  6. package/dist/application-C_LFXkKJ.mjs.map +1 -0
  7. package/dist/{brand-D-d15jx3.mjs → brand-Ll48SMXe.mjs} +1 -1
  8. package/dist/{brand-D-d15jx3.mjs.map → brand-Ll48SMXe.mjs.map} +1 -1
  9. package/dist/cli/index.mjs +163 -42
  10. package/dist/cli/index.mjs.map +1 -1
  11. package/dist/cli/lib.d.mts +43 -9
  12. package/dist/cli/lib.mjs +4 -4
  13. package/dist/cli/skills.mjs +13 -43
  14. package/dist/cli/skills.mjs.map +1 -1
  15. package/dist/{client-xzPXtc_e.mjs → client-DjGFRjH4.mjs} +105 -47
  16. package/dist/client-DjGFRjH4.mjs.map +1 -0
  17. package/dist/client-Dtf48x0o.mjs +4 -0
  18. package/dist/configure/index.d.mts +4 -4
  19. package/dist/configure/index.mjs +55 -4
  20. package/dist/configure/index.mjs.map +1 -1
  21. package/dist/{crash-report-BEAiCSCl.mjs → crash-report-CEIXtw4D.mjs} +1 -1
  22. package/dist/{crash-report-DXhPL8Ue.mjs → crash-report-CSWITsTz.mjs} +4 -4
  23. package/dist/{crash-report-DXhPL8Ue.mjs.map → crash-report-CSWITsTz.mjs.map} +1 -1
  24. package/dist/{errors-D9f2UJpT.mjs → errors-ChWX5ZG8.mjs} +1 -1
  25. package/dist/{errors-D9f2UJpT.mjs.map → errors-ChWX5ZG8.mjs.map} +1 -1
  26. package/dist/field-BY2vbJ8f.mjs +23 -0
  27. package/dist/field-BY2vbJ8f.mjs.map +1 -0
  28. package/dist/{index-DbzopC7M.d.mts → index-BtXZdz-F.d.mts} +2 -2
  29. package/dist/{index-y5790SX_.d.mts → index-Chvw1Eod.d.mts} +2 -2
  30. package/dist/{index-B2tsEXdh.d.mts → index-CiNNNpuH.d.mts} +2 -2
  31. package/dist/{index-31hm0Fq7.d.mts → index-D_ezppY7.d.mts} +133 -30
  32. package/dist/{index-DeBFa7oc.d.mts → index-reFAYSX7.d.mts} +2 -2
  33. package/dist/{interceptor-CzaH2Ur6.mjs → interceptor-4UC-KTno.mjs} +1 -1
  34. package/dist/{interceptor-CzaH2Ur6.mjs.map → interceptor-4UC-KTno.mjs.map} +1 -1
  35. package/dist/{job-DkAklmE4.mjs → job-p6zf8Qpg.mjs} +2 -2
  36. package/dist/job-p6zf8Qpg.mjs.map +1 -0
  37. package/dist/{logger-5_JMzHmw.mjs → logger-DTNAMYGy.mjs} +1 -1
  38. package/dist/{logger-5_JMzHmw.mjs.map → logger-DTNAMYGy.mjs.map} +1 -1
  39. package/dist/package-json-CPR7s5hf.mjs +4 -0
  40. package/dist/{package-json-BHViVisJ.mjs → package-json-CWp8s9dE.mjs} +1 -1
  41. package/dist/{package-json-BHViVisJ.mjs.map → package-json-CWp8s9dE.mjs.map} +1 -1
  42. package/dist/plugin/builtin/enum-constants/index.d.mts +1 -1
  43. package/dist/plugin/builtin/file-utils/index.d.mts +1 -1
  44. package/dist/plugin/builtin/kysely-type/index.d.mts +1 -1
  45. package/dist/plugin/builtin/seed/index.d.mts +1 -1
  46. package/dist/plugin/builtin/seed/index.mjs +1 -1
  47. package/dist/plugin/index.d.mts +2 -2
  48. package/dist/repl-editor-DjycioU-.mjs +255 -0
  49. package/dist/repl-editor-DjycioU-.mjs.map +1 -0
  50. package/dist/{runtime-DtSOnOHh.mjs → runtime-im7Sq4jO.mjs} +313 -182
  51. package/dist/runtime-im7Sq4jO.mjs.map +1 -0
  52. package/dist/{schema-CnwUqPyM.mjs → schema-CEcfEyPN.mjs} +4 -44
  53. package/dist/schema-CEcfEyPN.mjs.map +1 -0
  54. package/dist/{seed-DrbB1VXd.mjs → seed-CyYPhvNL.mjs} +12 -12
  55. package/dist/seed-CyYPhvNL.mjs.map +1 -0
  56. package/dist/{service-Bcp6JB3w.mjs → service-SrG26B9T.mjs} +3 -3
  57. package/dist/{service-Bcp6JB3w.mjs.map → service-SrG26B9T.mjs.map} +1 -1
  58. package/dist/{plugin-_K3ZfP8B.d.mts → tailor-db-field-CoFKRCYW.d.mts} +695 -1187
  59. package/dist/{telemetry-DwHuiNiR.mjs → telemetry-BuDto_2q.mjs} +2 -2
  60. package/dist/{telemetry-DwHuiNiR.mjs.map → telemetry-BuDto_2q.mjs.map} +1 -1
  61. package/dist/telemetry-C1hzFaiV.mjs +4 -0
  62. package/dist/types-BnphjkIJ.mjs +5 -0
  63. package/dist/{types-B9ZMosul.mjs → types-Duhhsx3R.mjs} +3 -32
  64. package/dist/types-Duhhsx3R.mjs.map +1 -0
  65. package/dist/utils/test/index.d.mts +2 -2
  66. package/dist/utils/test/index.mjs +1 -1
  67. package/dist/workflow.generated-Btz6srLR.d.mts +1207 -0
  68. package/docs/cli/application.md +21 -5
  69. package/docs/cli/auth.md +20 -14
  70. package/docs/cli/executor.md +17 -14
  71. package/docs/cli/function.md +6 -4
  72. package/docs/cli/query.md +45 -0
  73. package/docs/cli/secret.md +13 -9
  74. package/docs/cli/skills.md +75 -0
  75. package/docs/cli/staticwebsite.md +6 -4
  76. package/docs/cli/user.md +9 -1
  77. package/docs/cli/workflow.md +17 -13
  78. package/docs/cli-reference.md +16 -0
  79. package/docs/services/idp.md +4 -4
  80. package/docs/services/workflow.md +1 -1
  81. package/package.json +12 -9
  82. package/dist/application-C1ipG5Q6.mjs +0 -4
  83. package/dist/application-DhQrXEld.mjs.map +0 -1
  84. package/dist/client-BWAbbA1C.mjs +0 -4
  85. package/dist/client-xzPXtc_e.mjs.map +0 -1
  86. package/dist/job-DkAklmE4.mjs.map +0 -1
  87. package/dist/package-json--6dmp6-h.mjs +0 -4
  88. package/dist/runtime-DtSOnOHh.mjs.map +0 -1
  89. package/dist/schema-CnwUqPyM.mjs.map +0 -1
  90. package/dist/seed-DrbB1VXd.mjs.map +0 -1
  91. package/dist/telemetry-4IOPW6wE.mjs +0 -4
  92. package/dist/types-B9ZMosul.mjs.map +0 -1
  93. package/dist/types-C45jRrCM.mjs +0 -4
  94. package/dist/workflow.generated-BxbnuzAE.d.mts +0 -414
@@ -1,3 +1,3 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { n as fileUtilsPlugin, t as FileUtilsGeneratorID } from "../../../index-DbzopC7M.mjs";
2
+ import { n as fileUtilsPlugin, t as FileUtilsGeneratorID } from "../../../index-BtXZdz-F.mjs";
3
3
  export { FileUtilsGeneratorID, fileUtilsPlugin };
@@ -1,3 +1,3 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { n as kyselyTypePlugin, t as KyselyGeneratorID } from "../../../index-y5790SX_.mjs";
2
+ import { n as kyselyTypePlugin, t as KyselyGeneratorID } from "../../../index-Chvw1Eod.mjs";
3
3
  export { KyselyGeneratorID, kyselyTypePlugin };
@@ -1,3 +1,3 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { n as seedPlugin, t as SeedGeneratorID } from "../../../index-B2tsEXdh.mjs";
2
+ import { n as seedPlugin, t as SeedGeneratorID } from "../../../index-CiNNNpuH.mjs";
3
3
  export { SeedGeneratorID, seedPlugin };
@@ -1,4 +1,4 @@
1
1
 
2
- import { n as seedPlugin, t as SeedGeneratorID } from "../../../seed-DrbB1VXd.mjs";
2
+ import { n as seedPlugin, t as SeedGeneratorID } from "../../../seed-CyYPhvNL.mjs";
3
3
 
4
4
  export { SeedGeneratorID, seedPlugin };
@@ -1,6 +1,6 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { B as TailorAnyDBType } from "../plugin-_K3ZfP8B.mjs";
3
- import { n as TailorEnv, r as TailorActor } from "../env-CgI46oPS.mjs";
2
+ import { n as TailorAnyDBType } from "../tailor-db-field-CoFKRCYW.mjs";
3
+ import { r as TailorEnv, t as TailorActor } from "../actor-B2oEmlTc.mjs";
4
4
 
5
5
  //#region src/plugin/with-context.d.ts
6
6
  /**
@@ -0,0 +1,255 @@
1
+
2
+ import { GraphQLError, Lexer, Source, TokenKind } from "graphql";
3
+ import { getSegments } from "sql-highlight";
4
+
5
+ //#region src/cli/query/repl-editor.ts
6
+ const RESET = "\x1B[0m";
7
+ const BLUE = "\x1B[34m";
8
+ const MAGENTA = "\x1B[35m";
9
+ const YELLOW = "\x1B[33m";
10
+ const BRIGHT_GREEN = "\x1B[92m";
11
+ const CYAN = "\x1B[36m";
12
+ const BRIGHT_BLUE = "\x1B[94m";
13
+ const BOLD_CYAN = "\x1B[1;36m";
14
+ const BOLD_MAGENTA = "\x1B[1;35m";
15
+ const ITALIC_YELLOW = "\x1B[3;33m";
16
+ const GREEN = "\x1B[32m";
17
+ const DIM = "\x1B[90m";
18
+ const DIM_YELLOW = "\x1B[2;33m";
19
+ const SQL_STYLE_MAP = {
20
+ keyword: BLUE,
21
+ function: MAGENTA,
22
+ identifier: YELLOW,
23
+ string: BRIGHT_GREEN,
24
+ number: CYAN,
25
+ bracket: DIM_YELLOW,
26
+ special: DIM
27
+ };
28
+ /**
29
+ * Highlight a single SQL line using the `sql-highlight` tokenizer.
30
+ * @param line - SQL text for a single editor line
31
+ * @returns ANSI-decorated line safe for terminal output
32
+ */
33
+ function highlightSqlLine(line) {
34
+ const segments = getSegments(line);
35
+ let result = "";
36
+ for (const seg of segments) {
37
+ const style = SQL_STYLE_MAP[seg.name];
38
+ result += style ? style + seg.content + RESET : seg.content;
39
+ }
40
+ return result;
41
+ }
42
+ const GQL_KEYWORDS = new Set([
43
+ "query",
44
+ "mutation",
45
+ "subscription",
46
+ "fragment",
47
+ "on",
48
+ "type",
49
+ "input",
50
+ "enum",
51
+ "interface",
52
+ "union",
53
+ "scalar",
54
+ "extend",
55
+ "schema",
56
+ "directive",
57
+ "implements"
58
+ ]);
59
+ const GQL_DEF_KEYWORDS = new Set([
60
+ "query",
61
+ "mutation",
62
+ "subscription",
63
+ "fragment"
64
+ ]);
65
+ const GQL_BUILTINS = new Set([
66
+ "true",
67
+ "false",
68
+ "null"
69
+ ]);
70
+ /**
71
+ * Highlight a single GraphQL line using the official `graphql` Lexer. Tracks
72
+ * paren depth and the previous token to provide semantic-level colouring
73
+ * (field names vs argument names vs types).
74
+ * @param line - GraphQL text for a single editor line
75
+ * @returns ANSI-decorated line, or the input unchanged when the lexer rejects it
76
+ */
77
+ function highlightGraphqlLine(line) {
78
+ if (line.trimStart().startsWith("#")) return `${DIM}${line}${RESET}`;
79
+ try {
80
+ const lexer = new Lexer(new Source(line));
81
+ let result = "";
82
+ let pos = 0;
83
+ let parenDepth = 0;
84
+ let prevKind = "";
85
+ let prevText = "";
86
+ let afterColon = false;
87
+ let token = lexer.advance();
88
+ while (token.kind !== TokenKind.EOF) {
89
+ if (token.start > pos) result += line.slice(pos, token.start);
90
+ const text = line.slice(token.start, token.end);
91
+ switch (token.kind) {
92
+ case TokenKind.NAME:
93
+ if (prevKind === TokenKind.DOLLAR) result += `${MAGENTA}${text}${RESET}`;
94
+ else if (prevKind === TokenKind.AT) result += `${BOLD_MAGENTA}${text}${RESET}`;
95
+ else if (GQL_BUILTINS.has(text) || GQL_KEYWORDS.has(text)) result += `${BLUE}${text}${RESET}`;
96
+ else if (GQL_DEF_KEYWORDS.has(prevText)) result += `${BOLD_CYAN}${text}${RESET}`;
97
+ else if (afterColon) result += `${CYAN}${text}${RESET}`;
98
+ else if (parenDepth > 0) result += `${ITALIC_YELLOW}${text}${RESET}`;
99
+ else result += `${BRIGHT_BLUE}${text}${RESET}`;
100
+ afterColon = false;
101
+ break;
102
+ case TokenKind.INT:
103
+ case TokenKind.FLOAT:
104
+ result += `${BLUE}${text}${RESET}`;
105
+ afterColon = false;
106
+ break;
107
+ case TokenKind.STRING:
108
+ case TokenKind.BLOCK_STRING:
109
+ result += `${GREEN}${text}${RESET}`;
110
+ afterColon = false;
111
+ break;
112
+ case TokenKind.DOLLAR:
113
+ result += `${MAGENTA}${text}${RESET}`;
114
+ afterColon = false;
115
+ break;
116
+ case TokenKind.AT:
117
+ result += `${BOLD_MAGENTA}${text}${RESET}`;
118
+ afterColon = false;
119
+ break;
120
+ case TokenKind.BRACE_L:
121
+ case TokenKind.BRACE_R:
122
+ result += `${YELLOW}${text}${RESET}`;
123
+ afterColon = false;
124
+ break;
125
+ case TokenKind.PAREN_L:
126
+ parenDepth += 1;
127
+ result += `${DIM_YELLOW}${text}${RESET}`;
128
+ afterColon = false;
129
+ break;
130
+ case TokenKind.PAREN_R:
131
+ parenDepth = Math.max(0, parenDepth - 1);
132
+ result += `${DIM_YELLOW}${text}${RESET}`;
133
+ afterColon = false;
134
+ break;
135
+ case TokenKind.BRACKET_L:
136
+ case TokenKind.BRACKET_R:
137
+ result += `${DIM_YELLOW}${text}${RESET}`;
138
+ afterColon = false;
139
+ break;
140
+ case TokenKind.COLON:
141
+ result += `${DIM}${text}${RESET}`;
142
+ afterColon = true;
143
+ break;
144
+ case TokenKind.BANG:
145
+ case TokenKind.EQUALS:
146
+ case TokenKind.PIPE:
147
+ case TokenKind.AMP:
148
+ case TokenKind.SPREAD:
149
+ result += `${DIM}${text}${RESET}`;
150
+ afterColon = false;
151
+ break;
152
+ default:
153
+ result += text;
154
+ afterColon = false;
155
+ }
156
+ prevKind = token.kind;
157
+ prevText = text;
158
+ pos = token.end;
159
+ token = lexer.advance();
160
+ }
161
+ if (pos < line.length) result += line.slice(pos);
162
+ return result;
163
+ } catch (error) {
164
+ if (error instanceof GraphQLError) return line;
165
+ throw error;
166
+ }
167
+ }
168
+ const BRACKET_PAIRS = {
169
+ "(": ")",
170
+ "[": "]",
171
+ "{": "}"
172
+ };
173
+ const CLOSE_BRACKETS = new Set(Object.values(BRACKET_PAIRS));
174
+ /**
175
+ * Apply auto-close brackets and auto-indent on newline. Works for both SQL
176
+ * and GraphQL because both languages share the `()`, `[]`, `{}` bracket set.
177
+ * @param state - Editor state after the last edit
178
+ * @param event - Event describing the edit that just occurred
179
+ * @returns A new editor state to apply, or `undefined` to leave the state unchanged
180
+ */
181
+ function replTransform(state, event) {
182
+ const { lines, row, col } = state;
183
+ if (event.type === "insert" && event.char in BRACKET_PAIRS) {
184
+ const close = BRACKET_PAIRS[event.char];
185
+ const line = lines[row];
186
+ const newLine = line.slice(0, col) + close + line.slice(col);
187
+ return {
188
+ lines: lines.with(row, newLine),
189
+ row,
190
+ col
191
+ };
192
+ }
193
+ if (event.type === "insert" && CLOSE_BRACKETS.has(event.char)) {
194
+ const line = lines[row];
195
+ if (line[col] === event.char) {
196
+ const newLine = line.slice(0, col) + line.slice(col + 1);
197
+ return {
198
+ lines: lines.with(row, newLine),
199
+ row,
200
+ col
201
+ };
202
+ }
203
+ }
204
+ if (event.type === "backspace") {
205
+ const line = lines[row];
206
+ const beforeCursor = line.slice(0, col);
207
+ if (beforeCursor.length >= 1 && /^ +$/.test(beforeCursor)) {
208
+ const newIndent = beforeCursor.slice(0, -1);
209
+ const newLine = newIndent + line.slice(col);
210
+ return {
211
+ lines: lines.with(row, newLine),
212
+ row,
213
+ col: newIndent.length
214
+ };
215
+ }
216
+ }
217
+ if (event.type === "newline" && row > 0) {
218
+ const prevLine = lines[row - 1];
219
+ const baseIndent = prevLine.match(/^(\s*)/)?.[1] ?? "";
220
+ const endsWithOpen = /[{([]$/.test(prevLine.trimEnd());
221
+ const startsWithClose = /^[}\])]/.test(lines[row].trimStart());
222
+ if (endsWithOpen && startsWithClose) {
223
+ const innerIndent = baseIndent + " ";
224
+ const newLines = [...lines];
225
+ newLines[row] = innerIndent;
226
+ newLines.splice(row + 1, 0, baseIndent + lines[row].trimStart());
227
+ return {
228
+ lines: newLines,
229
+ row,
230
+ col: innerIndent.length
231
+ };
232
+ }
233
+ if (endsWithOpen) {
234
+ const closeChar = BRACKET_PAIRS[prevLine.trimEnd().slice(-1)] ?? "}";
235
+ const indent = baseIndent + " ";
236
+ const newLines = [...lines];
237
+ newLines[row] = indent + lines[row];
238
+ newLines.splice(row + 1, 0, baseIndent + closeChar);
239
+ return {
240
+ lines: newLines,
241
+ row,
242
+ col: indent.length
243
+ };
244
+ }
245
+ if (baseIndent && col === 0) return {
246
+ lines: lines.with(row, baseIndent + lines[row]),
247
+ row,
248
+ col: baseIndent.length
249
+ };
250
+ }
251
+ }
252
+
253
+ //#endregion
254
+ export { highlightGraphqlLine, highlightSqlLine, replTransform };
255
+ //# sourceMappingURL=repl-editor-DjycioU-.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl-editor-DjycioU-.mjs","names":[],"sources":["../src/cli/query/repl-editor.ts"],"sourcesContent":["import { GraphQLError, Lexer, Source, TokenKind } from \"graphql\";\nimport { getSegments } from \"sql-highlight\";\nimport type { TransformEvent, TransformState } from \"@toiroakr/read-multiline\";\n\n// ANSI colour sequences. Kept inline (rather than going through `node:util`\n// styleText) so that tests running outside a TTY still produce deterministic\n// escape sequences regardless of detected colour support.\nconst RESET = \"\\x1b[0m\";\nconst BLUE = \"\\x1b[34m\";\nconst MAGENTA = \"\\x1b[35m\";\nconst YELLOW = \"\\x1b[33m\";\nconst BRIGHT_GREEN = \"\\x1b[92m\";\nconst CYAN = \"\\x1b[36m\";\nconst BRIGHT_BLUE = \"\\x1b[94m\";\nconst BOLD_CYAN = \"\\x1b[1;36m\";\nconst BOLD_MAGENTA = \"\\x1b[1;35m\";\nconst ITALIC_YELLOW = \"\\x1b[3;33m\";\nconst GREEN = \"\\x1b[32m\";\nconst DIM = \"\\x1b[90m\";\nconst DIM_YELLOW = \"\\x1b[2;33m\";\n\nconst SQL_STYLE_MAP: Record<string, string> = {\n keyword: BLUE,\n function: MAGENTA,\n identifier: YELLOW,\n string: BRIGHT_GREEN,\n number: CYAN,\n bracket: DIM_YELLOW,\n special: DIM,\n};\n\n/**\n * Highlight a single SQL line using the `sql-highlight` tokenizer.\n * @param line - SQL text for a single editor line\n * @returns ANSI-decorated line safe for terminal output\n */\nexport function highlightSqlLine(line: string): string {\n const segments = getSegments(line);\n let result = \"\";\n for (const seg of segments) {\n const style = SQL_STYLE_MAP[seg.name];\n result += style ? style + seg.content + RESET : seg.content;\n }\n return result;\n}\n\nconst GQL_KEYWORDS = new Set([\n \"query\",\n \"mutation\",\n \"subscription\",\n \"fragment\",\n \"on\",\n \"type\",\n \"input\",\n \"enum\",\n \"interface\",\n \"union\",\n \"scalar\",\n \"extend\",\n \"schema\",\n \"directive\",\n \"implements\",\n]);\n\n// Keywords that introduce a definition name (next NAME token is the def).\nconst GQL_DEF_KEYWORDS = new Set([\"query\", \"mutation\", \"subscription\", \"fragment\"]);\n\nconst GQL_BUILTINS = new Set([\"true\", \"false\", \"null\"]);\n\n/**\n * Highlight a single GraphQL line using the official `graphql` Lexer. Tracks\n * paren depth and the previous token to provide semantic-level colouring\n * (field names vs argument names vs types).\n * @param line - GraphQL text for a single editor line\n * @returns ANSI-decorated line, or the input unchanged when the lexer rejects it\n */\nexport function highlightGraphqlLine(line: string): string {\n if (line.trimStart().startsWith(\"#\")) {\n return `${DIM}${line}${RESET}`;\n }\n\n try {\n const source = new Source(line);\n const lexer = new Lexer(source);\n let result = \"\";\n let pos = 0;\n\n let parenDepth = 0;\n let prevKind: string = \"\";\n let prevText = \"\";\n let afterColon = false;\n\n let token = lexer.advance();\n while (token.kind !== TokenKind.EOF) {\n if (token.start > pos) {\n result += line.slice(pos, token.start);\n }\n\n const text = line.slice(token.start, token.end);\n switch (token.kind) {\n case TokenKind.NAME: {\n if (prevKind === TokenKind.DOLLAR) {\n result += `${MAGENTA}${text}${RESET}`;\n } else if (prevKind === TokenKind.AT) {\n result += `${BOLD_MAGENTA}${text}${RESET}`;\n } else if (GQL_BUILTINS.has(text) || GQL_KEYWORDS.has(text)) {\n result += `${BLUE}${text}${RESET}`;\n } else if (GQL_DEF_KEYWORDS.has(prevText)) {\n result += `${BOLD_CYAN}${text}${RESET}`;\n } else if (afterColon) {\n result += `${CYAN}${text}${RESET}`;\n } else if (parenDepth > 0) {\n result += `${ITALIC_YELLOW}${text}${RESET}`;\n } else {\n result += `${BRIGHT_BLUE}${text}${RESET}`;\n }\n afterColon = false;\n break;\n }\n case TokenKind.INT:\n case TokenKind.FLOAT:\n result += `${BLUE}${text}${RESET}`;\n afterColon = false;\n break;\n case TokenKind.STRING:\n case TokenKind.BLOCK_STRING:\n result += `${GREEN}${text}${RESET}`;\n afterColon = false;\n break;\n case TokenKind.DOLLAR:\n result += `${MAGENTA}${text}${RESET}`;\n afterColon = false;\n break;\n case TokenKind.AT:\n result += `${BOLD_MAGENTA}${text}${RESET}`;\n afterColon = false;\n break;\n case TokenKind.BRACE_L:\n case TokenKind.BRACE_R:\n result += `${YELLOW}${text}${RESET}`;\n afterColon = false;\n break;\n case TokenKind.PAREN_L:\n parenDepth += 1;\n result += `${DIM_YELLOW}${text}${RESET}`;\n afterColon = false;\n break;\n case TokenKind.PAREN_R:\n parenDepth = Math.max(0, parenDepth - 1);\n result += `${DIM_YELLOW}${text}${RESET}`;\n afterColon = false;\n break;\n case TokenKind.BRACKET_L:\n case TokenKind.BRACKET_R:\n result += `${DIM_YELLOW}${text}${RESET}`;\n afterColon = false;\n break;\n case TokenKind.COLON:\n result += `${DIM}${text}${RESET}`;\n afterColon = true;\n break;\n case TokenKind.BANG:\n case TokenKind.EQUALS:\n case TokenKind.PIPE:\n case TokenKind.AMP:\n case TokenKind.SPREAD:\n result += `${DIM}${text}${RESET}`;\n afterColon = false;\n break;\n default:\n result += text;\n afterColon = false;\n }\n\n prevKind = token.kind;\n prevText = text;\n pos = token.end;\n token = lexer.advance();\n }\n\n if (pos < line.length) {\n result += line.slice(pos);\n }\n return result;\n } catch (error) {\n // The lexer throws GraphQLError on partial or invalid input (e.g. an\n // unterminated string while the user is still typing). Fall back to the\n // raw line so the editor keeps rendering without colour until the input\n // is valid. Any other error is a real bug and should surface.\n if (error instanceof GraphQLError) {\n return line;\n }\n throw error;\n }\n}\n\nconst BRACKET_PAIRS: Record<string, string> = { \"(\": \")\", \"[\": \"]\", \"{\": \"}\" };\nconst CLOSE_BRACKETS = new Set(Object.values(BRACKET_PAIRS));\n\n/**\n * Apply auto-close brackets and auto-indent on newline. Works for both SQL\n * and GraphQL because both languages share the `()`, `[]`, `{}` bracket set.\n * @param state - Editor state after the last edit\n * @param event - Event describing the edit that just occurred\n * @returns A new editor state to apply, or `undefined` to leave the state unchanged\n */\nexport function replTransform(\n state: TransformState,\n event: TransformEvent,\n): TransformState | undefined {\n const { lines, row, col } = state;\n\n if (event.type === \"insert\" && event.char in BRACKET_PAIRS) {\n const close = BRACKET_PAIRS[event.char];\n const line = lines[row];\n const newLine = line.slice(0, col) + close + line.slice(col);\n return { lines: lines.with(row, newLine), row, col };\n }\n\n if (event.type === \"insert\" && CLOSE_BRACKETS.has(event.char)) {\n const line = lines[row];\n if (line[col] === event.char) {\n const newLine = line.slice(0, col) + line.slice(col + 1);\n return { lines: lines.with(row, newLine), row, col };\n }\n }\n\n if (event.type === \"backspace\") {\n const line = lines[row];\n const beforeCursor = line.slice(0, col);\n if (beforeCursor.length >= 1 && /^ +$/.test(beforeCursor)) {\n const newIndent = beforeCursor.slice(0, -1);\n const newLine = newIndent + line.slice(col);\n return { lines: lines.with(row, newLine), row, col: newIndent.length };\n }\n }\n\n if (event.type === \"newline\" && row > 0) {\n const prevLine = lines[row - 1];\n const baseIndent = prevLine.match(/^(\\s*)/)?.[1] ?? \"\";\n const endsWithOpen = /[{([]$/.test(prevLine.trimEnd());\n const startsWithClose = /^[}\\])]/.test(lines[row].trimStart());\n\n if (endsWithOpen && startsWithClose) {\n // Bracket expansion: the cursor sits between a matching open/close\n // pair (e.g. `{|}`). Expand into a three-line block with the cursor\n // on an indented middle line.\n const innerIndent = baseIndent + \" \";\n const newLines = [...lines];\n newLines[row] = innerIndent;\n newLines.splice(row + 1, 0, baseIndent + lines[row].trimStart());\n return { lines: newLines, row, col: innerIndent.length };\n }\n if (endsWithOpen) {\n // A lone open bracket on the previous line: drop an extra indent for\n // the new line and auto-insert the matching closing bracket below.\n const openChar = prevLine.trimEnd().slice(-1);\n const closeChar = BRACKET_PAIRS[openChar] ?? \"}\";\n const indent = baseIndent + \" \";\n const newLines = [...lines];\n newLines[row] = indent + lines[row];\n newLines.splice(row + 1, 0, baseIndent + closeChar);\n return { lines: newLines, row, col: indent.length };\n }\n if (baseIndent && col === 0) {\n return { lines: lines.with(row, baseIndent + lines[row]), row, col: baseIndent.length };\n }\n }\n\n return undefined;\n}\n"],"mappings":"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"}