@xiaoso/dsh-tool-plus 0.1.16 → 0.1.17-beta.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 (109) hide show
  1. package/lib/{abort-DZ54CaKU.mjs → abort-BTblp0Rt.mjs} +2 -2
  2. package/lib/{alibaba-coding-plan-DODpkcqi.mjs → alibaba-coding-plan-t3R4YKCB.mjs} +3 -3
  3. package/lib/{alibaba-token-plan-C6lpKCda.mjs → alibaba-token-plan-CO4djG1y.mjs} +4 -4
  4. package/lib/{alibaba-token-plan-CHGyWOfX.mjs → alibaba-token-plan-CUjYJX0-.mjs} +1 -1
  5. package/lib/{anthropic-Dv_GGX6g.mjs → anthropic-nf7w6so1.mjs} +48 -21
  6. package/lib/{api-key-validation-MnMf_ihX.mjs → api-key-validation-C_tZ7Y9a.mjs} +2 -2
  7. package/lib/behavior-BwvTUtag.mjs +111 -0
  8. package/lib/{browser-render-BZXt548F.mjs → browser-render-BQaEVK_n.mjs} +4 -4
  9. package/lib/{reference-CtvM4zLU.mjs → bundled-references-CrQ4dQcT.mjs} +57 -4
  10. package/lib/cascade-BWjRTD1q.mjs +30265 -0
  11. package/lib/{cline-pass-BT9CBEOj.mjs → cline-pass-Bjm-O8GG.mjs} +2 -2
  12. package/lib/cloudflare-CKXRJ0l9.mjs +37 -0
  13. package/lib/{cloudflare-ai-gateway-DReN6ohJ.mjs → cloudflare-ai-gateway-BpnBSjwV.mjs} +8 -4
  14. package/lib/cloudflare-workers-ai-odj9XswL.mjs +32 -0
  15. package/lib/collapse-_nkb2dn7.mjs +1945 -0
  16. package/lib/{coreweave-C82HrLpb.mjs → coreweave-CGDZOD8-.mjs} +1 -1
  17. package/lib/{coreweave-C68UgRQO.mjs → coreweave-DwffcgW5.mjs} +4 -4
  18. package/lib/cursor-BgOuV7Qf.mjs +794 -0
  19. package/lib/{cursor-_gHHq-Dq.mjs → cursor-CF1iHHbv.mjs} +68 -19
  20. package/lib/{cursor-proto-Cr_WEMuv.mjs → cursor-proto-BuNTjX3L.mjs} +823 -23
  21. package/lib/{devin-QpfTSl9H.mjs → devin-7OEeEb80.mjs} +112 -31
  22. package/lib/{devin-proto-DYhp4Ty6.mjs → devin-proto-C-QreeAv.mjs} +71 -5
  23. package/lib/{dom-DG3sPESc.mjs → dom-BmbZv4v9.mjs} +598 -182
  24. package/lib/{error-O63pC8zg.mjs → error-8LVo7tug.mjs} +725 -104
  25. package/lib/factory-droid-ChhmsGWb.mjs +71 -0
  26. package/lib/{fs-promises-shim-B2YFWkcd.mjs → fs-promises-shim-CANAxFWh.mjs} +10 -1
  27. package/lib/{github-copilot-BMEcw8N1.mjs → github-copilot-QwevdT30.mjs} +4 -4
  28. package/lib/{github-copilot-headers-DnjGEbko.mjs → github-copilot-headers-CAUZ0rUD.mjs} +138 -26
  29. package/lib/{gitlab-duo-DnHqJjFY.mjs → gitlab-duo-DigV7k_o.mjs} +2 -2
  30. package/lib/{google-antigravity-B1mSckrK.mjs → google-antigravity-D-oe0r8A.mjs} +6 -7
  31. package/lib/{google-gemini-cli-DJwThCCn.mjs → google-gemini-cli-CQBHgGJT.mjs} +5 -6
  32. package/lib/{google-oauth-shared-BctLpVUN.mjs → google-oauth-shared-CvgVIUwJ.mjs} +2 -2
  33. package/lib/google-validation-CdvRj4ec.mjs +126 -0
  34. package/lib/id-EJwVLDHE.mjs +2548 -0
  35. package/lib/index.mjs +248 -258
  36. package/lib/{kilo-BEgEwMJQ.mjs → kilo-5r6OffCa.mjs} +2 -2
  37. package/lib/{kimi-T9NldEIJ.mjs → kimi-DOOtbXmm.mjs} +9 -10
  38. package/lib/{launch-BIWNyrBB.mjs → launch-DkAjib7h.mjs} +1 -1
  39. package/lib/{markit-Dvp2JPdT.mjs → markit-CCcyeAds.mjs} +359 -140
  40. package/lib/{models-DnXMYGcJ.mjs → models-DCpDT_im.mjs} +199203 -112275
  41. package/lib/{muse-code-CNvqqAp6.mjs → muse-code-CYf8zj_B.mjs} +5 -5
  42. package/lib/{openai-codex-D5-CyTxa.mjs → openai-codex-Cj-TvSFh.mjs} +13 -10
  43. package/lib/{perplexity-A2PEoGaC.mjs → perplexity-Dh_Qgsmx.mjs} +68 -25
  44. package/lib/{pkce-BYjmugmw.mjs → pkce-DO-jBJLV.mjs} +1 -1
  45. package/lib/pricing-DusBEhwm.mjs +593 -0
  46. package/lib/{readability-uGhqb4GC.mjs → readability-XHK0o3bv.mjs} +287 -27
  47. package/lib/{scrapers-C1ujjV8k.mjs → scrapers-B6PADOVm.mjs} +13 -13
  48. package/lib/slugify-ynYWBIA5.mjs +11 -0
  49. package/lib/snowflake-B_jap6lz.mjs +666 -0
  50. package/lib/snowflake-Cu1ZyOp6.mjs +151 -0
  51. package/lib/{src-AELUUb5U.mjs → src-BhinCSpi.mjs} +1172 -458
  52. package/lib/{stream-AVOoe5Hj.mjs → stream-D2ivg3GH.mjs} +3740 -5311
  53. package/lib/{turndown-D6fof1OX.mjs → turndown-Vya8SavL.mjs} +82 -30
  54. package/lib/types/tools/hashline/native/index.d.ts +2 -2
  55. package/lib/types/tools/hashline/native/policy.d.ts +19 -21
  56. package/lib/types/tools/omp/session/agent-storage.d.ts +3 -3
  57. package/lib/types/tools/shared/bun-named-shim.d.ts +5 -0
  58. package/lib/{types-BLrLohwK.mjs → types-tH1v9uRm.mjs} +2 -2
  59. package/lib/{utils-cZX3f_Ls.mjs → utils-C_Ncya1r.mjs} +1737 -509
  60. package/lib/utils-D2tK38xq.mjs +34006 -0
  61. package/lib/{utils-I4I8azHN.mjs → utils-DrDwmNtu.mjs} +8 -3
  62. package/lib/{xai-oauth-CbeldUSV.mjs → xai-oauth-DLLzX6my.mjs} +4 -4
  63. package/lib/{xiaomi-Dl3VSs04.mjs → xiaomi-CqK-KivK.mjs} +2 -2
  64. package/lib/{zai-FyjGSypr.mjs → zai-DoJ2xPIH.mjs} +2 -2
  65. package/lib/{zip-DRrycScC.mjs → zip-DG1mUV6X.mjs} +1 -1
  66. package/package.json +8 -8
  67. package/lib/amazon-bedrock-Dx0rr9dY.mjs +0 -996
  68. package/lib/anthropic-ClCw0PV_.mjs +0 -3624
  69. package/lib/anthropic-wire-lbGAFzYb.mjs +0 -927
  70. package/lib/azure-openai-responses-WE_bgFWp.mjs +0 -285
  71. package/lib/bundled-references-DY3EJxZV.mjs +0 -56
  72. package/lib/cloudflare-ai-gateway-CrMa97Ap.mjs +0 -44
  73. package/lib/collapse-CkMNRNr7.mjs +0 -2304
  74. package/lib/cursor-C6jaIJDg.mjs +0 -283
  75. package/lib/cursor-D-XZYDf_.mjs +0 -4544
  76. package/lib/deterministic-id-CUEIMSqR.mjs +0 -17
  77. package/lib/devin-ExGIghmx.mjs +0 -69
  78. package/lib/devin-u0ljw5P6.mjs +0 -628
  79. package/lib/effort-BdtQMN-_.mjs +0 -23
  80. package/lib/event-stream-BKEtb45Y.mjs +0 -167
  81. package/lib/gemini-headers-Co9cVvex.mjs +0 -54
  82. package/lib/google-auth-qAN-6DMW.mjs +0 -232
  83. package/lib/google-gemini-cli-B2Aw1S5w.mjs +0 -844
  84. package/lib/google-lTxuq28n.mjs +0 -38
  85. package/lib/google-shared-Y01j9xOr.mjs +0 -856
  86. package/lib/google-validation-BEkNs-Bx.mjs +0 -18
  87. package/lib/google-vertex-DcM-FRC5.mjs +0 -99
  88. package/lib/hosts-00rjRzUD.mjs +0 -203
  89. package/lib/id-AL5obQzR.mjs +0 -71
  90. package/lib/idle-iterator-D0ZXEcUq.mjs +0 -366
  91. package/lib/ollama-6R0oXZks.mjs +0 -574
  92. package/lib/openai-codex-responses-C8bnBWOe.mjs +0 -3232
  93. package/lib/openai-completions-DNr3mUsn.mjs +0 -1430
  94. package/lib/openai-configuration-update-xMYUjaK_.mjs +0 -150
  95. package/lib/openai-reasoning-fallback-Ju-5pSR8.mjs +0 -380
  96. package/lib/openai-responses-CjpafAEr.mjs +0 -861
  97. package/lib/protobuf-BMgDYu_U.mjs +0 -717
  98. package/lib/provider-response-SqKSkkUc.mjs +0 -22
  99. package/lib/proxy-DxvCQOCA.mjs +0 -230
  100. package/lib/request-debug-BwPOqN_j.mjs +0 -183
  101. package/lib/sanitize-text-BCf5KmCf.mjs +0 -33
  102. package/lib/sse-debug-B-tkLCPW.mjs +0 -11
  103. package/lib/stream-markup-healing-CN3RsqG9.mjs +0 -267
  104. package/lib/strict-tool-validation-CBTz1dAA.mjs +0 -105
  105. package/lib/taxonomy-DSIM99rS.mjs +0 -15392
  106. package/lib/thinking-ngMwf_1Y.mjs +0 -336
  107. package/lib/type-guards-CttAANEx.mjs +0 -11
  108. package/lib/utils-CE3DSebh.mjs +0 -11763
  109. package/lib/vision-guard-BCpXWUj3.mjs +0 -77
@@ -1,336 +0,0 @@
1
- import { installBunShim as __installBunShim } from "./bun-shim.mjs";
2
- __installBunShim();
3
- import { D as FencedThinkingScanner, O as partialSuffixOverlapAny } from "./utils-cZX3f_Ls.mjs";
4
- //#region node_modules/.pnpm/@oh-my-pi+pi-ai@18.1.17/node_modules/@oh-my-pi/pi-ai/src/dialect/thinking.ts
5
- /**
6
- * Every dialect's in-band thinking section in its canonical `renderThinking`
7
- * form (see the sibling `./*.ts` scanners). {@link ThinkingInbandScanner} heals
8
- * reasoning a model leaked into its visible text channel back into thinking
9
- * events, whichever dialect idiom the leak used.
10
- *
11
- * Plain (attribute-free) delimiters only — matching what `renderThinking`
12
- * emits and what models leak in practice. Attributed or namespaced XML thinking
13
- * tags (`<thinking signature="…">`, `antml:thinking`) are recovered by the owned
14
- * anthropic-dialect parser, not this text-channel healing fallback.
15
- */
16
- const TAGS = [
17
- {
18
- open: "<think>",
19
- close: "</think>",
20
- impliedOpen: true
21
- },
22
- {
23
- open: "<thinking>",
24
- close: "</thinking>"
25
- },
26
- {
27
- open: "<scratchpad>",
28
- close: "</scratchpad>"
29
- },
30
- {
31
- open: "```thinking\n",
32
- close: "```",
33
- fenced: true
34
- },
35
- {
36
- open: "<|channel>thought\n",
37
- close: "<channel|>"
38
- },
39
- {
40
- open: "<|start|>assistant<|channel|>analysis<|message|>",
41
- close: "<|end|>"
42
- },
43
- {
44
- open: "<|channel|>analysis<|message|>",
45
- close: "<|end|>"
46
- }
47
- ];
48
- const OPENS = TAGS.map((tag) => tag.open);
49
- const IMPLIED_OPEN_TAGS = TAGS.filter((tag) => tag.impliedOpen);
50
- const IMPLIED_OPEN_DELIMITERS = [...OPENS, ...IMPLIED_OPEN_TAGS.map((tag) => tag.close)];
51
- var ThinkingInbandScanner = class {
52
- #impliedOpen;
53
- #buffer = "";
54
- #closeTag = "";
55
- #thinking = "";
56
- /** Fence-aware close-matcher while inside a ` ```thinking ` block; undefined otherwise. */
57
- #fenced;
58
- /** Backtick count that opened the Markdown code span/fence we are inside; 0 when not in code. */
59
- #codeTicks = 0;
60
- /** True when {@link #codeTicks} opened a fenced block (closes on a fence line), not an inline span. */
61
- #codeFenced = false;
62
- /**
63
- * Leading-space count on the current output line, or -1 once a non-space
64
- * character has appeared. Starts at 0 (line start) so a fence opening the
65
- * stream — or one indented ≤3 spaces, as CommonMark allows — is recognized.
66
- */
67
- #lineIndent = 0;
68
- constructor(options = {}) {
69
- this.#impliedOpen = options.impliedOpen === true;
70
- }
71
- feed(text) {
72
- if (text.length === 0) return [];
73
- this.#buffer += text;
74
- return this.#consume(false);
75
- }
76
- flush() {
77
- const events = this.#consume(true);
78
- if (this.#buffer.length === 0) return events;
79
- if (this.#closeTag) {
80
- this.#emitThinking(this.#buffer, events);
81
- events.push({
82
- type: "thinkingEnd",
83
- thinking: this.#thinking
84
- });
85
- } else events.push({
86
- type: "text",
87
- text: this.#buffer
88
- });
89
- this.#buffer = "";
90
- this.#closeTag = "";
91
- return events;
92
- }
93
- #consume(final) {
94
- const events = [];
95
- for (;;) {
96
- if (this.#fenced) {
97
- const result = this.#fenced.feed(this.#buffer, final);
98
- this.#buffer = result.closed ? result.rest : "";
99
- this.#emitThinking(result.thinking, events);
100
- if (result.closed || final) {
101
- events.push({
102
- type: "thinkingEnd",
103
- thinking: this.#thinking
104
- });
105
- this.#thinking = "";
106
- this.#closeTag = "";
107
- this.#fenced = void 0;
108
- }
109
- if (this.#fenced) break;
110
- continue;
111
- }
112
- if (this.#buffer.length === 0) break;
113
- if (this.#closeTag) {
114
- const close = this.#buffer.indexOf(this.#closeTag);
115
- if (close === -1) {
116
- const hold = final ? 0 : partialSuffixOverlapAny(this.#buffer, [this.#closeTag]);
117
- this.#emitThinking(this.#buffer.slice(0, this.#buffer.length - hold), events);
118
- this.#buffer = this.#buffer.slice(this.#buffer.length - hold);
119
- break;
120
- }
121
- this.#emitThinking(this.#buffer.slice(0, close), events);
122
- this.#buffer = this.#buffer.slice(close + this.#closeTag.length);
123
- events.push({
124
- type: "thinkingEnd",
125
- thinking: this.#thinking
126
- });
127
- this.#thinking = "";
128
- this.#closeTag = "";
129
- continue;
130
- }
131
- if (this.#codeTicks > 0) {
132
- if (this.#emitCode(final, events)) continue;
133
- break;
134
- }
135
- const hit = scanVisible(this.#buffer, final, this.#impliedOpen);
136
- if (hit.kind === "none") {
137
- this.#emitText(this.#buffer, events);
138
- this.#buffer = "";
139
- break;
140
- }
141
- if (hit.index > 0) this.#emitText(this.#buffer.slice(0, hit.index), events);
142
- if (hit.kind === "hold") {
143
- this.#buffer = this.#buffer.slice(hit.index);
144
- break;
145
- }
146
- if (hit.kind === "impliedClose") {
147
- this.#buffer = this.#buffer.slice(hit.index + hit.tag.close.length);
148
- events.push({ type: "impliedThinkingEnd" });
149
- continue;
150
- }
151
- if (hit.kind === "code") {
152
- const fenced = hit.ticks >= 3 && this.#lineIndent >= 0 && this.#lineIndent <= 3;
153
- this.#emitText(this.#buffer.slice(hit.index, hit.index + hit.ticks), events);
154
- this.#buffer = this.#buffer.slice(hit.index + hit.ticks);
155
- this.#codeTicks = hit.ticks;
156
- this.#codeFenced = fenced;
157
- continue;
158
- }
159
- this.#buffer = this.#buffer.slice(hit.index + hit.tag.open.length);
160
- this.#closeTag = hit.tag.close;
161
- this.#thinking = "";
162
- if (hit.tag.fenced) this.#fenced = new FencedThinkingScanner();
163
- events.push({ type: "thinkingStart" });
164
- }
165
- return events;
166
- }
167
- /**
168
- * Emit buffered content while inside a Markdown code region, suppressing
169
- * reasoning-tag detection. A fenced block closes only on a fence line (a line
170
- * of backticks ≥ the opener); an inline span closes on the first backtick run
171
- * of exactly the opener length. Returns true when the region closed and the
172
- * loop should continue, false when it held back and should break.
173
- */
174
- #emitCode(final, events) {
175
- if (this.#codeFenced) {
176
- const end = findFenceCloseEnd(this.#buffer, this.#codeTicks, final);
177
- if (end !== -1) {
178
- this.#emitText(this.#buffer.slice(0, end), events);
179
- this.#buffer = this.#buffer.slice(end);
180
- this.#codeTicks = 0;
181
- this.#codeFenced = false;
182
- return true;
183
- }
184
- if (final) {
185
- this.#emitText(this.#buffer, events);
186
- this.#buffer = "";
187
- this.#codeTicks = 0;
188
- this.#codeFenced = false;
189
- return false;
190
- }
191
- const lastNl = this.#buffer.lastIndexOf("\n");
192
- if (lastNl !== -1) {
193
- this.#emitText(this.#buffer.slice(0, lastNl + 1), events);
194
- this.#buffer = this.#buffer.slice(lastNl + 1);
195
- }
196
- return false;
197
- }
198
- const close = findBacktickRun(this.#buffer, 0, this.#codeTicks);
199
- if (close !== -1 && (final || close + this.#codeTicks < this.#buffer.length)) {
200
- this.#emitText(this.#buffer.slice(0, close + this.#codeTicks), events);
201
- this.#buffer = this.#buffer.slice(close + this.#codeTicks);
202
- this.#codeTicks = 0;
203
- return true;
204
- }
205
- const hold = final ? 0 : trailingBacktickRun(this.#buffer);
206
- this.#emitText(this.#buffer.slice(0, this.#buffer.length - hold), events);
207
- this.#buffer = this.#buffer.slice(this.#buffer.length - hold);
208
- if (final) this.#codeTicks = 0;
209
- return false;
210
- }
211
- #emitText(text, events) {
212
- if (text.length === 0) return;
213
- events.push({
214
- type: "text",
215
- text
216
- });
217
- this.#lineIndent = trailingLineIndent(text, this.#lineIndent);
218
- }
219
- #emitThinking(delta, events) {
220
- if (delta.length === 0) return;
221
- this.#thinking += delta;
222
- events.push({
223
- type: "thinkingDelta",
224
- delta
225
- });
226
- }
227
- };
228
- /**
229
- * Walk idle visible text for the earliest boundary: a leaked reasoning-tag open,
230
- * a bare close of an implied-open tag (when `impliedOpen`), a Markdown
231
- * code-span/fence opener (a backtick run), or — when more chunks may follow — a
232
- * held partial delimiter at the buffer tail.
233
- *
234
- * Reasoning tags win at any position so the gemini ` ```thinking ` fence is
235
- * healed instead of being read as a code fence. Backtick runs enter code mode so
236
- * a literal `<think>` inside inline code or a fenced block stays visible text.
237
- */
238
- function scanVisible(buffer, final, impliedOpen) {
239
- const delimiters = impliedOpen ? IMPLIED_OPEN_DELIMITERS : OPENS;
240
- for (let i = 0; i < buffer.length; i++) {
241
- const tag = TAGS.find((candidate) => buffer.startsWith(candidate.open, i));
242
- if (tag) return {
243
- kind: "tag",
244
- index: i,
245
- tag
246
- };
247
- if (impliedOpen) {
248
- const closed = IMPLIED_OPEN_TAGS.find((candidate) => buffer.startsWith(candidate.close, i));
249
- if (closed) return {
250
- kind: "impliedClose",
251
- index: i,
252
- tag: closed
253
- };
254
- }
255
- if (!final) {
256
- const rest = buffer.slice(i);
257
- if (delimiters.some((delimiter) => delimiter.length > rest.length && delimiter.startsWith(rest))) return {
258
- kind: "hold",
259
- index: i
260
- };
261
- }
262
- if (buffer[i] === "`") {
263
- const ticks = backtickRun(buffer, i);
264
- if (!final && i + ticks === buffer.length) return {
265
- kind: "hold",
266
- index: i
267
- };
268
- return {
269
- kind: "code",
270
- index: i,
271
- ticks
272
- };
273
- }
274
- }
275
- return { kind: "none" };
276
- }
277
- /** Length of the maximal backtick run beginning at `from`. */
278
- function backtickRun(buffer, from) {
279
- let end = from;
280
- while (end < buffer.length && buffer[end] === "`") end++;
281
- return end - from;
282
- }
283
- /** Index of the first maximal backtick run of exactly `ticks` at/after `from`, else -1. */
284
- function findBacktickRun(buffer, from, ticks) {
285
- for (let i = buffer.indexOf("`", from); i !== -1; i = buffer.indexOf("`", i)) {
286
- const run = backtickRun(buffer, i);
287
- if (run === ticks) return i;
288
- i += run;
289
- }
290
- return -1;
291
- }
292
- /** Length of a backtick run that ends at the buffer tail; 0 when the tail is not a backtick. */
293
- function trailingBacktickRun(buffer) {
294
- let start = buffer.length;
295
- while (start > 0 && buffer[start - 1] === "`") start--;
296
- return buffer.length - start;
297
- }
298
- /**
299
- * Leading-space count of the line at the tail of `text`, continuing from the
300
- * prior line's `indent` state (see {@link ThinkingInbandScanner.#lineIndent}).
301
- * Returns -1 once any non-space character has appeared on the current line.
302
- */
303
- function trailingLineIndent(text, prior) {
304
- const lastNl = text.lastIndexOf("\n");
305
- let indent = lastNl === -1 ? prior : 0;
306
- for (let i = lastNl + 1; i < text.length; i++) {
307
- if (indent === -1) break;
308
- indent = text[i] === " " ? indent + 1 : -1;
309
- }
310
- return indent;
311
- }
312
- /**
313
- * Index just past the first closing fence line for a fenced block opened with
314
- * `ticks` backticks, or -1 when none is committed yet. A closing fence is a whole
315
- * line whose trimmed content is only backticks, at least `ticks` of them. A line
316
- * without a terminating newline is committed only when `final` (no more input can
317
- * extend it into a non-fence line).
318
- */
319
- function findFenceCloseEnd(buffer, ticks, final) {
320
- for (let start = 0; start <= buffer.length;) {
321
- const nl = buffer.indexOf("\n", start);
322
- const terminated = nl !== -1;
323
- const line = buffer.slice(start, terminated ? nl : buffer.length).trim();
324
- if (line.length >= ticks && isAllBackticks(line) && (terminated || final)) return terminated ? nl + 1 : buffer.length;
325
- if (!terminated) break;
326
- start = nl + 1;
327
- }
328
- return -1;
329
- }
330
- /** True when `text` is non-empty and every character is a backtick. */
331
- function isAllBackticks(text) {
332
- for (let i = 0; i < text.length; i++) if (text[i] !== "`") return false;
333
- return text.length > 0;
334
- }
335
- //#endregion
336
- export { ThinkingInbandScanner as t };
@@ -1,11 +0,0 @@
1
- import { installBunShim as __installBunShim } from "./bun-shim.mjs";
2
- __installBunShim();
3
- //#region node_modules/.pnpm/@oh-my-pi+pi-utils@18.1.17/node_modules/@oh-my-pi/pi-utils/src/type-guards.ts
4
- function isRecord(value) {
5
- return !!value && typeof value === "object" && !Array.isArray(value);
6
- }
7
- function asRecord(value) {
8
- return isRecord(value) ? value : null;
9
- }
10
- //#endregion
11
- export { isRecord as n, asRecord as t };