@valv/clickhouse
Advanced tools
| import type { Dialect } from "@valv/core"; | ||
| export declare const clickhouseDialect: Dialect; | ||
| //# sourceMappingURL=emit.d.ts.map |
| {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAUzC,eAAO,MAAM,iBAAiB,EAAE,OAqC/B,CAAA"} |
+48
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.clickhouseDialect = void 0; | ||
| const INTERVAL_UNITS = ["second", "minute", "hour", "day", "week", "month", "quarter", "year"]; | ||
| // ClickHouse uses backtick identifiers (escaping `\` then `` ` ``) and typed | ||
| // named placeholders `{pN:Type}`. The type is the one schema-derived string that | ||
| // reaches SQL, so its characters are allowlisted — a malformed hand-defined type | ||
| // can't break out of the placeholder. | ||
| const SAFE_TYPE = /^[A-Za-z0-9_(), '=]+$/; | ||
| exports.clickhouseDialect = { | ||
| quoteId(id) { | ||
| return "`" + id.replace(/\\/g, "\\\\").replace(/`/g, "``") + "`"; | ||
| }, | ||
| placeholder(index, type) { | ||
| if (!SAFE_TYPE.test(type)) { | ||
| throw new Error(`[valv/clickhouse] unsafe column type "${type}"`); | ||
| } | ||
| return `{p${index}:${type}}`; | ||
| }, | ||
| functions: { | ||
| // Parametric aggregate: quantileTiming(level)(column). `level` is a finite | ||
| // number in [0, 1], so inlining it can't carry SQL. | ||
| quantileTiming: { | ||
| args: [{ kind: "number", range: [0, 1] }, { kind: "column" }], | ||
| render: ([level, c]) => `quantileTiming(${level})(${c})`, | ||
| }, | ||
| // Time bucketing for series — fixed grains. | ||
| toDate: { args: [{ kind: "column" }], render: ([c]) => `toDate(${c})` }, | ||
| toStartOfHour: { args: [{ kind: "column" }], render: ([c]) => `toStartOfHour(${c})` }, | ||
| toStartOfDay: { args: [{ kind: "column" }], render: ([c]) => `toStartOfDay(${c})` }, | ||
| // Arbitrary-grain bucketing: toStartOfInterval(ts, INTERVAL n unit). The unit | ||
| // is membership-checked, the magnitude is a finite number — both safe inlined. | ||
| toStartOfInterval: { | ||
| args: [{ kind: "column" }, { kind: "number" }, { kind: "enum", values: INTERVAL_UNITS }], | ||
| render: ([c, n, unit]) => `toStartOfInterval(${c}, INTERVAL ${n} ${unit.toUpperCase()})`, | ||
| }, | ||
| // Distinct counts. | ||
| uniqExact: { args: [{ kind: "column" }], render: ([c]) => `uniqExact(${c})` }, | ||
| uniq: { args: [{ kind: "column" }], render: ([c]) => `uniq(${c})` }, | ||
| // Conditional aggregation — the predicate's literals become bound params. | ||
| countIf: { args: [{ kind: "predicate" }], render: ([p]) => `countIf(${p})` }, | ||
| sumIf: { | ||
| args: [{ kind: "column" }, { kind: "predicate" }], | ||
| render: ([c, p]) => `sumIf(${c}, ${p})`, | ||
| }, | ||
| }, | ||
| }; | ||
| //# sourceMappingURL=emit.js.map |
| {"version":3,"file":"emit.js","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"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"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAOvC,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAiCrD,CAAA"} | ||
| {"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAgBvC,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAyCrD,CAAA"} |
+20
-3
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.clickhouseFunctions = void 0; | ||
| const INTERVAL_UNITS = ["second", "minute", "hour", "day", "week", "month", "quarter", "year"]; | ||
| const INTERVAL_UNITS = [ | ||
| "second", | ||
| "minute", | ||
| "hour", | ||
| "day", | ||
| "week", | ||
| "month", | ||
| "quarter", | ||
| "year", | ||
| ]; | ||
| // ClickHouse-specific functions, merged over the standard aggregates in core's | ||
@@ -18,4 +27,12 @@ // BASE_FUNCTIONS at emit time. This is the list that grows as analytics needs | ||
| toDate: { args: [{ kind: "column" }], returns: "date", render: ([c]) => `toDate(${c})` }, | ||
| toStartOfHour: { args: [{ kind: "column" }], returns: "date", render: ([c]) => `toStartOfHour(${c})` }, | ||
| toStartOfDay: { args: [{ kind: "column" }], returns: "date", render: ([c]) => `toStartOfDay(${c})` }, | ||
| toStartOfHour: { | ||
| args: [{ kind: "column" }], | ||
| returns: "date", | ||
| render: ([c]) => `toStartOfHour(${c})`, | ||
| }, | ||
| toStartOfDay: { | ||
| args: [{ kind: "column" }], | ||
| returns: "date", | ||
| render: ([c]) => `toStartOfDay(${c})`, | ||
| }, | ||
| // Arbitrary-grain bucketing toStartOfInterval(ts, INTERVAL n unit); unit is | ||
@@ -22,0 +39,0 @@ // membership-checked and n is finite, so both are safe inlined. |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"functions.js","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":";;;AAEA,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAU,CAAA;AAEvG,+EAA+E;AAC/E,8EAA8E;AAC9E,0EAA0E;AAC7D,QAAA,mBAAmB,GAA0B;IACxD,+EAA+E;IAC/E,6BAA6B;IAC7B,cAAc,EAAE;QACd,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC7D,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,KAAK,KAAK,CAAC,GAAG;KACzD;IAED,8BAA8B;IAC9B,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE;IACxF,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE;IACtG,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE;IAEpG,4EAA4E;IAC5E,gEAAgE;IAChE,iBAAiB,EAAE;QACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QACxF,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,IAAI,IAAK,CAAC,WAAW,EAAE,GAAG;KAC1F;IAED,mBAAmB;IACnB,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE;IAChG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE;IAEtF,yEAAyE;IACzE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;IAC/F,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACjD,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG;KACxC;CACF,CAAA"} | ||
| {"version":3,"file":"functions.js","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":";;;AAEA,MAAM,cAAc,GAAG;IACrB,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;CACE,CAAA;AAEV,+EAA+E;AAC/E,8EAA8E;AAC9E,0EAA0E;AAC7D,QAAA,mBAAmB,GAA0B;IACxD,+EAA+E;IAC/E,6BAA6B;IAC7B,cAAc,EAAE;QACd,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC7D,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,KAAK,KAAK,CAAC,GAAG;KACzD;IAED,8BAA8B;IAC9B,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE;IACxF,aAAa,EAAE;QACb,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG;KACvC;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG;KACtC;IAED,4EAA4E;IAC5E,gEAAgE;IAChE,iBAAiB,EAAE;QACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QACxF,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,IAAI,IAAK,CAAC,WAAW,EAAE,GAAG;KAC1F;IAED,mBAAmB;IACnB,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE;IAChG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE;IAEtF,yEAAyE;IACzE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;IAC/F,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACjD,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG;KACxC;CACF,CAAA"} |
+2
-2
| { | ||
| "name": "@valv/clickhouse", | ||
| "version": "0.4.0", | ||
| "version": "0.5.0", | ||
| "description": "ClickHouse adapter for valv — row-level security and access control for AI agents", | ||
@@ -43,3 +43,3 @@ "keywords": [ | ||
| "@clickhouse/client": "^1.0.0", | ||
| "@valv/core": "^0.5.0" | ||
| "@valv/core": "^0.6.0" | ||
| }, | ||
@@ -46,0 +46,0 @@ "publishConfig": { |
| import type { FilterNode } from "@valv/core"; | ||
| export declare function quoteIdent(name: string): string; | ||
| export declare function escapeString(s: string): string; | ||
| export declare function escapeLikePattern(s: string): string; | ||
| export declare function formatValue(v: unknown): string; | ||
| export declare function compileFilter(node: FilterNode): string; | ||
| //# sourceMappingURL=sql.d.ts.map |
| {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAmB9C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAkDtD"} |
-93
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.quoteIdent = quoteIdent; | ||
| exports.escapeString = escapeString; | ||
| exports.escapeLikePattern = escapeLikePattern; | ||
| exports.formatValue = formatValue; | ||
| exports.compileFilter = compileFilter; | ||
| function quoteIdent(name) { | ||
| return "`" + name.replace(/`/g, "``") + "`"; | ||
| } | ||
| function escapeString(s) { | ||
| return s.replace(/\\/g, "\\\\").replace(/'/g, "\\'"); | ||
| } | ||
| function escapeLikePattern(s) { | ||
| return s.replace(/\\/g, "\\\\").replace(/%/g, "\\%").replace(/_/g, "\\_"); | ||
| } | ||
| function formatValue(v) { | ||
| if (v === null || v === undefined) | ||
| return "NULL"; | ||
| if (typeof v === "boolean") | ||
| return v ? "1" : "0"; | ||
| if (typeof v === "number") { | ||
| if (!isFinite(v)) | ||
| throw new Error(`Non-finite number value not allowed in query: ${v}`); | ||
| return String(v); | ||
| } | ||
| if (v instanceof Date) { | ||
| const pad = (n) => String(n).padStart(2, "0"); | ||
| const y = v.getUTCFullYear(); | ||
| const mo = pad(v.getUTCMonth() + 1); | ||
| const d = pad(v.getUTCDate()); | ||
| const h = pad(v.getUTCHours()); | ||
| const mi = pad(v.getUTCMinutes()); | ||
| const s = pad(v.getUTCSeconds()); | ||
| return `'${y}-${mo}-${d} ${h}:${mi}:${s}'`; | ||
| } | ||
| if (typeof v === "string") | ||
| return `'${escapeString(v)}'`; | ||
| return `'${escapeString(JSON.stringify(v))}'`; | ||
| } | ||
| function compileFilter(node) { | ||
| switch (node.type) { | ||
| case "eq": | ||
| if (node.value === null || node.value === undefined) { | ||
| return `${quoteIdent(node.field)} IS NULL`; | ||
| } | ||
| return `${quoteIdent(node.field)} = ${formatValue(node.value)}`; | ||
| case "in": { | ||
| if (node.values.length === 0) | ||
| return "1 = 0"; | ||
| const list = node.values.map(formatValue).join(", "); | ||
| return `${quoteIdent(node.field)} IN (${list})`; | ||
| } | ||
| case "range": { | ||
| const parts = []; | ||
| if (node.gte !== undefined) | ||
| parts.push(`${quoteIdent(node.field)} >= ${formatValue(node.gte)}`); | ||
| if (node.lte !== undefined) | ||
| parts.push(`${quoteIdent(node.field)} <= ${formatValue(node.lte)}`); | ||
| if (node.gt !== undefined) | ||
| parts.push(`${quoteIdent(node.field)} > ${formatValue(node.gt)}`); | ||
| if (node.lt !== undefined) | ||
| parts.push(`${quoteIdent(node.field)} < ${formatValue(node.lt)}`); | ||
| return parts.join(" AND "); | ||
| } | ||
| case "like": { | ||
| const escaped = escapeLikePattern(node.value); | ||
| let pattern; | ||
| if (node.mode === "startsWith") | ||
| pattern = `${escaped}%`; | ||
| else if (node.mode === "endsWith") | ||
| pattern = `%${escaped}`; | ||
| else | ||
| pattern = `%${escaped}%`; | ||
| return `${quoteIdent(node.field)} ILIKE '${escapeString(pattern)}'`; | ||
| } | ||
| case "null": | ||
| return node.isNull | ||
| ? `${quoteIdent(node.field)} IS NULL` | ||
| : `${quoteIdent(node.field)} IS NOT NULL`; | ||
| case "and": | ||
| if (node.filters.length === 0) | ||
| return "1 = 1"; | ||
| return "(" + node.filters.map(compileFilter).join(" AND ") + ")"; | ||
| case "or": | ||
| if (node.filters.length === 0) | ||
| return "1 = 0"; | ||
| return "(" + node.filters.map(compileFilter).join(" OR ") + ")"; | ||
| case "not": | ||
| return `NOT (${compileFilter(node.filter)})`; | ||
| } | ||
| } | ||
| //# sourceMappingURL=sql.js.map |
| {"version":3,"file":"sql.js","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":";;AAEA,gCAEC;AAED,oCAEC;AAED,8CAEC;AAED,kCAmBC;AAED,sCAkDC;AAnFD,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAA;AAC7C,CAAC;AAED,SAAgB,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACtD,CAAC;AAED,SAAgB,iBAAiB,CAAC,CAAS;IACzC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAC3E,CAAC;AAED,SAAgB,WAAW,CAAC,CAAU;IACpC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IAChD,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;IAChD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,EAAE,CAAC,CAAA;QACvF,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;IACD,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACrD,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAA;QAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAA;QACnC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;QAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAA;QAChC,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAA;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,CAAA;IACxD,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAC/C,CAAC;AAED,SAAgB,aAAa,CAAC,IAAgB;IAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,IAAI;YACP,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACpD,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAA;YAC5C,CAAC;YACD,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;QAEjE,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAA;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpD,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAA;QACjD,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAa,EAAE,CAAA;YAC1B,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrE,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;gBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACrE,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAC5F,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAC5F,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC7C,IAAI,OAAe,CAAA;YACnB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO,GAAG,GAAG,OAAO,GAAG,CAAA;iBAClD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;gBAAE,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;;gBACrD,OAAO,GAAG,IAAI,OAAO,GAAG,CAAA;YAC7B,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,YAAY,CAAC,OAAO,CAAC,GAAG,CAAA;QACrE,CAAC;QAED,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,MAAM;gBAChB,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;gBACrC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAA;QAE7C,KAAK,KAAK;YACR,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAA;YAC7C,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAA;QAElE,KAAK,IAAI;YACP,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAA;YAC7C,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAA;QAEjE,KAAK,KAAK;YACR,OAAO,QAAQ,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAA;IAChD,CAAC;AACH,CAAC"} |
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
42657
-6.78%495
-6.07%1
Infinity%