@teambit/objects 0.0.730 → 0.0.732
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/models/version-history.js +2 -2
- package/dist/models/version-history.js.map +1 -1
- package/dist/models/version-history.spec.d.ts +1 -0
- package/dist/models/version-history.spec.js +79 -0
- package/dist/models/version-history.spec.js.map +1 -0
- package/models/version-history.spec.ts +60 -0
- package/models/version-history.ts +2 -2
- package/package.json +12 -12
- /package/dist/{preview-1793111722995.js → preview-1793128347962.js} +0 -0
|
@@ -199,8 +199,8 @@ class VersionHistory extends _objects().BitObject {
|
|
|
199
199
|
merge(versionHistory) {
|
|
200
200
|
const existingHashes = this.getAllHashesAsString();
|
|
201
201
|
const incomingHashes = versionHistory.getAllHashesAsString();
|
|
202
|
-
const hashesInExistingOnly = (0, _lodash().difference)(existingHashes, incomingHashes);
|
|
203
|
-
const versionsDataOnExistingOnly = this.versions.filter(v => hashesInExistingOnly.
|
|
202
|
+
const hashesInExistingOnly = new Set((0, _lodash().difference)(existingHashes, incomingHashes));
|
|
203
|
+
const versionsDataOnExistingOnly = this.versions.filter(v => hashesInExistingOnly.has(v.hash.toString()));
|
|
204
204
|
const newVersions = [...versionHistory.versions, ...versionsDataOnExistingOnly];
|
|
205
205
|
this.versionsObj = this.versionParentsToObject(newVersions);
|
|
206
206
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_graph","data","require","_componentId","_bitError","_lodash","_legacy","_ref","_interopRequireDefault","_objects","_component","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","VersionHistory","BitObject","constructor","props","name","scope","versionsObj","versionParentsToObject","versions","graphCompleteRefs","values","reduce","acc","version","hash","id","fromId","toObject","map","v","toString","parents","p","unrelated","squashed","undefined","pretty","args","getStringifyArgs","JSON","stringify","toBuffer","Buffer","from","getVersionData","ref","hasHash","Boolean","addFromVersionsObjects","forEach","exists","head","previousParents","versionData","getVersionParentsFromVersion","isEmpty","length","getAllHashesFrom","start","item","missing","hashSet","Set","allHashes","stack","add","ver","pop","verHash","push","parent","parentHash","has","parentVer","found","isRefPartOfHistory","startFrom","searchFor","includes","isGraphCompleteSince","isComplete","hasChanged","getAllHashesAsString","keys","merge","versionHistory","existingHashes","incomingHashes","hashesInExistingOnly","difference","versionsDataOnExistingOnly","filter","newVersions","getAncestor","numOfGenerationsToGoBack","errorMsg","compId","BitError","getGraph","modelComponent","laneHeads","shortHash","limitVersions","refToStr","toShortString","graph","Graph","allVersions","slice","compact","flat","allHashesUniq","uniqBy","getMetadata","tag","getTagOfRefIfExists","pointers","nodes","Node","edges","verEdges","Edge","s","find","isEqual","setNodes","setEdges","ComponentID","fromObject","create","parse","contents","parsed","Ref","exports","versionParentsToGraph"],"sources":["version-history.ts"],"sourcesContent":["import { Graph, Edge, Node } from '@teambit/graph.cleargraph';\nimport { ComponentID } from '@teambit/component-id';\nimport { BitError } from '@teambit/bit-error';\nimport { compact, difference, uniqBy } from 'lodash';\nimport { getStringifyArgs } from '@teambit/legacy.utils';\nimport Ref from '../objects/ref';\nimport { BitObject } from '../objects';\nimport type Version from './version';\nimport { getVersionParentsFromVersion } from '@teambit/component.snap-distance';\nimport type ModelComponent from './model-component';\n\nexport type VersionParents = {\n hash: Ref;\n parents: Ref[];\n unrelated?: Ref;\n squashed?: Ref[];\n};\n\nexport type VersionHistoryGraph = Graph<string | HashMetadata, string>;\n\ntype VersionHistoryProps = {\n name: string;\n scope: string;\n versions: VersionParents[];\n graphCompleteRefs?: string[];\n};\n\ntype HashMetadata = {\n tag?: string;\n pointers?: string[];\n};\n\nexport default class VersionHistory extends BitObject {\n name: string;\n scope: string;\n private versionsObj: { [hash: string]: VersionParents };\n graphCompleteRefs: string[];\n hasChanged = false; // whether the version history has changed since the last persist\n constructor(props: VersionHistoryProps) {\n super();\n this.name = props.name;\n this.scope = props.scope;\n this.versionsObj = this.versionParentsToObject(props.versions);\n this.graphCompleteRefs = props.graphCompleteRefs || [];\n }\n\n get versions() {\n return Object.values(this.versionsObj);\n }\n\n private versionParentsToObject(versions: VersionParents[]) {\n return versions.reduce((acc, version) => {\n acc[version.hash.hash] = version;\n return acc;\n }, {});\n }\n\n id() {\n return `${this.scope}/${this.name}:${VersionHistory.name}`;\n }\n\n static fromId(name: string, scope: string) {\n return new VersionHistory({ scope, name, versions: [] });\n }\n\n toObject(): Record<string, any> {\n return {\n name: this.name,\n scope: this.scope,\n versions: this.versions.map((v) => ({\n hash: v.hash.toString(),\n parents: v.parents.map((p) => p.toString()),\n unrelated: v.unrelated?.toString(),\n squashed: v.squashed ? v.squashed.map((p) => p.toString()) : undefined,\n })),\n graphCompleteRefs: this.graphCompleteRefs,\n };\n }\n\n toString(pretty: boolean): string {\n const args = getStringifyArgs(pretty);\n return JSON.stringify(this.toObject(), ...args);\n }\n\n toBuffer(pretty): Buffer {\n return Buffer.from(this.toString(pretty));\n }\n\n getVersionData(ref: Ref): VersionParents | undefined {\n return this.versionsObj[ref.toString()];\n }\n\n hasHash(ref: Ref) {\n return Boolean(this.getVersionData(ref));\n }\n\n addFromVersionsObjects(versions: Version[]) {\n versions.forEach((version) => {\n const exists = this.getVersionData(version.hash());\n if (exists) {\n // just in case the parents got updated as a result of a merge/squash\n exists.parents = version.parents;\n exists.unrelated = version.unrelated?.head;\n exists.squashed = version.squashed?.previousParents;\n } else {\n const versionData = getVersionParentsFromVersion(version);\n this.versionsObj[version.hash().hash] = versionData;\n }\n });\n }\n\n isEmpty() {\n return !this.versions.length;\n }\n\n getAllHashesFrom(start: Ref): { found?: string[]; missing?: string[] } {\n const item = this.getVersionData(start);\n if (!item) return { missing: [start.toString()] };\n const hashSet = new Set<string>();\n const allHashes: string[] = [];\n const missing: string[] = [];\n\n // Use iterative approach with a stack to avoid stack overflow on deep histories\n const stack: VersionParents[] = [item];\n hashSet.add(item.hash.toString());\n\n while (stack.length > 0) {\n const ver = stack.pop()!;\n const verHash = ver.hash.toString();\n allHashes.push(verHash);\n\n for (const parent of ver.parents) {\n const parentHash = parent.toString();\n if (hashSet.has(parentHash)) continue;\n const parentVer = this.getVersionData(parent);\n if (!parentVer) {\n missing.push(parentHash);\n continue;\n }\n // Mark as processed before pushing to prevent duplicate stack entries\n hashSet.add(parentHash);\n stack.push(parentVer);\n }\n }\n\n return { found: allHashes, missing };\n }\n\n isRefPartOfHistory(startFrom: Ref, searchFor: Ref) {\n const { found } = this.getAllHashesFrom(startFrom);\n return found?.includes(searchFor.toString());\n }\n\n isGraphCompleteSince(ref: Ref) {\n if (this.graphCompleteRefs.includes(ref.toString())) return true;\n const { missing } = this.getAllHashesFrom(ref);\n const isComplete = !missing || !missing.length;\n if (isComplete) {\n this.graphCompleteRefs.push(ref.toString());\n this.hasChanged = true;\n }\n return isComplete;\n }\n\n getAllHashesAsString(): string[] {\n return Object.keys(this.versionsObj);\n }\n\n merge(versionHistory: VersionHistory) {\n const existingHashes = this.getAllHashesAsString();\n const incomingHashes = versionHistory.getAllHashesAsString();\n const hashesInExistingOnly = difference(existingHashes, incomingHashes);\n const versionsDataOnExistingOnly = this.versions.filter((v) => hashesInExistingOnly.includes(v.hash.toString()));\n const newVersions = [...versionHistory.versions, ...versionsDataOnExistingOnly];\n this.versionsObj = this.versionParentsToObject(newVersions);\n }\n\n getAncestor(numOfGenerationsToGoBack: number, ref: Ref): Ref {\n const errorMsg = `unable to get an older parent of ${this.compId.toString()}`;\n const versionData = this.getVersionData(ref);\n if (!versionData)\n throw new BitError(`${errorMsg}, version \"${ref.toString()}\" was not found in the version history`);\n if (numOfGenerationsToGoBack === 0) return versionData.hash;\n if (!versionData.parents.length) throw new BitError(`${errorMsg}, version \"${ref.toString()}\" has no parents`);\n const parent = versionData.parents[0];\n return this.getAncestor(numOfGenerationsToGoBack - 1, parent);\n }\n\n getGraph(\n modelComponent?: ModelComponent,\n laneHeads?: { [hash: string]: string[] },\n shortHash = false,\n limitVersions?: number\n ): VersionHistoryGraph {\n const refToStr = (ref: Ref) => (shortHash ? ref.toShortString() : ref.toString());\n const graph = new Graph<string | HashMetadata, string>();\n const allVersions = limitVersions ? [...this.versions].slice(-limitVersions) : this.versions;\n const allHashes = allVersions\n .map((v) => compact([v.hash, ...v.parents, ...(v.squashed || []), v.unrelated]))\n .flat();\n\n const allHashesUniq = uniqBy(allHashes, 'hash');\n\n const getMetadata = (ref: Ref): HashMetadata | undefined => {\n if (!modelComponent || !laneHeads) return undefined;\n const tag = modelComponent.getTagOfRefIfExists(ref);\n const pointers = laneHeads[ref.toString()];\n return { tag, pointers };\n };\n const nodes = allHashesUniq.map((v) => new Node(refToStr(v), getMetadata(v) || refToStr(v)));\n\n const edges = allVersions\n .map((v) => {\n const verEdges = v.parents.map((p) => new Edge(refToStr(v.hash), refToStr(p), 'parent'));\n if (v.unrelated) verEdges.push(new Edge(refToStr(v.hash), refToStr(v.unrelated), 'unrelated'));\n if (v.squashed) {\n const squashed = v.squashed.filter((s) => !v.parents.find((p) => p.isEqual(s)));\n squashed.map((p) => verEdges.push(new Edge(refToStr(v.hash), refToStr(p), 'squashed')));\n }\n return verEdges;\n })\n .flat();\n graph.setNodes(nodes);\n graph.setEdges(edges);\n return graph;\n }\n\n get compId() {\n return ComponentID.fromObject({ scope: this.scope, name: this.name });\n }\n\n static create(name: string, scope: string, versions: VersionParents[]) {\n return new VersionHistory({\n name,\n scope,\n versions,\n });\n }\n\n static parse(contents: string): VersionHistory {\n const parsed = JSON.parse(contents);\n const props: VersionHistoryProps = {\n name: parsed.name,\n scope: parsed.scope,\n versions: parsed.versions.map((ver) => ({\n hash: Ref.from(ver.hash),\n parents: ver.parents.map((p) => Ref.from(p)),\n unrelated: ver.unrelated ? Ref.from(ver.unrelated) : undefined,\n squashed: ver.squashed ? ver.squashed.map((p) => Ref.from(p)) : undefined,\n })),\n graphCompleteRefs: parsed.graphCompleteRefs,\n };\n return new VersionHistory(props);\n }\n}\n\nexport function versionParentsToGraph(versions: VersionParents[]): Graph<string, string> {\n const refToStr = (ref: Ref) => ref.toString();\n const graph = new Graph<string, string>();\n const allHashes = uniqBy(\n versions\n .map((v) => {\n return compact([v.hash, ...v.parents, ...(v.squashed || []), v.unrelated]);\n })\n .flat(),\n 'hash'\n );\n const nodes = allHashes.map((v) => new Node(refToStr(v), refToStr(v)));\n const edges = versions\n .map((v) => {\n const verEdges = v.parents.map((p) => new Edge(refToStr(v.hash), refToStr(p), 'parent'));\n if (v.unrelated) verEdges.push(new Edge(refToStr(v.hash), refToStr(v.unrelated), 'unrelated'));\n if (v.squashed) {\n const squashed = v.squashed.filter((s) => !v.parents.find((p) => p.isEqual(s)));\n squashed.map((p) => verEdges.push(new Edge(refToStr(v.hash), refToStr(p), 'squashed')));\n }\n return verEdges;\n })\n .flat();\n graph.setNodes(nodes);\n graph.setEdges(edges);\n return graph;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_graph","data","require","_componentId","_bitError","_lodash","_legacy","_ref","_interopRequireDefault","_objects","_component","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","VersionHistory","BitObject","constructor","props","name","scope","versionsObj","versionParentsToObject","versions","graphCompleteRefs","values","reduce","acc","version","hash","id","fromId","toObject","map","v","toString","parents","p","unrelated","squashed","undefined","pretty","args","getStringifyArgs","JSON","stringify","toBuffer","Buffer","from","getVersionData","ref","hasHash","Boolean","addFromVersionsObjects","forEach","exists","head","previousParents","versionData","getVersionParentsFromVersion","isEmpty","length","getAllHashesFrom","start","item","missing","hashSet","Set","allHashes","stack","add","ver","pop","verHash","push","parent","parentHash","has","parentVer","found","isRefPartOfHistory","startFrom","searchFor","includes","isGraphCompleteSince","isComplete","hasChanged","getAllHashesAsString","keys","merge","versionHistory","existingHashes","incomingHashes","hashesInExistingOnly","difference","versionsDataOnExistingOnly","filter","newVersions","getAncestor","numOfGenerationsToGoBack","errorMsg","compId","BitError","getGraph","modelComponent","laneHeads","shortHash","limitVersions","refToStr","toShortString","graph","Graph","allVersions","slice","compact","flat","allHashesUniq","uniqBy","getMetadata","tag","getTagOfRefIfExists","pointers","nodes","Node","edges","verEdges","Edge","s","find","isEqual","setNodes","setEdges","ComponentID","fromObject","create","parse","contents","parsed","Ref","exports","versionParentsToGraph"],"sources":["version-history.ts"],"sourcesContent":["import { Graph, Edge, Node } from '@teambit/graph.cleargraph';\nimport { ComponentID } from '@teambit/component-id';\nimport { BitError } from '@teambit/bit-error';\nimport { compact, difference, uniqBy } from 'lodash';\nimport { getStringifyArgs } from '@teambit/legacy.utils';\nimport Ref from '../objects/ref';\nimport { BitObject } from '../objects';\nimport type Version from './version';\nimport { getVersionParentsFromVersion } from '@teambit/component.snap-distance';\nimport type ModelComponent from './model-component';\n\nexport type VersionParents = {\n hash: Ref;\n parents: Ref[];\n unrelated?: Ref;\n squashed?: Ref[];\n};\n\nexport type VersionHistoryGraph = Graph<string | HashMetadata, string>;\n\ntype VersionHistoryProps = {\n name: string;\n scope: string;\n versions: VersionParents[];\n graphCompleteRefs?: string[];\n};\n\ntype HashMetadata = {\n tag?: string;\n pointers?: string[];\n};\n\nexport default class VersionHistory extends BitObject {\n name: string;\n scope: string;\n private versionsObj: { [hash: string]: VersionParents };\n graphCompleteRefs: string[];\n hasChanged = false; // whether the version history has changed since the last persist\n constructor(props: VersionHistoryProps) {\n super();\n this.name = props.name;\n this.scope = props.scope;\n this.versionsObj = this.versionParentsToObject(props.versions);\n this.graphCompleteRefs = props.graphCompleteRefs || [];\n }\n\n get versions() {\n return Object.values(this.versionsObj);\n }\n\n private versionParentsToObject(versions: VersionParents[]) {\n return versions.reduce((acc, version) => {\n acc[version.hash.hash] = version;\n return acc;\n }, {});\n }\n\n id() {\n return `${this.scope}/${this.name}:${VersionHistory.name}`;\n }\n\n static fromId(name: string, scope: string) {\n return new VersionHistory({ scope, name, versions: [] });\n }\n\n toObject(): Record<string, any> {\n return {\n name: this.name,\n scope: this.scope,\n versions: this.versions.map((v) => ({\n hash: v.hash.toString(),\n parents: v.parents.map((p) => p.toString()),\n unrelated: v.unrelated?.toString(),\n squashed: v.squashed ? v.squashed.map((p) => p.toString()) : undefined,\n })),\n graphCompleteRefs: this.graphCompleteRefs,\n };\n }\n\n toString(pretty: boolean): string {\n const args = getStringifyArgs(pretty);\n return JSON.stringify(this.toObject(), ...args);\n }\n\n toBuffer(pretty): Buffer {\n return Buffer.from(this.toString(pretty));\n }\n\n getVersionData(ref: Ref): VersionParents | undefined {\n return this.versionsObj[ref.toString()];\n }\n\n hasHash(ref: Ref) {\n return Boolean(this.getVersionData(ref));\n }\n\n addFromVersionsObjects(versions: Version[]) {\n versions.forEach((version) => {\n const exists = this.getVersionData(version.hash());\n if (exists) {\n // just in case the parents got updated as a result of a merge/squash\n exists.parents = version.parents;\n exists.unrelated = version.unrelated?.head;\n exists.squashed = version.squashed?.previousParents;\n } else {\n const versionData = getVersionParentsFromVersion(version);\n this.versionsObj[version.hash().hash] = versionData;\n }\n });\n }\n\n isEmpty() {\n return !this.versions.length;\n }\n\n getAllHashesFrom(start: Ref): { found?: string[]; missing?: string[] } {\n const item = this.getVersionData(start);\n if (!item) return { missing: [start.toString()] };\n const hashSet = new Set<string>();\n const allHashes: string[] = [];\n const missing: string[] = [];\n\n // Use iterative approach with a stack to avoid stack overflow on deep histories\n const stack: VersionParents[] = [item];\n hashSet.add(item.hash.toString());\n\n while (stack.length > 0) {\n const ver = stack.pop()!;\n const verHash = ver.hash.toString();\n allHashes.push(verHash);\n\n for (const parent of ver.parents) {\n const parentHash = parent.toString();\n if (hashSet.has(parentHash)) continue;\n const parentVer = this.getVersionData(parent);\n if (!parentVer) {\n missing.push(parentHash);\n continue;\n }\n // Mark as processed before pushing to prevent duplicate stack entries\n hashSet.add(parentHash);\n stack.push(parentVer);\n }\n }\n\n return { found: allHashes, missing };\n }\n\n isRefPartOfHistory(startFrom: Ref, searchFor: Ref) {\n const { found } = this.getAllHashesFrom(startFrom);\n return found?.includes(searchFor.toString());\n }\n\n isGraphCompleteSince(ref: Ref) {\n if (this.graphCompleteRefs.includes(ref.toString())) return true;\n const { missing } = this.getAllHashesFrom(ref);\n const isComplete = !missing || !missing.length;\n if (isComplete) {\n this.graphCompleteRefs.push(ref.toString());\n this.hasChanged = true;\n }\n return isComplete;\n }\n\n getAllHashesAsString(): string[] {\n return Object.keys(this.versionsObj);\n }\n\n merge(versionHistory: VersionHistory) {\n const existingHashes = this.getAllHashesAsString();\n const incomingHashes = versionHistory.getAllHashesAsString();\n const hashesInExistingOnly = new Set(difference(existingHashes, incomingHashes));\n const versionsDataOnExistingOnly = this.versions.filter((v) => hashesInExistingOnly.has(v.hash.toString()));\n const newVersions = [...versionHistory.versions, ...versionsDataOnExistingOnly];\n this.versionsObj = this.versionParentsToObject(newVersions);\n }\n\n getAncestor(numOfGenerationsToGoBack: number, ref: Ref): Ref {\n const errorMsg = `unable to get an older parent of ${this.compId.toString()}`;\n const versionData = this.getVersionData(ref);\n if (!versionData)\n throw new BitError(`${errorMsg}, version \"${ref.toString()}\" was not found in the version history`);\n if (numOfGenerationsToGoBack === 0) return versionData.hash;\n if (!versionData.parents.length) throw new BitError(`${errorMsg}, version \"${ref.toString()}\" has no parents`);\n const parent = versionData.parents[0];\n return this.getAncestor(numOfGenerationsToGoBack - 1, parent);\n }\n\n getGraph(\n modelComponent?: ModelComponent,\n laneHeads?: { [hash: string]: string[] },\n shortHash = false,\n limitVersions?: number\n ): VersionHistoryGraph {\n const refToStr = (ref: Ref) => (shortHash ? ref.toShortString() : ref.toString());\n const graph = new Graph<string | HashMetadata, string>();\n const allVersions = limitVersions ? [...this.versions].slice(-limitVersions) : this.versions;\n const allHashes = allVersions\n .map((v) => compact([v.hash, ...v.parents, ...(v.squashed || []), v.unrelated]))\n .flat();\n\n const allHashesUniq = uniqBy(allHashes, 'hash');\n\n const getMetadata = (ref: Ref): HashMetadata | undefined => {\n if (!modelComponent || !laneHeads) return undefined;\n const tag = modelComponent.getTagOfRefIfExists(ref);\n const pointers = laneHeads[ref.toString()];\n return { tag, pointers };\n };\n const nodes = allHashesUniq.map((v) => new Node(refToStr(v), getMetadata(v) || refToStr(v)));\n\n const edges = allVersions\n .map((v) => {\n const verEdges = v.parents.map((p) => new Edge(refToStr(v.hash), refToStr(p), 'parent'));\n if (v.unrelated) verEdges.push(new Edge(refToStr(v.hash), refToStr(v.unrelated), 'unrelated'));\n if (v.squashed) {\n const squashed = v.squashed.filter((s) => !v.parents.find((p) => p.isEqual(s)));\n squashed.map((p) => verEdges.push(new Edge(refToStr(v.hash), refToStr(p), 'squashed')));\n }\n return verEdges;\n })\n .flat();\n graph.setNodes(nodes);\n graph.setEdges(edges);\n return graph;\n }\n\n get compId() {\n return ComponentID.fromObject({ scope: this.scope, name: this.name });\n }\n\n static create(name: string, scope: string, versions: VersionParents[]) {\n return new VersionHistory({\n name,\n scope,\n versions,\n });\n }\n\n static parse(contents: string): VersionHistory {\n const parsed = JSON.parse(contents);\n const props: VersionHistoryProps = {\n name: parsed.name,\n scope: parsed.scope,\n versions: parsed.versions.map((ver) => ({\n hash: Ref.from(ver.hash),\n parents: ver.parents.map((p) => Ref.from(p)),\n unrelated: ver.unrelated ? Ref.from(ver.unrelated) : undefined,\n squashed: ver.squashed ? ver.squashed.map((p) => Ref.from(p)) : undefined,\n })),\n graphCompleteRefs: parsed.graphCompleteRefs,\n };\n return new VersionHistory(props);\n }\n}\n\nexport function versionParentsToGraph(versions: VersionParents[]): Graph<string, string> {\n const refToStr = (ref: Ref) => ref.toString();\n const graph = new Graph<string, string>();\n const allHashes = uniqBy(\n versions\n .map((v) => {\n return compact([v.hash, ...v.parents, ...(v.squashed || []), v.unrelated]);\n })\n .flat(),\n 'hash'\n );\n const nodes = allHashes.map((v) => new Node(refToStr(v), refToStr(v)));\n const edges = versions\n .map((v) => {\n const verEdges = v.parents.map((p) => new Edge(refToStr(v.hash), refToStr(p), 'parent'));\n if (v.unrelated) verEdges.push(new Edge(refToStr(v.hash), refToStr(v.unrelated), 'unrelated'));\n if (v.squashed) {\n const squashed = v.squashed.filter((s) => !v.parents.find((p) => p.isEqual(s)));\n squashed.map((p) => verEdges.push(new Edge(refToStr(v.hash), refToStr(p), 'squashed')));\n }\n return verEdges;\n })\n .flat();\n graph.setNodes(nodes);\n graph.setEdges(edges);\n return graph;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _chai() {
|
|
4
|
+
const data = require("chai");
|
|
5
|
+
_chai = function () {
|
|
6
|
+
return data;
|
|
7
|
+
};
|
|
8
|
+
return data;
|
|
9
|
+
}
|
|
10
|
+
function _ref() {
|
|
11
|
+
const data = _interopRequireDefault(require("../objects/ref"));
|
|
12
|
+
_ref = function () {
|
|
13
|
+
return data;
|
|
14
|
+
};
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
function _versionHistory() {
|
|
18
|
+
const data = _interopRequireDefault(require("./version-history"));
|
|
19
|
+
_versionHistory = function () {
|
|
20
|
+
return data;
|
|
21
|
+
};
|
|
22
|
+
return data;
|
|
23
|
+
}
|
|
24
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
25
|
+
const hash = i => i.toString(16).padStart(40, '0');
|
|
26
|
+
const ref = i => new (_ref().default)(hash(i));
|
|
27
|
+
const item = (i, parents = i > 0 ? [i - 1] : []) => ({
|
|
28
|
+
hash: ref(i),
|
|
29
|
+
parents: parents.map(ref)
|
|
30
|
+
});
|
|
31
|
+
const linear = (from, to) => Array.from({
|
|
32
|
+
length: to - from
|
|
33
|
+
}, (_, j) => item(from + j));
|
|
34
|
+
const create = versions => _versionHistory().default.create('button', 'acme.ui', versions);
|
|
35
|
+
const hashes = versionHistory => versionHistory.versions.map(v => v.hash.toString());
|
|
36
|
+
describe('VersionHistory', () => {
|
|
37
|
+
describe('merge', () => {
|
|
38
|
+
it('keeps the incoming versions, then the versions only the existing history has', () => {
|
|
39
|
+
const existing = create([...linear(0, 3), item(10, [2]), item(11, [10])]);
|
|
40
|
+
const incoming = create(linear(0, 5));
|
|
41
|
+
existing.merge(incoming);
|
|
42
|
+
(0, _chai().expect)(hashes(existing)).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(4), hash(10), hash(11)]);
|
|
43
|
+
});
|
|
44
|
+
it('takes the incoming data of a version both histories have', () => {
|
|
45
|
+
const existing = create([item(0), item(1, [0]), item(2, [1])]);
|
|
46
|
+
const incoming = create([item(0), item(1, [0]), item(2, [0])]);
|
|
47
|
+
existing.merge(incoming);
|
|
48
|
+
(0, _chai().expect)(existing.getVersionData(ref(2))?.parents.map(String)).to.deep.equal([hash(0)]);
|
|
49
|
+
});
|
|
50
|
+
it('keeps the existing history when the incoming one is empty', () => {
|
|
51
|
+
const existing = create(linear(0, 3));
|
|
52
|
+
existing.merge(create([]));
|
|
53
|
+
(0, _chai().expect)(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));
|
|
54
|
+
});
|
|
55
|
+
it('takes the incoming history when the existing one is empty', () => {
|
|
56
|
+
const existing = create([]);
|
|
57
|
+
existing.merge(create(linear(0, 3)));
|
|
58
|
+
(0, _chai().expect)(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));
|
|
59
|
+
});
|
|
60
|
+
it('stays the same when the incoming history is already part of the existing one', () => {
|
|
61
|
+
const existing = create([...linear(0, 4), item(20, [3])]);
|
|
62
|
+
existing.merge(create(linear(0, 4)));
|
|
63
|
+
(0, _chai().expect)(hashes(existing).sort()).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(20)].sort());
|
|
64
|
+
});
|
|
65
|
+
it('stays fast when the existing history has thousands of versions the incoming one does not', () => {
|
|
66
|
+
const size = 20000;
|
|
67
|
+
const existing = create([...linear(0, size), ...Array.from({
|
|
68
|
+
length: size
|
|
69
|
+
}, (_, j) => item(size + j, [j]))]);
|
|
70
|
+
const incoming = create(linear(0, size));
|
|
71
|
+
const start = Date.now();
|
|
72
|
+
existing.merge(incoming);
|
|
73
|
+
(0, _chai().expect)(existing.versions).to.have.length(size * 2);
|
|
74
|
+
(0, _chai().expect)(Date.now() - start).to.be.lessThan(2000);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=version-history.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_chai","data","require","_ref","_interopRequireDefault","_versionHistory","e","__esModule","default","hash","i","toString","padStart","ref","Ref","item","parents","map","linear","from","to","Array","length","_","j","create","versions","VersionHistory","hashes","versionHistory","v","describe","it","existing","incoming","merge","expect","deep","equal","getVersionData","String","sort","size","start","Date","now","have","be","lessThan"],"sources":["version-history.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport Ref from '../objects/ref';\nimport VersionHistory from './version-history';\nimport type { VersionParents } from './version-history';\n\nconst hash = (i: number) => i.toString(16).padStart(40, '0');\nconst ref = (i: number) => new Ref(hash(i));\nconst item = (i: number, parents: number[] = i > 0 ? [i - 1] : []): VersionParents => ({\n hash: ref(i),\n parents: parents.map(ref),\n});\nconst linear = (from: number, to: number) => Array.from({ length: to - from }, (_, j) => item(from + j));\nconst create = (versions: VersionParents[]) => VersionHistory.create('button', 'acme.ui', versions);\nconst hashes = (versionHistory: VersionHistory) => versionHistory.versions.map((v) => v.hash.toString());\n\ndescribe('VersionHistory', () => {\n describe('merge', () => {\n it('keeps the incoming versions, then the versions only the existing history has', () => {\n const existing = create([...linear(0, 3), item(10, [2]), item(11, [10])]);\n const incoming = create(linear(0, 5));\n existing.merge(incoming);\n expect(hashes(existing)).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(4), hash(10), hash(11)]);\n });\n\n it('takes the incoming data of a version both histories have', () => {\n const existing = create([item(0), item(1, [0]), item(2, [1])]);\n const incoming = create([item(0), item(1, [0]), item(2, [0])]);\n existing.merge(incoming);\n expect(existing.getVersionData(ref(2))?.parents.map(String)).to.deep.equal([hash(0)]);\n });\n\n it('keeps the existing history when the incoming one is empty', () => {\n const existing = create(linear(0, 3));\n existing.merge(create([]));\n expect(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));\n });\n\n it('takes the incoming history when the existing one is empty', () => {\n const existing = create([]);\n existing.merge(create(linear(0, 3)));\n expect(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));\n });\n\n it('stays the same when the incoming history is already part of the existing one', () => {\n const existing = create([...linear(0, 4), item(20, [3])]);\n existing.merge(create(linear(0, 4)));\n expect(hashes(existing).sort()).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(20)].sort());\n });\n\n it('stays fast when the existing history has thousands of versions the incoming one does not', () => {\n const size = 20000;\n const existing = create([...linear(0, size), ...Array.from({ length: size }, (_, j) => item(size + j, [j]))]);\n const incoming = create(linear(0, size));\n const start = Date.now();\n existing.merge(incoming);\n expect(existing.versions).to.have.length(size * 2);\n expect(Date.now() - start).to.be.lessThan(2000);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import Ref from '../objects/ref';
|
|
3
|
+
import VersionHistory from './version-history';
|
|
4
|
+
import type { VersionParents } from './version-history';
|
|
5
|
+
|
|
6
|
+
const hash = (i: number) => i.toString(16).padStart(40, '0');
|
|
7
|
+
const ref = (i: number) => new Ref(hash(i));
|
|
8
|
+
const item = (i: number, parents: number[] = i > 0 ? [i - 1] : []): VersionParents => ({
|
|
9
|
+
hash: ref(i),
|
|
10
|
+
parents: parents.map(ref),
|
|
11
|
+
});
|
|
12
|
+
const linear = (from: number, to: number) => Array.from({ length: to - from }, (_, j) => item(from + j));
|
|
13
|
+
const create = (versions: VersionParents[]) => VersionHistory.create('button', 'acme.ui', versions);
|
|
14
|
+
const hashes = (versionHistory: VersionHistory) => versionHistory.versions.map((v) => v.hash.toString());
|
|
15
|
+
|
|
16
|
+
describe('VersionHistory', () => {
|
|
17
|
+
describe('merge', () => {
|
|
18
|
+
it('keeps the incoming versions, then the versions only the existing history has', () => {
|
|
19
|
+
const existing = create([...linear(0, 3), item(10, [2]), item(11, [10])]);
|
|
20
|
+
const incoming = create(linear(0, 5));
|
|
21
|
+
existing.merge(incoming);
|
|
22
|
+
expect(hashes(existing)).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(4), hash(10), hash(11)]);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('takes the incoming data of a version both histories have', () => {
|
|
26
|
+
const existing = create([item(0), item(1, [0]), item(2, [1])]);
|
|
27
|
+
const incoming = create([item(0), item(1, [0]), item(2, [0])]);
|
|
28
|
+
existing.merge(incoming);
|
|
29
|
+
expect(existing.getVersionData(ref(2))?.parents.map(String)).to.deep.equal([hash(0)]);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('keeps the existing history when the incoming one is empty', () => {
|
|
33
|
+
const existing = create(linear(0, 3));
|
|
34
|
+
existing.merge(create([]));
|
|
35
|
+
expect(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('takes the incoming history when the existing one is empty', () => {
|
|
39
|
+
const existing = create([]);
|
|
40
|
+
existing.merge(create(linear(0, 3)));
|
|
41
|
+
expect(hashes(existing)).to.deep.equal(hashes(create(linear(0, 3))));
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('stays the same when the incoming history is already part of the existing one', () => {
|
|
45
|
+
const existing = create([...linear(0, 4), item(20, [3])]);
|
|
46
|
+
existing.merge(create(linear(0, 4)));
|
|
47
|
+
expect(hashes(existing).sort()).to.deep.equal([hash(0), hash(1), hash(2), hash(3), hash(20)].sort());
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('stays fast when the existing history has thousands of versions the incoming one does not', () => {
|
|
51
|
+
const size = 20000;
|
|
52
|
+
const existing = create([...linear(0, size), ...Array.from({ length: size }, (_, j) => item(size + j, [j]))]);
|
|
53
|
+
const incoming = create(linear(0, size));
|
|
54
|
+
const start = Date.now();
|
|
55
|
+
existing.merge(incoming);
|
|
56
|
+
expect(existing.versions).to.have.length(size * 2);
|
|
57
|
+
expect(Date.now() - start).to.be.lessThan(2000);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -169,8 +169,8 @@ export default class VersionHistory extends BitObject {
|
|
|
169
169
|
merge(versionHistory: VersionHistory) {
|
|
170
170
|
const existingHashes = this.getAllHashesAsString();
|
|
171
171
|
const incomingHashes = versionHistory.getAllHashesAsString();
|
|
172
|
-
const hashesInExistingOnly = difference(existingHashes, incomingHashes);
|
|
173
|
-
const versionsDataOnExistingOnly = this.versions.filter((v) => hashesInExistingOnly.
|
|
172
|
+
const hashesInExistingOnly = new Set(difference(existingHashes, incomingHashes));
|
|
173
|
+
const versionsDataOnExistingOnly = this.versions.filter((v) => hashesInExistingOnly.has(v.hash.toString()));
|
|
174
174
|
const newVersions = [...versionHistory.versions, ...versionsDataOnExistingOnly];
|
|
175
175
|
this.versionsObj = this.versionParentsToObject(newVersions);
|
|
176
176
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teambit/objects",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.732",
|
|
4
4
|
"homepage": "https://bit.cloud/teambit/scope/objects",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"componentId": {
|
|
7
7
|
"scope": "teambit.scope",
|
|
8
8
|
"name": "objects",
|
|
9
|
-
"version": "0.0.
|
|
9
|
+
"version": "0.0.732"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@pnpm/lockfile.types": "1100.0.19",
|
|
@@ -22,32 +22,32 @@
|
|
|
22
22
|
"@teambit/harmony.modules.runtimes": "0.0.4",
|
|
23
23
|
"@teambit/component-id": "1.2.5",
|
|
24
24
|
"@teambit/legacy.utils": "0.0.56",
|
|
25
|
+
"@teambit/harmony.modules.get-basic-log": "0.0.197",
|
|
25
26
|
"@teambit/bit-error": "0.0.404",
|
|
26
27
|
"@teambit/component-version": "1.0.4",
|
|
28
|
+
"@teambit/component.snap-distance": "0.0.193",
|
|
29
|
+
"@teambit/config-store": "0.0.308",
|
|
27
30
|
"@teambit/lane-id": "0.0.312",
|
|
28
31
|
"@teambit/legacy.cli.error": "0.0.72",
|
|
29
32
|
"@teambit/legacy.constants": "0.0.50",
|
|
30
33
|
"@teambit/legacy.logger": "0.0.71",
|
|
34
|
+
"@teambit/legacy.scope": "0.0.196",
|
|
31
35
|
"@teambit/toolbox.crypto.sha1": "0.0.24",
|
|
32
|
-
"@teambit/component.sources": "0.0.
|
|
36
|
+
"@teambit/component.sources": "0.0.245",
|
|
33
37
|
"@teambit/harmony.modules.concurrency": "0.0.51",
|
|
34
38
|
"@teambit/legacy-bit-id": "1.1.4",
|
|
35
39
|
"@teambit/legacy-component-log": "0.0.434",
|
|
36
|
-
"@teambit/legacy.consumer-component": "0.0.
|
|
37
|
-
"@teambit/legacy.consumer-config": "0.0.
|
|
38
|
-
"@teambit/legacy.extension-data": "0.0.
|
|
40
|
+
"@teambit/legacy.consumer-component": "0.0.194",
|
|
41
|
+
"@teambit/legacy.consumer-config": "0.0.193",
|
|
42
|
+
"@teambit/legacy.extension-data": "0.0.195",
|
|
39
43
|
"@teambit/pkg.modules.semver-helper": "0.0.38",
|
|
40
44
|
"@teambit/toolbox.array.duplications-finder": "0.0.19",
|
|
41
45
|
"@teambit/toolbox.promise.map-pool": "0.0.24",
|
|
42
46
|
"@teambit/graph.cleargraph": "0.0.11",
|
|
43
47
|
"@teambit/bit.get-bit-version": "0.0.31",
|
|
44
|
-
"@teambit/semantics.doc-parser": "0.0.
|
|
48
|
+
"@teambit/semantics.doc-parser": "0.0.201",
|
|
45
49
|
"@teambit/harmony.modules.in-memory-cache": "0.0.55",
|
|
46
|
-
"@teambit/toolbox.fs.remove-empty-dir": "0.0.22"
|
|
47
|
-
"@teambit/harmony.modules.get-basic-log": "0.0.196",
|
|
48
|
-
"@teambit/component.snap-distance": "0.0.192",
|
|
49
|
-
"@teambit/config-store": "0.0.307",
|
|
50
|
-
"@teambit/legacy.scope": "0.0.195"
|
|
50
|
+
"@teambit/toolbox.fs.remove-empty-dir": "0.0.22"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/semver": "7.5.8",
|
|
File without changes
|