@wrongstack/plugins 0.264.0 → 0.267.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.
package/dist/auto-doc.js CHANGED
@@ -50,32 +50,7 @@ function parseSource(content) {
50
50
  }
51
51
  return entities;
52
52
  }
53
- function generateJSDoc(entity, includeTypes) {
54
- switch (entity.kind) {
55
- case "function": {
56
- const params = entity.params.map((p) => ` * @param ${p} - TODO: describe parameter`).join("\n");
57
- const returns = entity.returnType ? `
58
- * @returns ${includeTypes ? `{${entity.returnType}} ` : ""}TODO: describe return value` : "";
59
- return `/**
60
- * TODO: One-line description of ${entity.name}
61
- ${params}${returns}
62
- */`;
63
- }
64
- case "class":
65
- return `/**
66
- * TODO: Describe class ${entity.name}
67
- */`;
68
- case "type":
69
- return `/**
70
- * TODO: Describe type ${entity.name}
71
- */`;
72
- case "interface":
73
- return `/**
74
- * TODO: Describe interface ${entity.name}
75
- */`;
76
- }
77
- }
78
- function generateTSDoc(entity, includeTypes) {
53
+ function generateDocComment(entity, includeTypes) {
79
54
  switch (entity.kind) {
80
55
  case "function": {
81
56
  const params = entity.params.map((p) => ` * @param ${p} - TODO: describe parameter`).join("\n");
@@ -112,7 +87,7 @@ function injectDocComment(content, entity, doc) {
112
87
  const idx = entity.startLine - 1;
113
88
  const codeLine = lines[idx] ?? "";
114
89
  const indent = codeLine.match(/^(\s*)/)?.[1] ?? "";
115
- lines.splice(idx, 0, `${indent}${doc} ${codeLine.trim()}`);
90
+ lines.splice(idx, 0, `${indent}${doc}`);
116
91
  return lines.join("\n");
117
92
  }
118
93
  async function runAutoDoc(input, api) {
@@ -122,7 +97,6 @@ async function runAutoDoc(input, api) {
122
97
  if (input.files.length === 0) {
123
98
  return { ok: false, error: "input.files is empty \u2014 provide at least one file path", filesProcessed: 0, changes: [] };
124
99
  }
125
- const style = input.style ?? "tsdoc";
126
100
  const includeTypes = api.config.extensions?.["auto-doc"]?.["includeTypes"] ?? false;
127
101
  const results = [];
128
102
  for (const file of input.files) {
@@ -139,7 +113,7 @@ async function runAutoDoc(input, api) {
139
113
  let modified = content;
140
114
  for (const entity of entities) {
141
115
  if (!input.force && !needsDocComment(modified, entity)) continue;
142
- const doc = style === "jsdoc" ? generateJSDoc(entity, includeTypes) : generateTSDoc(entity, includeTypes);
116
+ const doc = generateDocComment(entity, includeTypes);
143
117
  modified = injectDocComment(modified, entity, doc);
144
118
  results.push({ file, entity: entity.name });
145
119
  }
@@ -160,7 +134,6 @@ async function runAutoDocPreview(input, api) {
160
134
  if (input.files.length === 0) {
161
135
  return { ok: false, error: "input.files is empty \u2014 provide at least one file path", previews: [] };
162
136
  }
163
- const style = input.style ?? "tsdoc";
164
137
  const includeTypes = api.config.extensions?.["auto-doc"]?.["includeTypes"] ?? false;
165
138
  const previews = [];
166
139
  for (const file of input.files) {
@@ -168,7 +141,7 @@ async function runAutoDocPreview(input, api) {
168
141
  const { readFileSync } = await import('fs');
169
142
  const content = readFileSync(file, "utf-8");
170
143
  const entities = parseSource(content);
171
- const generated = entities.filter((e) => !needsDocComment(content, e)).map((e) => style === "jsdoc" ? generateJSDoc(e, includeTypes) : generateTSDoc(e, includeTypes));
144
+ const generated = entities.filter((e) => needsDocComment(content, e)).map((e) => generateDocComment(e, includeTypes));
172
145
  previews.push({ file, entities: generated });
173
146
  } catch {
174
147
  api.log.warn(`auto-doc-preview: could not read file ${file}`);
@@ -136,11 +136,11 @@ var plugin = {
136
136
  }
137
137
  },
138
138
  setup(api) {
139
- const cwd = api.config.extensions?.["git-autocommit"];
139
+ const extConfig = api.config.extensions?.["git-autocommit"];
140
140
  const opts = {
141
- conventionalCommits: cwd?.["conventionalCommits"] ?? true,
142
- autoStage: cwd?.["autoStage"] ?? false,
143
- defaultType: cwd?.["defaultType"] ?? "feat"
141
+ conventionalCommits: extConfig?.["conventionalCommits"] ?? true,
142
+ autoStage: extConfig?.["autoStage"] ?? false,
143
+ defaultType: extConfig?.["defaultType"] ?? "feat"
144
144
  };
145
145
  api.tools.register({
146
146
  name: "git_autocommit",
package/dist/index.js CHANGED
@@ -59,32 +59,7 @@ function parseSource(content) {
59
59
  }
60
60
  return entities;
61
61
  }
62
- function generateJSDoc(entity, includeTypes) {
63
- switch (entity.kind) {
64
- case "function": {
65
- const params = entity.params.map((p) => ` * @param ${p} - TODO: describe parameter`).join("\n");
66
- const returns = entity.returnType ? `
67
- * @returns ${includeTypes ? `{${entity.returnType}} ` : ""}TODO: describe return value` : "";
68
- return `/**
69
- * TODO: One-line description of ${entity.name}
70
- ${params}${returns}
71
- */`;
72
- }
73
- case "class":
74
- return `/**
75
- * TODO: Describe class ${entity.name}
76
- */`;
77
- case "type":
78
- return `/**
79
- * TODO: Describe type ${entity.name}
80
- */`;
81
- case "interface":
82
- return `/**
83
- * TODO: Describe interface ${entity.name}
84
- */`;
85
- }
86
- }
87
- function generateTSDoc(entity, includeTypes) {
62
+ function generateDocComment(entity, includeTypes) {
88
63
  switch (entity.kind) {
89
64
  case "function": {
90
65
  const params = entity.params.map((p) => ` * @param ${p} - TODO: describe parameter`).join("\n");
@@ -121,7 +96,7 @@ function injectDocComment(content, entity, doc) {
121
96
  const idx = entity.startLine - 1;
122
97
  const codeLine = lines[idx] ?? "";
123
98
  const indent = codeLine.match(/^(\s*)/)?.[1] ?? "";
124
- lines.splice(idx, 0, `${indent}${doc} ${codeLine.trim()}`);
99
+ lines.splice(idx, 0, `${indent}${doc}`);
125
100
  return lines.join("\n");
126
101
  }
127
102
  async function runAutoDoc(input, api) {
@@ -131,7 +106,6 @@ async function runAutoDoc(input, api) {
131
106
  if (input.files.length === 0) {
132
107
  return { ok: false, error: "input.files is empty \u2014 provide at least one file path", filesProcessed: 0, changes: [] };
133
108
  }
134
- const style = input.style ?? "tsdoc";
135
109
  const includeTypes = api.config.extensions?.["auto-doc"]?.["includeTypes"] ?? false;
136
110
  const results = [];
137
111
  for (const file of input.files) {
@@ -148,7 +122,7 @@ async function runAutoDoc(input, api) {
148
122
  let modified = content;
149
123
  for (const entity of entities) {
150
124
  if (!input.force && !needsDocComment(modified, entity)) continue;
151
- const doc = style === "jsdoc" ? generateJSDoc(entity, includeTypes) : generateTSDoc(entity, includeTypes);
125
+ const doc = generateDocComment(entity, includeTypes);
152
126
  modified = injectDocComment(modified, entity, doc);
153
127
  results.push({ file, entity: entity.name });
154
128
  }
@@ -169,7 +143,6 @@ async function runAutoDocPreview(input, api) {
169
143
  if (input.files.length === 0) {
170
144
  return { ok: false, error: "input.files is empty \u2014 provide at least one file path", previews: [] };
171
145
  }
172
- const style = input.style ?? "tsdoc";
173
146
  const includeTypes = api.config.extensions?.["auto-doc"]?.["includeTypes"] ?? false;
174
147
  const previews = [];
175
148
  for (const file of input.files) {
@@ -177,7 +150,7 @@ async function runAutoDocPreview(input, api) {
177
150
  const { readFileSync: readFileSync2 } = await import('fs');
178
151
  const content = readFileSync2(file, "utf-8");
179
152
  const entities = parseSource(content);
180
- const generated = entities.filter((e) => !needsDocComment(content, e)).map((e) => style === "jsdoc" ? generateJSDoc(e, includeTypes) : generateTSDoc(e, includeTypes));
153
+ const generated = entities.filter((e) => needsDocComment(content, e)).map((e) => generateDocComment(e, includeTypes));
181
154
  previews.push({ file, entities: generated });
182
155
  } catch {
183
156
  api.log.warn(`auto-doc-preview: could not read file ${file}`);
@@ -378,11 +351,11 @@ var plugin2 = {
378
351
  }
379
352
  },
380
353
  setup(api) {
381
- const cwd = api.config.extensions?.["git-autocommit"];
354
+ const extConfig = api.config.extensions?.["git-autocommit"];
382
355
  const opts = {
383
- conventionalCommits: cwd?.["conventionalCommits"] ?? true,
384
- autoStage: cwd?.["autoStage"] ?? false,
385
- defaultType: cwd?.["defaultType"] ?? "feat"
356
+ conventionalCommits: extConfig?.["conventionalCommits"] ?? true,
357
+ autoStage: extConfig?.["autoStage"] ?? false,
358
+ defaultType: extConfig?.["defaultType"] ?? "feat"
386
359
  };
387
360
  api.tools.register({
388
361
  name: "git_autocommit",
@@ -2157,12 +2130,12 @@ function expandLoops(template, variables) {
2157
2130
  }
2158
2131
  );
2159
2132
  }
2160
- function renderTemplate(template, variables) {
2133
+ function renderTemplate(template, variables, escapeHtml = true) {
2161
2134
  let result = template;
2162
2135
  result = expandConditionals(result, variables);
2163
2136
  result = expandLoops(result, variables);
2164
2137
  result = expandTemplate(result, variables);
2165
- {
2138
+ if (escapeHtml) {
2166
2139
  result = result.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
2167
2140
  }
2168
2141
  return result;
@@ -2195,6 +2168,7 @@ var plugin9 = {
2195
2168
  },
2196
2169
  setup(api) {
2197
2170
  const templates = /* @__PURE__ */ new Map();
2171
+ const autoEscapeHtml = api.config.extensions?.["template-engine"]?.["autoEscapeHtml"] ?? true;
2198
2172
  api.tools.register({
2199
2173
  name: "template_expand",
2200
2174
  description: "Expand a template string with variable substitution. Supports {{variable}}, {{#if var}}...{{/if}} conditionals, and {{#each items}}...{{/each}} loops.",
@@ -2227,7 +2201,7 @@ var plugin9 = {
2227
2201
  }
2228
2202
  let result;
2229
2203
  try {
2230
- result = raw ? renderTemplateRaw(template, variables) : renderTemplate(template, variables);
2204
+ result = raw ? renderTemplateRaw(template, variables) : renderTemplate(template, variables, autoEscapeHtml);
2231
2205
  } catch (err) {
2232
2206
  return { ok: false, error: String(err) };
2233
2207
  }
@@ -2291,7 +2265,7 @@ var plugin9 = {
2291
2265
  }
2292
2266
  let result;
2293
2267
  try {
2294
- result = raw ? renderTemplateRaw(content, variables) : renderTemplate(content, variables);
2268
+ result = raw ? renderTemplateRaw(content, variables) : renderTemplate(content, variables, autoEscapeHtml);
2295
2269
  } catch (err) {
2296
2270
  return { ok: false, error: `Template rendering failed: ${err}` };
2297
2271
  }
@@ -34,12 +34,12 @@ function expandLoops(template, variables) {
34
34
  }
35
35
  );
36
36
  }
37
- function renderTemplate(template, variables) {
37
+ function renderTemplate(template, variables, escapeHtml = true) {
38
38
  let result = template;
39
39
  result = expandConditionals(result, variables);
40
40
  result = expandLoops(result, variables);
41
41
  result = expandTemplate(result, variables);
42
- {
42
+ if (escapeHtml) {
43
43
  result = result.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
44
44
  }
45
45
  return result;
@@ -72,6 +72,7 @@ var plugin = {
72
72
  },
73
73
  setup(api) {
74
74
  const templates = /* @__PURE__ */ new Map();
75
+ const autoEscapeHtml = api.config.extensions?.["template-engine"]?.["autoEscapeHtml"] ?? true;
75
76
  api.tools.register({
76
77
  name: "template_expand",
77
78
  description: "Expand a template string with variable substitution. Supports {{variable}}, {{#if var}}...{{/if}} conditionals, and {{#each items}}...{{/each}} loops.",
@@ -104,7 +105,7 @@ var plugin = {
104
105
  }
105
106
  let result;
106
107
  try {
107
- result = raw ? renderTemplateRaw(template, variables) : renderTemplate(template, variables);
108
+ result = raw ? renderTemplateRaw(template, variables) : renderTemplate(template, variables, autoEscapeHtml);
108
109
  } catch (err) {
109
110
  return { ok: false, error: String(err) };
110
111
  }
@@ -168,7 +169,7 @@ var plugin = {
168
169
  }
169
170
  let result;
170
171
  try {
171
- result = raw ? renderTemplateRaw(content, variables) : renderTemplate(content, variables);
172
+ result = raw ? renderTemplateRaw(content, variables) : renderTemplate(content, variables, autoEscapeHtml);
172
173
  } catch (err) {
173
174
  return { ok: false, error: `Template rendering failed: ${err}` };
174
175
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/plugins",
3
- "version": "0.264.0",
3
+ "version": "0.267.0",
4
4
  "description": "Official WrongStack plugin collection — auto-doc, git-autocommit, shell-check, cost-tracker, file-watcher, web-search, json-path, cron, template-engine, semver-bump",
5
5
  "license": "MIT",
6
6
  "author": "ECOSTACK TECHNOLOGY OÜ",
@@ -63,7 +63,7 @@
63
63
  "vitest": "^4.1.8"
64
64
  },
65
65
  "dependencies": {
66
- "@wrongstack/core": "0.264.0"
66
+ "@wrongstack/core": "0.267.0"
67
67
  },
68
68
  "scripts": {
69
69
  "build": "tsup",