@blockspool/core 0.2.0 → 0.3.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/package.json +1 -1
- package/dist/db/adapter.d.ts +0 -191
- package/dist/db/adapter.d.ts.map +0 -1
- package/dist/db/adapter.js +0 -40
- package/dist/db/adapter.js.map +0 -1
- package/dist/db/contract.d.ts +0 -47
- package/dist/db/contract.d.ts.map +0 -1
- package/dist/db/contract.js +0 -258
- package/dist/db/contract.js.map +0 -1
- package/dist/db/index.d.ts +0 -6
- package/dist/db/index.d.ts.map +0 -1
- package/dist/db/index.js +0 -7
- package/dist/db/index.js.map +0 -1
- package/dist/exec/index.d.ts +0 -5
- package/dist/exec/index.d.ts.map +0 -1
- package/dist/exec/index.js +0 -5
- package/dist/exec/index.js.map +0 -1
- package/dist/exec/types.d.ts +0 -64
- package/dist/exec/types.d.ts.map +0 -1
- package/dist/exec/types.js +0 -8
- package/dist/exec/types.js.map +0 -1
- package/dist/index.d.ts +0 -23
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -27
- package/dist/index.js.map +0 -1
- package/dist/repos/index.d.ts +0 -15
- package/dist/repos/index.d.ts.map +0 -1
- package/dist/repos/index.js +0 -11
- package/dist/repos/index.js.map +0 -1
- package/dist/repos/projects.d.ts +0 -41
- package/dist/repos/projects.d.ts.map +0 -1
- package/dist/repos/projects.js +0 -74
- package/dist/repos/projects.js.map +0 -1
- package/dist/repos/run_steps.d.ts +0 -152
- package/dist/repos/run_steps.d.ts.map +0 -1
- package/dist/repos/run_steps.js +0 -321
- package/dist/repos/run_steps.js.map +0 -1
- package/dist/repos/runs.d.ts +0 -92
- package/dist/repos/runs.d.ts.map +0 -1
- package/dist/repos/runs.js +0 -177
- package/dist/repos/runs.js.map +0 -1
- package/dist/repos/tickets.d.ts +0 -71
- package/dist/repos/tickets.d.ts.map +0 -1
- package/dist/repos/tickets.js +0 -128
- package/dist/repos/tickets.js.map +0 -1
- package/dist/scout/index.d.ts +0 -15
- package/dist/scout/index.d.ts.map +0 -1
- package/dist/scout/index.js +0 -381
- package/dist/scout/index.js.map +0 -1
- package/dist/scout/prompt.d.ts +0 -30
- package/dist/scout/prompt.d.ts.map +0 -1
- package/dist/scout/prompt.js +0 -101
- package/dist/scout/prompt.js.map +0 -1
- package/dist/scout/runner.d.ts +0 -36
- package/dist/scout/runner.d.ts.map +0 -1
- package/dist/scout/runner.js +0 -133
- package/dist/scout/runner.js.map +0 -1
- package/dist/scout/scanner.d.ts +0 -35
- package/dist/scout/scanner.d.ts.map +0 -1
- package/dist/scout/scanner.js +0 -164
- package/dist/scout/scanner.js.map +0 -1
- package/dist/scout/types.d.ts +0 -175
- package/dist/scout/types.d.ts.map +0 -1
- package/dist/scout/types.js +0 -44
- package/dist/scout/types.js.map +0 -1
- package/dist/services/index.d.ts +0 -9
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -9
- package/dist/services/index.js.map +0 -1
- package/dist/services/qa.d.ts +0 -76
- package/dist/services/qa.d.ts.map +0 -1
- package/dist/services/qa.js +0 -239
- package/dist/services/qa.js.map +0 -1
- package/dist/services/scout.d.ts +0 -116
- package/dist/services/scout.d.ts.map +0 -1
- package/dist/services/scout.js +0 -203
- package/dist/services/scout.js.map +0 -1
- package/dist/utils/id.d.ts +0 -12
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -24
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/id.test.d.ts +0 -5
- package/dist/utils/id.test.d.ts.map +0 -1
- package/dist/utils/id.test.js +0 -173
- package/dist/utils/id.test.js.map +0 -1
- package/dist/utils/index.d.ts +0 -6
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/json.d.ts +0 -9
- package/dist/utils/json.d.ts.map +0 -1
- package/dist/utils/json.js +0 -19
- package/dist/utils/json.js.map +0 -1
package/dist/services/scout.d.ts
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scout Service - Orchestrates codebase scanning and ticket creation
|
|
3
|
-
*
|
|
4
|
-
* This is pure orchestration - it coordinates between:
|
|
5
|
-
* - File scanning (scanner.ts)
|
|
6
|
-
* - LLM analysis (runner.ts)
|
|
7
|
-
* - Data persistence (repos/*)
|
|
8
|
-
*
|
|
9
|
-
* It accepts dependencies via ScoutDeps, making it testable and adapter-agnostic.
|
|
10
|
-
*/
|
|
11
|
-
import type { DatabaseAdapter } from '../db/adapter.js';
|
|
12
|
-
import * as projects from '../repos/projects.js';
|
|
13
|
-
import * as tickets from '../repos/tickets.js';
|
|
14
|
-
import * as runs from '../repos/runs.js';
|
|
15
|
-
import { type TicketProposal } from '../scout/index.js';
|
|
16
|
-
/**
|
|
17
|
-
* Dependencies for the scout service
|
|
18
|
-
*/
|
|
19
|
-
export interface ScoutDeps {
|
|
20
|
-
/** Database adapter */
|
|
21
|
-
db: DatabaseAdapter;
|
|
22
|
-
/** Git operations */
|
|
23
|
-
git: GitService;
|
|
24
|
-
/** Logger */
|
|
25
|
-
logger?: Logger;
|
|
26
|
-
/** Clock for timestamps (useful for testing) */
|
|
27
|
-
clock?: () => Date;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Git service interface
|
|
31
|
-
*/
|
|
32
|
-
export interface GitService {
|
|
33
|
-
/** Find repository root from a path */
|
|
34
|
-
findRepoRoot(path: string): Promise<string | null>;
|
|
35
|
-
/** Get remote URL */
|
|
36
|
-
getRemoteUrl(repoRoot: string): Promise<string | null>;
|
|
37
|
-
/** Generate deterministic project ID from repo */
|
|
38
|
-
getProjectId(repoRoot: string, remoteUrl: string | null): string;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Logger interface
|
|
42
|
-
*/
|
|
43
|
-
export interface Logger {
|
|
44
|
-
debug(msg: string, data?: Record<string, unknown>): void;
|
|
45
|
-
info(msg: string, data?: Record<string, unknown>): void;
|
|
46
|
-
warn(msg: string, data?: Record<string, unknown>): void;
|
|
47
|
-
error(msg: string, data?: Record<string, unknown>): void;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Scout options
|
|
51
|
-
*/
|
|
52
|
-
export interface ScoutRepoOptions {
|
|
53
|
-
/** Path to scan (defaults to repo root) */
|
|
54
|
-
path?: string;
|
|
55
|
-
/** Glob pattern for files */
|
|
56
|
-
scope?: string;
|
|
57
|
-
/** Filter to categories */
|
|
58
|
-
types?: Array<'refactor' | 'docs' | 'test' | 'perf' | 'security'>;
|
|
59
|
-
/** Maximum proposals */
|
|
60
|
-
maxProposals?: number;
|
|
61
|
-
/** Minimum confidence threshold */
|
|
62
|
-
minConfidence?: number;
|
|
63
|
-
/** Model to use */
|
|
64
|
-
model?: 'haiku' | 'sonnet' | 'opus';
|
|
65
|
-
/** Custom prompt from formula — tells the AI what to focus on */
|
|
66
|
-
customPrompt?: string;
|
|
67
|
-
/** Timeout per batch */
|
|
68
|
-
timeoutMs?: number;
|
|
69
|
-
/** Abort signal */
|
|
70
|
-
signal?: AbortSignal;
|
|
71
|
-
/** Progress callback */
|
|
72
|
-
onProgress?: (progress: ScoutProgress) => void;
|
|
73
|
-
/** Auto-create tickets from proposals */
|
|
74
|
-
autoApprove?: boolean;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Scout progress
|
|
78
|
-
*/
|
|
79
|
-
export interface ScoutProgress {
|
|
80
|
-
phase: 'init' | 'scanning' | 'analyzing' | 'storing' | 'complete';
|
|
81
|
-
filesScanned?: number;
|
|
82
|
-
totalFiles?: number;
|
|
83
|
-
proposalsFound?: number;
|
|
84
|
-
ticketsCreated?: number;
|
|
85
|
-
message?: string;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Scout result
|
|
89
|
-
*/
|
|
90
|
-
export interface ScoutRepoResult {
|
|
91
|
-
success: boolean;
|
|
92
|
-
project: projects.Project;
|
|
93
|
-
run: runs.Run;
|
|
94
|
-
proposals: TicketProposal[];
|
|
95
|
-
tickets: tickets.Ticket[];
|
|
96
|
-
errors: string[];
|
|
97
|
-
scannedFiles: number;
|
|
98
|
-
durationMs: number;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Scout a repository for improvement opportunities
|
|
102
|
-
*
|
|
103
|
-
* This is the main entry point for the scout service. It:
|
|
104
|
-
* 1. Resolves the repository root
|
|
105
|
-
* 2. Ensures the project exists in the database
|
|
106
|
-
* 3. Creates a scout run
|
|
107
|
-
* 4. Scans files and generates proposals
|
|
108
|
-
* 5. Optionally creates tickets from proposals
|
|
109
|
-
* 6. Records the run outcome
|
|
110
|
-
*/
|
|
111
|
-
export declare function scoutRepo(deps: ScoutDeps, opts?: ScoutRepoOptions): Promise<ScoutRepoResult>;
|
|
112
|
-
/**
|
|
113
|
-
* Approve specific proposals and create tickets
|
|
114
|
-
*/
|
|
115
|
-
export declare function approveProposals(deps: ScoutDeps, projectId: string, proposals: TicketProposal[]): Promise<tickets.Ticket[]>;
|
|
116
|
-
//# sourceMappingURL=scout.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout.d.ts","sourceRoot":"","sources":["../../src/services/scout.ts"],"names":[],"mappings":"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"}
|
package/dist/services/scout.js
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scout Service - Orchestrates codebase scanning and ticket creation
|
|
3
|
-
*
|
|
4
|
-
* This is pure orchestration - it coordinates between:
|
|
5
|
-
* - File scanning (scanner.ts)
|
|
6
|
-
* - LLM analysis (runner.ts)
|
|
7
|
-
* - Data persistence (repos/*)
|
|
8
|
-
*
|
|
9
|
-
* It accepts dependencies via ScoutDeps, making it testable and adapter-agnostic.
|
|
10
|
-
*/
|
|
11
|
-
import * as projects from '../repos/projects.js';
|
|
12
|
-
import * as tickets from '../repos/tickets.js';
|
|
13
|
-
import * as runs from '../repos/runs.js';
|
|
14
|
-
import { scout as scanAndPropose, } from '../scout/index.js';
|
|
15
|
-
/**
|
|
16
|
-
* Scout a repository for improvement opportunities
|
|
17
|
-
*
|
|
18
|
-
* This is the main entry point for the scout service. It:
|
|
19
|
-
* 1. Resolves the repository root
|
|
20
|
-
* 2. Ensures the project exists in the database
|
|
21
|
-
* 3. Creates a scout run
|
|
22
|
-
* 4. Scans files and generates proposals
|
|
23
|
-
* 5. Optionally creates tickets from proposals
|
|
24
|
-
* 6. Records the run outcome
|
|
25
|
-
*/
|
|
26
|
-
export async function scoutRepo(deps, opts = {}) {
|
|
27
|
-
const { db, git, logger } = deps;
|
|
28
|
-
const startTime = Date.now();
|
|
29
|
-
const errors = [];
|
|
30
|
-
const report = (progress) => {
|
|
31
|
-
opts.onProgress?.({
|
|
32
|
-
phase: 'init',
|
|
33
|
-
...progress,
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
// Phase 1: Resolve repository
|
|
37
|
-
report({ phase: 'init', message: 'Resolving repository...' });
|
|
38
|
-
const targetPath = opts.path ?? process.cwd();
|
|
39
|
-
const repoRoot = await git.findRepoRoot(targetPath);
|
|
40
|
-
if (!repoRoot) {
|
|
41
|
-
throw new Error(`Not a git repository: ${targetPath}`);
|
|
42
|
-
}
|
|
43
|
-
const remoteUrl = await git.getRemoteUrl(repoRoot);
|
|
44
|
-
const projectId = git.getProjectId(repoRoot, remoteUrl);
|
|
45
|
-
logger?.debug('Resolved repository', { repoRoot, remoteUrl, projectId });
|
|
46
|
-
// Phase 2: Ensure project exists
|
|
47
|
-
const project = await projects.ensureForRepo(db, {
|
|
48
|
-
id: projectId,
|
|
49
|
-
name: repoRoot.split('/').pop() || 'unknown',
|
|
50
|
-
repoUrl: remoteUrl,
|
|
51
|
-
rootPath: repoRoot,
|
|
52
|
-
});
|
|
53
|
-
logger?.info('Project ensured', { projectId: project.id, name: project.name });
|
|
54
|
-
// Phase 3: Create scout run
|
|
55
|
-
const run = await runs.create(db, {
|
|
56
|
-
projectId: project.id,
|
|
57
|
-
type: 'scout',
|
|
58
|
-
metadata: {
|
|
59
|
-
scope: opts.scope ?? 'src/**',
|
|
60
|
-
maxProposals: opts.maxProposals ?? 10,
|
|
61
|
-
model: opts.model ?? 'opus',
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
logger?.debug('Scout run created', { runId: run.id });
|
|
65
|
-
try {
|
|
66
|
-
// Phase 4: Get dedup context
|
|
67
|
-
const recentTickets = await tickets.getRecentlyCompleted(db, project.id, 20);
|
|
68
|
-
const recentTitles = recentTickets.map(t => t.title);
|
|
69
|
-
// Phase 5: Scan and generate proposals
|
|
70
|
-
report({ phase: 'scanning', message: 'Scanning files...' });
|
|
71
|
-
const scanResult = await scanAndPropose({
|
|
72
|
-
scope: opts.scope ?? 'src/**',
|
|
73
|
-
types: opts.types,
|
|
74
|
-
maxProposals: opts.maxProposals ?? 10,
|
|
75
|
-
minConfidence: opts.minConfidence ?? 50,
|
|
76
|
-
projectPath: repoRoot,
|
|
77
|
-
model: opts.model ?? 'opus',
|
|
78
|
-
timeoutMs: opts.timeoutMs ?? 120000,
|
|
79
|
-
signal: opts.signal,
|
|
80
|
-
recentlyCompletedTitles: recentTitles,
|
|
81
|
-
customPrompt: opts.customPrompt,
|
|
82
|
-
onProgress: (p) => {
|
|
83
|
-
report({
|
|
84
|
-
phase: 'analyzing',
|
|
85
|
-
filesScanned: p.filesScanned,
|
|
86
|
-
totalFiles: p.totalFiles,
|
|
87
|
-
proposalsFound: p.proposalsFound,
|
|
88
|
-
message: `Analyzing batch ${p.currentBatch}/${p.totalBatches}`,
|
|
89
|
-
});
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
if (!scanResult.success) {
|
|
93
|
-
errors.push(...scanResult.errors);
|
|
94
|
-
}
|
|
95
|
-
logger?.info('Scan complete', {
|
|
96
|
-
files: scanResult.scannedFiles,
|
|
97
|
-
proposals: scanResult.proposals.length,
|
|
98
|
-
});
|
|
99
|
-
// Phase 6: Create tickets if auto-approve
|
|
100
|
-
const createdTickets = [];
|
|
101
|
-
if (opts.autoApprove && scanResult.proposals.length > 0) {
|
|
102
|
-
report({
|
|
103
|
-
phase: 'storing',
|
|
104
|
-
proposalsFound: scanResult.proposals.length,
|
|
105
|
-
message: 'Creating tickets...',
|
|
106
|
-
});
|
|
107
|
-
const ticketInputs = scanResult.proposals.map(proposal => ({
|
|
108
|
-
projectId: project.id,
|
|
109
|
-
title: proposal.title,
|
|
110
|
-
description: formatProposalDescription(proposal),
|
|
111
|
-
status: 'ready',
|
|
112
|
-
priority: proposal.confidence,
|
|
113
|
-
category: proposal.category,
|
|
114
|
-
allowedPaths: proposal.allowed_paths,
|
|
115
|
-
verificationCommands: proposal.verification_commands,
|
|
116
|
-
}));
|
|
117
|
-
const created = await tickets.createMany(db, ticketInputs);
|
|
118
|
-
createdTickets.push(...created);
|
|
119
|
-
logger?.info('Tickets created', { count: created.length });
|
|
120
|
-
}
|
|
121
|
-
// Phase 7: Mark run success
|
|
122
|
-
await runs.markSuccess(db, run.id, {
|
|
123
|
-
scannedFiles: scanResult.scannedFiles,
|
|
124
|
-
proposalCount: scanResult.proposals.length,
|
|
125
|
-
ticketCount: createdTickets.length,
|
|
126
|
-
durationMs: Date.now() - startTime,
|
|
127
|
-
});
|
|
128
|
-
report({
|
|
129
|
-
phase: 'complete',
|
|
130
|
-
filesScanned: scanResult.scannedFiles,
|
|
131
|
-
proposalsFound: scanResult.proposals.length,
|
|
132
|
-
ticketsCreated: createdTickets.length,
|
|
133
|
-
});
|
|
134
|
-
return {
|
|
135
|
-
success: true,
|
|
136
|
-
project,
|
|
137
|
-
run: (await runs.getById(db, run.id)),
|
|
138
|
-
proposals: scanResult.proposals,
|
|
139
|
-
tickets: createdTickets,
|
|
140
|
-
errors: scanResult.errors,
|
|
141
|
-
scannedFiles: scanResult.scannedFiles,
|
|
142
|
-
durationMs: Date.now() - startTime,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
// Mark run as failed
|
|
147
|
-
await runs.markFailure(db, run.id, error, {
|
|
148
|
-
durationMs: Date.now() - startTime,
|
|
149
|
-
});
|
|
150
|
-
logger?.error('Scout failed', { error: error.message });
|
|
151
|
-
return {
|
|
152
|
-
success: false,
|
|
153
|
-
project,
|
|
154
|
-
run: (await runs.getById(db, run.id)),
|
|
155
|
-
proposals: [],
|
|
156
|
-
tickets: [],
|
|
157
|
-
errors: [...errors, error.message],
|
|
158
|
-
scannedFiles: 0,
|
|
159
|
-
durationMs: Date.now() - startTime,
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Format a proposal into ticket description markdown
|
|
165
|
-
*/
|
|
166
|
-
function formatProposalDescription(proposal) {
|
|
167
|
-
const parts = [
|
|
168
|
-
proposal.description,
|
|
169
|
-
'',
|
|
170
|
-
'## Acceptance Criteria',
|
|
171
|
-
...proposal.acceptance_criteria.map(c => `- ${c}`),
|
|
172
|
-
'',
|
|
173
|
-
'## Rationale',
|
|
174
|
-
proposal.rationale,
|
|
175
|
-
'',
|
|
176
|
-
'## Files',
|
|
177
|
-
...proposal.files.map(f => `- \`${f}\``),
|
|
178
|
-
'',
|
|
179
|
-
`**Complexity:** ${proposal.estimated_complexity}`,
|
|
180
|
-
`**Confidence:** ${proposal.confidence}%`,
|
|
181
|
-
];
|
|
182
|
-
return parts.join('\n');
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Approve specific proposals and create tickets
|
|
186
|
-
*/
|
|
187
|
-
export async function approveProposals(deps, projectId, proposals) {
|
|
188
|
-
const { db, logger } = deps;
|
|
189
|
-
const ticketInputs = proposals.map(proposal => ({
|
|
190
|
-
projectId,
|
|
191
|
-
title: proposal.title,
|
|
192
|
-
description: formatProposalDescription(proposal),
|
|
193
|
-
status: 'ready',
|
|
194
|
-
priority: proposal.confidence,
|
|
195
|
-
category: proposal.category,
|
|
196
|
-
allowedPaths: proposal.allowed_paths,
|
|
197
|
-
verificationCommands: proposal.verification_commands,
|
|
198
|
-
}));
|
|
199
|
-
const created = await tickets.createMany(db, ticketInputs);
|
|
200
|
-
logger?.info('Proposals approved', { count: created.length });
|
|
201
|
-
return created;
|
|
202
|
-
}
|
|
203
|
-
//# sourceMappingURL=scout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scout.js","sourceRoot":"","sources":["../../src/services/scout.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/id.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ID generation utilities
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Generate a random ID
|
|
6
|
-
*/
|
|
7
|
-
export declare function nanoid(size?: number): string;
|
|
8
|
-
/**
|
|
9
|
-
* Generate a prefixed ID
|
|
10
|
-
*/
|
|
11
|
-
export declare function prefixedId(prefix: string, size?: number): string;
|
|
12
|
-
//# sourceMappingURL=id.d.ts.map
|
package/dist/utils/id.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,GAAE,MAAW,GAAG,MAAM,CAWhD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAEpE"}
|
package/dist/utils/id.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ID generation utilities
|
|
3
|
-
*/
|
|
4
|
-
const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';
|
|
5
|
-
/**
|
|
6
|
-
* Generate a random ID
|
|
7
|
-
*/
|
|
8
|
-
export function nanoid(size = 21) {
|
|
9
|
-
let id = '';
|
|
10
|
-
const bytes = new Uint8Array(size);
|
|
11
|
-
// eslint-disable-next-line no-undef
|
|
12
|
-
crypto.getRandomValues(bytes);
|
|
13
|
-
for (let i = 0; i < size; i++) {
|
|
14
|
-
id += ALPHABET[bytes[i] % ALPHABET.length];
|
|
15
|
-
}
|
|
16
|
-
return id;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Generate a prefixed ID
|
|
20
|
-
*/
|
|
21
|
-
export function prefixedId(prefix, size = 12) {
|
|
22
|
-
return `${prefix}_${nanoid(size)}`;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=id.js.map
|
package/dist/utils/id.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AAExD;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE;IACtC,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,oCAAoC;IACpC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,OAAe,EAAE;IAC1D,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACrC,CAAC"}
|
package/dist/utils/id.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id.test.d.ts","sourceRoot":"","sources":["../../src/utils/id.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/utils/id.test.js
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for ID generation utilities
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from 'vitest';
|
|
5
|
-
import { nanoid, prefixedId } from './id.js';
|
|
6
|
-
const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';
|
|
7
|
-
describe('nanoid', () => {
|
|
8
|
-
describe('length', () => {
|
|
9
|
-
it('generates string of default length (21)', () => {
|
|
10
|
-
const id = nanoid();
|
|
11
|
-
expect(id).toHaveLength(21);
|
|
12
|
-
});
|
|
13
|
-
it('generates string of specified length', () => {
|
|
14
|
-
expect(nanoid(10)).toHaveLength(10);
|
|
15
|
-
expect(nanoid(32)).toHaveLength(32);
|
|
16
|
-
expect(nanoid(100)).toHaveLength(100);
|
|
17
|
-
});
|
|
18
|
-
it('handles size=0', () => {
|
|
19
|
-
const id = nanoid(0);
|
|
20
|
-
expect(id).toBe('');
|
|
21
|
-
expect(id).toHaveLength(0);
|
|
22
|
-
});
|
|
23
|
-
it('handles size=1', () => {
|
|
24
|
-
const id = nanoid(1);
|
|
25
|
-
expect(id).toHaveLength(1);
|
|
26
|
-
expect(ALPHABET).toContain(id);
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
describe('character set', () => {
|
|
30
|
-
it('only uses characters from ALPHABET', () => {
|
|
31
|
-
// Generate multiple IDs to increase coverage
|
|
32
|
-
for (let i = 0; i < 100; i++) {
|
|
33
|
-
const id = nanoid(50);
|
|
34
|
-
for (const char of id) {
|
|
35
|
-
expect(ALPHABET).toContain(char);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
it('produces lowercase alphanumeric characters only', () => {
|
|
40
|
-
const id = nanoid(100);
|
|
41
|
-
expect(id).toMatch(/^[0-9a-z]+$/);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
describe('uniqueness', () => {
|
|
45
|
-
it('generates unique IDs across multiple calls', () => {
|
|
46
|
-
const ids = new Set();
|
|
47
|
-
const count = 1000;
|
|
48
|
-
for (let i = 0; i < count; i++) {
|
|
49
|
-
ids.add(nanoid());
|
|
50
|
-
}
|
|
51
|
-
expect(ids.size).toBe(count);
|
|
52
|
-
});
|
|
53
|
-
it('generates unique IDs even with small size', () => {
|
|
54
|
-
// With size=8 and 36-char alphabet, we have 36^8 = 2.8 trillion possibilities
|
|
55
|
-
// 100 samples should still be unique
|
|
56
|
-
const ids = new Set();
|
|
57
|
-
const count = 100;
|
|
58
|
-
for (let i = 0; i < count; i++) {
|
|
59
|
-
ids.add(nanoid(8));
|
|
60
|
-
}
|
|
61
|
-
expect(ids.size).toBe(count);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
describe('randomness', () => {
|
|
65
|
-
it('produces different IDs on consecutive calls', () => {
|
|
66
|
-
const id1 = nanoid();
|
|
67
|
-
const id2 = nanoid();
|
|
68
|
-
const id3 = nanoid();
|
|
69
|
-
expect(id1).not.toBe(id2);
|
|
70
|
-
expect(id2).not.toBe(id3);
|
|
71
|
-
expect(id1).not.toBe(id3);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
describe('edge cases', () => {
|
|
75
|
-
it('handles large sizes', () => {
|
|
76
|
-
const id = nanoid(1000);
|
|
77
|
-
expect(id).toHaveLength(1000);
|
|
78
|
-
expect(id).toMatch(/^[0-9a-z]+$/);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
describe('prefixedId', () => {
|
|
83
|
-
describe('format', () => {
|
|
84
|
-
it('returns prefix_id format', () => {
|
|
85
|
-
const id = prefixedId('tkt');
|
|
86
|
-
expect(id).toMatch(/^tkt_[0-9a-z]+$/);
|
|
87
|
-
});
|
|
88
|
-
it('uses underscore as separator', () => {
|
|
89
|
-
const id = prefixedId('usr');
|
|
90
|
-
const parts = id.split('_');
|
|
91
|
-
expect(parts).toHaveLength(2);
|
|
92
|
-
expect(parts[0]).toBe('usr');
|
|
93
|
-
});
|
|
94
|
-
it('preserves prefix exactly', () => {
|
|
95
|
-
const prefixes = ['tkt', 'run', 'step', 'ABC', '123'];
|
|
96
|
-
for (const prefix of prefixes) {
|
|
97
|
-
const id = prefixedId(prefix);
|
|
98
|
-
expect(id.startsWith(`${prefix}_`)).toBe(true);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe('default size', () => {
|
|
103
|
-
it('uses default size of 12 for random part', () => {
|
|
104
|
-
const id = prefixedId('tkt');
|
|
105
|
-
const randomPart = id.split('_')[1];
|
|
106
|
-
expect(randomPart).toHaveLength(12);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
describe('custom size', () => {
|
|
110
|
-
it('respects custom size parameter', () => {
|
|
111
|
-
const id = prefixedId('tkt', 8);
|
|
112
|
-
const randomPart = id.split('_')[1];
|
|
113
|
-
expect(randomPart).toHaveLength(8);
|
|
114
|
-
});
|
|
115
|
-
it('handles size=0', () => {
|
|
116
|
-
const id = prefixedId('tkt', 0);
|
|
117
|
-
expect(id).toBe('tkt_');
|
|
118
|
-
});
|
|
119
|
-
it('handles size=1', () => {
|
|
120
|
-
const id = prefixedId('tkt', 1);
|
|
121
|
-
const randomPart = id.split('_')[1];
|
|
122
|
-
expect(randomPart).toHaveLength(1);
|
|
123
|
-
expect(ALPHABET).toContain(randomPart);
|
|
124
|
-
});
|
|
125
|
-
it('handles large sizes', () => {
|
|
126
|
-
const id = prefixedId('tkt', 100);
|
|
127
|
-
const randomPart = id.split('_')[1];
|
|
128
|
-
expect(randomPart).toHaveLength(100);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
describe('uniqueness', () => {
|
|
132
|
-
it('generates unique IDs with same prefix', () => {
|
|
133
|
-
const ids = new Set();
|
|
134
|
-
const count = 100;
|
|
135
|
-
for (let i = 0; i < count; i++) {
|
|
136
|
-
ids.add(prefixedId('tkt'));
|
|
137
|
-
}
|
|
138
|
-
expect(ids.size).toBe(count);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
describe('character set', () => {
|
|
142
|
-
it('random part only uses characters from ALPHABET', () => {
|
|
143
|
-
for (let i = 0; i < 50; i++) {
|
|
144
|
-
const id = prefixedId('test', 20);
|
|
145
|
-
const randomPart = id.split('_')[1];
|
|
146
|
-
for (const char of randomPart) {
|
|
147
|
-
expect(ALPHABET).toContain(char);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
describe('edge cases', () => {
|
|
153
|
-
it('handles empty prefix', () => {
|
|
154
|
-
const id = prefixedId('');
|
|
155
|
-
expect(id).toMatch(/^_[0-9a-z]+$/);
|
|
156
|
-
});
|
|
157
|
-
it('handles prefix with special characters', () => {
|
|
158
|
-
const id = prefixedId('test-prefix');
|
|
159
|
-
expect(id.startsWith('test-prefix_')).toBe(true);
|
|
160
|
-
});
|
|
161
|
-
it('handles prefix with underscore', () => {
|
|
162
|
-
const id = prefixedId('my_prefix');
|
|
163
|
-
expect(id.startsWith('my_prefix_')).toBe(true);
|
|
164
|
-
// Verify format still works (split produces 3 parts now)
|
|
165
|
-
const parts = id.split('_');
|
|
166
|
-
expect(parts[0]).toBe('my');
|
|
167
|
-
expect(parts[1]).toBe('prefix');
|
|
168
|
-
// Random part is the third element
|
|
169
|
-
expect(parts[2]).toHaveLength(12);
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
//# sourceMappingURL=id.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id.test.js","sourceRoot":"","sources":["../../src/utils/id.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/utils/index.js
DELETED
package/dist/utils/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/utils/json.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON parsing utilities
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Parse a JSON string that should contain an array.
|
|
6
|
-
* Returns an empty array if the value is null, empty, or invalid JSON.
|
|
7
|
-
*/
|
|
8
|
-
export declare function parseJsonArray(value: string | null): string[];
|
|
9
|
-
//# sourceMappingURL=json.d.ts.map
|
package/dist/utils/json.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAQ7D"}
|
package/dist/utils/json.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON parsing utilities
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Parse a JSON string that should contain an array.
|
|
6
|
-
* Returns an empty array if the value is null, empty, or invalid JSON.
|
|
7
|
-
*/
|
|
8
|
-
export function parseJsonArray(value) {
|
|
9
|
-
if (!value)
|
|
10
|
-
return [];
|
|
11
|
-
try {
|
|
12
|
-
const parsed = JSON.parse(value);
|
|
13
|
-
return Array.isArray(parsed) ? parsed : [];
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return [];
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=json.js.map
|
package/dist/utils/json.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|