@morscherlab/mint-sdk 1.3.0 → 1.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/dist/__tests__/components/AutoGroupModal.anatomy.test.d.ts +1 -0
- package/dist/__tests__/components/AutoGroupModal.wiring.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/fieldEdits.test.d.ts +1 -0
- package/dist/__tests__/composables/autoGroup/golden.test.d.ts +1 -0
- package/dist/components/AutoGroupModal.adapter.d.ts +27 -4
- package/dist/components/SmartGroup.types.d.ts +22 -0
- package/dist/components/SmartGroupFieldRecipe.groups.d.ts +10 -2
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -0
- package/dist/components/index.js +1 -1
- package/dist/{components-vHfxV2PB.js → components-bbanLd1u.js} +499 -263
- package/dist/components-bbanLd1u.js.map +1 -0
- package/dist/composables/autoGroup/classify.d.ts +7 -1
- package/dist/composables/autoGroup/columns.d.ts +16 -1
- package/dist/composables/autoGroup/index.d.ts +5 -7
- package/dist/composables/autoGroup/tokenize.d.ts +36 -1
- package/dist/composables/index.js +2 -2
- package/dist/composables/useAutoGroup.d.ts +13 -2
- package/dist/{composables-D6uqp0UF.js → composables-BbHozlA7.js} +2 -2
- package/dist/{composables-D6uqp0UF.js.map → composables-BbHozlA7.js.map} +1 -1
- package/dist/index.js +3 -3
- package/dist/install.js +1 -1
- package/dist/permissions.js +2 -2
- package/dist/permissions.js.map +1 -1
- package/dist/styles.css +71 -82
- package/dist/types/auto-group.d.ts +1 -1
- package/dist/{validation-Dmp9Q5W0.js → validation-CukfLjy-.js} +323 -187
- package/dist/validation-CukfLjy-.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/components/AutoGroupModal.anatomy.test.ts +86 -0
- package/src/__tests__/components/AutoGroupModal.wiring.test.ts +53 -0
- package/src/__tests__/components/SampleSelector.test.ts +14 -16
- package/src/__tests__/components/SmartGroupFieldRecipe.groups.test.ts +23 -0
- package/src/__tests__/components/SmartGroupFieldRecipe.test.ts +176 -0
- package/src/__tests__/composables/autoGroup/columns.test.ts +100 -11
- package/src/__tests__/composables/autoGroup/fieldEdits.test.ts +74 -0
- package/src/__tests__/composables/autoGroup/fingerprint.test.ts +9 -0
- package/src/__tests__/composables/autoGroup/golden.test.ts +187 -0
- package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +7 -7
- package/src/__tests__/composables/autoGroup/tokenLength.test.ts +7 -0
- package/src/__tests__/composables/autoGroup/tokenize.test.ts +78 -1
- package/src/__tests__/composables/useAutoGroup.test.ts +2 -1
- package/src/__tests__/fixtures/auto-group/share-exp021.txt +103 -0
- package/src/__tests__/fixtures/auto-group/share-exp031.txt +39 -0
- package/src/__tests__/fixtures/auto-group/share-exp114.txt +123 -0
- package/src/__tests__/fixtures/auto-group/share-exp214.txt +63 -0
- package/src/__tests__/utils/permissions.test.ts +15 -0
- package/src/components/AutoGroupModal.adapter.ts +80 -9
- package/src/components/AutoGroupModal.vue +41 -8
- package/src/components/SmartGroup.types.ts +23 -0
- package/src/components/SmartGroupFieldRecipe.groups.ts +14 -2
- package/src/components/SmartGroupFieldRecipe.vue +289 -169
- package/src/composables/autoGroup/classify.ts +26 -7
- package/src/composables/autoGroup/columns.ts +144 -36
- package/src/composables/autoGroup/compose.ts +8 -10
- package/src/composables/autoGroup/fingerprint.ts +1 -1
- package/src/composables/autoGroup/index.ts +5 -12
- package/src/composables/autoGroup/tokenLength.ts +8 -0
- package/src/composables/autoGroup/tokenize.ts +148 -1
- package/src/composables/autoGroup/vocab.json +5 -11
- package/src/composables/useAutoGroup.ts +92 -79
- package/src/permissions.ts +3 -2
- package/src/styles/components/smart-group.css +71 -82
- package/src/types/auto-group.ts +1 -0
- package/dist/components-vHfxV2PB.js.map +0 -1
- package/dist/composables/autoGroup/replicatePreGroup.d.ts +0 -36
- package/dist/validation-Dmp9Q5W0.js.map +0 -1
- package/src/composables/autoGroup/replicatePreGroup.ts +0 -124
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Replicate pre-grouping.
|
|
3
|
-
*
|
|
4
|
-
* Strip the replicate / injection-number markers from each sample's name, then
|
|
5
|
-
* collapse samples that share a base name. Those samples ARE replicates of one
|
|
6
|
-
* another by definition; the remaining unique base names are what the rest of
|
|
7
|
-
* the pipeline (tokenize → classify → schema → compose) should operate on.
|
|
8
|
-
*
|
|
9
|
-
* This pre-pass replaces the older "treat every sample as independent, then
|
|
10
|
-
* infer replicate columns" approach. Identifying replicate-equivalence by name
|
|
11
|
-
* before tokenisation removes a class of fragile cardinality heuristics.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { TreeNode } from '../../types/componentLabTypes'
|
|
15
|
-
import vocabData from './vocab.json'
|
|
16
|
-
|
|
17
|
-
const STRIP_PATTERNS: RegExp[] = (vocabData.replicateStripPatterns as string[]).map(
|
|
18
|
-
src => new RegExp(src, 'gi'),
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Iteratively strip every replicate / injection-number marker from `name`.
|
|
23
|
-
* Each pattern is applied repeatedly until it stops matching, so a sample like
|
|
24
|
-
* `study_T1_Rep2_004` collapses to `study` in one call.
|
|
25
|
-
*/
|
|
26
|
-
export function stripReplicateTokens(name: string): string {
|
|
27
|
-
let base = name
|
|
28
|
-
for (const re of STRIP_PATTERNS) {
|
|
29
|
-
let prev
|
|
30
|
-
do {
|
|
31
|
-
prev = base
|
|
32
|
-
base = base.replace(re, '')
|
|
33
|
-
re.lastIndex = 0
|
|
34
|
-
} while (base !== prev)
|
|
35
|
-
}
|
|
36
|
-
return base
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface ReplicatePreGrouping {
|
|
40
|
-
/** Unique base names in first-seen order. Length === `originalSamples.length` only if every sample has a distinct base. */
|
|
41
|
-
baseNames: string[]
|
|
42
|
-
/**
|
|
43
|
-
* `membersByBase[i]` = original-sample indices that collapsed onto `baseNames[i]`.
|
|
44
|
-
* Length of each entry is the replicate count for that base.
|
|
45
|
-
*/
|
|
46
|
-
membersByBase: number[][]
|
|
47
|
-
/** Original sample names indexed by their position in `samples`. Retained so the compose layer can expand groups back to originals. */
|
|
48
|
-
originalSamples: string[]
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function preGroupReplicates(samples: string[]): ReplicatePreGrouping {
|
|
52
|
-
const map = new Map<string, number[]>()
|
|
53
|
-
const baseOrder: string[] = []
|
|
54
|
-
for (let i = 0; i < samples.length; i++) {
|
|
55
|
-
const base = stripReplicateTokens(samples[i])
|
|
56
|
-
const bucket = map.get(base)
|
|
57
|
-
if (bucket) {
|
|
58
|
-
bucket.push(i)
|
|
59
|
-
} else {
|
|
60
|
-
map.set(base, [i])
|
|
61
|
-
baseOrder.push(base)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
baseNames: baseOrder,
|
|
66
|
-
membersByBase: baseOrder.map(b => map.get(b)!),
|
|
67
|
-
originalSamples: samples,
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Expand groups produced over base names back to groups of original sample
|
|
73
|
-
* names. Each entry in `group.samples` is treated as a base name and replaced
|
|
74
|
-
* by the list of original samples that collapsed onto it.
|
|
75
|
-
*/
|
|
76
|
-
export function expandGroupsWithReplicates<G extends { samples: string[] }>(
|
|
77
|
-
groups: G[],
|
|
78
|
-
preGrouping: ReplicatePreGrouping,
|
|
79
|
-
): G[] {
|
|
80
|
-
const baseToMembers = new Map<string, number[]>()
|
|
81
|
-
for (let i = 0; i < preGrouping.baseNames.length; i++) {
|
|
82
|
-
baseToMembers.set(preGrouping.baseNames[i], preGrouping.membersByBase[i])
|
|
83
|
-
}
|
|
84
|
-
return groups.map(g => ({
|
|
85
|
-
...g,
|
|
86
|
-
samples: g.samples.flatMap(baseName => {
|
|
87
|
-
const indices = baseToMembers.get(baseName)
|
|
88
|
-
return indices ? indices.map(i => preGrouping.originalSamples[i]) : [baseName]
|
|
89
|
-
}),
|
|
90
|
-
}))
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Expand a group hierarchy (built over base names) back to original samples.
|
|
95
|
-
* Each leaf node's `label` is a base name; it is replaced by one leaf per
|
|
96
|
-
* original sample that collapsed onto it (sharing the leaf's injection badge,
|
|
97
|
-
* since collapsed replicates have identical base tokens). Every ancestor's
|
|
98
|
-
* `badge` (sample count) is recomputed from the expanded leaf count so the tree
|
|
99
|
-
* agrees with the flat groups produced by `expandGroupsWithReplicates`.
|
|
100
|
-
*/
|
|
101
|
-
export function expandTreeWithReplicates(
|
|
102
|
-
nodes: TreeNode[],
|
|
103
|
-
preGrouping: ReplicatePreGrouping,
|
|
104
|
-
): TreeNode[] {
|
|
105
|
-
const baseToOriginals = new Map<string, string[]>()
|
|
106
|
-
for (let i = 0; i < preGrouping.baseNames.length; i++) {
|
|
107
|
-
baseToOriginals.set(
|
|
108
|
-
preGrouping.baseNames[i],
|
|
109
|
-
preGrouping.membersByBase[i].map(m => preGrouping.originalSamples[m]),
|
|
110
|
-
)
|
|
111
|
-
}
|
|
112
|
-
const leafCount = (n: TreeNode): number =>
|
|
113
|
-
n.children && n.children.length ? n.children.reduce((acc, c) => acc + leafCount(c), 0) : 1
|
|
114
|
-
const expand = (node: TreeNode): TreeNode[] => {
|
|
115
|
-
if (node.children && node.children.length) {
|
|
116
|
-
const children = node.children.flatMap(expand)
|
|
117
|
-
return [{ ...node, children, badge: children.reduce((acc, c) => acc + leafCount(c), 0) }]
|
|
118
|
-
}
|
|
119
|
-
const originals = baseToOriginals.get(node.label)
|
|
120
|
-
if (!originals || originals.length === 0) return [node]
|
|
121
|
-
return originals.map((name, k) => ({ ...node, id: `${node.id}${k}`, label: name }))
|
|
122
|
-
}
|
|
123
|
-
return nodes.flatMap(expand)
|
|
124
|
-
}
|