@teambit/objects 0.0.0-00042bc99514ea12d897f81bcd0181e2b034c615

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 (121) hide show
  1. package/dist/fixtures/version-model-extended.json +48 -0
  2. package/dist/fixtures/version-model-object.json +87 -0
  3. package/dist/index.d.ts +19 -0
  4. package/dist/index.js +371 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/models/dependencies-graph.d.ts +46 -0
  7. package/dist/models/dependencies-graph.js +105 -0
  8. package/dist/models/dependencies-graph.js.map +1 -0
  9. package/dist/models/detach-heads.d.ts +25 -0
  10. package/dist/models/detach-heads.js +84 -0
  11. package/dist/models/detach-heads.js.map +1 -0
  12. package/dist/models/export-metadata.d.ts +24 -0
  13. package/dist/models/export-metadata.js +74 -0
  14. package/dist/models/export-metadata.js.map +1 -0
  15. package/dist/models/index.d.ts +10 -0
  16. package/dist/models/index.js +125 -0
  17. package/dist/models/index.js.map +1 -0
  18. package/dist/models/lane-history.d.ts +43 -0
  19. package/dist/models/lane-history.js +131 -0
  20. package/dist/models/lane-history.js.map +1 -0
  21. package/dist/models/lane-history.spec.d.ts +1 -0
  22. package/dist/models/lane-history.spec.js +46 -0
  23. package/dist/models/lane-history.spec.js.map +1 -0
  24. package/dist/models/lane.d.ts +128 -0
  25. package/dist/models/lane.js +485 -0
  26. package/dist/models/lane.js.map +1 -0
  27. package/dist/models/model-component.d.ts +338 -0
  28. package/dist/models/model-component.js +1509 -0
  29. package/dist/models/model-component.js.map +1 -0
  30. package/dist/models/model-component.spec.d.ts +1 -0
  31. package/dist/models/model-component.spec.js +71 -0
  32. package/dist/models/model-component.spec.js.map +1 -0
  33. package/dist/models/scopeMeta.d.ts +20 -0
  34. package/dist/models/scopeMeta.js +68 -0
  35. package/dist/models/scopeMeta.js.map +1 -0
  36. package/dist/models/source.d.ts +10 -0
  37. package/dist/models/source.js +42 -0
  38. package/dist/models/source.js.map +1 -0
  39. package/dist/models/symlink.d.ts +30 -0
  40. package/dist/models/symlink.js +91 -0
  41. package/dist/models/symlink.js.map +1 -0
  42. package/dist/models/version-history.d.ts +59 -0
  43. package/dist/models/version-history.js +296 -0
  44. package/dist/models/version-history.js.map +1 -0
  45. package/dist/models/version.d.ts +288 -0
  46. package/dist/models/version.js +780 -0
  47. package/dist/models/version.js.map +1 -0
  48. package/dist/models/version.spec.d.ts +1 -0
  49. package/dist/models/version.spec.js +332 -0
  50. package/dist/models/version.spec.js.map +1 -0
  51. package/dist/objects/bit-object-list.d.ts +24 -0
  52. package/dist/objects/bit-object-list.js +65 -0
  53. package/dist/objects/bit-object-list.js.map +1 -0
  54. package/dist/objects/index.d.ts +5 -0
  55. package/dist/objects/index.js +60 -0
  56. package/dist/objects/index.js.map +1 -0
  57. package/dist/objects/object-list-to-graph.d.ts +13 -0
  58. package/dist/objects/object-list-to-graph.js +93 -0
  59. package/dist/objects/object-list-to-graph.js.map +1 -0
  60. package/dist/objects/object-list.d.ts +58 -0
  61. package/dist/objects/object-list.js +389 -0
  62. package/dist/objects/object-list.js.map +1 -0
  63. package/dist/objects/object.d.ts +35 -0
  64. package/dist/objects/object.js +189 -0
  65. package/dist/objects/object.js.map +1 -0
  66. package/dist/objects/objects-readable-generator.d.ts +31 -0
  67. package/dist/objects/objects-readable-generator.js +203 -0
  68. package/dist/objects/objects-readable-generator.js.map +1 -0
  69. package/dist/objects/raw-object.d.ts +23 -0
  70. package/dist/objects/raw-object.js +145 -0
  71. package/dist/objects/raw-object.js.map +1 -0
  72. package/dist/objects/ref.d.ts +14 -0
  73. package/dist/objects/ref.js +45 -0
  74. package/dist/objects/ref.js.map +1 -0
  75. package/dist/objects/repository.d.ts +165 -0
  76. package/dist/objects/repository.js +866 -0
  77. package/dist/objects/repository.js.map +1 -0
  78. package/dist/objects/scope-index.d.ts +74 -0
  79. package/dist/objects/scope-index.js +255 -0
  80. package/dist/objects/scope-index.js.map +1 -0
  81. package/dist/objects/scope-index.spec.d.ts +1 -0
  82. package/dist/objects/scope-index.spec.js +152 -0
  83. package/dist/objects/scope-index.spec.js.map +1 -0
  84. package/dist/objects.aspect.d.ts +2 -0
  85. package/dist/objects.aspect.js +18 -0
  86. package/dist/objects.aspect.js.map +1 -0
  87. package/dist/objects.main.runtime.d.ts +7 -0
  88. package/dist/objects.main.runtime.js +36 -0
  89. package/dist/objects.main.runtime.js.map +1 -0
  90. package/dist/preview-1781548568469.js +7 -0
  91. package/fixtures/version-model-extended.json +48 -0
  92. package/fixtures/version-model-object.json +87 -0
  93. package/models/dependencies-graph.ts +120 -0
  94. package/models/detach-heads.ts +79 -0
  95. package/models/export-metadata.ts +56 -0
  96. package/models/index.ts +11 -0
  97. package/models/lane-history.spec.ts +35 -0
  98. package/models/lane-history.ts +131 -0
  99. package/models/lane.ts +400 -0
  100. package/models/model-component.spec.ts +55 -0
  101. package/models/model-component.ts +1522 -0
  102. package/models/scopeMeta.ts +58 -0
  103. package/models/source.ts +31 -0
  104. package/models/symlink.ts +66 -0
  105. package/models/version-history.ts +283 -0
  106. package/models/version.spec.ts +280 -0
  107. package/models/version.ts +821 -0
  108. package/objects/bit-object-list.ts +59 -0
  109. package/objects/index.ts +6 -0
  110. package/objects/object-list-to-graph.ts +69 -0
  111. package/objects/object-list.ts +327 -0
  112. package/objects/object.ts +152 -0
  113. package/objects/objects-readable-generator.ts +174 -0
  114. package/objects/raw-object.ts +132 -0
  115. package/objects/ref.ts +45 -0
  116. package/objects/repository.ts +780 -0
  117. package/objects/scope-index.spec.ts +95 -0
  118. package/objects/scope-index.ts +197 -0
  119. package/package.json +97 -0
  120. package/types/asset.d.ts +41 -0
  121. package/types/style.d.ts +42 -0
@@ -0,0 +1,174 @@
1
+ import pMapSeries from 'p-map-series';
2
+ import { BitError } from '@teambit/bit-error';
3
+ import { Readable } from 'stream';
4
+ import { compact } from 'lodash';
5
+ import type BitObject from './object';
6
+ import type Repository from './repository';
7
+ import type Ref from './ref';
8
+ import type { Scope } from '@teambit/legacy.scope';
9
+ import { logger } from '@teambit/legacy.logger';
10
+ import { getAllVersionHashesMemoized } from '@teambit/component.snap-distance';
11
+ import type { Lane, LaneHistory, ModelComponent, Version } from '../models';
12
+ import type { ObjectItem } from './object-list';
13
+
14
+ export type ComponentWithCollectOptions = {
15
+ component: ModelComponent;
16
+ version: string;
17
+ collectParents: boolean;
18
+ collectParentsUntil?: Ref | null; // stop traversing when this hash found. helps to import only the delta.
19
+ collectArtifacts: boolean;
20
+ includeVersionHistory?: boolean; // send VersionHistory object if exists rather than collecting parents
21
+ };
22
+
23
+ export class ObjectsReadableGenerator {
24
+ public readable: Readable;
25
+ private pushed: string[] = [];
26
+ constructor(
27
+ private repo: Repository,
28
+ private callbackOnceDone: Function
29
+ ) {
30
+ this.readable = new Readable({ objectMode: true, read() {} });
31
+ }
32
+ async pushObjectsToReadable(componentsWithOptions: ComponentWithCollectOptions[]) {
33
+ try {
34
+ await this.pushScopeMeta();
35
+ await pMapSeries(componentsWithOptions, async (componentWithOptions) =>
36
+ this.pushComponentObjects(componentWithOptions)
37
+ );
38
+ this.closeReadableSuccessfully();
39
+ } catch (err: any) {
40
+ this.closeReadableFailure(err);
41
+ }
42
+ }
43
+
44
+ async pushLanes(lanesToFetch: Lane[], lanesHistory: LaneHistory[] = []) {
45
+ try {
46
+ const lanesItems = await Promise.all(lanesToFetch.map((laneToFetch) => this.bitObjectToItem(laneToFetch)));
47
+ const laneHistoryItems = await Promise.all(lanesHistory.map((laneHistory) => this.bitObjectToItem(laneHistory)));
48
+ this.pushManyObjects([...lanesItems, ...laneHistoryItems]);
49
+ this.closeReadableSuccessfully();
50
+ } catch (err: any) {
51
+ this.closeReadableFailure(err);
52
+ }
53
+ }
54
+
55
+ async pushObjects(refs: Ref[], scope: Scope) {
56
+ try {
57
+ await pMapSeries(refs, async (ref) => {
58
+ const objectItem = await this.getObjectGracefully(ref, scope);
59
+ if (objectItem) this.push(objectItem);
60
+ });
61
+ this.closeReadableSuccessfully();
62
+ } catch (err: any) {
63
+ this.closeReadableFailure(err);
64
+ }
65
+ }
66
+
67
+ private closeReadableSuccessfully() {
68
+ logger.debug(`ObjectsReadableGenerator, pushed ${this.pushed.length} objects`);
69
+ this.callbackOnceDone();
70
+ this.readable.push(null);
71
+ }
72
+
73
+ private closeReadableFailure(err: Error) {
74
+ logger.debug(`ObjectsReadableGenerator, pushed ${this.pushed.length} objects`);
75
+ logger.error(`ObjectsReadableGenerator, got an error`, err);
76
+ this.callbackOnceDone(err);
77
+ this.readable.destroy(err);
78
+ }
79
+
80
+ private async bitObjectToItem(obj: BitObject): Promise<ObjectItem> {
81
+ return {
82
+ ref: obj.hash(),
83
+ buffer: await obj.compress(),
84
+ type: obj.getType(),
85
+ };
86
+ }
87
+
88
+ private async getObjectGracefully(ref: Ref, scope: Scope) {
89
+ try {
90
+ return await scope.getObjectItem(ref);
91
+ } catch (err: any) {
92
+ logger.warn(
93
+ `getObjectGracefully: failed retrieving an object ${ref.toString()} from the filesystem.\n${err.message}`
94
+ );
95
+ return null;
96
+ }
97
+ }
98
+
99
+ private async pushScopeMeta() {
100
+ const scopeMeta = await this.repo.getScopeMetaObject();
101
+ this.push(scopeMeta);
102
+ }
103
+
104
+ private push(obj: ObjectItem) {
105
+ const hashStr = obj.ref.toString();
106
+ if (this.pushed.includes(hashStr)) {
107
+ return;
108
+ }
109
+ logger.trace('ObjectsReadableGenerator.push', hashStr);
110
+ this.readable.push(obj);
111
+ this.pushed.push(hashStr);
112
+ }
113
+ private pushManyObjects(objects: ObjectItem[]) {
114
+ objects.map((obj) => this.push(obj));
115
+ }
116
+
117
+ private async pushComponentObjects(componentWithOptions: ComponentWithCollectOptions): Promise<void> {
118
+ const { component, collectParents, collectArtifacts, collectParentsUntil, includeVersionHistory } =
119
+ componentWithOptions;
120
+ const version = await component.loadVersion(componentWithOptions.version, this.repo, false);
121
+ if (!version) throw new BitError(`failed loading version ${componentWithOptions.version} of ${component.id()}`);
122
+ if (collectParentsUntil && version.hash().isEqual(collectParentsUntil)) {
123
+ return;
124
+ }
125
+ const collectVersionObjects = async (ver: Version): Promise<ObjectItem[]> => {
126
+ const versionRefs = ver.refsWithOptions(false, collectArtifacts);
127
+ const missingVersionRefs = versionRefs.filter((ref) => !this.pushed.includes(ref.toString()));
128
+ const versionObjects = await ver.collectManyObjects(this.repo, missingVersionRefs);
129
+ const versionData = { ref: ver.hash(), buffer: await ver.asRaw(this.repo), type: ver.getType() };
130
+ return [...versionObjects, versionData];
131
+ };
132
+ if (!this.pushed.includes(component.hash().toString())) {
133
+ const componentData = {
134
+ ref: component.hash(),
135
+ buffer: await component.asRaw(this.repo),
136
+ type: component.getType(),
137
+ };
138
+ this.push(componentData);
139
+ }
140
+ const allVersions: Version[] = [];
141
+ if (includeVersionHistory) {
142
+ const versionHistory = await component.getAndPopulateVersionHistory(this.repo, version.hash());
143
+ const versionHistoryData = {
144
+ ref: versionHistory.hash(),
145
+ buffer: await versionHistory.asRaw(this.repo),
146
+ type: versionHistory.getType(),
147
+ };
148
+ this.push(versionHistoryData);
149
+ }
150
+ if (collectParents) {
151
+ const allParentsHashes = await getAllVersionHashesMemoized({
152
+ modelComponent: component,
153
+ repo: this.repo,
154
+ startFrom: version.hash(),
155
+ stopAt: collectParentsUntil ? [collectParentsUntil] : undefined,
156
+ });
157
+ const missingParentsHashes = allParentsHashes.filter((h) => !h.isEqual(version.hash()));
158
+ const parentVersions = await pMapSeries(missingParentsHashes, (parentHash) => parentHash.load(this.repo));
159
+ const nullParentHashes = missingParentsHashes.filter((_, i) => !parentVersions[i]);
160
+ if (nullParentHashes.length) {
161
+ logger.warn(
162
+ `ObjectsReadableGenerator.pushComponentObjects: failed loading ${nullParentHashes.length} parent version(s) for ${component.id()} (version: ${componentWithOptions.version}), missing: ${nullParentHashes.join(', ')}`
163
+ );
164
+ }
165
+ allVersions.push(...(compact(parentVersions) as Version[]));
166
+ // note: don't bring the head. otherwise, component-delta of the head won't bring all history of this comp.
167
+ }
168
+ allVersions.push(version);
169
+ await pMapSeries(allVersions, async (ver) => {
170
+ const versionObjects = await collectVersionObjects(ver);
171
+ this.pushManyObjects(versionObjects);
172
+ });
173
+ }
174
+ }
@@ -0,0 +1,132 @@
1
+ import { NULL_BYTE, SPACE_DELIMITER } from '@teambit/legacy.constants';
2
+ import { getStringifyArgs, inflate } from '@teambit/legacy.utils';
3
+ import { typesObj as types } from '@teambit/legacy.scope';
4
+ import type BitObject from './object';
5
+ import { clone } from 'lodash';
6
+
7
+ export default class BitRawObject {
8
+ headers: string[];
9
+ type: string;
10
+ content: Buffer;
11
+ parsedContent: any;
12
+ _ref: string;
13
+
14
+ constructor(
15
+ buffer: Buffer,
16
+ ref: string | null | undefined,
17
+ type: string | null | undefined,
18
+ content: Buffer | null | undefined,
19
+ parsedContent: any | null | undefined
20
+ ) {
21
+ let headers;
22
+ let contentFromBuffer;
23
+ if (buffer) {
24
+ const firstNullByteLocation = buffer.indexOf(NULL_BYTE);
25
+ headers = buffer.slice(0, firstNullByteLocation).toString();
26
+ contentFromBuffer = buffer.slice(firstNullByteLocation + 1, buffer.length);
27
+ }
28
+ this.content = content || contentFromBuffer;
29
+ this.headers = headers ? headers.split(SPACE_DELIMITER) : undefined;
30
+ const typeFromHeader = this.headers ? this.headers[0] : undefined;
31
+ // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
32
+ this.type = type || typeFromHeader;
33
+ // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
34
+ this._ref = ref;
35
+ this.parsedContent = parsedContent || this.getParsedContent();
36
+ }
37
+
38
+ getParsedContent() {
39
+ if (this.parsedContent) return this.parsedContent;
40
+ let parsedContent;
41
+ switch (this.type) {
42
+ case 'Version':
43
+ case 'Component':
44
+ case 'Symlink':
45
+ case 'ScopeMeta':
46
+ case 'VersionHistory':
47
+ parsedContent = JSON.parse(this.content.toString());
48
+ break;
49
+
50
+ default:
51
+ parsedContent = this.content;
52
+ }
53
+ return parsedContent;
54
+ }
55
+
56
+ getString(pretty: boolean) {
57
+ const args = getStringifyArgs(pretty);
58
+ switch (this.type) {
59
+ case 'Version':
60
+ case 'Component':
61
+ case 'Symlink':
62
+ case 'ScopeMeta':
63
+ case 'VersionHistory':
64
+ return JSON.stringify(this.parsedContent, ...args);
65
+ case 'Source':
66
+ return pretty ? JSON.stringify(JSON.parse(this.content.toString()), ...args) : this.content;
67
+
68
+ default:
69
+ return this.content;
70
+ }
71
+ }
72
+
73
+ set ref(ref: string) {
74
+ this._ref = ref;
75
+ }
76
+
77
+ get ref(): string {
78
+ return this._ref;
79
+ }
80
+
81
+ get id(): string {
82
+ switch (this.type) {
83
+ case 'Version':
84
+ return 'component version';
85
+ case 'Component':
86
+ return this.parsedContent.scope
87
+ ? [this.parsedContent.scope, this.parsedContent.name].join('/')
88
+ : this.parsedContent.name;
89
+ case 'Symlink':
90
+ return this.parsedContent.name;
91
+ case 'ScopeMeta':
92
+ return this.parsedContent.name;
93
+
94
+ default:
95
+ return 'component source file';
96
+ }
97
+ }
98
+
99
+ refs(): string[] {
100
+ if (this.type === 'Component') {
101
+ return Object.values(this.parsedContent.versions);
102
+ }
103
+ if (this.type === 'Version') {
104
+ const files = this.parsedContent.files ? this.parsedContent.files.map((file) => file.file) : [];
105
+ const dists = this.parsedContent.dists ? this.parsedContent.dists.map((dist) => dist.file) : [];
106
+ return [...dists, ...files].filter((ref) => ref);
107
+ }
108
+
109
+ return [];
110
+ }
111
+
112
+ static async fromDeflatedBuffer(fileContents: Buffer, ref: string | null | undefined): Promise<BitObject> {
113
+ // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
114
+ return inflate(fileContents).then((buffer) => new BitRawObject(buffer, ref));
115
+ }
116
+
117
+ /**
118
+ * Build a real object (model) from a parsed content (can be the original parsed conents or a provided one)
119
+ * We use the provided version during the migration process when we change the parsed content outside
120
+ * @param {Any} parsedContent
121
+ */
122
+ toRealObject() {
123
+ return types[this.type].from(this.parsedContent || this.getParsedContent(), this.headers[1]);
124
+ }
125
+
126
+ clone() {
127
+ const parsedContent = this.parsedContent ? clone(this.parsedContent) : undefined;
128
+ // TODO: Should also clone the buffers (content)
129
+ // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
130
+ return new BitRawObject(undefined, this._ref, this.type, this.content, parsedContent);
131
+ }
132
+ }
package/objects/ref.ts ADDED
@@ -0,0 +1,45 @@
1
+ import type BitObject from './object';
2
+ import type Repository from './repository';
3
+
4
+ export default class Ref {
5
+ hash: string;
6
+
7
+ constructor(hash: string) {
8
+ if (!hash) throw new Error('failed creating a Ref object, the hash argument is empty');
9
+ this.hash = hash;
10
+ }
11
+
12
+ toString() {
13
+ // reason for hash.toString() is when working with short hash, it's possible that all characters are numbers
14
+ // so it's needed to convert it to string
15
+ return this.hash.toString();
16
+ }
17
+
18
+ toShortString(numOfChars = 9) {
19
+ return this.hash.substring(0, numOfChars).toString();
20
+ }
21
+
22
+ load(repository: Repository, throws = false): Promise<BitObject> {
23
+ return repository.load(this, throws);
24
+ }
25
+
26
+ loadSync(repo: Repository, throws = true): BitObject {
27
+ return repo.loadSync(this, throws);
28
+ }
29
+
30
+ loadRaw(repo: Repository): Promise<Buffer> {
31
+ return repo.loadRaw(this);
32
+ }
33
+
34
+ isEqual(ref: Ref): boolean {
35
+ return this.toString() === ref.toString();
36
+ }
37
+
38
+ clone() {
39
+ return new Ref(this.hash);
40
+ }
41
+
42
+ static from(hash: string): Ref {
43
+ return new Ref(hash);
44
+ }
45
+ }