@shaxpir/duiduidui-models 1.0.0
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/README.md +1 -0
- package/decs.d.ts +87 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +20 -0
- package/dist/models/OutboundMessage.d.ts +18 -0
- package/dist/models/OutboundMessage.js +25 -0
- package/dist/models/content/Activity.d.ts +10 -0
- package/dist/models/content/Activity.js +2 -0
- package/dist/models/content/ArrayView.d.ts +26 -0
- package/dist/models/content/ArrayView.js +174 -0
- package/dist/models/content/Billing.d.ts +144 -0
- package/dist/models/content/Billing.js +418 -0
- package/dist/models/content/Book.d.ts +77 -0
- package/dist/models/content/Book.js +407 -0
- package/dist/models/content/Category.d.ts +16 -0
- package/dist/models/content/Category.js +20 -0
- package/dist/models/content/Checkpointable.d.ts +21 -0
- package/dist/models/content/Checkpointable.js +156 -0
- package/dist/models/content/Comment.d.ts +19 -0
- package/dist/models/content/Comment.js +53 -0
- package/dist/models/content/ConceptArt.d.ts +31 -0
- package/dist/models/content/ConceptArt.js +84 -0
- package/dist/models/content/Content.d.ts +52 -0
- package/dist/models/content/Content.js +61 -0
- package/dist/models/content/ContentKind.d.ts +10 -0
- package/dist/models/content/ContentKind.js +16 -0
- package/dist/models/content/Context.d.ts +28 -0
- package/dist/models/content/Context.js +162 -0
- package/dist/models/content/DevEnv.d.ts +5 -0
- package/dist/models/content/DevEnv.js +9 -0
- package/dist/models/content/Device.d.ts +24 -0
- package/dist/models/content/Device.js +62 -0
- package/dist/models/content/Dictionary.d.ts +31 -0
- package/dist/models/content/Dictionary.js +5 -0
- package/dist/models/content/DictionaryEntry.d.ts +20 -0
- package/dist/models/content/DictionaryEntry.js +2 -0
- package/dist/models/content/ElasticModel.d.ts +149 -0
- package/dist/models/content/ElasticModel.js +179 -0
- package/dist/models/content/Environment.d.ts +61 -0
- package/dist/models/content/Environment.js +124 -0
- package/dist/models/content/ExportOptions.d.ts +64 -0
- package/dist/models/content/ExportOptions.js +213 -0
- package/dist/models/content/Folder.d.ts +16 -0
- package/dist/models/content/Folder.js +33 -0
- package/dist/models/content/Fragment.d.ts +54 -0
- package/dist/models/content/Fragment.js +181 -0
- package/dist/models/content/GeoLocation.d.ts +4 -0
- package/dist/models/content/GeoLocation.js +2 -0
- package/dist/models/content/Hanzi.d.ts +21 -0
- package/dist/models/content/Hanzi.js +2 -0
- package/dist/models/content/HighlightRule.d.ts +9 -0
- package/dist/models/content/HighlightRule.js +2 -0
- package/dist/models/content/Manifest.d.ts +42 -0
- package/dist/models/content/Manifest.js +114 -0
- package/dist/models/content/Media.d.ts +32 -0
- package/dist/models/content/Media.js +98 -0
- package/dist/models/content/Metric.d.ts +46 -0
- package/dist/models/content/Metric.js +183 -0
- package/dist/models/content/Migration.d.ts +68 -0
- package/dist/models/content/Migration.js +155 -0
- package/dist/models/content/Model.d.ts +45 -0
- package/dist/models/content/Model.js +280 -0
- package/dist/models/content/Permissions.d.ts +7 -0
- package/dist/models/content/Permissions.js +20 -0
- package/dist/models/content/Phrase.d.ts +8 -0
- package/dist/models/content/Phrase.js +2 -0
- package/dist/models/content/Placeholder.d.ts +8 -0
- package/dist/models/content/Placeholder.js +36 -0
- package/dist/models/content/Profile.d.ts +30 -0
- package/dist/models/content/Profile.js +95 -0
- package/dist/models/content/RichText.d.ts +58 -0
- package/dist/models/content/RichText.js +79 -0
- package/dist/models/content/Session.d.ts +39 -0
- package/dist/models/content/Session.js +173 -0
- package/dist/models/content/Speech.d.ts +67 -0
- package/dist/models/content/Speech.js +97 -0
- package/dist/models/content/Stub.d.ts +24 -0
- package/dist/models/content/Stub.js +179 -0
- package/dist/models/content/Time.d.ts +56 -0
- package/dist/models/content/Time.js +295 -0
- package/dist/models/content/User.d.ts +36 -0
- package/dist/models/content/User.js +95 -0
- package/dist/models/content/Workspace.d.ts +71 -0
- package/dist/models/content/Workspace.js +237 -0
- package/dist/models/content/index.d.ts +36 -0
- package/dist/models/content/index.js +53 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.js +21 -0
- package/dist/models/legacy/LegacyBodyFormat.d.ts +9 -0
- package/dist/models/legacy/LegacyBodyFormat.js +2 -0
- package/dist/models/legacy/LegacyComment.d.ts +12 -0
- package/dist/models/legacy/LegacyComment.js +2 -0
- package/dist/models/legacy/LegacyContent.d.ts +53 -0
- package/dist/models/legacy/LegacyContent.js +55 -0
- package/dist/models/legacy/LegacyConversion.d.ts +55 -0
- package/dist/models/legacy/LegacyConversion.js +401 -0
- package/dist/models/legacy/LegacyFragment.d.ts +21 -0
- package/dist/models/legacy/LegacyFragment.js +2 -0
- package/dist/models/legacy/LegacyLocator.d.ts +8 -0
- package/dist/models/legacy/LegacyLocator.js +31 -0
- package/dist/models/legacy/LegacyOutboundMessage.d.ts +16 -0
- package/dist/models/legacy/LegacyOutboundMessage.js +13 -0
- package/dist/models/legacy/LegacyPicture.d.ts +14 -0
- package/dist/models/legacy/LegacyPicture.js +2 -0
- package/dist/models/legacy/LegacyProfile.d.ts +9 -0
- package/dist/models/legacy/LegacyProfile.js +2 -0
- package/dist/models/legacy/LegacySession.d.ts +41 -0
- package/dist/models/legacy/LegacySession.js +35 -0
- package/dist/models/legacy/LegacyStory.d.ts +23 -0
- package/dist/models/legacy/LegacyStory.js +2 -0
- package/dist/models/legacy/LegacyStub.d.ts +15 -0
- package/dist/models/legacy/LegacyStub.js +2 -0
- package/dist/models/legacy/LegacyTransaction.d.ts +14 -0
- package/dist/models/legacy/LegacyTransaction.js +49 -0
- package/dist/models/legacy/LegacyUser.d.ts +28 -0
- package/dist/models/legacy/LegacyUser.js +32 -0
- package/dist/models/legacy/LegacyWorkspace.d.ts +23 -0
- package/dist/models/legacy/LegacyWorkspace.js +6 -0
- package/dist/models/legacy/index.d.ts +15 -0
- package/dist/models/legacy/index.js +32 -0
- package/dist/models/markup/BodyFormat.d.ts +14 -0
- package/dist/models/markup/BodyFormat.js +190 -0
- package/dist/models/markup/ChangeModel.d.ts +22 -0
- package/dist/models/markup/ChangeModel.js +107 -0
- package/dist/models/markup/DeltaOps.d.ts +5 -0
- package/dist/models/markup/DeltaOps.js +74 -0
- package/dist/models/markup/HtmlMarkup.d.ts +4 -0
- package/dist/models/markup/HtmlMarkup.js +21 -0
- package/dist/models/markup/Operation.d.ts +32 -0
- package/dist/models/markup/Operation.js +194 -0
- package/dist/models/markup/TextEditOps.d.ts +9 -0
- package/dist/models/markup/TextEditOps.js +50 -0
- package/dist/models/markup/index.d.ts +6 -0
- package/dist/models/markup/index.js +23 -0
- package/dist/repo/ConnectionListener.d.ts +9 -0
- package/dist/repo/ConnectionListener.js +21 -0
- package/dist/repo/PermissiveJson1.d.ts +58 -0
- package/dist/repo/PermissiveJson1.js +39 -0
- package/dist/repo/ShareSync.d.ts +60 -0
- package/dist/repo/ShareSync.js +348 -0
- package/dist/repo/index.d.ts +3 -0
- package/dist/repo/index.js +20 -0
- package/dist/util/Async.d.ts +8 -0
- package/dist/util/Async.js +18 -0
- package/dist/util/Base62.d.ts +6 -0
- package/dist/util/Base62.js +47 -0
- package/dist/util/BinarySearch.d.ts +7 -0
- package/dist/util/BinarySearch.js +46 -0
- package/dist/util/CachingHasher.d.ts +8 -0
- package/dist/util/CachingHasher.js +41 -0
- package/dist/util/Color.d.ts +32 -0
- package/dist/util/Color.js +204 -0
- package/dist/util/Dispatch.d.ts +15 -0
- package/dist/util/Dispatch.js +79 -0
- package/dist/util/EditDistance.d.ts +13 -0
- package/dist/util/EditDistance.js +184 -0
- package/dist/util/Encryption.d.ts +5 -0
- package/dist/util/Encryption.js +2 -0
- package/dist/util/Logging.d.ts +108 -0
- package/dist/util/Logging.js +412 -0
- package/dist/util/NumberFormat.d.ts +14 -0
- package/dist/util/NumberFormat.js +224 -0
- package/dist/util/Struct.d.ts +4 -0
- package/dist/util/Struct.js +15 -0
- package/dist/util/Template.d.ts +16 -0
- package/dist/util/Template.js +128 -0
- package/dist/util/Text.d.ts +45 -0
- package/dist/util/Text.js +243 -0
- package/dist/util/Tuples.d.ts +9 -0
- package/dist/util/Tuples.js +135 -0
- package/dist/util/Validate.d.ts +4 -0
- package/dist/util/Validate.js +11 -0
- package/dist/util/Vocabulary.d.ts +3 -0
- package/dist/util/Vocabulary.js +35 -0
- package/dist/util/index.d.ts +16 -0
- package/dist/util/index.js +33 -0
- package/lib/models/content/ArrayView.ts +203 -0
- package/lib/models/content/Billing.ts +558 -0
- package/lib/models/content/Content.ts +110 -0
- package/lib/models/content/ContentKind.ts +14 -0
- package/lib/models/content/DevEnv.ts +5 -0
- package/lib/models/content/Device.ts +86 -0
- package/lib/models/content/DictionaryEntry.ts +22 -0
- package/lib/models/content/GeoLocation.ts +4 -0
- package/lib/models/content/Hanzi.ts +25 -0
- package/lib/models/content/Manifest.ts +162 -0
- package/lib/models/content/Media.ts +126 -0
- package/lib/models/content/Model.ts +327 -0
- package/lib/models/content/Permissions.ts +21 -0
- package/lib/models/content/Phrase.ts +10 -0
- package/lib/models/content/Profile.ts +119 -0
- package/lib/models/content/Time.ts +328 -0
- package/lib/models/content/User.ts +130 -0
- package/lib/models/markup/ChangeModel.ts +95 -0
- package/lib/models/markup/DeltaOps.ts +71 -0
- package/lib/models/markup/Operation.ts +215 -0
- package/lib/models/markup/TextEditOps.ts +50 -0
- package/lib/repo/ConnectionListener.ts +25 -0
- package/lib/repo/PermissiveJson1.ts +14 -0
- package/lib/repo/ShareSync.ts +390 -0
- package/lib/util/Base62.ts +47 -0
- package/lib/util/CachingHasher.ts +38 -0
- package/lib/util/Dispatch.ts +92 -0
- package/lib/util/Encryption.ts +5 -0
- package/lib/util/Logging.ts +568 -0
- package/lib/util/NumberFormat.ts +194 -0
- package/lib/util/Struct.ts +14 -0
- package/lib/util/Tuples.ts +131 -0
- package/package.json +41 -0
- package/tsconfig.json +25 -0
- package/tslint.json +46 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Manifest = void 0;
|
|
4
|
+
const ShareSync_1 = require("../../repo/ShareSync");
|
|
5
|
+
const CachingHasher_1 = require("../../util/CachingHasher");
|
|
6
|
+
const Operation_1 = require("../markup/Operation");
|
|
7
|
+
const ContentKind_1 = require("./ContentKind");
|
|
8
|
+
const Model_1 = require("./Model");
|
|
9
|
+
const Time_1 = require("./Time");
|
|
10
|
+
class Manifest extends Model_1.Model {
|
|
11
|
+
constructor(doc, shouldAcquire, shareSync) {
|
|
12
|
+
super(doc, shouldAcquire, shareSync);
|
|
13
|
+
}
|
|
14
|
+
static makeManifestId(userId) {
|
|
15
|
+
return CachingHasher_1.CachingHasher.makeMd5ContentId(userId + "-" + ContentKind_1.ContentKind.MANIFEST);
|
|
16
|
+
}
|
|
17
|
+
static create(userId) {
|
|
18
|
+
const now = Time_1.Time.utc();
|
|
19
|
+
const manifestId = Manifest.makeManifestId(userId);
|
|
20
|
+
return ShareSync_1.ShareSyncFactory.get().createManifest({
|
|
21
|
+
meta: {
|
|
22
|
+
kind: ContentKind_1.ContentKind.MANIFEST,
|
|
23
|
+
ref: manifestId,
|
|
24
|
+
updated_at: {
|
|
25
|
+
utc_time: now
|
|
26
|
+
},
|
|
27
|
+
owner: userId
|
|
28
|
+
},
|
|
29
|
+
payload: {
|
|
30
|
+
device: {},
|
|
31
|
+
media: {},
|
|
32
|
+
profile: {},
|
|
33
|
+
user: {}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
get meta() {
|
|
38
|
+
this.checkDisposed("Manifest.meta");
|
|
39
|
+
return this.doc.data.meta;
|
|
40
|
+
}
|
|
41
|
+
get owner() {
|
|
42
|
+
this.checkDisposed("Manifest.userId");
|
|
43
|
+
return this.doc.data.meta.owner;
|
|
44
|
+
}
|
|
45
|
+
canUserView(userId) {
|
|
46
|
+
this.checkDisposed("Manifest.canUserView");
|
|
47
|
+
return this.doc.data.meta.owner === userId;
|
|
48
|
+
}
|
|
49
|
+
doesContentExist(kind, ref) {
|
|
50
|
+
this.checkDisposed("Manifest.doesContentExist");
|
|
51
|
+
return this.doc.data &&
|
|
52
|
+
this.doc.data.payload &&
|
|
53
|
+
this.doc.data.payload[kind] &&
|
|
54
|
+
this.doc.data.payload[kind][ref];
|
|
55
|
+
}
|
|
56
|
+
getUtcTimeOf(kind, ref) {
|
|
57
|
+
this.checkDisposed("Manifest.getTimestampOf");
|
|
58
|
+
if (this.doesContentExist(kind, ref)) {
|
|
59
|
+
return this.doc.data.payload[kind][ref];
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
getAllEntries() {
|
|
64
|
+
return this.getAllEntriesWhere(() => true);
|
|
65
|
+
}
|
|
66
|
+
getAllEntriesWhere(predicate) {
|
|
67
|
+
const entries = [];
|
|
68
|
+
if (this.exists() && this.doc.data.payload) {
|
|
69
|
+
Manifest.forEachEntry(this.doc.data, (entry) => {
|
|
70
|
+
if (!predicate || predicate(entry)) {
|
|
71
|
+
entries.push(entry);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return entries;
|
|
76
|
+
}
|
|
77
|
+
update(content) {
|
|
78
|
+
this.checkDisposed("Manifest.update");
|
|
79
|
+
content.acquire().then(() => {
|
|
80
|
+
const kind = content.kind;
|
|
81
|
+
const contentRef = content.ref;
|
|
82
|
+
const timestamp = content.updatedAt.utc_time;
|
|
83
|
+
const batch = new Operation_1.BatchOperation(this, content.meta.updated_at);
|
|
84
|
+
// Update the embedded timestamp of this content item
|
|
85
|
+
batch.setPathValue(['payload', kind, contentRef], timestamp);
|
|
86
|
+
batch.commit();
|
|
87
|
+
content.release();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
static forEachEntry(body, callback) {
|
|
91
|
+
const kinds = Object.keys(body.payload);
|
|
92
|
+
for (let i = 0; i < kinds.length; i++) {
|
|
93
|
+
const kind = kinds[i];
|
|
94
|
+
const manifestPayload = body.payload[kind];
|
|
95
|
+
const refs = Object.keys(manifestPayload);
|
|
96
|
+
for (let j = 0; j < refs.length; j++) {
|
|
97
|
+
const ref = refs[j];
|
|
98
|
+
const timestamp = manifestPayload[ref];
|
|
99
|
+
if (ref && timestamp) {
|
|
100
|
+
const entry = {
|
|
101
|
+
kind: kind,
|
|
102
|
+
ref: ref,
|
|
103
|
+
at_utc_time: timestamp
|
|
104
|
+
};
|
|
105
|
+
callback(entry);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
console.error(`manifest with missing ref or timestamp: ${JSON.stringify(body)}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.Manifest = Manifest;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/// <reference path="../../../decs.d.ts" />
|
|
2
|
+
import { Doc } from '@shaxpir/sharedb/lib/client';
|
|
3
|
+
import { ShareSync } from '../../repo/ShareSync';
|
|
4
|
+
import { Content, ContentBody, ContentId, ContentMeta } from './Content';
|
|
5
|
+
export interface MediaDimensions {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
}
|
|
9
|
+
export interface MediaCropping extends MediaDimensions {
|
|
10
|
+
offset_top: number;
|
|
11
|
+
offset_left: number;
|
|
12
|
+
}
|
|
13
|
+
export interface MediaPayload extends MediaDimensions {
|
|
14
|
+
extension: string;
|
|
15
|
+
bytes: number;
|
|
16
|
+
}
|
|
17
|
+
export interface MediaBody extends ContentBody {
|
|
18
|
+
meta: ContentMeta;
|
|
19
|
+
payload: MediaPayload;
|
|
20
|
+
}
|
|
21
|
+
export declare class Media extends Content {
|
|
22
|
+
constructor(doc: Doc, shouldAcquire: boolean, shareSync: ShareSync);
|
|
23
|
+
get payload(): MediaPayload;
|
|
24
|
+
static create(userId: ContentId, mediaId: ContentId, payload: MediaPayload): Media;
|
|
25
|
+
get bytes(): number;
|
|
26
|
+
get width(): number;
|
|
27
|
+
get height(): number;
|
|
28
|
+
get extension(): string;
|
|
29
|
+
get mediaType(): string;
|
|
30
|
+
scaleToFit(boxSize: number, cropping: MediaCropping): MediaCropping;
|
|
31
|
+
static makeDefaultCropping(media: Media): MediaCropping;
|
|
32
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Media = void 0;
|
|
4
|
+
const ShareSync_1 = require("../../repo/ShareSync");
|
|
5
|
+
const Content_1 = require("./Content");
|
|
6
|
+
const ContentKind_1 = require("./ContentKind");
|
|
7
|
+
const Time_1 = require("./Time");
|
|
8
|
+
class Media extends Content_1.Content {
|
|
9
|
+
constructor(doc, shouldAcquire, shareSync) {
|
|
10
|
+
super(doc, shouldAcquire, shareSync);
|
|
11
|
+
}
|
|
12
|
+
get payload() {
|
|
13
|
+
this.checkDisposed("Media.payload");
|
|
14
|
+
return this.doc.data.payload;
|
|
15
|
+
}
|
|
16
|
+
static create(userId, mediaId, payload) {
|
|
17
|
+
const now = Time_1.MultiClock.now();
|
|
18
|
+
return ShareSync_1.ShareSyncFactory.get().createContent({
|
|
19
|
+
meta: {
|
|
20
|
+
ref: mediaId,
|
|
21
|
+
is_head: true,
|
|
22
|
+
kind: ContentKind_1.ContentKind.MEDIA,
|
|
23
|
+
id: mediaId,
|
|
24
|
+
owner: userId,
|
|
25
|
+
created_at: now,
|
|
26
|
+
updated_at: now
|
|
27
|
+
},
|
|
28
|
+
payload: payload
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
get bytes() {
|
|
32
|
+
this.checkDisposed("Media.bytes");
|
|
33
|
+
return this.payload.bytes;
|
|
34
|
+
}
|
|
35
|
+
get width() {
|
|
36
|
+
this.checkDisposed("Media.width");
|
|
37
|
+
return this.payload.width;
|
|
38
|
+
}
|
|
39
|
+
get height() {
|
|
40
|
+
this.checkDisposed("Media.height");
|
|
41
|
+
return this.payload.height;
|
|
42
|
+
}
|
|
43
|
+
get extension() {
|
|
44
|
+
this.checkDisposed("Media.extension");
|
|
45
|
+
return this.payload.extension;
|
|
46
|
+
}
|
|
47
|
+
get mediaType() {
|
|
48
|
+
this.checkDisposed("Media.mediaType");
|
|
49
|
+
const extension = this.extension;
|
|
50
|
+
if (extension === "jpg" || extension === "jpeg") {
|
|
51
|
+
return "image/jpeg";
|
|
52
|
+
}
|
|
53
|
+
else if (extension === "png") {
|
|
54
|
+
return "image/png";
|
|
55
|
+
}
|
|
56
|
+
else if (extension === "gif") {
|
|
57
|
+
return "image/gif";
|
|
58
|
+
}
|
|
59
|
+
else if (extension === "svg") {
|
|
60
|
+
return "image/svg+xml";
|
|
61
|
+
}
|
|
62
|
+
else if (extension === "bmp") {
|
|
63
|
+
return "image/bmp";
|
|
64
|
+
}
|
|
65
|
+
return "image/" + extension;
|
|
66
|
+
}
|
|
67
|
+
scaleToFit(boxSize, cropping) {
|
|
68
|
+
this.checkDisposed("Media.scaleToFit");
|
|
69
|
+
const zoom = boxSize / cropping.width;
|
|
70
|
+
const scaledWidth = Math.floor(this.width * zoom);
|
|
71
|
+
const scaledHeight = Math.floor(this.height * zoom);
|
|
72
|
+
const offsetLeft = -Math.floor(cropping.offset_left * zoom);
|
|
73
|
+
const offsetTop = -Math.floor(cropping.offset_top * zoom);
|
|
74
|
+
return {
|
|
75
|
+
"offset_top": offsetTop,
|
|
76
|
+
"offset_left": offsetLeft,
|
|
77
|
+
"width": scaledWidth,
|
|
78
|
+
"height": scaledHeight
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
static makeDefaultCropping(media) {
|
|
82
|
+
const width = media.width;
|
|
83
|
+
const height = media.height;
|
|
84
|
+
const isLandscapeOrSquare = width >= height;
|
|
85
|
+
const isPortraitOrSquare = height >= width;
|
|
86
|
+
const croppingOffsetTop = isLandscapeOrSquare ? 0 : Math.floor((height - width) / 2);
|
|
87
|
+
const croppingOffsetLeft = isPortraitOrSquare ? 0 : Math.floor((width - height) / 2);
|
|
88
|
+
const croppingWidth = isLandscapeOrSquare ? height : width;
|
|
89
|
+
const croppingHeight = isPortraitOrSquare ? width : height;
|
|
90
|
+
return {
|
|
91
|
+
offset_top: croppingOffsetTop,
|
|
92
|
+
offset_left: croppingOffsetLeft,
|
|
93
|
+
width: croppingWidth,
|
|
94
|
+
height: croppingHeight
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.Media = Media;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/// <reference path="../../../decs.d.ts" />
|
|
2
|
+
import { Doc } from '@shaxpir/sharedb/lib/client';
|
|
3
|
+
import { ShareSync } from "../../repo/ShareSync";
|
|
4
|
+
import { Content, ContentBody, ContentId, ContentMeta } from "./Content";
|
|
5
|
+
import { CompactDate } from "./Time";
|
|
6
|
+
export declare enum MetricName {
|
|
7
|
+
WORD_COUNT = "word_count",
|
|
8
|
+
MINUTES_WRITING = "minutes_writing"
|
|
9
|
+
}
|
|
10
|
+
export interface MetricEntry {
|
|
11
|
+
date: CompactDate;
|
|
12
|
+
amount: number;
|
|
13
|
+
}
|
|
14
|
+
export interface MetricPayload {
|
|
15
|
+
metric_name: string;
|
|
16
|
+
min_date: CompactDate;
|
|
17
|
+
max_date: CompactDate;
|
|
18
|
+
entries: {
|
|
19
|
+
[key: string]: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface MetricBody extends ContentBody {
|
|
23
|
+
meta: ContentMeta;
|
|
24
|
+
payload: MetricPayload;
|
|
25
|
+
}
|
|
26
|
+
export declare class Metric extends Content {
|
|
27
|
+
static makeMetricId(userId: ContentId, metricName: MetricName): ContentId;
|
|
28
|
+
static create(userId: ContentId, metricName: MetricName, entries: {
|
|
29
|
+
[key: string]: number;
|
|
30
|
+
}): Metric;
|
|
31
|
+
constructor(doc: Doc, shouldAcquire: boolean, shareSync: ShareSync);
|
|
32
|
+
get payload(): MetricPayload;
|
|
33
|
+
get metricName(): string;
|
|
34
|
+
get minDate(): CompactDate;
|
|
35
|
+
get maxDate(): CompactDate;
|
|
36
|
+
get length(): number;
|
|
37
|
+
get(index: number): MetricEntry;
|
|
38
|
+
sumBetween(minDate: CompactDate, maxDate: CompactDate): number;
|
|
39
|
+
forDate(date: CompactDate): number;
|
|
40
|
+
nonZeroDayCount(): number;
|
|
41
|
+
setDateAmount(date: CompactDate, amount: number): void;
|
|
42
|
+
incrementDateAmounts(dateAmounts: {
|
|
43
|
+
[key: string]: number;
|
|
44
|
+
}): void;
|
|
45
|
+
static forEachEntry(body: MetricBody, callback: (entry: MetricEntry) => void): void;
|
|
46
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Metric = exports.MetricName = void 0;
|
|
7
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
8
|
+
const utc_1 = __importDefault(require("dayjs/plugin/utc"));
|
|
9
|
+
dayjs_1.default.extend(utc_1.default);
|
|
10
|
+
const ShareSync_1 = require("../../repo/ShareSync");
|
|
11
|
+
const CachingHasher_1 = require("../../util/CachingHasher");
|
|
12
|
+
const Operation_1 = require("../markup/Operation");
|
|
13
|
+
const Content_1 = require("./Content");
|
|
14
|
+
const ContentKind_1 = require("./ContentKind");
|
|
15
|
+
const Time_1 = require("./Time");
|
|
16
|
+
var MetricName;
|
|
17
|
+
(function (MetricName) {
|
|
18
|
+
MetricName["WORD_COUNT"] = "word_count";
|
|
19
|
+
MetricName["MINUTES_WRITING"] = "minutes_writing";
|
|
20
|
+
})(MetricName || (exports.MetricName = MetricName = {}));
|
|
21
|
+
class Metric extends Content_1.Content {
|
|
22
|
+
static makeMetricId(userId, metricName) {
|
|
23
|
+
return CachingHasher_1.CachingHasher.makeMd5ContentId(userId + "-metric-" + metricName);
|
|
24
|
+
}
|
|
25
|
+
static create(userId, metricName, entries) {
|
|
26
|
+
const metricId = Metric.makeMetricId(userId, metricName);
|
|
27
|
+
// Find the min and max dates
|
|
28
|
+
let minDate = null;
|
|
29
|
+
let maxDate = null;
|
|
30
|
+
for (let d of Object.keys(entries)) {
|
|
31
|
+
const date = d;
|
|
32
|
+
if (minDate === null || Time_1.Time.compareDate(date, minDate) < 0) {
|
|
33
|
+
minDate = date;
|
|
34
|
+
}
|
|
35
|
+
if (maxDate === null || Time_1.Time.compareDate(date, maxDate) > 0) {
|
|
36
|
+
maxDate = date;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const now = Time_1.MultiClock.now();
|
|
40
|
+
return ShareSync_1.ShareSyncFactory.get().createContent({
|
|
41
|
+
meta: {
|
|
42
|
+
ref: metricId,
|
|
43
|
+
is_head: true,
|
|
44
|
+
kind: ContentKind_1.ContentKind.METRIC,
|
|
45
|
+
id: metricId,
|
|
46
|
+
owner: userId,
|
|
47
|
+
created_at: now,
|
|
48
|
+
updated_at: now
|
|
49
|
+
},
|
|
50
|
+
payload: {
|
|
51
|
+
metric_name: metricName,
|
|
52
|
+
min_date: minDate,
|
|
53
|
+
max_date: maxDate,
|
|
54
|
+
entries: entries
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
constructor(doc, shouldAcquire, shareSync) {
|
|
59
|
+
super(doc, shouldAcquire, shareSync);
|
|
60
|
+
}
|
|
61
|
+
get payload() {
|
|
62
|
+
this.checkDisposed("Metric.payload");
|
|
63
|
+
return this.doc.data.payload;
|
|
64
|
+
}
|
|
65
|
+
get metricName() {
|
|
66
|
+
this.checkDisposed("Metric.name");
|
|
67
|
+
return this.payload.metric_name;
|
|
68
|
+
}
|
|
69
|
+
get minDate() {
|
|
70
|
+
this.checkDisposed("Metric.minDate");
|
|
71
|
+
return this.payload.min_date;
|
|
72
|
+
}
|
|
73
|
+
get maxDate() {
|
|
74
|
+
this.checkDisposed("Metric.maxDate");
|
|
75
|
+
return this.payload.max_date;
|
|
76
|
+
}
|
|
77
|
+
get length() {
|
|
78
|
+
this.checkDisposed("Metric.length");
|
|
79
|
+
const minMoment = dayjs_1.default.utc(this.minDate, Time_1.Time.DATE_FORMAT);
|
|
80
|
+
const maxMoment = dayjs_1.default.utc(this.maxDate, Time_1.Time.DATE_FORMAT);
|
|
81
|
+
return Math.abs(maxMoment.diff(minMoment, "days")) + 1;
|
|
82
|
+
}
|
|
83
|
+
get(index) {
|
|
84
|
+
this.checkDisposed("Metric.get");
|
|
85
|
+
if (index === 0) {
|
|
86
|
+
return {
|
|
87
|
+
date: this.minDate,
|
|
88
|
+
amount: this.forDate(this.minDate)
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const minMoment = dayjs_1.default.utc(this.minDate, Time_1.Time.DATE_FORMAT);
|
|
93
|
+
const offsetDate = minMoment.add(index, 'days').format(Time_1.Time.DATE_FORMAT);
|
|
94
|
+
return {
|
|
95
|
+
date: offsetDate,
|
|
96
|
+
amount: this.forDate(offsetDate)
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
sumBetween(minDate, maxDate) {
|
|
101
|
+
this.checkDisposed("Metric.sumBetween");
|
|
102
|
+
let sum = 0;
|
|
103
|
+
const dates = Time_1.Time.datesBetween(minDate, maxDate);
|
|
104
|
+
for (let i = 0, len = dates.length; i < len; i++) {
|
|
105
|
+
const date = dates[i];
|
|
106
|
+
sum += this.forDate(date);
|
|
107
|
+
}
|
|
108
|
+
return sum;
|
|
109
|
+
}
|
|
110
|
+
forDate(date) {
|
|
111
|
+
this.checkDisposed("Metric.forDate");
|
|
112
|
+
const map = this.payload.entries;
|
|
113
|
+
if (map.hasOwnProperty(date)) {
|
|
114
|
+
return map[date];
|
|
115
|
+
}
|
|
116
|
+
return 0.0;
|
|
117
|
+
}
|
|
118
|
+
nonZeroDayCount() {
|
|
119
|
+
this.checkDisposed("Metric.nonZeroDayCount");
|
|
120
|
+
let count = 0;
|
|
121
|
+
const map = this.payload.entries;
|
|
122
|
+
for (let date of Object.keys(map)) {
|
|
123
|
+
if (map[date] !== 0.0) {
|
|
124
|
+
count++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return count;
|
|
128
|
+
}
|
|
129
|
+
setDateAmount(date, amount) {
|
|
130
|
+
this.checkDisposed("Metric.setDateAmount");
|
|
131
|
+
const prevMinDate = this.payload.min_date;
|
|
132
|
+
const prevMaxDate = this.payload.max_date;
|
|
133
|
+
const batch = new Operation_1.BatchOperation(this);
|
|
134
|
+
batch.setPathValue(['payload', 'entries', date], amount);
|
|
135
|
+
if (prevMinDate === null || Time_1.Time.compareDate(date, prevMinDate) < 0) {
|
|
136
|
+
batch.setPathValue(['payload', 'min_date'], date);
|
|
137
|
+
}
|
|
138
|
+
if (prevMaxDate === null || Time_1.Time.compareDate(date, prevMaxDate) > 0) {
|
|
139
|
+
batch.setPathValue(['payload', 'max_date'], date);
|
|
140
|
+
}
|
|
141
|
+
batch.commit();
|
|
142
|
+
}
|
|
143
|
+
incrementDateAmounts(dateAmounts) {
|
|
144
|
+
this.checkDisposed("Metric.incrementDateAmounts");
|
|
145
|
+
const prevMinDate = this.payload.min_date;
|
|
146
|
+
const prevMaxDate = this.payload.max_date;
|
|
147
|
+
let minDate = prevMinDate;
|
|
148
|
+
let maxDate = prevMaxDate;
|
|
149
|
+
const batch = new Operation_1.BatchOperation(this);
|
|
150
|
+
const dates = Object.keys(dateAmounts);
|
|
151
|
+
for (let i = 0; i < dates.length; i++) {
|
|
152
|
+
const date = dates[i];
|
|
153
|
+
const prevAmount = this.forDate(date);
|
|
154
|
+
const newAmount = dateAmounts[date];
|
|
155
|
+
batch.setPathValue(['payload', 'entries', date], prevAmount + newAmount);
|
|
156
|
+
if (minDate === null || Time_1.Time.compareDate(date, minDate) < 0) {
|
|
157
|
+
minDate = date;
|
|
158
|
+
}
|
|
159
|
+
if (maxDate === null || Time_1.Time.compareDate(date, maxDate) > 0) {
|
|
160
|
+
maxDate = date;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (minDate != prevMinDate) {
|
|
164
|
+
batch.setPathValue(['payload', 'min_date'], minDate);
|
|
165
|
+
}
|
|
166
|
+
if (maxDate != prevMaxDate) {
|
|
167
|
+
batch.setPathValue(['payload', 'max_date'], maxDate);
|
|
168
|
+
}
|
|
169
|
+
batch.commit();
|
|
170
|
+
}
|
|
171
|
+
static forEachEntry(body, callback) {
|
|
172
|
+
const dates = Object.keys(body.payload.entries);
|
|
173
|
+
for (let i = 0; i < dates.length; i++) {
|
|
174
|
+
const date = dates[i];
|
|
175
|
+
const amount = body.payload.entries[date];
|
|
176
|
+
callback({
|
|
177
|
+
date: date,
|
|
178
|
+
amount: amount
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.Metric = Metric;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/// <reference path="../../../decs.d.ts" />
|
|
2
|
+
import { Doc } from '@shaxpir/sharedb/lib/client';
|
|
3
|
+
import { ShareSync } from '../../repo/ShareSync';
|
|
4
|
+
import { LegacyContentKind, LegacyLocator } from '../legacy';
|
|
5
|
+
import { Content, ContentId, ContentMeta, ContentRef } from "./Content";
|
|
6
|
+
import { ContentKind } from './ContentKind';
|
|
7
|
+
import { MultiTime } from './Time';
|
|
8
|
+
export declare enum MigrationStatus {
|
|
9
|
+
MIGRATED = "MIGRATED",
|
|
10
|
+
CANT_MIGRATE = "CANT_MIGRATE",
|
|
11
|
+
REPAIRED = "REPAIRED",
|
|
12
|
+
CANT_REPAIR = "CANT_REPAIR",
|
|
13
|
+
SKIPPED = "SKIPPED",
|
|
14
|
+
UPDATED = "UPDATED"
|
|
15
|
+
}
|
|
16
|
+
export interface MigrationBody {
|
|
17
|
+
meta: ContentMeta;
|
|
18
|
+
payload: MigrationPayload;
|
|
19
|
+
}
|
|
20
|
+
export interface MigrationEntry {
|
|
21
|
+
at: MultiTime;
|
|
22
|
+
status: string;
|
|
23
|
+
message?: string;
|
|
24
|
+
models: MigrationModel[];
|
|
25
|
+
}
|
|
26
|
+
export interface MigrationModel {
|
|
27
|
+
legacy_kind?: LegacyContentKind;
|
|
28
|
+
legacy_locator?: LegacyLocator;
|
|
29
|
+
modern_kind?: ContentKind;
|
|
30
|
+
modern_id?: ContentId;
|
|
31
|
+
modern_ref?: ContentRef;
|
|
32
|
+
}
|
|
33
|
+
export interface MigrationPayload {
|
|
34
|
+
start: MultiTime;
|
|
35
|
+
end: MultiTime;
|
|
36
|
+
duration_minutes: number;
|
|
37
|
+
is_primary: boolean;
|
|
38
|
+
is_complete: boolean;
|
|
39
|
+
device_id: string;
|
|
40
|
+
legacy_snapshot_count: number;
|
|
41
|
+
repaired_count: number;
|
|
42
|
+
cant_repair_count: number;
|
|
43
|
+
migrated_count: number;
|
|
44
|
+
cant_migrate_count: number;
|
|
45
|
+
updated_count: number;
|
|
46
|
+
skipped_count: number;
|
|
47
|
+
migration_entries: MigrationEntry[];
|
|
48
|
+
}
|
|
49
|
+
export declare class Migration extends Content {
|
|
50
|
+
constructor(doc: Doc, shouldAcquire: boolean, shareSync: ShareSync);
|
|
51
|
+
static makeMigrationId(userId: ContentId): ContentId;
|
|
52
|
+
static create(userId: ContentId, isPrimary: boolean, deviceId: ContentId): Migration;
|
|
53
|
+
get payload(): MigrationPayload;
|
|
54
|
+
get durationMinutes(): number;
|
|
55
|
+
get isPrimary(): boolean;
|
|
56
|
+
get isComplete(): boolean;
|
|
57
|
+
setIsComplete(value: boolean): void;
|
|
58
|
+
get legacySnapshotCount(): number;
|
|
59
|
+
setLegacySnapshotCount(value: number): void;
|
|
60
|
+
get repairedCount(): number;
|
|
61
|
+
get cantRepairCount(): number;
|
|
62
|
+
get migratedCount(): number;
|
|
63
|
+
get cantMigrateCount(): number;
|
|
64
|
+
get updatedCount(): number;
|
|
65
|
+
get skippedCount(): number;
|
|
66
|
+
addMigrationEntry(entry: MigrationEntry): void;
|
|
67
|
+
private touch;
|
|
68
|
+
}
|