@wrongstack/tools 0.313.0 → 0.313.1
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/audit.js +10 -4055
- package/dist/bash.js +9 -2308
- package/dist/batch-tool-use.js +2 -187
- package/dist/browser/index.js +25 -1339
- package/dist/builtin.js +69 -33949
- package/dist/chunk-2CTB3UK5.js +197 -0
- package/dist/chunk-2ME7ZWDD.js +1272 -0
- package/dist/chunk-2TFQDEPU.js +113 -0
- package/dist/chunk-2ZCJNKFE.js +315 -0
- package/dist/chunk-3PVYQFRQ.js +472 -0
- package/dist/chunk-3QMQBO5Z.js +89 -0
- package/dist/chunk-42AKKX7O.js +385 -0
- package/dist/chunk-42SKEETB.js +113 -0
- package/dist/chunk-4BHUSMNL.js +104 -0
- package/dist/chunk-4I4LWFOO.js +431 -0
- package/dist/chunk-553IQUMO.js +478 -0
- package/dist/chunk-55KF77OK.js +1944 -0
- package/dist/chunk-6HLZK37X.js +359 -0
- package/dist/chunk-6RNIFLG4.js +305 -0
- package/dist/chunk-A6BRWIXN.js +317 -0
- package/dist/chunk-AHHDWNXC.js +200 -0
- package/dist/chunk-B2CIOKWP.js +899 -0
- package/dist/chunk-BTSFTGIL.js +7 -0
- package/dist/chunk-D33S4RQG.js +222 -0
- package/dist/chunk-DIJKHSUO.js +134 -0
- package/dist/chunk-DPL47QGS.js +3515 -0
- package/dist/chunk-EMRGN4KM.js +170 -0
- package/dist/chunk-FGOABE4Z.js +955 -0
- package/dist/chunk-FW65TP4G.js +520 -0
- package/dist/chunk-GOIZNNOA.js +221 -0
- package/dist/chunk-H5MJUAA6.js +295 -0
- package/dist/chunk-H5OHH6F4.js +223 -0
- package/dist/chunk-HC5RM4WY.js +199 -0
- package/dist/chunk-HEQFMLZ7.js +190 -0
- package/dist/chunk-HFXSNKCV.js +196 -0
- package/dist/chunk-HXSBQ2SE.js +1723 -0
- package/dist/chunk-ILESNGNM.js +163 -0
- package/dist/chunk-INF5CGAO.js +137 -0
- package/dist/chunk-IWDFZ6XR.js +337 -0
- package/dist/chunk-IXMNTNW5.js +238 -0
- package/dist/chunk-J4SRJKBW.js +428 -0
- package/dist/chunk-J5SKD6LN.js +235 -0
- package/dist/chunk-JRJJX3L5.js +424 -0
- package/dist/chunk-KXNDHMUB.js +366 -0
- package/dist/chunk-LIJQMYYX.js +59 -0
- package/dist/chunk-MAN26PZ5.js +260 -0
- package/dist/chunk-MKRQMLZA.js +474 -0
- package/dist/chunk-NBDZMMG2.js +169 -0
- package/dist/chunk-NHA6BEIH.js +101 -0
- package/dist/chunk-OA6YJIWL.js +4412 -0
- package/dist/chunk-OZC255IC.js +2830 -0
- package/dist/chunk-PUR6WU2B.js +154 -0
- package/dist/chunk-Q5JPPCZC.js +12 -0
- package/dist/chunk-QBV725YG.js +128 -0
- package/dist/chunk-QHVW4AAM.js +892 -0
- package/dist/chunk-QNJ7AQ4B.js +1000 -0
- package/dist/chunk-RGISBZBD.js +231 -0
- package/dist/chunk-RJZQWEMS.js +84 -0
- package/dist/chunk-RP2ZA47V.js +15 -0
- package/dist/chunk-RXISBFR5.js +315 -0
- package/dist/chunk-S5CCLZL3.js +99 -0
- package/dist/chunk-TVTCSBJF.js +122 -0
- package/dist/chunk-U4D5S3VQ.js +21 -0
- package/dist/chunk-U4VAATKP.js +193 -0
- package/dist/chunk-UKU2ZX4C.js +203 -0
- package/dist/chunk-UNSKG6DC.js +159 -0
- package/dist/chunk-URFKEIHM.js +1091 -0
- package/dist/chunk-UTV7YAW7.js +178 -0
- package/dist/chunk-V43EQ6VR.js +68 -0
- package/dist/chunk-VB3MJGCV.js +610 -0
- package/dist/chunk-WHIIIREL.js +223 -0
- package/dist/chunk-XMIFYKUT.js +1371 -0
- package/dist/chunk-YF2RSV34.js +54 -0
- package/dist/chunk-Z6DAKQ3U.js +1 -0
- package/dist/chunk-ZIGAZFWE.js +522 -0
- package/dist/circuit-breaker.js +3 -191
- package/dist/codebase-index/index.js +84 -13688
- package/dist/codebase-index/parser-worker-script.js +8 -3995
- package/dist/codebase-index/project-server.js +60 -8548
- package/dist/codebase-index/worker.js +20 -8416
- package/dist/design.js +2 -299
- package/dist/diff.js +4 -256
- package/dist/document.js +4 -222
- package/dist/e2e.js +5 -476
- package/dist/edit.js +14 -10200
- package/dist/exec.js +16 -3131
- package/dist/fetch.js +8 -398
- package/dist/format.js +10 -3750
- package/dist/generic-parser-VUXDIAOZ.js +13 -0
- package/dist/git.js +4 -380
- package/dist/glob.js +6 -280
- package/dist/go-parser-6CA77WZ4.js +469 -0
- package/dist/grep.js +7 -604
- package/dist/index.js +318 -35387
- package/dist/install.js +10 -4091
- package/dist/json-parser-7YMDJSBJ.js +213 -0
- package/dist/json.js +4 -665
- package/dist/kanban.js +3 -2096
- package/dist/languages/index.js +23 -4664
- package/dist/legacy-bridge-7UKZT46G.js +18 -0
- package/dist/lint.js +10 -3706
- package/dist/logs.js +4 -287
- package/dist/memory.js +6 -215
- package/dist/mode.js +3 -99
- package/dist/outdated.js +4 -5170
- package/dist/pack.js +65 -33897
- package/dist/parser-dispatch-VPOFDO2U.js +14 -0
- package/dist/patch.js +13 -9935
- package/dist/plan.js +5 -3286
- package/dist/process-registry.js +8 -651
- package/dist/ps-slash.js +12 -1439
- package/dist/py-parser-GPM5VYRG.js +16 -0
- package/dist/read.js +13 -9816
- package/dist/replace.js +15 -10014
- package/dist/rs-parser-WVQ4KYCX.js +81 -0
- package/dist/scaffold.js +4 -253
- package/dist/search.js +5 -585
- package/dist/session-kanban.js +30 -972
- package/dist/skill.js +2 -215
- package/dist/task.js +5 -3410
- package/dist/test.js +10 -3773
- package/dist/todo.js +4 -2891
- package/dist/tool-help.js +3 -123
- package/dist/tool-search.js +3 -79
- package/dist/tool-tier.js +68 -33984
- package/dist/tool-use.js +2 -93
- package/dist/tree-sitter-parser-YCILHGZD.js +17 -0
- package/dist/tree.js +4 -288
- package/dist/ts-parser-YH4ZMWMH.js +232 -0
- package/dist/typecheck.js +10 -3753
- package/dist/win32.js +6 -60
- package/dist/write.js +14 -9882
- package/dist/yaml-parser-GFAOKV53.js +157 -0
- package/package.json +5 -5
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import {
|
|
2
|
+
detectLang
|
|
3
|
+
} from "./chunk-ILESNGNM.js";
|
|
4
|
+
|
|
5
|
+
// src/codebase-index/rs-parser.ts
|
|
6
|
+
import { expectDefined } from "@wrongstack/core/utils";
|
|
7
|
+
async function parseSymbols(opts) {
|
|
8
|
+
const { file, content, lang } = opts;
|
|
9
|
+
return regexParse({ file, content, lang });
|
|
10
|
+
}
|
|
11
|
+
var RS_PATTERNS = [
|
|
12
|
+
{ regex: /fn\s+(\w+)\s*\([^)]*\)/g, kind: "function" },
|
|
13
|
+
{ regex: /struct\s+(\w+)/g, kind: "struct" },
|
|
14
|
+
{ regex: /enum\s+(\w+)/g, kind: "enum" },
|
|
15
|
+
{ regex: /trait\s+(\w+)/g, kind: "trait" },
|
|
16
|
+
{ regex: /impl\s+(?:<[^>]+>)?(\w+)/g, kind: "impl" },
|
|
17
|
+
{ regex: /type\s+(\w+)\s*=/g, kind: "type" },
|
|
18
|
+
{ regex: /const\s+(\w+)/g, kind: "const" },
|
|
19
|
+
{ regex: /static\s+(\w+)/g, kind: "static" },
|
|
20
|
+
{ regex: /mod\s+(\w+)/g, kind: "mod" }
|
|
21
|
+
];
|
|
22
|
+
function regexParse(opts) {
|
|
23
|
+
const { file, content, lang } = opts;
|
|
24
|
+
const symbols = [];
|
|
25
|
+
const lines = content.split("\n");
|
|
26
|
+
const lineOffsets = [0];
|
|
27
|
+
for (let i = 0; i < lines.length; i++) {
|
|
28
|
+
lineOffsets.push((lineOffsets[i] ?? 0) + (lines[i]?.length ?? 0) + 1);
|
|
29
|
+
}
|
|
30
|
+
function lineFromOffset(offset) {
|
|
31
|
+
let lo = 0;
|
|
32
|
+
let hi = lineOffsets.length - 1;
|
|
33
|
+
while (lo < hi) {
|
|
34
|
+
const mid = lo + hi + 1 >>> 1;
|
|
35
|
+
if (expectDefined(lineOffsets[mid]) <= offset) lo = mid;
|
|
36
|
+
else hi = mid - 1;
|
|
37
|
+
}
|
|
38
|
+
return lo + 1;
|
|
39
|
+
}
|
|
40
|
+
function extractDeclaration(lineIdx, _match) {
|
|
41
|
+
const line = lines[lineIdx] ?? "";
|
|
42
|
+
return line.trim().slice(0, 500);
|
|
43
|
+
}
|
|
44
|
+
for (const pattern of RS_PATTERNS) {
|
|
45
|
+
pattern.regex.lastIndex = 0;
|
|
46
|
+
for (let match = pattern.regex.exec(content); match !== null; match = pattern.regex.exec(content)) {
|
|
47
|
+
const name = expectDefined(match[1]);
|
|
48
|
+
const offset = match.index ?? 0;
|
|
49
|
+
const line = lineFromOffset(offset);
|
|
50
|
+
const col = offset - (lineOffsets[line - 1] ?? 0);
|
|
51
|
+
const lineIdx = line - 1;
|
|
52
|
+
const signature = extractDeclaration(lineIdx, match);
|
|
53
|
+
symbols.push({
|
|
54
|
+
id: 0,
|
|
55
|
+
lang,
|
|
56
|
+
kind: pattern.kind,
|
|
57
|
+
name,
|
|
58
|
+
file,
|
|
59
|
+
line,
|
|
60
|
+
col,
|
|
61
|
+
signature,
|
|
62
|
+
docComment: "",
|
|
63
|
+
scope: "",
|
|
64
|
+
text: `${name} ${signature}`.trim()
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const seen = /* @__PURE__ */ new Set();
|
|
69
|
+
const deduped = symbols.filter((s) => {
|
|
70
|
+
const key = `${s.name}:${s.line}`;
|
|
71
|
+
if (seen.has(key)) return false;
|
|
72
|
+
seen.add(key);
|
|
73
|
+
return true;
|
|
74
|
+
});
|
|
75
|
+
return { file, lang, symbols: deduped, mtimeMs: Date.now() };
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
detectLang,
|
|
79
|
+
parseSymbols
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=rs-parser-WVQ4KYCX.js.map
|
package/dist/scaffold.js
CHANGED
|
@@ -1,256 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
// src/_util.ts
|
|
7
|
-
import * as fsp from "node:fs/promises";
|
|
8
|
-
import * as path from "node:path";
|
|
9
|
-
import * as Core from "@wrongstack/core/utils";
|
|
10
|
-
function resolvePath(input, ctx) {
|
|
11
|
-
return path.isAbsolute(input) ? path.normalize(input) : path.resolve(ctx.workingDir ?? ctx.cwd, input);
|
|
12
|
-
}
|
|
13
|
-
function allowedRoots(ctx) {
|
|
14
|
-
return [path.resolve(ctx.projectRoot), path.resolve(Core.wstackGlobalRoot())];
|
|
15
|
-
}
|
|
16
|
-
function isInsideAny(target, roots) {
|
|
17
|
-
return roots.some((root) => {
|
|
18
|
-
const rel = path.relative(root, target);
|
|
19
|
-
return rel === "" || !rel.startsWith("..") && !path.isAbsolute(rel);
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
function ensureInsideRoot(absPath, ctx) {
|
|
23
|
-
const target = path.resolve(absPath);
|
|
24
|
-
if (ctx.allowOutsideProjectRoot) return target;
|
|
25
|
-
if (isInsideAny(target, allowedRoots(ctx))) return target;
|
|
26
|
-
throw new Error(`Path "${absPath}" is outside project root "${path.resolve(ctx.projectRoot)}"`);
|
|
27
|
-
}
|
|
28
|
-
function safeResolve(input, ctx) {
|
|
29
|
-
return ensureInsideRoot(resolvePath(input, ctx), ctx);
|
|
30
|
-
}
|
|
31
|
-
async function resolveRealInsideRoot(absPath, ctx) {
|
|
32
|
-
if (ctx.allowOutsideProjectRoot) return absPath;
|
|
33
|
-
const realRoots = await Promise.all(
|
|
34
|
-
allowedRoots(ctx).map((r) => fsp.realpath(r).catch(() => path.resolve(r)))
|
|
35
|
-
);
|
|
36
|
-
let probe = absPath;
|
|
37
|
-
const pendingTail = [];
|
|
38
|
-
for (; ; ) {
|
|
39
|
-
let real;
|
|
40
|
-
try {
|
|
41
|
-
real = await fsp.realpath(probe);
|
|
42
|
-
} catch (err) {
|
|
43
|
-
if (err.code === "ENOENT") {
|
|
44
|
-
const parent = path.dirname(probe);
|
|
45
|
-
if (parent === probe) return absPath;
|
|
46
|
-
pendingTail.unshift(path.basename(probe));
|
|
47
|
-
probe = parent;
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
throw err;
|
|
51
|
-
}
|
|
52
|
-
const candidate = pendingTail.length > 0 ? path.join(real, ...pendingTail) : real;
|
|
53
|
-
if (isInsideAny(candidate, realRoots)) {
|
|
54
|
-
return candidate;
|
|
55
|
-
}
|
|
56
|
-
throw new Error(
|
|
57
|
-
`Path "${absPath}" resolves through a symlink outside project root "${realRoots[0]}"`
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
async function safeResolveReal(input, ctx) {
|
|
62
|
-
const abs = safeResolve(input, ctx);
|
|
63
|
-
return await resolveRealInsideRoot(abs, ctx);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// src/scaffold.ts
|
|
67
|
-
var BUILT_IN_TEMPLATES = {
|
|
68
|
-
"npm-package": {
|
|
69
|
-
description: "Basic npm package with ESM",
|
|
70
|
-
files: {
|
|
71
|
-
"package.json": JSON.stringify(
|
|
72
|
-
{
|
|
73
|
-
name: "{{name}}",
|
|
74
|
-
version: "0.1.1",
|
|
75
|
-
type: "module",
|
|
76
|
-
main: "./dist/index.js",
|
|
77
|
-
scripts: { build: "tsc", test: "vitest run" },
|
|
78
|
-
devDependencies: { typescript: "^5.0.0" }
|
|
79
|
-
},
|
|
80
|
-
null,
|
|
81
|
-
2
|
|
82
|
-
),
|
|
83
|
-
"tsconfig.json": JSON.stringify(
|
|
84
|
-
{
|
|
85
|
-
compilerOptions: { target: "ES2022", module: "ESNext", strict: true },
|
|
86
|
-
include: ["src"]
|
|
87
|
-
},
|
|
88
|
-
null,
|
|
89
|
-
2
|
|
90
|
-
),
|
|
91
|
-
"src/index.ts": `export function hello() {
|
|
92
|
-
return 'Hello from {{name}}';
|
|
93
|
-
}
|
|
94
|
-
`,
|
|
95
|
-
"src/index.test.ts": `import { hello } from './index';
|
|
96
|
-
import { describe, it, expect } from 'vitest';
|
|
97
|
-
|
|
98
|
-
describe('hello', () => {
|
|
99
|
-
it('returns greeting', () => {
|
|
100
|
-
expect(hello()).toBe('Hello from {{name}}');
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
`
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
"cli-tool": {
|
|
107
|
-
description: "CLI tool with argparse",
|
|
108
|
-
files: {
|
|
109
|
-
"package.json": JSON.stringify(
|
|
110
|
-
{
|
|
111
|
-
name: "{{name}}",
|
|
112
|
-
version: "0.1.1",
|
|
113
|
-
type: "module",
|
|
114
|
-
bin: { "{{name}}": "./src/index.js" },
|
|
115
|
-
scripts: { build: "tsc", start: "node dist/index.js" }
|
|
116
|
-
},
|
|
117
|
-
null,
|
|
118
|
-
2
|
|
119
|
-
),
|
|
120
|
-
"src/index.ts": `#!/usr/bin/env node
|
|
121
|
-
|
|
122
|
-
async function main() {
|
|
123
|
-
console.log('Hello from {{name}}');
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
main();
|
|
127
|
-
`
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
"react-component": {
|
|
131
|
-
description: "React component with TypeScript",
|
|
132
|
-
files: {
|
|
133
|
-
"{{name}}.tsx": `interface {{Name}}Props {
|
|
134
|
-
className?: string;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export function {{Name}}({ className }: {{Name}}Props) {
|
|
138
|
-
return (
|
|
139
|
-
<div className={className}>
|
|
140
|
-
{{Name}} Component
|
|
141
|
-
</div>
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
`,
|
|
145
|
-
"{{name}}.test.tsx": `import { render, screen } from '@testing-library/react';
|
|
146
|
-
import { {{Name}} } from './{{Name}}';
|
|
147
|
-
|
|
148
|
-
describe('{{Name}}', () => {
|
|
149
|
-
it('renders', () => {
|
|
150
|
-
render(<{{Name}} />);
|
|
151
|
-
expect(screen.getByText('{{Name}} Component')).toBeInTheDocument();
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
`
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
var scaffoldTool = {
|
|
159
|
-
name: "scaffold",
|
|
160
|
-
category: "Project",
|
|
161
|
-
description: "Generate new files and folder structures from built-in templates or custom definitions. This is the recommended way to bootstrap new packages, components, or modules instead of creating files one by one with `write`.",
|
|
162
|
-
usageHint: "PREFERRED FOR SCAFFOLDING:\n\n- Use built-in templates when they match your needs (e.g. react-component, npm-package).\n- Supports `dry_run` so you can preview exactly what will be created.\n- Has the powerful `fs.write.outside-project` capability \u2014 review paths carefully.\nMuch cleaner and safer than manually writing multiple files.",
|
|
163
|
-
permission: "confirm",
|
|
164
|
-
mutating: true,
|
|
165
|
-
subjectKey: "name",
|
|
166
|
-
capabilities: ["fs.write.outside-project", "fs.write"],
|
|
167
|
-
icon: "scaffold",
|
|
168
|
-
timeoutMs: 3e4,
|
|
169
|
-
inputSchema: {
|
|
170
|
-
type: "object",
|
|
171
|
-
properties: {
|
|
172
|
-
template: {
|
|
173
|
-
type: "string",
|
|
174
|
-
description: "Template name (npm-package, cli-tool, react-component) or path to template directory"
|
|
175
|
-
},
|
|
176
|
-
name: {
|
|
177
|
-
type: "string",
|
|
178
|
-
description: "Project/component name (used in generated files)"
|
|
179
|
-
},
|
|
180
|
-
cwd: { type: "string", description: "Working directory (default: cwd)" },
|
|
181
|
-
vars: {
|
|
182
|
-
type: "object",
|
|
183
|
-
additionalProperties: { type: "string" },
|
|
184
|
-
description: "Template variables for custom templates"
|
|
185
|
-
},
|
|
186
|
-
dry_run: {
|
|
187
|
-
type: "boolean",
|
|
188
|
-
description: "Preview generated files without creating (default: false)"
|
|
189
|
-
}
|
|
190
|
-
},
|
|
191
|
-
required: ["template", "name"]
|
|
192
|
-
},
|
|
193
|
-
async execute(input, ctx) {
|
|
194
|
-
const cwd = input.cwd ? await safeResolveReal(input.cwd, ctx) : ctx.cwd;
|
|
195
|
-
const name = input.name;
|
|
196
|
-
const vars = { name, ...input.vars };
|
|
197
|
-
const builtIn = BUILT_IN_TEMPLATES[input.template];
|
|
198
|
-
if (builtIn) {
|
|
199
|
-
return await handleBuiltIn(name, builtIn.files, cwd, ctx, input.dry_run ?? false, vars);
|
|
200
|
-
}
|
|
201
|
-
return {
|
|
202
|
-
template: input.template,
|
|
203
|
-
name,
|
|
204
|
-
files_created: 0,
|
|
205
|
-
files: [],
|
|
206
|
-
dry_run: input.dry_run ?? false,
|
|
207
|
-
output: `Template "${input.template}" not found. Available: ${Object.keys(BUILT_IN_TEMPLATES).join(", ")}`
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
async function handleBuiltIn(name, templateFiles, cwd, ctx, dryRun, vars) {
|
|
212
|
-
const files = [];
|
|
213
|
-
let filesCreated = 0;
|
|
214
|
-
for (const [filePath, content] of Object.entries(templateFiles)) {
|
|
215
|
-
const resolvedPath = substituteVars(filePath, name, vars);
|
|
216
|
-
const joinedPath = path2.join(cwd, resolvedPath);
|
|
217
|
-
const root = path2.resolve(ctx.projectRoot);
|
|
218
|
-
const target = path2.resolve(joinedPath);
|
|
219
|
-
const rel = path2.relative(root, target);
|
|
220
|
-
if (rel.startsWith("..") || path2.isAbsolute(rel)) {
|
|
221
|
-
throw new Error(`scaffold: generated path "${resolvedPath}" would escape project root`);
|
|
222
|
-
}
|
|
223
|
-
const fullPath = target;
|
|
224
|
-
if (!dryRun) {
|
|
225
|
-
await fs.mkdir(path2.dirname(fullPath), { recursive: true });
|
|
226
|
-
await atomicWrite(fullPath, substituteVars(content, name, vars));
|
|
227
|
-
}
|
|
228
|
-
files.push(resolvedPath);
|
|
229
|
-
filesCreated++;
|
|
230
|
-
}
|
|
231
|
-
return {
|
|
232
|
-
template: "built-in",
|
|
233
|
-
name,
|
|
234
|
-
files_created: filesCreated,
|
|
235
|
-
files,
|
|
236
|
-
dry_run: dryRun,
|
|
237
|
-
output: dryRun ? `Would create ${filesCreated} files: ${files.join(", ")}` : `Created ${filesCreated} files: ${files.join(", ")}`
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
function escapeRegexLiteral(value) {
|
|
241
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
242
|
-
}
|
|
243
|
-
function substituteVars(content, name, vars) {
|
|
244
|
-
const kebab = name.toLowerCase().replace(/\s+/g, "-");
|
|
245
|
-
const pascal = name.replace(/(?:^|[-_\s]+)([a-z])/g, (_, c) => c.toUpperCase());
|
|
246
|
-
let result = content;
|
|
247
|
-
result = result.replace(/\{\{name\}\}/g, () => kebab);
|
|
248
|
-
result = result.replace(/\{\{Name\}\}/g, () => pascal);
|
|
249
|
-
for (const [k, v] of Object.entries(vars)) {
|
|
250
|
-
result = result.replace(new RegExp(`\\{\\{${escapeRegexLiteral(k)}\\}\\}`, "g"), () => v);
|
|
251
|
-
}
|
|
252
|
-
return result;
|
|
253
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
scaffoldTool
|
|
3
|
+
} from "./chunk-AHHDWNXC.js";
|
|
4
|
+
import "./chunk-D33S4RQG.js";
|
|
254
5
|
export {
|
|
255
6
|
scaffoldTool
|
|
256
7
|
};
|