@jamesaphoenix/tx-test-utils 0.4.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.
Files changed (101) hide show
  1. package/dist/database/index.d.ts +8 -0
  2. package/dist/database/index.d.ts.map +1 -0
  3. package/dist/database/index.js +7 -0
  4. package/dist/database/index.js.map +1 -0
  5. package/dist/database/test-database.d.ts +101 -0
  6. package/dist/database/test-database.d.ts.map +1 -0
  7. package/dist/database/test-database.js +130 -0
  8. package/dist/database/test-database.js.map +1 -0
  9. package/dist/factories/anchor.factory.d.ts +117 -0
  10. package/dist/factories/anchor.factory.d.ts.map +1 -0
  11. package/dist/factories/anchor.factory.js +201 -0
  12. package/dist/factories/anchor.factory.js.map +1 -0
  13. package/dist/factories/candidate.factory.d.ts +151 -0
  14. package/dist/factories/candidate.factory.d.ts.map +1 -0
  15. package/dist/factories/candidate.factory.js +194 -0
  16. package/dist/factories/candidate.factory.js.map +1 -0
  17. package/dist/factories/edge.factory.d.ts +119 -0
  18. package/dist/factories/edge.factory.d.ts.map +1 -0
  19. package/dist/factories/edge.factory.js +191 -0
  20. package/dist/factories/edge.factory.js.map +1 -0
  21. package/dist/factories/factories.test.d.ts +8 -0
  22. package/dist/factories/factories.test.d.ts.map +1 -0
  23. package/dist/factories/factories.test.js +419 -0
  24. package/dist/factories/factories.test.js.map +1 -0
  25. package/dist/factories/index.d.ts +15 -0
  26. package/dist/factories/index.d.ts.map +1 -0
  27. package/dist/factories/index.js +21 -0
  28. package/dist/factories/index.js.map +1 -0
  29. package/dist/factories/learning.factory.d.ts +107 -0
  30. package/dist/factories/learning.factory.d.ts.map +1 -0
  31. package/dist/factories/learning.factory.js +150 -0
  32. package/dist/factories/learning.factory.js.map +1 -0
  33. package/dist/factories/task.factory.d.ts +106 -0
  34. package/dist/factories/task.factory.d.ts.map +1 -0
  35. package/dist/factories/task.factory.js +151 -0
  36. package/dist/factories/task.factory.js.map +1 -0
  37. package/dist/fixtures/index.d.ts +36 -0
  38. package/dist/fixtures/index.d.ts.map +1 -0
  39. package/dist/fixtures/index.js +47 -0
  40. package/dist/fixtures/index.js.map +1 -0
  41. package/dist/helpers/effect.d.ts +186 -0
  42. package/dist/helpers/effect.d.ts.map +1 -0
  43. package/dist/helpers/effect.js +298 -0
  44. package/dist/helpers/effect.js.map +1 -0
  45. package/dist/helpers/effect.test.d.ts +7 -0
  46. package/dist/helpers/effect.test.d.ts.map +1 -0
  47. package/dist/helpers/effect.test.js +271 -0
  48. package/dist/helpers/effect.test.js.map +1 -0
  49. package/dist/helpers/index.d.ts +7 -0
  50. package/dist/helpers/index.d.ts.map +1 -0
  51. package/dist/helpers/index.js +11 -0
  52. package/dist/helpers/index.js.map +1 -0
  53. package/dist/index.d.ts +26 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +52 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/llm-cache/cache.d.ts +152 -0
  58. package/dist/llm-cache/cache.d.ts.map +1 -0
  59. package/dist/llm-cache/cache.js +199 -0
  60. package/dist/llm-cache/cache.js.map +1 -0
  61. package/dist/llm-cache/cache.test.d.ts +7 -0
  62. package/dist/llm-cache/cache.test.d.ts.map +1 -0
  63. package/dist/llm-cache/cache.test.js +310 -0
  64. package/dist/llm-cache/cache.test.js.map +1 -0
  65. package/dist/llm-cache/cli.d.ts +113 -0
  66. package/dist/llm-cache/cli.d.ts.map +1 -0
  67. package/dist/llm-cache/cli.js +248 -0
  68. package/dist/llm-cache/cli.js.map +1 -0
  69. package/dist/llm-cache/index.d.ts +31 -0
  70. package/dist/llm-cache/index.d.ts.map +1 -0
  71. package/dist/llm-cache/index.js +31 -0
  72. package/dist/llm-cache/index.js.map +1 -0
  73. package/dist/mocks/anthropic.mock.d.ts +173 -0
  74. package/dist/mocks/anthropic.mock.d.ts.map +1 -0
  75. package/dist/mocks/anthropic.mock.js +125 -0
  76. package/dist/mocks/anthropic.mock.js.map +1 -0
  77. package/dist/mocks/ast-grep.mock.d.ts +216 -0
  78. package/dist/mocks/ast-grep.mock.d.ts.map +1 -0
  79. package/dist/mocks/ast-grep.mock.js +164 -0
  80. package/dist/mocks/ast-grep.mock.js.map +1 -0
  81. package/dist/mocks/file-system.mock.d.ts +181 -0
  82. package/dist/mocks/file-system.mock.d.ts.map +1 -0
  83. package/dist/mocks/file-system.mock.js +280 -0
  84. package/dist/mocks/file-system.mock.js.map +1 -0
  85. package/dist/mocks/index.d.ts +10 -0
  86. package/dist/mocks/index.d.ts.map +1 -0
  87. package/dist/mocks/index.js +16 -0
  88. package/dist/mocks/index.js.map +1 -0
  89. package/dist/mocks/mocks.test.d.ts +10 -0
  90. package/dist/mocks/mocks.test.d.ts.map +1 -0
  91. package/dist/mocks/mocks.test.js +961 -0
  92. package/dist/mocks/mocks.test.js.map +1 -0
  93. package/dist/mocks/openai.mock.d.ts +205 -0
  94. package/dist/mocks/openai.mock.d.ts.map +1 -0
  95. package/dist/mocks/openai.mock.js +178 -0
  96. package/dist/mocks/openai.mock.js.map +1 -0
  97. package/dist/setup/index.d.ts +7 -0
  98. package/dist/setup/index.d.ts.map +1 -0
  99. package/dist/setup/index.js +9 -0
  100. package/dist/setup/index.js.map +1 -0
  101. package/package.json +80 -0
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Learning factory for creating test learning data.
3
+ *
4
+ * @module @tx/test-utils/factories/learning
5
+ */
6
+ /**
7
+ * Factory class for creating test learnings.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const db = await Effect.runPromise(createTestDatabase())
12
+ * const factory = new LearningFactory(db)
13
+ *
14
+ * // Create single learning
15
+ * const learning = factory.create({ content: 'Always use Effect for async ops' })
16
+ *
17
+ * // Create with embedding for vector search testing
18
+ * const embedding = new Float32Array([0.1, 0.2, 0.3, ...])
19
+ * const withVector = factory.withEmbedding(embedding, { content: 'Test learning' })
20
+ *
21
+ * // Create multiple learnings
22
+ * const learnings = await factory.createMany(5, { category: 'testing' })
23
+ * ```
24
+ */
25
+ export class LearningFactory {
26
+ counter = 0;
27
+ db;
28
+ constructor(db) {
29
+ this.db = db;
30
+ }
31
+ /**
32
+ * Create a single test learning.
33
+ */
34
+ create(options = {}) {
35
+ this.counter++;
36
+ const now = new Date();
37
+ const id = options.id ?? this.counter;
38
+ const content = options.content ?? `Test learning ${this.counter}`;
39
+ const sourceType = options.sourceType ?? "manual";
40
+ const sourceRef = options.sourceRef ?? null;
41
+ const keywords = options.keywords ?? [];
42
+ const category = options.category ?? null;
43
+ const usageCount = options.usageCount ?? 0;
44
+ const lastUsedAt = options.lastUsedAt ?? null;
45
+ const outcomeScore = options.outcomeScore ?? null;
46
+ const embedding = options.embedding ?? null;
47
+ const createdAt = options.createdAt ?? now;
48
+ // Convert Float32Array to Buffer for SQLite storage
49
+ const embeddingBuffer = embedding
50
+ ? Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength)
51
+ : null;
52
+ this.db.run(`INSERT INTO learnings (id, content, source_type, source_ref, keywords, category, usage_count, last_used_at, outcome_score, embedding, created_at)
53
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
54
+ id,
55
+ content,
56
+ sourceType,
57
+ sourceRef,
58
+ JSON.stringify(keywords),
59
+ category,
60
+ usageCount,
61
+ lastUsedAt ? lastUsedAt.toISOString() : null,
62
+ outcomeScore,
63
+ embeddingBuffer,
64
+ createdAt.toISOString()
65
+ ]);
66
+ return {
67
+ id: id,
68
+ content,
69
+ sourceType,
70
+ sourceRef,
71
+ keywords,
72
+ category,
73
+ usageCount,
74
+ lastUsedAt,
75
+ outcomeScore,
76
+ embedding,
77
+ createdAt
78
+ };
79
+ }
80
+ /**
81
+ * Create multiple test learnings.
82
+ */
83
+ createMany(count, options = {}) {
84
+ const learnings = [];
85
+ for (let i = 0; i < count; i++) {
86
+ learnings.push(this.create({
87
+ ...options,
88
+ content: options.content ? `${options.content} ${i + 1}` : undefined
89
+ }));
90
+ }
91
+ return learnings;
92
+ }
93
+ /**
94
+ * Create a learning with specific content.
95
+ */
96
+ withContent(content, options = {}) {
97
+ return this.create({ ...options, content });
98
+ }
99
+ /**
100
+ * Create a learning with embedding vector for vector search testing.
101
+ */
102
+ withEmbedding(embedding, options = {}) {
103
+ return this.create({ ...options, embedding });
104
+ }
105
+ /**
106
+ * Create a learning with a specific category.
107
+ */
108
+ withCategory(category, options = {}) {
109
+ return this.create({ ...options, category });
110
+ }
111
+ /**
112
+ * Create a learning from a specific source.
113
+ */
114
+ fromSource(sourceType, sourceRef, options = {}) {
115
+ return this.create({ ...options, sourceType, sourceRef });
116
+ }
117
+ /**
118
+ * Reset the internal counter.
119
+ */
120
+ reset() {
121
+ this.counter = 0;
122
+ }
123
+ }
124
+ /**
125
+ * Create a single test learning (convenience function).
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * const db = await Effect.runPromise(createTestDatabase())
130
+ * const learning = createTestLearning(db, { content: 'Use Effect-TS for typed errors' })
131
+ * ```
132
+ */
133
+ export const createTestLearning = (db, options = {}) => {
134
+ const factory = new LearningFactory(db);
135
+ return factory.create(options);
136
+ };
137
+ /**
138
+ * Create multiple test learnings (convenience function).
139
+ *
140
+ * @example
141
+ * ```typescript
142
+ * const db = await Effect.runPromise(createTestDatabase())
143
+ * const learnings = createTestLearnings(db, 10, { category: 'patterns' })
144
+ * ```
145
+ */
146
+ export const createTestLearnings = (db, count, options = {}) => {
147
+ const factory = new LearningFactory(db);
148
+ return factory.createMany(count, options);
149
+ };
150
+ //# sourceMappingURL=learning.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning.factory.js","sourceRoot":"","sources":["../../src/factories/learning.factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Task factory for creating test task data.
3
+ *
4
+ * @module @tx/test-utils/factories/task
5
+ */
6
+ import type { Task, TaskStatus } from "@jamesaphoenix/tx-types";
7
+ import type { TestDatabase } from "../database/index.js";
8
+ /**
9
+ * Options for creating a test task.
10
+ */
11
+ export interface CreateTaskOptions {
12
+ /** Task ID (auto-generated if not provided) */
13
+ id?: string;
14
+ /** Task title */
15
+ title?: string;
16
+ /** Task description */
17
+ description?: string;
18
+ /** Task status */
19
+ status?: TaskStatus;
20
+ /** Parent task ID */
21
+ parentId?: string | null;
22
+ /** Priority score */
23
+ score?: number;
24
+ /** Task metadata */
25
+ metadata?: Record<string, unknown>;
26
+ /** Creation timestamp */
27
+ createdAt?: Date;
28
+ /** Completion timestamp (only if status is 'done') */
29
+ completedAt?: Date | null;
30
+ }
31
+ /**
32
+ * Factory class for creating test tasks.
33
+ *
34
+ * Provides methods to create individual tasks or batches of tasks
35
+ * with customizable properties.
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * const db = await Effect.runPromise(createTestDatabase())
40
+ * const factory = new TaskFactory(db)
41
+ *
42
+ * // Create single task
43
+ * const task = factory.create({ title: 'Test Task' })
44
+ *
45
+ * // Create with dependencies
46
+ * const parent = factory.create({ title: 'Parent' })
47
+ * const child = factory.create({ title: 'Child', parentId: parent.id })
48
+ *
49
+ * // Create multiple tasks
50
+ * const tasks = await factory.createMany(5, { status: 'backlog' })
51
+ * ```
52
+ */
53
+ export declare class TaskFactory {
54
+ private counter;
55
+ private readonly db;
56
+ private readonly namespace;
57
+ constructor(db: TestDatabase, namespace?: string);
58
+ /**
59
+ * Create a single test task.
60
+ */
61
+ create(options?: CreateTaskOptions): Task;
62
+ /**
63
+ * Create multiple test tasks.
64
+ */
65
+ createMany(count: number, options?: CreateTaskOptions): Task[];
66
+ /**
67
+ * Create a task with a specific status.
68
+ */
69
+ withStatus(status: TaskStatus, options?: CreateTaskOptions): Task;
70
+ /**
71
+ * Create a completed task.
72
+ */
73
+ completed(options?: CreateTaskOptions): Task;
74
+ /**
75
+ * Create a task hierarchy (parent with children).
76
+ */
77
+ withChildren(parentOptions: CreateTaskOptions, childCount: number, childOptions?: CreateTaskOptions): {
78
+ parent: Task;
79
+ children: Task[];
80
+ };
81
+ /**
82
+ * Reset the internal counter.
83
+ */
84
+ reset(): void;
85
+ }
86
+ /**
87
+ * Create a single test task (convenience function).
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const db = await Effect.runPromise(createTestDatabase())
92
+ * const task = createTestTask(db, { title: 'My Task' })
93
+ * ```
94
+ */
95
+ export declare const createTestTask: (db: TestDatabase, options?: CreateTaskOptions) => Task;
96
+ /**
97
+ * Create multiple test tasks (convenience function).
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * const db = await Effect.runPromise(createTestDatabase())
102
+ * const tasks = createTestTasks(db, 5, { status: 'backlog' })
103
+ * ```
104
+ */
105
+ export declare const createTestTasks: (db: TestDatabase, count: number, options?: CreateTaskOptions) => Task[];
106
+ //# sourceMappingURL=task.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.factory.d.ts","sourceRoot":"","sources":["../../src/factories/task.factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,IAAI,EAEJ,UAAU,EACX,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGxD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB;IAClB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,yBAAyB;IACzB,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,sDAAsD;IACtD,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,EAAE,EAAE,YAAY,EAAE,SAAS,SAAiB;IAKxD;;OAEG;IACH,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,IAAI;IA6C7C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI,EAAE;IAWlE;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,IAAI;IAIrE;;OAEG;IACH,SAAS,CAAC,OAAO,GAAE,iBAAsB,GAAG,IAAI;IAQhD;;OAEG;IACH,YAAY,CACV,aAAa,EAAE,iBAAiB,EAChC,UAAU,EAAE,MAAM,EAClB,YAAY,GAAE,iBAAsB,GACnC;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,IAAI,EAAE,CAAA;KAAE;IASrC;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GACzB,IAAI,YAAY,EAChB,UAAS,iBAAsB,KAC9B,IAGF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAC1B,IAAI,YAAY,EAChB,OAAO,MAAM,EACb,UAAS,iBAAsB,KAC9B,IAAI,EAGN,CAAA"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Task factory for creating test task data.
3
+ *
4
+ * @module @tx/test-utils/factories/task
5
+ */
6
+ import { fixtureId } from "../fixtures/index.js";
7
+ /**
8
+ * Factory class for creating test tasks.
9
+ *
10
+ * Provides methods to create individual tasks or batches of tasks
11
+ * with customizable properties.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const db = await Effect.runPromise(createTestDatabase())
16
+ * const factory = new TaskFactory(db)
17
+ *
18
+ * // Create single task
19
+ * const task = factory.create({ title: 'Test Task' })
20
+ *
21
+ * // Create with dependencies
22
+ * const parent = factory.create({ title: 'Parent' })
23
+ * const child = factory.create({ title: 'Child', parentId: parent.id })
24
+ *
25
+ * // Create multiple tasks
26
+ * const tasks = await factory.createMany(5, { status: 'backlog' })
27
+ * ```
28
+ */
29
+ export class TaskFactory {
30
+ counter = 0;
31
+ db;
32
+ namespace;
33
+ constructor(db, namespace = "task-factory") {
34
+ this.db = db;
35
+ this.namespace = namespace;
36
+ }
37
+ /**
38
+ * Create a single test task.
39
+ */
40
+ create(options = {}) {
41
+ this.counter++;
42
+ const now = new Date();
43
+ const id = options.id ?? fixtureId(`${this.namespace}::task-${this.counter}`);
44
+ const title = options.title ?? `Test Task ${this.counter}`;
45
+ const description = options.description ?? "";
46
+ const status = options.status ?? "backlog";
47
+ const parentId = options.parentId ?? null;
48
+ const score = options.score ?? 500;
49
+ const metadata = options.metadata ?? {};
50
+ const createdAt = options.createdAt ?? now;
51
+ const completedAt = options.completedAt ?? (status === "done" ? now : null);
52
+ this.db.run(`INSERT INTO tasks (id, title, description, status, parent_id, score, metadata, created_at, updated_at, completed_at)
53
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
54
+ id,
55
+ title,
56
+ description,
57
+ status,
58
+ parentId,
59
+ score,
60
+ JSON.stringify(metadata),
61
+ createdAt.toISOString(),
62
+ now.toISOString(),
63
+ completedAt ? completedAt.toISOString() : null
64
+ ]);
65
+ return {
66
+ id: id,
67
+ title,
68
+ description,
69
+ status,
70
+ parentId: parentId,
71
+ score,
72
+ metadata,
73
+ createdAt,
74
+ updatedAt: now,
75
+ completedAt
76
+ };
77
+ }
78
+ /**
79
+ * Create multiple test tasks.
80
+ */
81
+ createMany(count, options = {}) {
82
+ const tasks = [];
83
+ for (let i = 0; i < count; i++) {
84
+ tasks.push(this.create({
85
+ ...options,
86
+ title: options.title ? `${options.title} ${i + 1}` : undefined
87
+ }));
88
+ }
89
+ return tasks;
90
+ }
91
+ /**
92
+ * Create a task with a specific status.
93
+ */
94
+ withStatus(status, options = {}) {
95
+ return this.create({ ...options, status });
96
+ }
97
+ /**
98
+ * Create a completed task.
99
+ */
100
+ completed(options = {}) {
101
+ return this.create({
102
+ ...options,
103
+ status: "done",
104
+ completedAt: options.completedAt ?? new Date()
105
+ });
106
+ }
107
+ /**
108
+ * Create a task hierarchy (parent with children).
109
+ */
110
+ withChildren(parentOptions, childCount, childOptions = {}) {
111
+ const parent = this.create(parentOptions);
112
+ const children = this.createMany(childCount, {
113
+ ...childOptions,
114
+ parentId: parent.id
115
+ });
116
+ return { parent, children };
117
+ }
118
+ /**
119
+ * Reset the internal counter.
120
+ */
121
+ reset() {
122
+ this.counter = 0;
123
+ }
124
+ }
125
+ /**
126
+ * Create a single test task (convenience function).
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const db = await Effect.runPromise(createTestDatabase())
131
+ * const task = createTestTask(db, { title: 'My Task' })
132
+ * ```
133
+ */
134
+ export const createTestTask = (db, options = {}) => {
135
+ const factory = new TaskFactory(db);
136
+ return factory.create(options);
137
+ };
138
+ /**
139
+ * Create multiple test tasks (convenience function).
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * const db = await Effect.runPromise(createTestDatabase())
144
+ * const tasks = createTestTasks(db, 5, { status: 'backlog' })
145
+ * ```
146
+ */
147
+ export const createTestTasks = (db, count, options = {}) => {
148
+ const factory = new TaskFactory(db);
149
+ return factory.createMany(count, options);
150
+ };
151
+ //# sourceMappingURL=task.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.factory.js","sourceRoot":"","sources":["../../src/factories/task.factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Fixture ID generation utilities for deterministic test data.
3
+ *
4
+ * @module @tx/test-utils/fixtures
5
+ */
6
+ /**
7
+ * Generate deterministic fixture ID from name.
8
+ * Same name always produces same ID across test runs.
9
+ *
10
+ * @example
11
+ * fixtureId('auth-task') // -> 'tx-a1b2c3d4'
12
+ * fixtureId('auth-task') // -> 'tx-a1b2c3d4' (same)
13
+ */
14
+ export declare const fixtureId: (name: string) => string;
15
+ /**
16
+ * Generate fixture ID with namespace to avoid collisions.
17
+ *
18
+ * @example
19
+ * namespacedFixtureId('task-service.test', 'task-1') // -> 'tx-c3d4e5f6'
20
+ */
21
+ export declare const namespacedFixtureId: (namespace: string, name: string) => string;
22
+ /**
23
+ * Generate sequential IDs within a namespace.
24
+ * Useful for creating multiple related fixtures.
25
+ *
26
+ * @example
27
+ * const ids = sequentialFixtureIds('tasks', 5)
28
+ * // -> ['tx-a1...', 'tx-b2...', 'tx-c3...', 'tx-d4...', 'tx-e5...']
29
+ */
30
+ export declare const sequentialFixtureIds: (namespace: string, count: number) => string[];
31
+ /**
32
+ * Generate fixture ID from object content.
33
+ * Useful for content-addressed fixtures.
34
+ */
35
+ export declare const contentFixtureId: (content: object) => string;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAGxC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,MAErE,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAAI,WAAW,MAAM,EAAE,OAAO,MAAM,KAAG,MAAM,EAI7E,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG,MAGlD,CAAA"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Fixture ID generation utilities for deterministic test data.
3
+ *
4
+ * @module @tx/test-utils/fixtures
5
+ */
6
+ import * as crypto from "crypto";
7
+ /**
8
+ * Generate deterministic fixture ID from name.
9
+ * Same name always produces same ID across test runs.
10
+ *
11
+ * @example
12
+ * fixtureId('auth-task') // -> 'tx-a1b2c3d4'
13
+ * fixtureId('auth-task') // -> 'tx-a1b2c3d4' (same)
14
+ */
15
+ export const fixtureId = (name) => {
16
+ const hash = crypto.createHash("sha256").update(name).digest("hex");
17
+ return `tx-${hash.slice(0, 8)}`;
18
+ };
19
+ /**
20
+ * Generate fixture ID with namespace to avoid collisions.
21
+ *
22
+ * @example
23
+ * namespacedFixtureId('task-service.test', 'task-1') // -> 'tx-c3d4e5f6'
24
+ */
25
+ export const namespacedFixtureId = (namespace, name) => {
26
+ return fixtureId(`${namespace}::${name}`);
27
+ };
28
+ /**
29
+ * Generate sequential IDs within a namespace.
30
+ * Useful for creating multiple related fixtures.
31
+ *
32
+ * @example
33
+ * const ids = sequentialFixtureIds('tasks', 5)
34
+ * // -> ['tx-a1...', 'tx-b2...', 'tx-c3...', 'tx-d4...', 'tx-e5...']
35
+ */
36
+ export const sequentialFixtureIds = (namespace, count) => {
37
+ return Array.from({ length: count }, (_, i) => namespacedFixtureId(namespace, `${i + 1}`));
38
+ };
39
+ /**
40
+ * Generate fixture ID from object content.
41
+ * Useful for content-addressed fixtures.
42
+ */
43
+ export const contentFixtureId = (content) => {
44
+ const json = JSON.stringify(content, Object.keys(content).sort());
45
+ return fixtureId(json);
46
+ };
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fixtures/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnE,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;AACjC,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAiB,EAAE,IAAY,EAAU,EAAE;IAC7E,OAAO,SAAS,CAAC,GAAG,SAAS,KAAK,IAAI,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,SAAiB,EAAE,KAAa,EAAY,EAAE;IACjF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5C,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAC3C,CAAA;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAU,EAAE;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACjE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC,CAAA"}