cozy-client 27.5.1 → 27.6.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/CHANGELOG.md +11 -0
- package/dist/CozyClient.js +1 -1
- package/dist/models/file.js +49 -2
- package/dist/models/file.spec.js +107 -70
- package/package.json +2 -2
- package/types/models/file.d.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [27.6.0](https://github.com/cozy/cozy-client/compare/v27.5.1...v27.6.0) (2021-12-13)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* Add some helpers for model file ([e074067](https://github.com/cozy/cozy-client/commit/e0740674bb250b979fc3a6bfeace771de3d3c2fd))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [27.5.1](https://github.com/cozy/cozy-client/compare/v27.5.0...v27.5.1) (2021-12-01)
|
|
7
18
|
|
|
8
19
|
|
package/dist/CozyClient.js
CHANGED
|
@@ -2452,7 +2452,7 @@ var CozyClient = /*#__PURE__*/function () {
|
|
|
2452
2452
|
CozyClient.hooks = CozyClient.hooks || {};
|
|
2453
2453
|
CozyClient.fetchPolicies = _policies.default; //COZY_CLIENT_VERSION_PACKAGE in replaced by babel. See babel config
|
|
2454
2454
|
|
|
2455
|
-
CozyClient.version = "27.
|
|
2455
|
+
CozyClient.version = "27.6.0";
|
|
2456
2456
|
|
|
2457
2457
|
_microee.default.mixin(CozyClient);
|
|
2458
2458
|
|
package/dist/models/file.js
CHANGED
|
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.normalize = normalize;
|
|
9
9
|
exports.ensureFilePath = ensureFilePath;
|
|
10
10
|
exports.getParentFolderId = getParentFolderId;
|
|
11
|
-
exports.doMobileUpload = exports.readMobileFile = exports.uploadFileWithConflictStrategy = exports.generateFileNameForRevision = exports.generateNewFileNameOnConflict = exports.overrideFileForPath = exports.move = exports.getFullpath = exports.hasMetadataAttribute = exports.isReferencedByAlbum = exports.fetchFilesByQualificationRules = exports.saveFileQualification = exports.isSharingShorcutNew = exports.isSharingShortcutNew = exports.isSharingShorcut = exports.isSharingShortcut = exports.getSharingShortcutTargetDoctype = exports.getSharingShortcutTargetMime = exports.getSharingShortcutStatus = exports.isShortcut = exports.shouldBeOpenedByOnlyOffice = exports.isOnlyOfficeFile = exports.isNote = exports.isDirectory = exports.isFile = exports.splitFilename = exports.ALBUMS_DOCTYPE = void 0;
|
|
11
|
+
exports.isFromKonnector = exports.hasCertifications = exports.hasQualifications = exports.isPlainText = exports.doMobileUpload = exports.readMobileFile = exports.uploadFileWithConflictStrategy = exports.generateFileNameForRevision = exports.generateNewFileNameOnConflict = exports.overrideFileForPath = exports.move = exports.getFullpath = exports.hasMetadataAttribute = exports.isReferencedByAlbum = exports.fetchFilesByQualificationRules = exports.saveFileQualification = exports.isSharingShorcutNew = exports.isSharingShortcutNew = exports.isSharingShorcut = exports.isSharingShortcut = exports.getSharingShortcutTargetDoctype = exports.getSharingShortcutTargetMime = exports.getSharingShortcutStatus = exports.isShortcut = exports.shouldBeOpenedByOnlyOffice = exports.isOnlyOfficeFile = exports.isNote = exports.isDirectory = exports.isFile = exports.splitFilename = exports.ALBUMS_DOCTYPE = void 0;
|
|
12
12
|
|
|
13
13
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
14
14
|
|
|
@@ -976,5 +976,52 @@ var doMobileUpload = /*#__PURE__*/function () {
|
|
|
976
976
|
return _ref12.apply(this, arguments);
|
|
977
977
|
};
|
|
978
978
|
}();
|
|
979
|
+
/**
|
|
980
|
+
* @param {string} [mimeType=''] - Mime type of file
|
|
981
|
+
* @param {string} [fileName=''] - Name of file
|
|
982
|
+
* @returns {boolean}
|
|
983
|
+
*/
|
|
984
|
+
|
|
985
|
+
|
|
986
|
+
exports.doMobileUpload = doMobileUpload;
|
|
987
|
+
|
|
988
|
+
var isPlainText = function isPlainText() {
|
|
989
|
+
var mimeType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
990
|
+
var fileName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
991
|
+
return mimeType ? /^text\//.test(mimeType) : /\.(txt|md)$/.test(fileName);
|
|
992
|
+
};
|
|
993
|
+
/**
|
|
994
|
+
* @param {IOCozyFile} file - io.cozy.files document
|
|
995
|
+
* @returns {boolean}
|
|
996
|
+
*/
|
|
997
|
+
|
|
998
|
+
|
|
999
|
+
exports.isPlainText = isPlainText;
|
|
1000
|
+
|
|
1001
|
+
var hasQualifications = function hasQualifications(file) {
|
|
1002
|
+
return (0, _has.default)(file, 'metadata.qualification');
|
|
1003
|
+
};
|
|
1004
|
+
/**
|
|
1005
|
+
* @param {IOCozyFile} file - io.cozy.files document
|
|
1006
|
+
* @returns {boolean}
|
|
1007
|
+
*/
|
|
1008
|
+
|
|
1009
|
+
|
|
1010
|
+
exports.hasQualifications = hasQualifications;
|
|
1011
|
+
|
|
1012
|
+
var hasCertifications = function hasCertifications(file) {
|
|
1013
|
+
return (0, _get.default)(file, 'metadata.carbonCopy', false) || (0, _get.default)(file, 'metadata.electronicSafe', false);
|
|
1014
|
+
};
|
|
1015
|
+
/**
|
|
1016
|
+
* @param {IOCozyFile} file - io.cozy.files document
|
|
1017
|
+
* @returns {boolean}
|
|
1018
|
+
*/
|
|
1019
|
+
|
|
1020
|
+
|
|
1021
|
+
exports.hasCertifications = hasCertifications;
|
|
1022
|
+
|
|
1023
|
+
var isFromKonnector = function isFromKonnector(file) {
|
|
1024
|
+
return (0, _has.default)(file, 'cozyMetadata.sourceAccount');
|
|
1025
|
+
};
|
|
979
1026
|
|
|
980
|
-
exports.
|
|
1027
|
+
exports.isFromKonnector = isFromKonnector;
|
package/dist/models/file.spec.js
CHANGED
|
@@ -154,6 +154,53 @@ describe('File Model', () => {
|
|
|
154
154
|
).toBe(false)
|
|
155
155
|
})
|
|
156
156
|
|
|
157
|
+
describe('hasQualifications', () => {
|
|
158
|
+
it.each`
|
|
159
|
+
file | result
|
|
160
|
+
${{ name: 'file01', metadata: { qualification: { label: 'passport' } } }} | ${true}
|
|
161
|
+
${{ name: 'file02', metadata: {} }} | ${false}
|
|
162
|
+
${{ name: 'file03' }} | ${false}
|
|
163
|
+
`(
|
|
164
|
+
`should test if a $file.name has a qualification or not`,
|
|
165
|
+
({ file, result }) => {
|
|
166
|
+
expect(fileModel.hasQualifications(file)).toEqual(result)
|
|
167
|
+
}
|
|
168
|
+
)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
describe('hasCertifications', () => {
|
|
172
|
+
it.each`
|
|
173
|
+
file | result
|
|
174
|
+
${{ name: 'file01', metadata: { carbonCopy: true } }} | ${true}
|
|
175
|
+
${{ name: 'file02', metadata: { electronicSafe: true } }} | ${true}
|
|
176
|
+
${{ name: 'file03', metadata: { carbonCopy: true, electronicSafe: false } }} | ${true}
|
|
177
|
+
${{ name: 'file04', metadata: { carbonCopy: false, electronicSafe: true } }} | ${true}
|
|
178
|
+
${{ name: 'file05', metadata: { carbonCopy: true, electronicSafe: true } }} | ${true}
|
|
179
|
+
${{ name: 'file06', metadata: { carbonCopy: false, electronicSafe: false } }} | ${false}
|
|
180
|
+
${{ name: 'file07', metadata: {} }} | ${false}
|
|
181
|
+
${{ name: 'file08' }} | ${false}
|
|
182
|
+
`(
|
|
183
|
+
`should test if a $file.name has a certification or not`,
|
|
184
|
+
({ file, result }) => {
|
|
185
|
+
expect(fileModel.hasCertifications(file)).toEqual(result)
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
describe('isFromKonnector', () => {
|
|
191
|
+
it.each`
|
|
192
|
+
file | result
|
|
193
|
+
${{ name: 'file01', cozyMetadata: { sourceAccount: 'sourceAccountId' } }} | ${true}
|
|
194
|
+
${{ name: 'file02', cozyMetadata: {} }} | ${false}
|
|
195
|
+
${{ name: 'file03' }} | ${false}
|
|
196
|
+
`(
|
|
197
|
+
`should test if a $file.name is from connector or not`,
|
|
198
|
+
({ file, result }) => {
|
|
199
|
+
expect(fileModel.isFromKonnector(file)).toEqual(result)
|
|
200
|
+
}
|
|
201
|
+
)
|
|
202
|
+
})
|
|
203
|
+
|
|
157
204
|
describe('normalizeFile', () => {
|
|
158
205
|
const id = 'uuid123'
|
|
159
206
|
const type = 'directory'
|
|
@@ -183,34 +230,19 @@ describe('File Model', () => {
|
|
|
183
230
|
})
|
|
184
231
|
|
|
185
232
|
describe('splitFilename', () => {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
type: 'file',
|
|
189
|
-
name:
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
{ filename: 'file', extension: '
|
|
195
|
-
{ filename: 'file', extension: '' }
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
{ filename: 'file.', extension: '.ext' },
|
|
200
|
-
{ filename: '.file', extension: '' },
|
|
201
|
-
{ filename: '.file', extension: '.ext' }
|
|
202
|
-
]
|
|
203
|
-
|
|
204
|
-
for (const expectation of scenarios) {
|
|
205
|
-
it(`splits ${stringify(joinName(expectation))} into ${stringify(
|
|
206
|
-
expectation
|
|
207
|
-
)}`, () => {
|
|
208
|
-
expect(fileModel.splitFilename(mkFile(expectation))).toEqual(
|
|
209
|
-
expectation
|
|
210
|
-
)
|
|
211
|
-
})
|
|
212
|
-
}
|
|
213
|
-
|
|
233
|
+
it.each`
|
|
234
|
+
opts | result
|
|
235
|
+
${{ type: 'file', name: 'file.ext' }} | ${{ filename: 'file', extension: '.ext' }}
|
|
236
|
+
${{ type: 'file', name: 'file' }} | ${{ filename: 'file', extension: '' }}
|
|
237
|
+
${{ type: 'file', name: 'file.html.ext' }} | ${{ filename: 'file.html', extension: '.ext' }}
|
|
238
|
+
${{ type: 'file', name: 'file.' }} | ${{ filename: 'file', extension: '.' }}
|
|
239
|
+
${{ type: 'file', name: 'file..' }} | ${{ filename: 'file.', extension: '.' }}
|
|
240
|
+
${{ type: 'file', name: 'file..ext' }} | ${{ filename: 'file.', extension: '.ext' }}
|
|
241
|
+
${{ type: 'file', name: '.file' }} | ${{ filename: '.file', extension: '' }}
|
|
242
|
+
${{ type: 'file', name: '.file.ext' }} | ${{ filename: '.file', extension: '.ext' }}
|
|
243
|
+
`(`should splits $opts.name into $result`, ({ opts, result }) => {
|
|
244
|
+
expect(fileModel.splitFilename(opts)).toEqual(result)
|
|
245
|
+
})
|
|
214
246
|
it('should throw an error if the file is not correct', () => {
|
|
215
247
|
expect(() => fileModel.splitFilename({})).toThrow()
|
|
216
248
|
expect(() => fileModel.splitFilename({ name: null })).toThrow()
|
|
@@ -510,48 +542,6 @@ describe('File Model', () => {
|
|
|
510
542
|
})
|
|
511
543
|
})
|
|
512
544
|
|
|
513
|
-
describe('splitFilename', () => {
|
|
514
|
-
const name = ({ filename, extension }) => filename + extension
|
|
515
|
-
const file = expectation => ({ type: 'file', name: name(expectation) })
|
|
516
|
-
const { stringify } = JSON
|
|
517
|
-
|
|
518
|
-
const scenarios = [
|
|
519
|
-
{ filename: 'file', extension: '.ext' },
|
|
520
|
-
{ filename: 'file', extension: '' },
|
|
521
|
-
{ filename: 'file.html', extension: '.ejs' },
|
|
522
|
-
{ filename: 'file', extension: '.' },
|
|
523
|
-
{ filename: 'file.', extension: '.' },
|
|
524
|
-
{ filename: 'file.', extension: '.ext' },
|
|
525
|
-
{ filename: '.file', extension: '' },
|
|
526
|
-
{ filename: '.file', extension: '.ext' }
|
|
527
|
-
]
|
|
528
|
-
|
|
529
|
-
for (const expectation of scenarios) {
|
|
530
|
-
it(`splits ${stringify(name(expectation))} into ${stringify(
|
|
531
|
-
expectation
|
|
532
|
-
)}`, () => {
|
|
533
|
-
expect(fileModel.splitFilename(file(expectation))).toEqual(expectation)
|
|
534
|
-
})
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
it('should throw an error if the file is not correct', () => {
|
|
538
|
-
const file = {}
|
|
539
|
-
|
|
540
|
-
expect(() => fileModel.splitFilename(file)).toThrow()
|
|
541
|
-
})
|
|
542
|
-
it('should return only the folder name if its a folder', () => {
|
|
543
|
-
const file = {
|
|
544
|
-
name: 'foo',
|
|
545
|
-
type: 'directory'
|
|
546
|
-
}
|
|
547
|
-
const result = fileModel.splitFilename(file)
|
|
548
|
-
expect(result).toEqual({
|
|
549
|
-
filename: 'foo',
|
|
550
|
-
extension: ''
|
|
551
|
-
})
|
|
552
|
-
})
|
|
553
|
-
})
|
|
554
|
-
|
|
555
545
|
describe('generateNewFileNameOnConflict', () => {
|
|
556
546
|
it('should generate the right file name with _X', () => {
|
|
557
547
|
const filename1 = fileModel.generateNewFileNameOnConflict('test')
|
|
@@ -663,6 +653,53 @@ describe('File Model', () => {
|
|
|
663
653
|
})
|
|
664
654
|
})
|
|
665
655
|
})
|
|
656
|
+
|
|
657
|
+
describe('isPlainText', () => {
|
|
658
|
+
describe('using mime types', () => {
|
|
659
|
+
it('should match mime types starting with "text/"', () => {
|
|
660
|
+
expect(fileModel.isPlainText('text/plain')).toBe(true)
|
|
661
|
+
expect(fileModel.isPlainText('text/markdown')).toBe(true)
|
|
662
|
+
expect(fileModel.isPlainText('application/text')).toBe(false)
|
|
663
|
+
expect(fileModel.isPlainText('something/text/else')).toBe(false)
|
|
664
|
+
expect(fileModel.isPlainText('text/vnd.cozy.note+markdown')).toBe(true)
|
|
665
|
+
})
|
|
666
|
+
|
|
667
|
+
it('should not match complex text formats', () => {
|
|
668
|
+
expect(fileModel.isPlainText('application/msword')).toBe(false)
|
|
669
|
+
expect(
|
|
670
|
+
fileModel.isPlainText('application/vnd.oasis.opendocument.text')
|
|
671
|
+
).toBe(false)
|
|
672
|
+
expect(
|
|
673
|
+
fileModel.isPlainText('application/x-iwork-pages-sffpages')
|
|
674
|
+
).toBe(false)
|
|
675
|
+
})
|
|
676
|
+
|
|
677
|
+
it('should not use the filename if a mime type is present', () => {
|
|
678
|
+
expect(
|
|
679
|
+
fileModel.isPlainText('application/msword', 'iswearitstext.txt')
|
|
680
|
+
).toBe(false)
|
|
681
|
+
})
|
|
682
|
+
})
|
|
683
|
+
|
|
684
|
+
describe('using file names', () => {
|
|
685
|
+
it('should match txt files', () => {
|
|
686
|
+
expect(fileModel.isPlainText(undefined, 'iswearitstext.txt')).toBe(true)
|
|
687
|
+
})
|
|
688
|
+
|
|
689
|
+
it('should match md files', () => {
|
|
690
|
+
expect(fileModel.isPlainText(undefined, 'markdown.md')).toBe(true)
|
|
691
|
+
})
|
|
692
|
+
|
|
693
|
+
it('should not match anything else', () => {
|
|
694
|
+
expect(fileModel.isPlainText(undefined, 'file.doc')).toBe(false)
|
|
695
|
+
expect(fileModel.isPlainText(undefined, 'file.docx')).toBe(false)
|
|
696
|
+
expect(fileModel.isPlainText(undefined, 'file.pages')).toBe(false)
|
|
697
|
+
expect(fileModel.isPlainText(undefined, 'file.odt')).toBe(false)
|
|
698
|
+
expect(fileModel.isPlainText(undefined, 'file.csv')).toBe(false)
|
|
699
|
+
expect(fileModel.isPlainText(undefined, 'file.vcf')).toBe(false)
|
|
700
|
+
})
|
|
701
|
+
})
|
|
702
|
+
})
|
|
666
703
|
})
|
|
667
704
|
|
|
668
705
|
describe('File qualification', () => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cozy-client",
|
|
3
|
-
"version": "27.
|
|
3
|
+
"version": "27.6.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/index.node.js",
|
|
6
6
|
"browser": "dist/index.js",
|
|
@@ -69,5 +69,5 @@
|
|
|
69
69
|
"react-native-inappbrowser-reborn": "^3.5.1"
|
|
70
70
|
},
|
|
71
71
|
"sideEffects": false,
|
|
72
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "4228ec1287e3b18892f2e57128a09a77e87cae2e"
|
|
73
73
|
}
|
package/types/models/file.d.ts
CHANGED
|
@@ -57,6 +57,10 @@ export function generateFileNameForRevision(file: IOCozyFile, revision: object,
|
|
|
57
57
|
export function uploadFileWithConflictStrategy(client: CozyClient, file: string | ArrayBuffer, options: FileUploadOptions): any;
|
|
58
58
|
export function readMobileFile(fileURL: string): Promise<any>;
|
|
59
59
|
export function doMobileUpload(client: CozyClient, fileURL: string, options: FileUploadOptions): Promise<any>;
|
|
60
|
+
export function isPlainText(mimeType?: string, fileName?: string): boolean;
|
|
61
|
+
export function hasQualifications(file: IOCozyFile): boolean;
|
|
62
|
+
export function hasCertifications(file: IOCozyFile): boolean;
|
|
63
|
+
export function isFromKonnector(file: IOCozyFile): boolean;
|
|
60
64
|
export type FileUploadOptions = {
|
|
61
65
|
/**
|
|
62
66
|
* - The file name to upload
|