spec-copy-selection 1.0.1 → 1.0.2
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/cli/readFileRange.js +69 -3
- package/dist/cli/readFileRange.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,34 @@ const promises_1 = require("node:fs/promises");
|
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
10
|
const node_readline_1 = require("node:readline");
|
|
11
11
|
const FILE_SIZE_THRESHOLD = 10 * 1024 * 1024;
|
|
12
|
+
function shouldPrependSeparator(filePath, startLine, linesBeforeStart) {
|
|
13
|
+
if (!filePath.includes('backlog.md')) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
if (startLine === 1) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return !linesBeforeStart.some((line) => line.trim() === '---');
|
|
20
|
+
}
|
|
21
|
+
async function insertSeparatorToFile(filePath, startLine, endLine, lines) {
|
|
22
|
+
const updatedLines = [
|
|
23
|
+
...lines.slice(0, startLine - 1),
|
|
24
|
+
'',
|
|
25
|
+
'---',
|
|
26
|
+
'',
|
|
27
|
+
...lines.slice(startLine - 1),
|
|
28
|
+
];
|
|
29
|
+
await (0, promises_1.writeFile)(filePath, updatedLines.join('\n'), 'utf-8');
|
|
30
|
+
const totalLinesAfterInsertion = updatedLines.length;
|
|
31
|
+
const newStartLine = startLine + 3;
|
|
32
|
+
const newEndLine = Math.min(endLine + 3, totalLinesAfterInsertion);
|
|
33
|
+
const content = updatedLines.slice(newStartLine - 1, newEndLine).join('\n');
|
|
34
|
+
return {
|
|
35
|
+
content,
|
|
36
|
+
startLine: newStartLine,
|
|
37
|
+
endLine: newEndLine,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
12
40
|
async function readFileRangeSmall(resolvedPath, filePath, startLine, endLine) {
|
|
13
41
|
let fileContent;
|
|
14
42
|
try {
|
|
@@ -33,7 +61,12 @@ async function readFileRangeSmall(resolvedPath, filePath, startLine, endLine) {
|
|
|
33
61
|
}
|
|
34
62
|
const actualEndLine = Math.min(endLine, totalLines);
|
|
35
63
|
const extractedLines = lines.slice(startLine - 1, actualEndLine);
|
|
36
|
-
|
|
64
|
+
const content = extractedLines.join('\n');
|
|
65
|
+
return {
|
|
66
|
+
content,
|
|
67
|
+
startLine,
|
|
68
|
+
endLine: actualEndLine,
|
|
69
|
+
};
|
|
37
70
|
}
|
|
38
71
|
async function readFileRangeLarge(resolvedPath, filePath, startLine, endLine) {
|
|
39
72
|
return new Promise((resolve, reject) => {
|
|
@@ -59,7 +92,12 @@ async function readFileRangeLarge(resolvedPath, filePath, startLine, endLine) {
|
|
|
59
92
|
}
|
|
60
93
|
if (currentLine >= endLine) {
|
|
61
94
|
cleanup();
|
|
62
|
-
|
|
95
|
+
const content = lines.join('\n');
|
|
96
|
+
resolve({
|
|
97
|
+
content,
|
|
98
|
+
startLine,
|
|
99
|
+
endLine: currentLine,
|
|
100
|
+
});
|
|
63
101
|
}
|
|
64
102
|
});
|
|
65
103
|
rl.on('close', () => {
|
|
@@ -69,7 +107,12 @@ async function readFileRangeLarge(resolvedPath, filePath, startLine, endLine) {
|
|
|
69
107
|
reject(new Error(`Invalid range: start line (${startLine}) exceeds file length (${currentLine} lines)`));
|
|
70
108
|
return;
|
|
71
109
|
}
|
|
72
|
-
|
|
110
|
+
const content = lines.join('\n');
|
|
111
|
+
resolve({
|
|
112
|
+
content,
|
|
113
|
+
startLine,
|
|
114
|
+
endLine: currentLine,
|
|
115
|
+
});
|
|
73
116
|
}
|
|
74
117
|
});
|
|
75
118
|
rl.on('error', (error) => {
|
|
@@ -105,6 +148,29 @@ async function readFileRange(filePath, startLine, endLine) {
|
|
|
105
148
|
throw new Error(`Permission denied: ${filePath}`);
|
|
106
149
|
}
|
|
107
150
|
}
|
|
151
|
+
if (resolvedPath.includes('backlog.md') && startLine > 1) {
|
|
152
|
+
let fileContent;
|
|
153
|
+
try {
|
|
154
|
+
fileContent = await (0, promises_1.readFile)(resolvedPath, 'utf-8');
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (error instanceof Error) {
|
|
158
|
+
if (error.code === 'ENOENT') {
|
|
159
|
+
throw new Error(`File not found: ${filePath}`);
|
|
160
|
+
}
|
|
161
|
+
if (error.code === 'EACCES') {
|
|
162
|
+
throw new Error(`Permission denied: ${filePath}`);
|
|
163
|
+
}
|
|
164
|
+
throw new Error(`Failed to read file: ${error.message}`);
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
const lines = fileContent.split('\n');
|
|
169
|
+
const linesBeforeStart = lines.slice(0, startLine - 1);
|
|
170
|
+
if (shouldPrependSeparator(resolvedPath, startLine, linesBeforeStart)) {
|
|
171
|
+
return insertSeparatorToFile(resolvedPath, startLine, endLine, lines);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
108
174
|
if (fileSize >= FILE_SIZE_THRESHOLD) {
|
|
109
175
|
return readFileRangeLarge(resolvedPath, filePath, startLine, endLine);
|
|
110
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readFileRange.js","sourceRoot":"","sources":["../../src/cli/readFileRange.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"readFileRange.js","sourceRoot":"","sources":["../../src/cli/readFileRange.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -11,18 +11,18 @@ const transform_1 = require("./transform");
|
|
|
11
11
|
async function main() {
|
|
12
12
|
try {
|
|
13
13
|
const args = (0, index_js_1.parseArgs)(process.argv.slice(2));
|
|
14
|
-
const content = await (0, index_js_1.readFileRange)(args.filePath, args.startLine, args.endLine);
|
|
14
|
+
const { content, startLine: updatedStartLine, endLine: updatedEndLine, } = await (0, index_js_1.readFileRange)(args.filePath, args.startLine, args.endLine);
|
|
15
15
|
const resolvedPath = node_path_1.default.resolve(process.cwd(), args.filePath);
|
|
16
16
|
const metadata = {
|
|
17
17
|
filePath: resolvedPath,
|
|
18
18
|
fileName: node_path_1.default.basename(resolvedPath),
|
|
19
19
|
extension: node_path_1.default.extname(resolvedPath),
|
|
20
|
-
lineRange: `${
|
|
20
|
+
lineRange: `${updatedStartLine}-${updatedEndLine}`,
|
|
21
21
|
};
|
|
22
22
|
const transform = (0, transform_1.compose)(transform_1.formatOutput, transform_1.stripFrontmatter);
|
|
23
23
|
const transformed = transform(content, metadata);
|
|
24
24
|
await clipboardy_1.default.write(transformed);
|
|
25
|
-
console.log(`✓ Copied lines ${
|
|
25
|
+
console.log(`✓ Copied lines ${updatedStartLine}-${updatedEndLine} from ${metadata.fileName} to clipboard`);
|
|
26
26
|
}
|
|
27
27
|
catch (error) {
|
|
28
28
|
console.error('Error:', error instanceof Error ? error.message : String(error));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,0DAA6B;AAC7B,4DAAmC;AACnC,6CAA0D;AAE1D,2CAAsE;AAEtE,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,oBAAS,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAG9C,MAAM,OAAO,GAAG,MAAM,IAAA,wBAAa,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,0DAA6B;AAC7B,4DAAmC;AACnC,6CAA0D;AAE1D,2CAAsE;AAEtE,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QAEH,MAAM,IAAI,GAAG,IAAA,oBAAS,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAG9C,MAAM,EACJ,OAAO,EACP,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,cAAc,GACxB,GAAG,MAAM,IAAA,wBAAa,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAGrE,MAAM,YAAY,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAiB;YAC7B,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,mBAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;YACrC,SAAS,EAAE,mBAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YACrC,SAAS,EAAE,GAAG,gBAAgB,IAAI,cAAc,EAAE;SACnD,CAAC;QAGF,MAAM,SAAS,GAAG,IAAA,mBAAO,EAAC,wBAAY,EAAE,4BAAgB,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAGjD,MAAM,oBAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAGnC,OAAO,CAAC,GAAG,CACT,kBAAkB,gBAAgB,IAAI,cAAc,SAAS,QAAQ,CAAC,QAAQ,eAAe,CAC9F,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|