@64mb/freelens-power 1.6.0 → 2.0.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 (47) hide show
  1. package/README.md +1 -1
  2. package/out/main/common/resource-search-kind-priority.js +23 -0
  3. package/out/main/common/resource-search-kind-priority.js.map +1 -0
  4. package/out/main/power-logs-query.js +1 -0
  5. package/out/main/power-logs-query.js.map +1 -1
  6. package/out/main/resource-search-database.js +7 -2
  7. package/out/main/resource-search-database.js.map +1 -1
  8. package/out/main/resource-search-worker.js +6 -2
  9. package/out/main/resource-search-worker.js.map +1 -1
  10. package/out/renderer/_virtual/_global-external_react.js +2 -1
  11. package/out/renderer/power-log-json-cell.js +74 -0
  12. package/out/renderer/power-log-json-cell.js.map +1 -0
  13. package/out/renderer/power-log-json-fields.js +144 -0
  14. package/out/renderer/power-log-json-fields.js.map +1 -0
  15. package/out/renderer/power-log-json.js +139 -20
  16. package/out/renderer/power-log-json.js.map +1 -1
  17. package/out/renderer/power-log-message-tokens.js +60 -0
  18. package/out/renderer/power-log-message-tokens.js.map +1 -0
  19. package/out/renderer/power-log-message.js +26 -0
  20. package/out/renderer/power-log-message.js.map +1 -0
  21. package/out/renderer/power-logs-sql-row.js +2 -2
  22. package/out/renderer/power-logs-sql-row.js.map +1 -1
  23. package/out/renderer/power-logs.css.js +36 -6
  24. package/out/renderer/power-logs.css.js.map +1 -1
  25. package/out/renderer/power-logs.js +249 -28
  26. package/out/renderer/power-logs.js.map +1 -1
  27. package/out/renderer/preferences/logs-preferences.js +159 -38
  28. package/out/renderer/preferences/logs-preferences.js.map +1 -1
  29. package/out/renderer/resource-search-model.js +2 -1
  30. package/out/renderer/resource-search-model.js.map +1 -1
  31. package/out/renderer/resource-search-sync.js +1 -1
  32. package/out/renderer/resource-search-sync.js.map +1 -1
  33. package/out/renderer/resource-search.js +84 -81
  34. package/out/renderer/resource-search.js.map +1 -1
  35. package/out/renderer/src/common/power-log-field-filters.js +92 -0
  36. package/out/renderer/src/common/power-log-field-filters.js.map +1 -0
  37. package/out/renderer/src/common/power-log-json-filter-sql.js +106 -0
  38. package/out/renderer/src/common/power-log-json-filter-sql.js.map +1 -0
  39. package/out/renderer/src/common/power-log-json-preset.js +36 -0
  40. package/out/renderer/src/common/power-log-json-preset.js.map +1 -0
  41. package/out/renderer/src/common/power-log-level.js +171 -0
  42. package/out/renderer/src/common/power-log-level.js.map +1 -0
  43. package/out/renderer/src/common/power-log-parser.js +7 -29
  44. package/out/renderer/src/common/power-log-parser.js.map +1 -1
  45. package/out/renderer/src/common/resource-search-kind-priority.js +28 -0
  46. package/out/renderer/src/common/resource-search-kind-priority.js.map +1 -0
  47. package/package.json +1 -1
@@ -0,0 +1,106 @@
1
+ const require_power_log_field_filters = require("./power-log-field-filters.js");
2
+ //#region src/common/power-log-json-filter-sql.ts
3
+ var maxSqlLength = 65536;
4
+ var normalizedType = (type) => `CASE WHEN ${type} IN ('integer', 'real') THEN 'number' ELSE ${type} END`;
5
+ var quoteIdentifier = (value) => `"${value.replace(/"/g, "\"\"")}"`;
6
+ var literal = (value) => value.split("\0").map((part) => `'${part.replace(/'/g, "''")}'`).join(" || char(0) || ");
7
+ var tree = (name) => `SELECT path, ${normalizedType("type")}, CASE
8
+ WHEN type IN ('object', 'array') THEN NULL
9
+ WHEN type IN ('integer', 'real') THEN CAST(value AS REAL)
10
+ ELSE value END FROM ${name}`;
11
+ var descendants = (name, root) => `${name}(path, value, type) AS (
12
+ ${root}
13
+ UNION ALL
14
+ SELECT json_insert(parent.path, '$[#]', j.key), j.value, j.type
15
+ FROM ${name} AS parent, json_each(CASE WHEN parent.type IN ('object', 'array') THEN parent.value ELSE NULL END) AS j
16
+ )`;
17
+ function predicate(filter) {
18
+ if (!filter || typeof filter.column !== "string" || !filter.column || filter.column.includes("\0") || !Array.isArray(filter.path) || filter.path.length > 128 || filter.operator !== "eq" && filter.operator !== "neq" || !require_power_log_field_filters.jsonValuesEqual(filter.value, filter.value)) throw new Error("Invalid JSON field filter");
19
+ const steps = [];
20
+ for (const [depth, part] of filter.path.entries()) {
21
+ if (typeof part !== "string" && !(typeof part === "number" && Number.isSafeInteger(part) && part >= 0)) throw new Error("Invalid JSON field path");
22
+ steps.push(`(walk.depth = ${depth} AND typeof(j.key) = '${typeof part === "string" ? "text" : "integer"}' AND j.key = ${typeof part === "string" ? literal(part) : part})`);
23
+ }
24
+ let encoded;
25
+ try {
26
+ encoded = JSON.stringify(filter.value);
27
+ } catch {
28
+ throw new Error("JSON field filter value cannot be encoded");
29
+ }
30
+ const source = `"__power_rows".${quoteIdentifier(filter.column)}`;
31
+ const safe = `CASE WHEN json_valid(${source}) THEN ${source} ELSE NULL END`;
32
+ const recursion = steps.length ? `
33
+ UNION ALL
34
+ SELECT walk.depth + 1, j.value, j.type
35
+ FROM walk, json_each(CASE WHEN walk.type IN ('object', 'array') THEN walk.value ELSE NULL END) AS j
36
+ WHERE ${steps.join(" OR ")}` : "";
37
+ const leftTree = tree("actual_tree");
38
+ const rightTree = tree("expected_tree");
39
+ const equal = `EXISTS (
40
+ SELECT 1 FROM walk, wanted WHERE walk.depth = ${filter.path.length}
41
+ AND CASE
42
+ WHEN walk.type IS NULL OR ${normalizedType("walk.type")} != ${normalizedType("wanted.type")} THEN 0
43
+ WHEN walk.type IN ('object', 'array') THEN
44
+ NOT EXISTS (${leftTree} EXCEPT ${rightTree}) AND NOT EXISTS (${rightTree} EXCEPT ${leftTree})
45
+ WHEN walk.type IN ('integer', 'real') THEN CAST(walk.value AS REAL) IS CAST(wanted.value AS REAL)
46
+ ELSE walk.value IS wanted.value
47
+ END
48
+ )`;
49
+ return `(WITH RECURSIVE walk(depth, value, type) AS (
50
+ SELECT 0, json_extract(${safe}, '$'), json_type(${safe})${recursion}
51
+ ), wanted(value, type) AS (
52
+ SELECT json_extract(${literal(encoded)}, '$'), json_type(${literal(encoded)})
53
+ ), ${descendants("actual_tree", `SELECT json_array(), value, type FROM walk WHERE depth = ${filter.path.length}`)},
54
+ ${descendants("expected_tree", "SELECT json_array(), value, type FROM wanted")}
55
+ SELECT ${filter.operator === "neq" ? "NOT " : ""}${equal})`;
56
+ }
57
+ function withoutFinalSemicolon(sql) {
58
+ let lastCode = -1;
59
+ for (let index = 0; index < sql.length;) {
60
+ const character = sql[index];
61
+ if (/\s/.test(character)) {
62
+ index++;
63
+ continue;
64
+ }
65
+ if (sql.startsWith("--", index)) {
66
+ const newline = sql.indexOf("\n", index + 2);
67
+ index = newline < 0 ? sql.length : newline + 1;
68
+ continue;
69
+ }
70
+ if (sql.startsWith("/*", index)) {
71
+ const end = sql.indexOf("*/", index + 2);
72
+ index = end < 0 ? sql.length : end + 2;
73
+ continue;
74
+ }
75
+ lastCode = index;
76
+ if (character === "'" || character === "\"" || character === "`" || character === "[") {
77
+ const closing = character === "[" ? "]" : character;
78
+ for (index++; index < sql.length; index++) {
79
+ if (sql[index] !== closing) continue;
80
+ if (closing !== "]" && sql[index + 1] === closing) {
81
+ index++;
82
+ continue;
83
+ }
84
+ index++;
85
+ break;
86
+ }
87
+ } else index++;
88
+ }
89
+ return sql[lastCode] === ";" ? sql.slice(0, lastCode) + sql.slice(lastCode + 1) : sql;
90
+ }
91
+ function buildJsonFilterSql(baseSql, filters) {
92
+ if (typeof baseSql !== "string" || !Array.isArray(filters)) throw new Error("Invalid JSON filter query");
93
+ if (!filters.length) return baseSql;
94
+ const base = withoutFinalSemicolon(baseSql.trim());
95
+ if (!base) throw new Error("JSON filter query must not be empty");
96
+ let sql = `SELECT * FROM (${base}\n) AS "__power_rows" WHERE `;
97
+ for (const [index, filter] of filters.entries()) {
98
+ sql += `${index ? " AND " : ""}${predicate(filter)}`;
99
+ if (sql.length > maxSqlLength) throw new Error("JSON filter query exceeds 65536 characters");
100
+ }
101
+ return sql;
102
+ }
103
+ //#endregion
104
+ exports.buildJsonFilterSql = buildJsonFilterSql;
105
+
106
+ //# sourceMappingURL=power-log-json-filter-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-log-json-filter-sql.js","names":[],"sources":["../../../../src/common/power-log-json-filter-sql.ts"],"sourcesContent":["import { type JsonFieldFilter, jsonValuesEqual } from \"./power-log-field-filters\";\n\nexport interface SqlJsonFieldFilter extends JsonFieldFilter {\n column: string;\n}\n\nconst maxSqlLength = 65536;\nconst normalizedType = (type: string) => `CASE WHEN ${type} IN ('integer', 'real') THEN 'number' ELSE ${type} END`;\nconst quoteIdentifier = (value: string) => `\"${value.replace(/\"/g, '\"\"')}\"`;\nconst literal = (value: string): string =>\n value\n .split(\"\\0\")\n .map((part) => `'${part.replace(/'/g, \"''\")}'`)\n .join(\" || char(0) || \");\nconst tree = (name: string) => `SELECT path, ${normalizedType(\"type\")}, CASE\n WHEN type IN ('object', 'array') THEN NULL\n WHEN type IN ('integer', 'real') THEN CAST(value AS REAL)\n ELSE value END FROM ${name}`;\nconst descendants = (name: string, root: string) => `${name}(path, value, type) AS (\n ${root}\n UNION ALL\n SELECT json_insert(parent.path, '$[#]', j.key), j.value, j.type\n FROM ${name} AS parent, json_each(CASE WHEN parent.type IN ('object', 'array') THEN parent.value ELSE NULL END) AS j\n )`;\n\nfunction predicate(filter: SqlJsonFieldFilter): string {\n if (\n !filter ||\n typeof filter.column !== \"string\" ||\n !filter.column ||\n filter.column.includes(\"\\0\") ||\n !Array.isArray(filter.path) ||\n filter.path.length > 128 ||\n (filter.operator !== \"eq\" && filter.operator !== \"neq\") ||\n !jsonValuesEqual(filter.value, filter.value)\n )\n throw new Error(\"Invalid JSON field filter\");\n const steps: string[] = [];\n for (const [depth, part] of filter.path.entries()) {\n if (typeof part !== \"string\" && !(typeof part === \"number\" && Number.isSafeInteger(part) && part >= 0)) {\n throw new Error(\"Invalid JSON field path\");\n }\n steps.push(\n `(walk.depth = ${depth} AND typeof(j.key) = '${typeof part === \"string\" ? \"text\" : \"integer\"}' AND j.key = ${typeof part === \"string\" ? literal(part) : part})`,\n );\n }\n let encoded: string;\n try {\n encoded = JSON.stringify(filter.value);\n } catch {\n throw new Error(\"JSON field filter value cannot be encoded\");\n }\n const source = `\"__power_rows\".${quoteIdentifier(filter.column)}`;\n const safe = `CASE WHEN json_valid(${source}) THEN ${source} ELSE NULL END`;\n const recursion = steps.length\n ? `\n UNION ALL\n SELECT walk.depth + 1, j.value, j.type\n FROM walk, json_each(CASE WHEN walk.type IN ('object', 'array') THEN walk.value ELSE NULL END) AS j\n WHERE ${steps.join(\" OR \")}`\n : \"\";\n const leftTree = tree(\"actual_tree\");\n const rightTree = tree(\"expected_tree\");\n const equal = `EXISTS (\n SELECT 1 FROM walk, wanted WHERE walk.depth = ${filter.path.length}\n AND CASE\n WHEN walk.type IS NULL OR ${normalizedType(\"walk.type\")} != ${normalizedType(\"wanted.type\")} THEN 0\n WHEN walk.type IN ('object', 'array') THEN\n NOT EXISTS (${leftTree} EXCEPT ${rightTree}) AND NOT EXISTS (${rightTree} EXCEPT ${leftTree})\n WHEN walk.type IN ('integer', 'real') THEN CAST(walk.value AS REAL) IS CAST(wanted.value AS REAL)\n ELSE walk.value IS wanted.value\n END\n )`;\n return `(WITH RECURSIVE walk(depth, value, type) AS (\n SELECT 0, json_extract(${safe}, '$'), json_type(${safe})${recursion}\n ), wanted(value, type) AS (\n SELECT json_extract(${literal(encoded)}, '$'), json_type(${literal(encoded)})\n ), ${descendants(\"actual_tree\", `SELECT json_array(), value, type FROM walk WHERE depth = ${filter.path.length}`)},\n ${descendants(\"expected_tree\", \"SELECT json_array(), value, type FROM wanted\")}\n SELECT ${filter.operator === \"neq\" ? \"NOT \" : \"\"}${equal})`;\n}\n\nfunction withoutFinalSemicolon(sql: string): string {\n let lastCode = -1;\n for (let index = 0; index < sql.length; ) {\n const character = sql[index];\n if (/\\s/.test(character)) {\n index++;\n continue;\n }\n if (sql.startsWith(\"--\", index)) {\n const newline = sql.indexOf(\"\\n\", index + 2);\n index = newline < 0 ? sql.length : newline + 1;\n continue;\n }\n if (sql.startsWith(\"/*\", index)) {\n const end = sql.indexOf(\"*/\", index + 2);\n index = end < 0 ? sql.length : end + 2;\n continue;\n }\n lastCode = index;\n if (character === \"'\" || character === '\"' || character === \"`\" || character === \"[\") {\n const closing = character === \"[\" ? \"]\" : character;\n for (index++; index < sql.length; index++) {\n if (sql[index] !== closing) continue;\n if (closing !== \"]\" && sql[index + 1] === closing) {\n index++;\n continue;\n }\n index++;\n break;\n }\n } else index++;\n }\n return sql[lastCode] === \";\" ? sql.slice(0, lastCode) + sql.slice(lastCode + 1) : sql;\n}\n\nexport function buildJsonFilterSql(baseSql: string, filters: SqlJsonFieldFilter[]): string {\n if (typeof baseSql !== \"string\" || !Array.isArray(filters)) throw new Error(\"Invalid JSON filter query\");\n if (!filters.length) return baseSql;\n const base = withoutFinalSemicolon(baseSql.trim());\n if (!base) throw new Error(\"JSON filter query must not be empty\");\n let sql = `SELECT * FROM (${base}\\n) AS \"__power_rows\" WHERE `;\n for (const [index, filter] of filters.entries()) {\n sql += `${index ? \" AND \" : \"\"}${predicate(filter)}`;\n if (sql.length > maxSqlLength) throw new Error(\"JSON filter query exceeds 65536 characters\");\n }\n return sql;\n}\n"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ //#region src/common/power-log-json-preset.ts
2
+ var JSON_KEY_DISCOVERY_SQL = `WITH recent AS (
3
+ SELECT fieldsJson FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200
4
+ ), json_recent AS (
5
+ SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL ORDER BY timestamp DESC NULLS LAST LIMIT 100
6
+ ), samples AS (
7
+ SELECT fieldsJson FROM recent UNION ALL SELECT fieldsJson FROM json_recent
8
+ )
9
+ SELECT field.key FROM samples JOIN json_each(samples.fieldsJson) AS field
10
+ WHERE typeof(field.key) = 'text'
11
+ UNION
12
+ SELECT 'message' FROM recent WHERE fieldsJson IS NULL
13
+ LIMIT 65`;
14
+ function buildJsonProjectionSql(keys, options = {}) {
15
+ const fallbackSql = options.recent ? "SELECT fieldsJson, message, level, container, pod, timestamp FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200" : "SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100";
16
+ if (!keys.length || keys.length > 64) return fallbackSql;
17
+ const aliases = /* @__PURE__ */ new Set();
18
+ for (const key of keys) {
19
+ const alias = key.replace(/[A-Z]/g, (character) => character.toLowerCase());
20
+ if (key.length > 128 || key.includes("\0") || aliases.has(alias)) return fallbackSql;
21
+ aliases.add(alias);
22
+ }
23
+ const columns = keys.map((key) => {
24
+ const literal = `'${key.replace(/'/g, "''")}'`;
25
+ const identifier = `"${key.replace(/"/g, "\"\"")}"`;
26
+ const lookup = `(SELECT value FROM json_each(logs.fieldsJson) WHERE key = ${literal} LIMIT 1)`;
27
+ return `${options.recent && key === "message" ? `CASE WHEN logs.fieldsJson IS NULL THEN logs.message ELSE ${lookup} END` : lookup} AS ${identifier}`;
28
+ });
29
+ const tail = options.recent ? "ORDER BY logs.timestamp DESC NULLS LAST\nLIMIT 200" : "WHERE fieldsJson IS NOT NULL\nORDER BY logs.timestamp DESC NULLS LAST\nLIMIT 100";
30
+ return `SELECT\n ${columns.join(",\n ")}\nFROM logs\n${tail}`;
31
+ }
32
+ //#endregion
33
+ exports.JSON_KEY_DISCOVERY_SQL = JSON_KEY_DISCOVERY_SQL;
34
+ exports.buildJsonProjectionSql = buildJsonProjectionSql;
35
+
36
+ //# sourceMappingURL=power-log-json-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-log-json-preset.js","names":[],"sources":["../../../../src/common/power-log-json-preset.ts"],"sourcesContent":["export const JSON_KEY_DISCOVERY_SQL = `WITH recent AS (\n SELECT fieldsJson FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200\n), json_recent AS (\n SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL ORDER BY timestamp DESC NULLS LAST LIMIT 100\n), samples AS (\n SELECT fieldsJson FROM recent UNION ALL SELECT fieldsJson FROM json_recent\n)\nSELECT field.key FROM samples JOIN json_each(samples.fieldsJson) AS field\nWHERE typeof(field.key) = 'text'\nUNION\nSELECT 'message' FROM recent WHERE fieldsJson IS NULL\nLIMIT 65`;\n\nexport function buildJsonProjectionSql(keys: string[], options: { recent?: boolean } = {}): string {\n const fallbackSql = options.recent\n ? \"SELECT fieldsJson, message, level, container, pod, timestamp FROM logs ORDER BY timestamp DESC NULLS LAST LIMIT 200\"\n : \"SELECT fieldsJson FROM logs WHERE fieldsJson IS NOT NULL LIMIT 100\";\n if (!keys.length || keys.length > 64) return fallbackSql;\n const aliases = new Set<string>();\n for (const key of keys) {\n const alias = key.replace(/[A-Z]/g, (character) => character.toLowerCase());\n if (key.length > 128 || key.includes(\"\\0\") || aliases.has(alias)) return fallbackSql;\n aliases.add(alias);\n }\n const columns = keys.map((key) => {\n const literal = `'${key.replace(/'/g, \"''\")}'`;\n const identifier = `\"${key.replace(/\"/g, '\"\"')}\"`;\n const lookup = `(SELECT value FROM json_each(logs.fieldsJson) WHERE key = ${literal} LIMIT 1)`;\n const value =\n options.recent && key === \"message\"\n ? `CASE WHEN logs.fieldsJson IS NULL THEN logs.message ELSE ${lookup} END`\n : lookup;\n return `${value} AS ${identifier}`;\n });\n const tail = options.recent\n ? \"ORDER BY logs.timestamp DESC NULLS LAST\\nLIMIT 200\"\n : \"WHERE fieldsJson IS NOT NULL\\nORDER BY logs.timestamp DESC NULLS LAST\\nLIMIT 100\";\n return `SELECT\\n ${columns.join(\",\\n \")}\\nFROM logs\\n${tail}`;\n}\n"],"mappings":";AAAA,IAAa,yBAAyB;;;;;;;;;;;;AAatC,SAAgB,uBAAuB,MAAgB,UAAgC,CAAC,GAAW;CACjG,MAAM,cAAc,QAAQ,SACxB,wHACA;CACJ,IAAI,CAAC,KAAK,UAAU,KAAK,SAAS,IAAI,OAAO;CAC7C,MAAM,0BAAU,IAAI,IAAY;CAChC,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,IAAI,QAAQ,WAAW,cAAc,UAAU,YAAY,CAAC;EAC1E,IAAI,IAAI,SAAS,OAAO,IAAI,SAAS,IAAI,KAAK,QAAQ,IAAI,KAAK,GAAG,OAAO;EACzE,QAAQ,IAAI,KAAK;CACnB;CACA,MAAM,UAAU,KAAK,KAAK,QAAQ;EAChC,MAAM,UAAU,IAAI,IAAI,QAAQ,MAAM,IAAI,EAAE;EAC5C,MAAM,aAAa,IAAI,IAAI,QAAQ,MAAM,MAAI,EAAE;EAC/C,MAAM,SAAS,6DAA6D,QAAQ;EAKpF,OAAO,GAHL,QAAQ,UAAU,QAAQ,YACtB,4DAA4D,OAAO,QACnE,OACU,MAAM;CACxB,CAAC;CACD,MAAM,OAAO,QAAQ,SACjB,uDACA;CACJ,OAAO,aAAa,QAAQ,KAAK,OAAO,EAAE,eAAe;AAC3D"}
@@ -0,0 +1,171 @@
1
+ //#region src/common/power-log-level.ts
2
+ var names = {
3
+ trace: "trace",
4
+ verbose: "trace",
5
+ vrb: "trace",
6
+ trc: "trace",
7
+ trce: "trace",
8
+ fine: "debug",
9
+ finer: "trace",
10
+ finest: "trace",
11
+ debug: "debug",
12
+ dbg: "debug",
13
+ dbug: "debug",
14
+ info: "info",
15
+ information: "info",
16
+ informational: "info",
17
+ notice: "info",
18
+ inf: "info",
19
+ success: "info",
20
+ warn: "warn",
21
+ warning: "warn",
22
+ wrn: "warn",
23
+ error: "error",
24
+ err: "error",
25
+ severe: "error",
26
+ fail: "error",
27
+ dpanic: "error",
28
+ fatal: "fatal",
29
+ critical: "fatal",
30
+ crit: "fatal",
31
+ ftl: "fatal",
32
+ panic: "fatal",
33
+ alert: "fatal",
34
+ emerg: "fatal",
35
+ emergency: "fatal"
36
+ };
37
+ var pino = {
38
+ 10: "trace",
39
+ 20: "debug",
40
+ 30: "info",
41
+ 40: "warn",
42
+ 50: "error",
43
+ 60: "fatal"
44
+ };
45
+ var python = {
46
+ 10: "debug",
47
+ 20: "info",
48
+ 30: "warn",
49
+ 40: "error",
50
+ 50: "fatal"
51
+ };
52
+ var oldKeys = [
53
+ "level",
54
+ "severity",
55
+ "loglevel",
56
+ "log_level",
57
+ "levelname"
58
+ ];
59
+ var textKeys = [
60
+ "level_name",
61
+ "Level",
62
+ "LogLevel",
63
+ "severityText",
64
+ "severity_text",
65
+ "SeverityText",
66
+ "log.level",
67
+ "@l"
68
+ ];
69
+ var numberKeys = [
70
+ "severityNumber",
71
+ "severity_number",
72
+ "SeverityNumber"
73
+ ];
74
+ function object(value) {
75
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
76
+ }
77
+ function named(value) {
78
+ if (typeof value !== "string") return "unknown";
79
+ const key = value.trim().toLowerCase();
80
+ return Object.hasOwn(names, key) ? names[key] : "unknown";
81
+ }
82
+ function firstString(...values) {
83
+ return values.find((value) => typeof value === "string");
84
+ }
85
+ function ownValue(record, keys) {
86
+ for (const key of keys) if (record[key] !== void 0 && record[key] !== null) return record[key];
87
+ }
88
+ function structuredLogFields(record) {
89
+ const nested = object(record.record);
90
+ const loguruLevel = object(nested?.level);
91
+ if (typeof record.text === "string" && nested && loguruLevel) return {
92
+ level: typeof loguruLevel.name === "string" ? named(loguruLevel.name) : typeof loguruLevel.no === "number" ? {
93
+ 5: "trace",
94
+ ...python,
95
+ 25: "info"
96
+ }[loguruLevel.no] ?? "unknown" : "unknown",
97
+ message: firstString(nested.message, record.text)
98
+ };
99
+ const primary = ownValue(record, oldKeys);
100
+ const explicit = ownValue(record, textKeys) ?? oldKeys.slice(1).map((key) => record[key]).find((value) => typeof value === "string") ?? object(record.log)?.level;
101
+ let level = "unknown";
102
+ if (typeof primary === "string") level = named(primary);
103
+ else if (explicit !== void 0) level = named(explicit);
104
+ else if (numberKeys.some((key) => record[key] !== void 0)) {
105
+ const value = ownValue(record, numberKeys);
106
+ if (typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= 24) level = [
107
+ "trace",
108
+ "debug",
109
+ "info",
110
+ "warn",
111
+ "error",
112
+ "fatal"
113
+ ][Math.floor((value - 1) / 4)];
114
+ } else if (record.levelno !== void 0) {
115
+ if (typeof record.levelno === "number") level = python[record.levelno] ?? "unknown";
116
+ } else if (typeof record.level === "number") level = pino[record.level] ?? "unknown";
117
+ else if (typeof record["@t"] === "string" && (typeof record["@m"] === "string" || typeof record["@mt"] === "string")) level = "info";
118
+ const body = record.body ?? record.Body;
119
+ return {
120
+ level,
121
+ message: firstString(record.message, record.msg, record.text, record.Message, record.RenderedMessage, record["@m"], record["@mt"], object(record.fields)?.message, numberKeys.some((key) => record[key] !== void 0) || [
122
+ "severityText",
123
+ "severity_text",
124
+ "SeverityText"
125
+ ].some((key) => record[key] !== void 0) ? typeof body === "string" ? body : object(body)?.stringValue : void 0)
126
+ };
127
+ }
128
+ function plainLogLevel(message) {
129
+ const klog = /^([IWEF])\d{4}\s\d{2}:\d{2}:\d{2}\.\d+\s+\d+\s+[^\s]+:\d+\]/.exec(message);
130
+ if (klog) return {
131
+ I: "info",
132
+ W: "warn",
133
+ E: "error",
134
+ F: "fatal"
135
+ }[klog[1]];
136
+ const syslog = /^<(\d{1,3})>(?=\d{1,2}\s|[A-Z][a-z]{2} \d)/.exec(message);
137
+ if (syslog && Number(syslog[1]) <= 191) return [
138
+ "fatal",
139
+ "fatal",
140
+ "fatal",
141
+ "error",
142
+ "warn",
143
+ "info",
144
+ "info",
145
+ "debug"
146
+ ][Number(syslog[1]) % 8];
147
+ const field = /\s*([A-Za-z_][A-Za-z0-9_.]*)=("(?:\\.|[^"\\])*"|[^"\s]+)(?=\s|$)/y;
148
+ let cursor = 0;
149
+ for (let count = 0; count < 256; count++) {
150
+ field.lastIndex = cursor;
151
+ const match = field.exec(message);
152
+ if (!match) break;
153
+ cursor = field.lastIndex;
154
+ if ([...oldKeys, ...textKeys].includes(match[1])) try {
155
+ return named(match[2].startsWith("\"") ? JSON.parse(match[2]) : match[2]);
156
+ } catch {
157
+ return "unknown";
158
+ }
159
+ }
160
+ const header = /^\s*(\[)?(?:(\d{4}[-/]\d{2}[-/]\d{2}[ T]\d{2}:\d{2}:\d{2}(?:[.,]\d{1,9})?(?:Z|[+-]\d{2}:?\d{2})?|\d{2}:\d{2}:\d{2}(?:[.,]\d{1,9})?)\s*[| ]\s*)?([A-Za-z]+)(?=$|[\s\]:|,-])/.exec(message);
161
+ if (!header) return "unknown";
162
+ const word = header[3];
163
+ const delimiter = message.slice(header[0].length).trimStart()[0];
164
+ if (!header[1] && !header[2] && word !== word.toUpperCase() && delimiter !== ":") return "unknown";
165
+ return named(word);
166
+ }
167
+ //#endregion
168
+ exports.plainLogLevel = plainLogLevel;
169
+ exports.structuredLogFields = structuredLogFields;
170
+
171
+ //# sourceMappingURL=power-log-level.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power-log-level.js","names":[],"sources":["../../../../src/common/power-log-level.ts"],"sourcesContent":["import type { LogLevel } from \"./power-logs\";\n\nconst names: Record<string, LogLevel> = {\n trace: \"trace\",\n verbose: \"trace\",\n vrb: \"trace\",\n trc: \"trace\",\n trce: \"trace\",\n fine: \"debug\",\n finer: \"trace\",\n finest: \"trace\",\n debug: \"debug\",\n dbg: \"debug\",\n dbug: \"debug\",\n info: \"info\",\n information: \"info\",\n informational: \"info\",\n notice: \"info\",\n inf: \"info\",\n success: \"info\",\n warn: \"warn\",\n warning: \"warn\",\n wrn: \"warn\",\n error: \"error\",\n err: \"error\",\n severe: \"error\",\n fail: \"error\",\n dpanic: \"error\",\n fatal: \"fatal\",\n critical: \"fatal\",\n crit: \"fatal\",\n ftl: \"fatal\",\n panic: \"fatal\",\n alert: \"fatal\",\n emerg: \"fatal\",\n emergency: \"fatal\",\n};\nconst pino: Record<number, LogLevel> = { 10: \"trace\", 20: \"debug\", 30: \"info\", 40: \"warn\", 50: \"error\", 60: \"fatal\" };\nconst python: Record<number, LogLevel> = { 10: \"debug\", 20: \"info\", 30: \"warn\", 40: \"error\", 50: \"fatal\" };\nconst oldKeys = [\"level\", \"severity\", \"loglevel\", \"log_level\", \"levelname\"];\nconst textKeys = [\n \"level_name\",\n \"Level\",\n \"LogLevel\",\n \"severityText\",\n \"severity_text\",\n \"SeverityText\",\n \"log.level\",\n \"@l\",\n];\nconst numberKeys = [\"severityNumber\", \"severity_number\", \"SeverityNumber\"];\n\nfunction object(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\nfunction named(value: unknown): LogLevel {\n if (typeof value !== \"string\") return \"unknown\";\n const key = value.trim().toLowerCase();\n return Object.hasOwn(names, key) ? names[key] : \"unknown\";\n}\nfunction firstString(...values: unknown[]): string | undefined {\n return values.find((value): value is string => typeof value === \"string\");\n}\nfunction ownValue(record: Record<string, unknown>, keys: string[]): unknown {\n for (const key of keys) if (record[key] !== undefined && record[key] !== null) return record[key];\n return undefined;\n}\n\nexport function structuredLogFields(record: Record<string, unknown>): { level: LogLevel; message?: string } {\n const nested = object(record.record);\n const loguruLevel = object(nested?.level);\n if (typeof record.text === \"string\" && nested && loguruLevel) {\n const level =\n typeof loguruLevel.name === \"string\"\n ? named(loguruLevel.name)\n : typeof loguruLevel.no === \"number\"\n ? (({ 5: \"trace\", ...python, 25: \"info\" } as Record<number, LogLevel>)[loguruLevel.no] ?? \"unknown\")\n : \"unknown\";\n return { level, message: firstString(nested.message, record.text) };\n }\n const primary = ownValue(record, oldKeys);\n const explicit =\n ownValue(record, textKeys) ??\n oldKeys\n .slice(1)\n .map((key) => record[key])\n .find((value) => typeof value === \"string\") ??\n object(record.log)?.level;\n let level: LogLevel = \"unknown\";\n if (typeof primary === \"string\") level = named(primary);\n else if (explicit !== undefined) level = named(explicit);\n else if (numberKeys.some((key) => record[key] !== undefined)) {\n const value = ownValue(record, numberKeys);\n if (typeof value === \"number\" && Number.isInteger(value) && value >= 1 && value <= 24)\n level = ([\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"] as LogLevel[])[Math.floor((value - 1) / 4)];\n } else if (record.levelno !== undefined) {\n if (typeof record.levelno === \"number\") level = python[record.levelno] ?? \"unknown\";\n } else if (typeof record.level === \"number\") level = pino[record.level] ?? \"unknown\";\n else if (typeof record[\"@t\"] === \"string\" && (typeof record[\"@m\"] === \"string\" || typeof record[\"@mt\"] === \"string\"))\n level = \"info\";\n const body = record.body ?? record.Body;\n return {\n level,\n message: firstString(\n record.message,\n record.msg,\n record.text,\n record.Message,\n record.RenderedMessage,\n record[\"@m\"],\n record[\"@mt\"],\n object(record.fields)?.message,\n numberKeys.some((key) => record[key] !== undefined) ||\n [\"severityText\", \"severity_text\", \"SeverityText\"].some((key) => record[key] !== undefined)\n ? typeof body === \"string\"\n ? body\n : object(body)?.stringValue\n : undefined,\n ),\n };\n}\n\nexport function plainLogLevel(message: string): LogLevel {\n const klog = /^([IWEF])\\d{4}\\s\\d{2}:\\d{2}:\\d{2}\\.\\d+\\s+\\d+\\s+[^\\s]+:\\d+\\]/.exec(message);\n if (klog) return ({ I: \"info\", W: \"warn\", E: \"error\", F: \"fatal\" } as Record<string, LogLevel>)[klog[1]];\n const syslog = /^<(\\d{1,3})>(?=\\d{1,2}\\s|[A-Z][a-z]{2} \\d)/.exec(message);\n if (syslog && Number(syslog[1]) <= 191)\n return ([\"fatal\", \"fatal\", \"fatal\", \"error\", \"warn\", \"info\", \"info\", \"debug\"] as LogLevel[])[Number(syslog[1]) % 8];\n const field = /\\s*([A-Za-z_][A-Za-z0-9_.]*)=(\"(?:\\\\.|[^\"\\\\])*\"|[^\"\\s]+)(?=\\s|$)/y;\n let cursor = 0;\n for (let count = 0; count < 256; count++) {\n field.lastIndex = cursor;\n const match = field.exec(message);\n if (!match) break;\n cursor = field.lastIndex;\n if ([...oldKeys, ...textKeys].includes(match[1])) {\n try {\n return named(match[2].startsWith('\"') ? JSON.parse(match[2]) : match[2]);\n } catch {\n return \"unknown\";\n }\n }\n }\n const header =\n /^\\s*(\\[)?(?:(\\d{4}[-/]\\d{2}[-/]\\d{2}[ T]\\d{2}:\\d{2}:\\d{2}(?:[.,]\\d{1,9})?(?:Z|[+-]\\d{2}:?\\d{2})?|\\d{2}:\\d{2}:\\d{2}(?:[.,]\\d{1,9})?)\\s*[| ]\\s*)?([A-Za-z]+)(?=$|[\\s\\]:|,-])/.exec(\n message,\n );\n if (!header) return \"unknown\";\n const word = header[3];\n const delimiter = message.slice(header[0].length).trimStart()[0];\n if (!header[1] && !header[2] && word !== word.toUpperCase() && delimiter !== \":\") return \"unknown\";\n return named(word);\n}\n"],"mappings":"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"}
@@ -1,26 +1,7 @@
1
1
  const require_power_logs = require("./power-logs.js");
2
+ const require_power_log_level = require("./power-log-level.js");
2
3
  //#region src/common/power-log-parser.ts
3
4
  var ansi = /\x1b(?:\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1b\\))/g;
4
- var levels = {
5
- trace: "trace",
6
- debug: "debug",
7
- info: "info",
8
- information: "info",
9
- warn: "warn",
10
- warning: "warn",
11
- error: "error",
12
- fatal: "fatal",
13
- critical: "fatal",
14
- panic: "fatal"
15
- };
16
- var pinoLevels = /* @__PURE__ */ new Map([
17
- [10, "trace"],
18
- [20, "debug"],
19
- [30, "info"],
20
- [40, "warn"],
21
- [50, "error"],
22
- [60, "fatal"]
23
- ]);
24
5
  function parseLogLine(line, source) {
25
6
  let message = line.replace(ansi, "").replace(/\r$/, "").replace(/\x00/g, "");
26
7
  let timestamp = null;
@@ -32,23 +13,20 @@ function parseLogLine(line, source) {
32
13
  }
33
14
  let fieldsJson = null;
34
15
  let level = "unknown";
16
+ let structured = false;
35
17
  try {
36
18
  const fields = JSON.parse(message);
37
19
  if (fields && typeof fields === "object" && !Array.isArray(fields)) {
38
20
  const object = fields;
39
- const rawLevel = object.level ?? object.severity ?? object.loglevel ?? object.log_level;
40
- if (typeof rawLevel === "string") level = levels[rawLevel.toLowerCase()] ?? "unknown";
41
- else if (typeof rawLevel === "number") level = pinoLevels.get(rawLevel) ?? "unknown";
42
- const rawMessage = object.message ?? object.msg ?? object.text;
43
- if (typeof rawMessage === "string") message = rawMessage.replace(ansi, "").replace(/\x00/g, "");
21
+ structured = true;
22
+ const extracted = require_power_log_level.structuredLogFields(object);
23
+ level = extracted.level;
24
+ if (extracted.message !== void 0) message = extracted.message.replace(ansi, "").replace(/\x00/g, "");
44
25
  const serialized = JSON.stringify(fields);
45
26
  if (Buffer.byteLength(serialized) <= require_power_logs.POWER_LOGS_LIMITS.recordBytes / 2) fieldsJson = serialized;
46
27
  }
47
28
  } catch {}
48
- if (level === "unknown") {
49
- const match = /(?:^|[\s\[])\b(trace|debug|info|warn(?:ing)?|error|fatal|critical|panic)\b[\s\]:-]?/i.exec(message);
50
- if (match) level = levels[match[1].toLowerCase()] ?? "unknown";
51
- }
29
+ if (!structured) level = require_power_log_level.plainLogLevel(message);
52
30
  const record = {
53
31
  timestamp,
54
32
  pod: source.pod,
@@ -1 +1 @@
1
- {"version":3,"file":"power-log-parser.js","names":[],"sources":["../../../../src/common/power-log-parser.ts"],"sourcesContent":["import { type LogLevel, type LogRecord, type LogSource, POWER_LOGS_LIMITS } from \"./power-logs\";\n\nconst ansi = /\\x1b(?:\\[[0-?]*[ -/]*[@-~]|\\][^\\x07]*(?:\\x07|\\x1b\\\\))/g;\nconst levels: Record<string, LogLevel> = {\n trace: \"trace\",\n debug: \"debug\",\n info: \"info\",\n information: \"info\",\n warn: \"warn\",\n warning: \"warn\",\n error: \"error\",\n fatal: \"fatal\",\n critical: \"fatal\",\n panic: \"fatal\",\n};\nconst pinoLevels = new Map<number, LogLevel>([\n [10, \"trace\"],\n [20, \"debug\"],\n [30, \"info\"],\n [40, \"warn\"],\n [50, \"error\"],\n [60, \"fatal\"],\n]);\nexport function parseLogLine(line: string, source: LogSource): LogRecord {\n let message = line.replace(ansi, \"\").replace(/\\r$/, \"\").replace(/\\x00/g, \"\");\n let timestamp: number | null = null;\n const prefix = /^(\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.\\d{1,9})?(?:Z|[+-]\\d\\d:\\d\\d))\\s/.exec(message);\n if (prefix) {\n const value = Date.parse(prefix[1]);\n if (Number.isFinite(value)) timestamp = value;\n message = message.slice(prefix[0].length);\n }\n let fieldsJson: string | null = null;\n let level: LogLevel = \"unknown\";\n try {\n const fields: unknown = JSON.parse(message);\n if (fields && typeof fields === \"object\" && !Array.isArray(fields)) {\n const object = fields as Record<string, unknown>;\n const rawLevel = object.level ?? object.severity ?? object.loglevel ?? object.log_level;\n if (typeof rawLevel === \"string\") level = levels[rawLevel.toLowerCase()] ?? \"unknown\";\n else if (typeof rawLevel === \"number\") level = pinoLevels.get(rawLevel) ?? \"unknown\";\n const rawMessage = object.message ?? object.msg ?? object.text;\n if (typeof rawMessage === \"string\") message = rawMessage.replace(ansi, \"\").replace(/\\x00/g, \"\");\n const serialized = JSON.stringify(fields);\n if (Buffer.byteLength(serialized) <= POWER_LOGS_LIMITS.recordBytes / 2) fieldsJson = serialized;\n }\n } catch {\n /* malformed structured lines remain plain text */\n }\n if (level === \"unknown\") {\n const match = /(?:^|[\\s\\[])\\b(trace|debug|info|warn(?:ing)?|error|fatal|critical|panic)\\b[\\s\\]:-]?/i.exec(message);\n if (match) level = levels[match[1].toLowerCase()] ?? \"unknown\";\n }\n const record: LogRecord = {\n timestamp,\n pod: source.pod,\n podUid: source.podUid,\n container: source.container,\n level,\n message,\n fieldsJson,\n previous: source.previous === true,\n };\n const serializedBytes = () => Buffer.byteLength(JSON.stringify(record));\n if (serializedBytes() > POWER_LOGS_LIMITS.recordBytes && record.fieldsJson !== null) {\n record.fieldsJson = null;\n record.message += \" [structured fields omitted]\";\n }\n if (serializedBytes() > POWER_LOGS_LIMITS.recordBytes) {\n const characters = Array.from(record.message);\n let low = 0;\n let high = characters.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n record.message = `${characters.slice(0, middle).join(\"\")} [truncated]`;\n if (serializedBytes() <= POWER_LOGS_LIMITS.recordBytes) low = middle;\n else high = middle - 1;\n }\n record.message = `${characters.slice(0, low).join(\"\")} [truncated]`;\n }\n return record;\n}\n\nexport class LogLineDecoder {\n private decoder = new TextDecoder();\n private pending = \"\";\n private dropping = false;\n truncated = false;\n push(chunk: Uint8Array | string, final = false): string[] {\n const text = typeof chunk === \"string\" ? chunk : this.decoder.decode(chunk, { stream: !final });\n const lines: string[] = [];\n for (const part of text.split(/(?<=\\n)/)) {\n const ended = part.endsWith(\"\\n\");\n if (!this.dropping) this.pending += part;\n if (Buffer.byteLength(this.pending) > POWER_LOGS_LIMITS.recordBytes) {\n this.pending = \"\";\n this.dropping = true;\n this.truncated = true;\n }\n if (ended) {\n if (!this.dropping) lines.push(this.pending.replace(/\\r?\\n$/, \"\"));\n this.pending = \"\";\n this.dropping = false;\n }\n }\n if (final && this.pending && !this.dropping) {\n lines.push(this.pending);\n this.pending = \"\";\n }\n return lines;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"power-log-parser.js","names":[],"sources":["../../../../src/common/power-log-parser.ts"],"sourcesContent":["import { plainLogLevel, structuredLogFields } from \"./power-log-level\";\nimport { type LogLevel, type LogRecord, type LogSource, POWER_LOGS_LIMITS } from \"./power-logs\";\n\nconst ansi = /\\x1b(?:\\[[0-?]*[ -/]*[@-~]|\\][^\\x07]*(?:\\x07|\\x1b\\\\))/g;\nexport function parseLogLine(line: string, source: LogSource): LogRecord {\n let message = line.replace(ansi, \"\").replace(/\\r$/, \"\").replace(/\\x00/g, \"\");\n let timestamp: number | null = null;\n const prefix = /^(\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.\\d{1,9})?(?:Z|[+-]\\d\\d:\\d\\d))\\s/.exec(message);\n if (prefix) {\n const value = Date.parse(prefix[1]);\n if (Number.isFinite(value)) timestamp = value;\n message = message.slice(prefix[0].length);\n }\n let fieldsJson: string | null = null;\n let level: LogLevel = \"unknown\";\n let structured = false;\n try {\n const fields: unknown = JSON.parse(message);\n if (fields && typeof fields === \"object\" && !Array.isArray(fields)) {\n const object = fields as Record<string, unknown>;\n structured = true;\n const extracted = structuredLogFields(object);\n level = extracted.level;\n if (extracted.message !== undefined) message = extracted.message.replace(ansi, \"\").replace(/\\x00/g, \"\");\n const serialized = JSON.stringify(fields);\n if (Buffer.byteLength(serialized) <= POWER_LOGS_LIMITS.recordBytes / 2) fieldsJson = serialized;\n }\n } catch {\n /* malformed structured lines remain plain text */\n }\n if (!structured) level = plainLogLevel(message);\n const record: LogRecord = {\n timestamp,\n pod: source.pod,\n podUid: source.podUid,\n container: source.container,\n level,\n message,\n fieldsJson,\n previous: source.previous === true,\n };\n const serializedBytes = () => Buffer.byteLength(JSON.stringify(record));\n if (serializedBytes() > POWER_LOGS_LIMITS.recordBytes && record.fieldsJson !== null) {\n record.fieldsJson = null;\n record.message += \" [structured fields omitted]\";\n }\n if (serializedBytes() > POWER_LOGS_LIMITS.recordBytes) {\n const characters = Array.from(record.message);\n let low = 0;\n let high = characters.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n record.message = `${characters.slice(0, middle).join(\"\")} [truncated]`;\n if (serializedBytes() <= POWER_LOGS_LIMITS.recordBytes) low = middle;\n else high = middle - 1;\n }\n record.message = `${characters.slice(0, low).join(\"\")} [truncated]`;\n }\n return record;\n}\n\nexport class LogLineDecoder {\n private decoder = new TextDecoder();\n private pending = \"\";\n private dropping = false;\n truncated = false;\n push(chunk: Uint8Array | string, final = false): string[] {\n const text = typeof chunk === \"string\" ? chunk : this.decoder.decode(chunk, { stream: !final });\n const lines: string[] = [];\n for (const part of text.split(/(?<=\\n)/)) {\n const ended = part.endsWith(\"\\n\");\n if (!this.dropping) this.pending += part;\n if (Buffer.byteLength(this.pending) > POWER_LOGS_LIMITS.recordBytes) {\n this.pending = \"\";\n this.dropping = true;\n this.truncated = true;\n }\n if (ended) {\n if (!this.dropping) lines.push(this.pending.replace(/\\r?\\n$/, \"\"));\n this.pending = \"\";\n this.dropping = false;\n }\n }\n if (final && this.pending && !this.dropping) {\n lines.push(this.pending);\n this.pending = \"\";\n }\n return lines;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ //#region src/common/resource-search-kind-priority.ts
2
+ var COMMON_RESOURCE_KINDS = [
3
+ "Pod",
4
+ "Deployment",
5
+ "Service",
6
+ "StatefulSet",
7
+ "DaemonSet",
8
+ "Job",
9
+ "CronJob",
10
+ "Ingress",
11
+ "Gateway",
12
+ "HTTPRoute",
13
+ "ConfigMap",
14
+ "Secret",
15
+ "Namespace",
16
+ "Node",
17
+ "PersistentVolumeClaim",
18
+ "PersistentVolume"
19
+ ];
20
+ function resourceKindPriority(kind) {
21
+ const index = COMMON_RESOURCE_KINDS.indexOf(kind);
22
+ return index < 0 ? COMMON_RESOURCE_KINDS.length : index;
23
+ }
24
+ //#endregion
25
+ exports.COMMON_RESOURCE_KINDS = COMMON_RESOURCE_KINDS;
26
+ exports.resourceKindPriority = resourceKindPriority;
27
+
28
+ //# sourceMappingURL=resource-search-kind-priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-search-kind-priority.js","names":[],"sources":["../../../../src/common/resource-search-kind-priority.ts"],"sourcesContent":["export const COMMON_RESOURCE_KINDS = [\n \"Pod\",\n \"Deployment\",\n \"Service\",\n \"StatefulSet\",\n \"DaemonSet\",\n \"Job\",\n \"CronJob\",\n \"Ingress\",\n \"Gateway\",\n \"HTTPRoute\",\n \"ConfigMap\",\n \"Secret\",\n \"Namespace\",\n \"Node\",\n \"PersistentVolumeClaim\",\n \"PersistentVolume\",\n];\n\nexport function resourceKindPriority(kind: string): number {\n const index = COMMON_RESOURCE_KINDS.indexOf(kind);\n return index < 0 ? COMMON_RESOURCE_KINDS.length : index;\n}\n"],"mappings":";AAAA,IAAa,wBAAwB;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,qBAAqB,MAAsB;CACzD,MAAM,QAAQ,sBAAsB,QAAQ,IAAI;CAChD,OAAO,QAAQ,IAAI,sBAAsB,SAAS;AACpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@64mb/freelens-power",
3
- "version": "1.6.0",
3
+ "version": "2.0.0",
4
4
  "description": "Power tools for Freelens Kubernetes IDE",
5
5
  "main": "out/main/index.js",
6
6
  "renderer": "out/renderer/index.js",