@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.
Files changed (93) hide show
  1. package/package.json +1 -1
  2. package/dist/db/adapter.d.ts +0 -191
  3. package/dist/db/adapter.d.ts.map +0 -1
  4. package/dist/db/adapter.js +0 -40
  5. package/dist/db/adapter.js.map +0 -1
  6. package/dist/db/contract.d.ts +0 -47
  7. package/dist/db/contract.d.ts.map +0 -1
  8. package/dist/db/contract.js +0 -258
  9. package/dist/db/contract.js.map +0 -1
  10. package/dist/db/index.d.ts +0 -6
  11. package/dist/db/index.d.ts.map +0 -1
  12. package/dist/db/index.js +0 -7
  13. package/dist/db/index.js.map +0 -1
  14. package/dist/exec/index.d.ts +0 -5
  15. package/dist/exec/index.d.ts.map +0 -1
  16. package/dist/exec/index.js +0 -5
  17. package/dist/exec/index.js.map +0 -1
  18. package/dist/exec/types.d.ts +0 -64
  19. package/dist/exec/types.d.ts.map +0 -1
  20. package/dist/exec/types.js +0 -8
  21. package/dist/exec/types.js.map +0 -1
  22. package/dist/index.d.ts +0 -23
  23. package/dist/index.d.ts.map +0 -1
  24. package/dist/index.js +0 -27
  25. package/dist/index.js.map +0 -1
  26. package/dist/repos/index.d.ts +0 -15
  27. package/dist/repos/index.d.ts.map +0 -1
  28. package/dist/repos/index.js +0 -11
  29. package/dist/repos/index.js.map +0 -1
  30. package/dist/repos/projects.d.ts +0 -41
  31. package/dist/repos/projects.d.ts.map +0 -1
  32. package/dist/repos/projects.js +0 -74
  33. package/dist/repos/projects.js.map +0 -1
  34. package/dist/repos/run_steps.d.ts +0 -152
  35. package/dist/repos/run_steps.d.ts.map +0 -1
  36. package/dist/repos/run_steps.js +0 -321
  37. package/dist/repos/run_steps.js.map +0 -1
  38. package/dist/repos/runs.d.ts +0 -92
  39. package/dist/repos/runs.d.ts.map +0 -1
  40. package/dist/repos/runs.js +0 -177
  41. package/dist/repos/runs.js.map +0 -1
  42. package/dist/repos/tickets.d.ts +0 -71
  43. package/dist/repos/tickets.d.ts.map +0 -1
  44. package/dist/repos/tickets.js +0 -128
  45. package/dist/repos/tickets.js.map +0 -1
  46. package/dist/scout/index.d.ts +0 -15
  47. package/dist/scout/index.d.ts.map +0 -1
  48. package/dist/scout/index.js +0 -381
  49. package/dist/scout/index.js.map +0 -1
  50. package/dist/scout/prompt.d.ts +0 -30
  51. package/dist/scout/prompt.d.ts.map +0 -1
  52. package/dist/scout/prompt.js +0 -101
  53. package/dist/scout/prompt.js.map +0 -1
  54. package/dist/scout/runner.d.ts +0 -36
  55. package/dist/scout/runner.d.ts.map +0 -1
  56. package/dist/scout/runner.js +0 -133
  57. package/dist/scout/runner.js.map +0 -1
  58. package/dist/scout/scanner.d.ts +0 -35
  59. package/dist/scout/scanner.d.ts.map +0 -1
  60. package/dist/scout/scanner.js +0 -164
  61. package/dist/scout/scanner.js.map +0 -1
  62. package/dist/scout/types.d.ts +0 -175
  63. package/dist/scout/types.d.ts.map +0 -1
  64. package/dist/scout/types.js +0 -44
  65. package/dist/scout/types.js.map +0 -1
  66. package/dist/services/index.d.ts +0 -9
  67. package/dist/services/index.d.ts.map +0 -1
  68. package/dist/services/index.js +0 -9
  69. package/dist/services/index.js.map +0 -1
  70. package/dist/services/qa.d.ts +0 -76
  71. package/dist/services/qa.d.ts.map +0 -1
  72. package/dist/services/qa.js +0 -239
  73. package/dist/services/qa.js.map +0 -1
  74. package/dist/services/scout.d.ts +0 -116
  75. package/dist/services/scout.d.ts.map +0 -1
  76. package/dist/services/scout.js +0 -203
  77. package/dist/services/scout.js.map +0 -1
  78. package/dist/utils/id.d.ts +0 -12
  79. package/dist/utils/id.d.ts.map +0 -1
  80. package/dist/utils/id.js +0 -24
  81. package/dist/utils/id.js.map +0 -1
  82. package/dist/utils/id.test.d.ts +0 -5
  83. package/dist/utils/id.test.d.ts.map +0 -1
  84. package/dist/utils/id.test.js +0 -173
  85. package/dist/utils/id.test.js.map +0 -1
  86. package/dist/utils/index.d.ts +0 -6
  87. package/dist/utils/index.d.ts.map +0 -1
  88. package/dist/utils/index.js +0 -6
  89. package/dist/utils/index.js.map +0 -1
  90. package/dist/utils/json.d.ts +0 -9
  91. package/dist/utils/json.d.ts.map +0 -1
  92. package/dist/utils/json.js +0 -19
  93. package/dist/utils/json.js.map +0 -1
@@ -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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"}
@@ -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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"}
@@ -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
@@ -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
@@ -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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for ID generation utilities
3
- */
4
- export {};
5
- //# sourceMappingURL=id.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"id.test.d.ts","sourceRoot":"","sources":["../../src/utils/id.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -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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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Utility exports
3
- */
4
- export { nanoid, prefixedId } from './id.js';
5
- export { parseJsonArray } from './json.js';
6
- //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Utility exports
3
- */
4
- export { nanoid, prefixedId } from './id.js';
5
- export { parseJsonArray } from './json.js';
6
- //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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
@@ -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"}
@@ -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
@@ -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"}