@pnp/cli-microsoft365 6.7.0-beta.60f2469 → 6.7.0-beta.7321771
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/.devcontainer/Dockerfile +1 -1
- package/README.md +10 -10
- package/dist/Auth.js +75 -4
- package/dist/AuthServer.js +2 -1
- package/dist/Command.js +56 -7
- package/dist/m365/base/AzmgmtCommand.js +11 -0
- package/dist/m365/base/PowerAppsCommand.js +11 -0
- package/dist/m365/base/PowerPlatformCommand.js +11 -0
- package/dist/m365/commands/login.js +17 -1
- package/dist/m365/commands/status.js +4 -2
- package/dist/m365/flow/commands/run/run-get.js +31 -1
- package/dist/m365/spo/commands/file/file-list.js +108 -32
- package/dist/m365/spo/commands/folder/folder-list.js +73 -16
- package/dist/m365/spo/commands/listitem/listitem-list.js +113 -55
- package/dist/request.js +7 -0
- package/dist/utils/misc.js +11 -0
- package/docs/docs/cmd/flow/run/run-get.md +110 -9
- package/docs/docs/cmd/login.md +5 -2
- package/docs/docs/cmd/planner/task/task-add.md +3 -1
- package/docs/docs/cmd/planner/task/task-set.md +6 -4
- package/docs/docs/cmd/spo/file/file-list.md +87 -2
- package/docs/docs/cmd/spo/folder/folder-list.md +36 -1
- package/docs/docs/cmd/spo/listitem/listitem-list.md +22 -8
- package/docs/docs/cmd/spo/spo-get.md +12 -0
- package/docs/docs/cmd/spo/spo-search.md +16 -3
- package/docs/docs/cmd/spo/user/user-ensure.md +1 -2
- package/docs/docs/cmd/spo/user/user-get.md +24 -0
- package/docs/docs/cmd/spo/user/user-list.md +27 -3
- package/docs/docs/cmd/spo/userprofile/userprofile-get.md +21 -0
- package/docs/docs/cmd/spo/web/web-add.md +24 -0
- package/docs/docs/cmd/spo/web/web-clientsidewebpart-list.md +16 -0
- package/docs/docs/cmd/spo/web/web-get.md +124 -0
- package/docs/docs/cmd/spo/web/web-installedlanguage-list.md +16 -0
- package/docs/docs/cmd/spo/web/web-list.md +16 -0
- package/docs/docs/cmd/spo/web/web-retentionlabel-list.md +29 -2
- package/package.json +2 -1
- package/dist/m365/spo/commands/file/FilePropertiesCollection.js +0 -3
- package/dist/m365/spo/commands/folder/FileFolderCollection.js +0 -3
|
@@ -17,6 +17,7 @@ var _SpoFileListCommand_instances, _SpoFileListCommand_initTelemetry, _SpoFileLi
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
const request_1 = require("../../../../request");
|
|
19
19
|
const formatting_1 = require("../../../../utils/formatting");
|
|
20
|
+
const urlUtil_1 = require("../../../../utils/urlUtil");
|
|
20
21
|
const validation_1 = require("../../../../utils/validation");
|
|
21
22
|
const SpoCommand_1 = require("../../../base/SpoCommand");
|
|
22
23
|
const commands_1 = require("../../commands");
|
|
@@ -37,53 +38,123 @@ class SpoFileListCommand extends SpoCommand_1.default {
|
|
|
37
38
|
commandAction(logger, args) {
|
|
38
39
|
return __awaiter(this, void 0, void 0, function* () {
|
|
39
40
|
if (this.verbose) {
|
|
40
|
-
logger.logToStderr(`Retrieving all files in folder ${args.options.folder} at site ${args.options.webUrl}...`);
|
|
41
|
+
logger.logToStderr(`Retrieving all files in folder '${args.options.folder}' at site '${args.options.webUrl}'${args.options.recursive ? ' (recursive)' : ''}...`);
|
|
41
42
|
}
|
|
42
43
|
try {
|
|
43
|
-
const
|
|
44
|
-
|
|
44
|
+
const fieldProperties = this.formatSelectProperties(args.options.fields, args.options.output);
|
|
45
|
+
const allFiles = [];
|
|
46
|
+
const allFolders = args.options.recursive
|
|
47
|
+
? [...yield this.getFolders(args.options.folder, args, logger), args.options.folder]
|
|
48
|
+
: [args.options.folder];
|
|
49
|
+
for (const folder of allFolders) {
|
|
50
|
+
const files = yield this.getFiles(folder, fieldProperties, args, logger);
|
|
51
|
+
files.forEach((file) => allFiles.push(file));
|
|
52
|
+
}
|
|
53
|
+
// Clean ListItemAllFields.ID property from the output if included
|
|
54
|
+
// Reason: It causes a casing conflict with 'Id' when parsing JSON in PowerShell
|
|
55
|
+
if (fieldProperties.selectProperties.some(p => p.toLowerCase().indexOf('listitemallfields') > -1)) {
|
|
56
|
+
allFiles.filter(file => { var _a; return ((_a = file.ListItemAllFields) === null || _a === void 0 ? void 0 : _a.ID) !== undefined; }).forEach(file => delete file.ListItemAllFields['ID']);
|
|
57
|
+
}
|
|
58
|
+
logger.log(allFiles);
|
|
45
59
|
}
|
|
46
60
|
catch (err) {
|
|
47
61
|
this.handleRejectedODataJsonPromise(err);
|
|
48
62
|
}
|
|
49
63
|
});
|
|
50
64
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
};
|
|
67
|
-
return request_1.default
|
|
68
|
-
.get(requestOptions)
|
|
69
|
-
.then((filesAndFoldersResult) => {
|
|
70
|
-
filesAndFoldersResult.Files.forEach((file) => files.value.push(file));
|
|
71
|
-
// If the request is --recursive, call this method for other folders.
|
|
72
|
-
if (args.options.recursive &&
|
|
73
|
-
filesAndFoldersResult.Folders !== undefined &&
|
|
74
|
-
filesAndFoldersResult.Folders.length !== 0) {
|
|
75
|
-
return Promise.all(filesAndFoldersResult.Folders.map((folder) => this.getFiles(folder.ServerRelativeUrl, args, files)));
|
|
65
|
+
getFiles(folderUrl, fieldProperties, args, logger, skip = 0) {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
if (this.verbose) {
|
|
68
|
+
const page = Math.ceil(skip / SpoFileListCommand.pageSize) + 1;
|
|
69
|
+
logger.logToStderr(`Retrieving files in folder '${folderUrl}'${page > 1 ? ', page ' + page : ''}...`);
|
|
70
|
+
}
|
|
71
|
+
const allFiles = [];
|
|
72
|
+
const serverRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(args.options.webUrl, folderUrl);
|
|
73
|
+
const requestUrl = `${args.options.webUrl}/_api/web/GetFolderByServerRelativeUrl(@url)/Files?@url='${formatting_1.formatting.encodeQueryParameter(serverRelativeUrl)}'`;
|
|
74
|
+
const queryParams = [`$skip=${skip}`, `$top=${SpoFileListCommand.pageSize}`];
|
|
75
|
+
if (fieldProperties.expandProperties.length > 0) {
|
|
76
|
+
queryParams.push(`$expand=${fieldProperties.expandProperties.join(',')}`);
|
|
77
|
+
}
|
|
78
|
+
if (fieldProperties.selectProperties.length > 0) {
|
|
79
|
+
queryParams.push(`$select=${fieldProperties.selectProperties.join(',')}`);
|
|
76
80
|
}
|
|
77
|
-
|
|
78
|
-
|
|
81
|
+
if (args.options.filter) {
|
|
82
|
+
queryParams.push(`$filter=${args.options.filter}`);
|
|
79
83
|
}
|
|
80
|
-
|
|
84
|
+
const requestOptions = {
|
|
85
|
+
url: `${requestUrl}&${queryParams.join('&')}`,
|
|
86
|
+
method: 'GET',
|
|
87
|
+
headers: {
|
|
88
|
+
'accept': 'application/json;odata=nometadata'
|
|
89
|
+
},
|
|
90
|
+
responseType: 'json'
|
|
91
|
+
};
|
|
92
|
+
const response = yield request_1.default.get(requestOptions);
|
|
93
|
+
response.value.forEach(file => allFiles.push(file));
|
|
94
|
+
if (response.value.length === SpoFileListCommand.pageSize) {
|
|
95
|
+
const files = yield this.getFiles(folderUrl, fieldProperties, args, logger, skip + SpoFileListCommand.pageSize);
|
|
96
|
+
files.forEach(file => allFiles.push(file));
|
|
97
|
+
}
|
|
98
|
+
return allFiles;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
getFolders(folderUrl, args, logger, skip = 0) {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
if (this.verbose) {
|
|
104
|
+
const page = Math.ceil(skip / SpoFileListCommand.pageSize) + 1;
|
|
105
|
+
logger.logToStderr(`Retrieving folders in folder '${folderUrl}'${page > 1 ? ', page ' + page : ''}...`);
|
|
106
|
+
}
|
|
107
|
+
const allFolders = [];
|
|
108
|
+
const serverRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(args.options.webUrl, folderUrl);
|
|
109
|
+
const requestUrl = `${args.options.webUrl}/_api/web/GetFolderByServerRelativeUrl(@url)/Folders?@url='${formatting_1.formatting.encodeQueryParameter(serverRelativeUrl)}'`;
|
|
110
|
+
const requestOptions = {
|
|
111
|
+
url: `${requestUrl}&$skip=${skip}&$top=${SpoFileListCommand.pageSize}&$select=ServerRelativeUrl`,
|
|
112
|
+
method: 'GET',
|
|
113
|
+
headers: {
|
|
114
|
+
'accept': 'application/json;odata=nometadata'
|
|
115
|
+
},
|
|
116
|
+
responseType: 'json'
|
|
117
|
+
};
|
|
118
|
+
const response = yield request_1.default.get(requestOptions);
|
|
119
|
+
for (const folder of response.value) {
|
|
120
|
+
allFolders.push(folder.ServerRelativeUrl);
|
|
121
|
+
const subfolders = yield this.getFolders(folder.ServerRelativeUrl, args, logger);
|
|
122
|
+
subfolders.forEach(folder => allFolders.push(folder));
|
|
123
|
+
}
|
|
124
|
+
if (response.value.length === SpoFileListCommand.pageSize) {
|
|
125
|
+
const folders = yield this.getFolders(folderUrl, args, logger, skip + SpoFileListCommand.pageSize);
|
|
126
|
+
folders.forEach(folder => allFolders.push(folder));
|
|
127
|
+
}
|
|
128
|
+
return allFolders;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
formatSelectProperties(fields, output) {
|
|
132
|
+
let selectProperties = [];
|
|
133
|
+
const expandProperties = [];
|
|
134
|
+
if (output === 'text' && !fields) {
|
|
135
|
+
selectProperties = ['UniqueId', 'Name', 'ServerRelativeUrl'];
|
|
136
|
+
}
|
|
137
|
+
if (fields) {
|
|
138
|
+
fields.split(',').forEach((field) => {
|
|
139
|
+
const subparts = field.trim().split('/');
|
|
140
|
+
if (subparts.length > 1) {
|
|
141
|
+
expandProperties.push(subparts[0]);
|
|
142
|
+
}
|
|
143
|
+
selectProperties.push(field.trim());
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
selectProperties: [...new Set(selectProperties)],
|
|
148
|
+
expandProperties: [...new Set(expandProperties)]
|
|
149
|
+
};
|
|
81
150
|
}
|
|
82
151
|
}
|
|
83
152
|
_SpoFileListCommand_instances = new WeakSet(), _SpoFileListCommand_initTelemetry = function _SpoFileListCommand_initTelemetry() {
|
|
84
153
|
this.telemetry.push((args) => {
|
|
85
154
|
Object.assign(this.telemetryProperties, {
|
|
86
|
-
recursive: args.options.recursive
|
|
155
|
+
recursive: args.options.recursive,
|
|
156
|
+
fields: typeof args.options.fields !== 'undefined',
|
|
157
|
+
filter: typeof args.options.filter !== 'undefined'
|
|
87
158
|
});
|
|
88
159
|
});
|
|
89
160
|
}, _SpoFileListCommand_initOptions = function _SpoFileListCommand_initOptions() {
|
|
@@ -91,11 +162,16 @@ _SpoFileListCommand_instances = new WeakSet(), _SpoFileListCommand_initTelemetry
|
|
|
91
162
|
option: '-u, --webUrl <webUrl>'
|
|
92
163
|
}, {
|
|
93
164
|
option: '-f, --folder <folder>'
|
|
165
|
+
}, {
|
|
166
|
+
option: '--fields [fields]'
|
|
167
|
+
}, {
|
|
168
|
+
option: '--filter [filter]'
|
|
94
169
|
}, {
|
|
95
170
|
option: '-r, --recursive'
|
|
96
171
|
});
|
|
97
172
|
}, _SpoFileListCommand_initValidators = function _SpoFileListCommand_initValidators() {
|
|
98
173
|
this.validators.push((args) => __awaiter(this, void 0, void 0, function* () { return validation_1.validation.isValidSharePointUrl(args.options.webUrl); }));
|
|
99
174
|
};
|
|
175
|
+
SpoFileListCommand.pageSize = 5000;
|
|
100
176
|
module.exports = new SpoFileListCommand();
|
|
101
177
|
//# sourceMappingURL=file-list.js.map
|
|
@@ -15,8 +15,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
15
15
|
};
|
|
16
16
|
var _SpoFolderListCommand_instances, _SpoFolderListCommand_initTelemetry, _SpoFolderListCommand_initOptions, _SpoFolderListCommand_initValidators;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const request_1 = require("../../../../request");
|
|
18
19
|
const formatting_1 = require("../../../../utils/formatting");
|
|
19
|
-
const odata_1 = require("../../../../utils/odata");
|
|
20
20
|
const urlUtil_1 = require("../../../../utils/urlUtil");
|
|
21
21
|
const validation_1 = require("../../../../utils/validation");
|
|
22
22
|
const SpoCommand_1 = require("../../../base/SpoCommand");
|
|
@@ -41,37 +41,89 @@ class SpoFolderListCommand extends SpoCommand_1.default {
|
|
|
41
41
|
commandAction(logger, args) {
|
|
42
42
|
return __awaiter(this, void 0, void 0, function* () {
|
|
43
43
|
if (this.verbose) {
|
|
44
|
-
logger.logToStderr(`Retrieving folders
|
|
44
|
+
logger.logToStderr(`Retrieving all folders in folder '${args.options.parentFolderUrl}' at site '${args.options.webUrl}'${args.options.recursive ? ' (recursive)' : ''}...`);
|
|
45
45
|
}
|
|
46
46
|
try {
|
|
47
|
-
const
|
|
48
|
-
|
|
47
|
+
const fieldProperties = this.formatSelectProperties(args.options.fields);
|
|
48
|
+
const allFiles = yield this.getFolders(args.options.parentFolderUrl, fieldProperties, args, logger);
|
|
49
|
+
// Clean ListItemAllFields.ID property from the output if included
|
|
50
|
+
// Reason: It causes a casing conflict with 'Id' when parsing JSON in PowerShell
|
|
51
|
+
if (fieldProperties.selectProperties.some(p => p.toLowerCase().indexOf('listitemallfields') > -1)) {
|
|
52
|
+
allFiles.filter(folder => { var _a; return ((_a = folder.ListItemAllFields) === null || _a === void 0 ? void 0 : _a.ID) !== undefined; }).forEach(folder => delete folder.ListItemAllFields['ID']);
|
|
53
|
+
}
|
|
54
|
+
logger.log(allFiles);
|
|
49
55
|
}
|
|
50
56
|
catch (err) {
|
|
51
57
|
this.handleRejectedODataJsonPromise(err);
|
|
52
58
|
}
|
|
53
59
|
});
|
|
54
60
|
}
|
|
55
|
-
|
|
61
|
+
getFolders(parentFolderUrl, fieldProperties, args, logger, skip = 0) {
|
|
56
62
|
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
if (this.verbose) {
|
|
64
|
+
const page = Math.ceil(skip / SpoFolderListCommand.pageSize) + 1;
|
|
65
|
+
logger.logToStderr(`Retrieving folders in folder '${parentFolderUrl}'${page > 1 ? ', page ' + page : ''}...`);
|
|
66
|
+
}
|
|
67
|
+
const allFolders = [];
|
|
68
|
+
const serverRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(args.options.webUrl, parentFolderUrl);
|
|
69
|
+
const requestUrl = `${args.options.webUrl}/_api/web/GetFolderByServerRelativeUrl(@url)/Folders?@url='${formatting_1.formatting.encodeQueryParameter(serverRelativeUrl)}'`;
|
|
70
|
+
const queryParams = [`$skip=${skip}`, `$top=${SpoFolderListCommand.pageSize}`];
|
|
71
|
+
if (fieldProperties.expandProperties.length > 0) {
|
|
72
|
+
queryParams.push(`$expand=${fieldProperties.expandProperties.join(',')}`);
|
|
73
|
+
}
|
|
74
|
+
if (fieldProperties.selectProperties.length > 0) {
|
|
75
|
+
queryParams.push(`$select=${fieldProperties.selectProperties.join(',')}`);
|
|
76
|
+
}
|
|
77
|
+
if (args.options.filter) {
|
|
78
|
+
queryParams.push(`$filter=${args.options.filter}`);
|
|
79
|
+
}
|
|
80
|
+
const requestOptions = {
|
|
81
|
+
url: `${requestUrl}&${queryParams.join('&')}`,
|
|
82
|
+
method: 'GET',
|
|
83
|
+
headers: {
|
|
84
|
+
'accept': 'application/json;odata=nometadata'
|
|
85
|
+
},
|
|
86
|
+
responseType: 'json'
|
|
87
|
+
};
|
|
88
|
+
const response = yield request_1.default.get(requestOptions);
|
|
89
|
+
for (const folder of response.value) {
|
|
90
|
+
allFolders.push(folder);
|
|
91
|
+
if (args.options.recursive) {
|
|
92
|
+
const subFolders = yield this.getFolders(folder.ServerRelativeUrl, fieldProperties, args, logger);
|
|
93
|
+
subFolders.forEach(subFolder => allFolders.push(subFolder));
|
|
65
94
|
}
|
|
66
95
|
}
|
|
67
|
-
|
|
96
|
+
if (response.value.length === SpoFolderListCommand.pageSize) {
|
|
97
|
+
const folders = yield this.getFolders(parentFolderUrl, fieldProperties, args, logger, skip + SpoFolderListCommand.pageSize);
|
|
98
|
+
folders.forEach(folder => allFolders.push(folder));
|
|
99
|
+
}
|
|
100
|
+
return allFolders;
|
|
68
101
|
});
|
|
69
102
|
}
|
|
103
|
+
formatSelectProperties(fields) {
|
|
104
|
+
const selectProperties = [];
|
|
105
|
+
const expandProperties = [];
|
|
106
|
+
if (fields) {
|
|
107
|
+
fields.split(',').forEach((field) => {
|
|
108
|
+
const subparts = field.trim().split('/');
|
|
109
|
+
if (subparts.length > 1) {
|
|
110
|
+
expandProperties.push(subparts[0]);
|
|
111
|
+
}
|
|
112
|
+
selectProperties.push(field.trim());
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
selectProperties: [...new Set(selectProperties)],
|
|
117
|
+
expandProperties: [...new Set(expandProperties)]
|
|
118
|
+
};
|
|
119
|
+
}
|
|
70
120
|
}
|
|
71
121
|
_SpoFolderListCommand_instances = new WeakSet(), _SpoFolderListCommand_initTelemetry = function _SpoFolderListCommand_initTelemetry() {
|
|
72
122
|
this.telemetry.push((args) => {
|
|
73
123
|
Object.assign(this.telemetryProperties, {
|
|
74
|
-
recursive: !!args.options.recursive
|
|
124
|
+
recursive: !!args.options.recursive,
|
|
125
|
+
fields: typeof args.options.fields !== 'undefined',
|
|
126
|
+
filter: typeof args.options.filter !== 'undefined'
|
|
75
127
|
});
|
|
76
128
|
});
|
|
77
129
|
}, _SpoFolderListCommand_initOptions = function _SpoFolderListCommand_initOptions() {
|
|
@@ -80,10 +132,15 @@ _SpoFolderListCommand_instances = new WeakSet(), _SpoFolderListCommand_initTelem
|
|
|
80
132
|
}, {
|
|
81
133
|
option: '-p, --parentFolderUrl <parentFolderUrl>'
|
|
82
134
|
}, {
|
|
83
|
-
option: '--
|
|
135
|
+
option: '-f, --fields [fields]'
|
|
136
|
+
}, {
|
|
137
|
+
option: '--filter [filter]'
|
|
138
|
+
}, {
|
|
139
|
+
option: '-r, --recursive [recursive]'
|
|
84
140
|
});
|
|
85
141
|
}, _SpoFolderListCommand_initValidators = function _SpoFolderListCommand_initValidators() {
|
|
86
142
|
this.validators.push((args) => __awaiter(this, void 0, void 0, function* () { return validation_1.validation.isValidSharePointUrl(args.options.webUrl); }));
|
|
87
143
|
};
|
|
144
|
+
SpoFolderListCommand.pageSize = 5000;
|
|
88
145
|
module.exports = new SpoFolderListCommand();
|
|
89
146
|
//# sourceMappingURL=folder-list.js.map
|
|
@@ -18,6 +18,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
const Cli_1 = require("../../../../cli/Cli");
|
|
19
19
|
const request_1 = require("../../../../request");
|
|
20
20
|
const formatting_1 = require("../../../../utils/formatting");
|
|
21
|
+
const odata_1 = require("../../../../utils/odata");
|
|
21
22
|
const spo_1 = require("../../../../utils/spo");
|
|
22
23
|
const urlUtil_1 = require("../../../../utils/urlUtil");
|
|
23
24
|
const validation_1 = require("../../../../utils/validation");
|
|
@@ -41,63 +42,94 @@ class SpoListItemListCommand extends SpoCommand_1.default {
|
|
|
41
42
|
}
|
|
42
43
|
commandAction(logger, args) {
|
|
43
44
|
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
-
let
|
|
45
|
+
let listApiUrl = `${args.options.webUrl}/_api/web`;
|
|
45
46
|
if (args.options.listId) {
|
|
46
|
-
|
|
47
|
+
listApiUrl += `/lists(guid'${formatting_1.formatting.encodeQueryParameter(args.options.listId)}')`;
|
|
47
48
|
}
|
|
48
49
|
else if (args.options.listTitle) {
|
|
49
|
-
|
|
50
|
+
listApiUrl += `/lists/getByTitle('${formatting_1.formatting.encodeQueryParameter(args.options.listTitle)}')`;
|
|
50
51
|
}
|
|
51
52
|
else if (args.options.listUrl) {
|
|
52
53
|
const listServerRelativeUrl = urlUtil_1.urlUtil.getServerRelativePath(args.options.webUrl, args.options.listUrl);
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
let formDigestValue = '';
|
|
56
|
-
const fieldsArray = args.options.fields ? args.options.fields.split(",")
|
|
57
|
-
: (!args.options.output || Cli_1.Cli.shouldTrimOutput(args.options.output)) ? ["Title", "Id"] : [];
|
|
58
|
-
const fieldsWithSlash = fieldsArray.filter(item => item.includes('/'));
|
|
59
|
-
const fieldsToExpand = fieldsWithSlash.map(e => e.split('/')[0]);
|
|
60
|
-
const expandFieldsArray = fieldsToExpand.filter((item, pos) => fieldsToExpand.indexOf(item) === pos);
|
|
54
|
+
listApiUrl += `/GetList('${formatting_1.formatting.encodeQueryParameter(listServerRelativeUrl)}')`;
|
|
55
|
+
}
|
|
61
56
|
try {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
57
|
+
const listItems = args.options.camlQuery
|
|
58
|
+
? yield this.getItemsUsingCAMLQuery(logger, args.options, listApiUrl)
|
|
59
|
+
: yield this.getItems(logger, args.options, listApiUrl);
|
|
60
|
+
listItems.forEach(v => delete v['ID']);
|
|
61
|
+
logger.log(listItems);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
this.handleRejectedODataJsonPromise(err);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
getItems(logger, options, listApiUrl) {
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
if (this.verbose) {
|
|
71
|
+
logger.logToStderr(`Getting list items`);
|
|
72
|
+
}
|
|
73
|
+
const queryParams = [];
|
|
74
|
+
const fieldsArray = options.fields ? options.fields.split(",")
|
|
75
|
+
: (!options.output || Cli_1.Cli.shouldTrimOutput(options.output)) ? ["Title", "Id"] : [];
|
|
76
|
+
const expandFieldsArray = this.getExpandFieldsArray(fieldsArray);
|
|
77
|
+
const skipTokenId = yield this.getLastItemIdForPage(logger, options, listApiUrl);
|
|
78
|
+
queryParams.push(`$top=${options.pageSize || 5000}`);
|
|
79
|
+
if (options.filter) {
|
|
80
|
+
queryParams.push(`$filter=${encodeURIComponent(options.filter)}`);
|
|
81
|
+
}
|
|
82
|
+
if (expandFieldsArray.length > 0) {
|
|
83
|
+
queryParams.push(`$expand=${expandFieldsArray.join(",")}`);
|
|
84
|
+
}
|
|
85
|
+
if (fieldsArray.length > 0) {
|
|
86
|
+
queryParams.push(`$select=${formatting_1.formatting.encodeQueryParameter(fieldsArray.join(","))}`);
|
|
87
|
+
}
|
|
88
|
+
if (skipTokenId !== undefined) {
|
|
89
|
+
queryParams.push(`$skiptoken=Paged=TRUE%26p_ID=${skipTokenId}`);
|
|
90
|
+
}
|
|
91
|
+
// If skiptoken is not found, then we are past the last page
|
|
92
|
+
if (options.pageNumber && Number(options.pageNumber) > 0 && skipTokenId === undefined) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
if (!options.pageSize) {
|
|
96
|
+
return yield odata_1.odata.getAllItems(`${listApiUrl}/items?${queryParams.join('&')}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const requestOptions = {
|
|
100
|
+
url: `${listApiUrl}/items?${queryParams.join('&')}`,
|
|
101
|
+
headers: {
|
|
102
|
+
'accept': 'application/json;odata=nometadata'
|
|
103
|
+
},
|
|
104
|
+
responseType: 'json'
|
|
105
|
+
};
|
|
106
|
+
const listItemCollection = yield request_1.default.get(requestOptions);
|
|
107
|
+
return listItemCollection.value;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
getItemsUsingCAMLQuery(logger, options, listApiUrl) {
|
|
112
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
113
|
+
const formDigestValue = (yield spo_1.spo.getRequestDigest(options.webUrl)).FormDigestValue;
|
|
114
|
+
if (this.verbose) {
|
|
115
|
+
logger.logToStderr(`Getting list items using CAML query`);
|
|
116
|
+
}
|
|
117
|
+
const items = [];
|
|
118
|
+
let skipTokenId = undefined;
|
|
119
|
+
do {
|
|
120
|
+
const requestBody = {
|
|
121
|
+
"query": {
|
|
122
|
+
"ViewXml": options.camlQuery,
|
|
123
|
+
"AllowIncrementalResults": true
|
|
65
124
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (args.options.pageNumber && Number(args.options.pageNumber) > 0) {
|
|
71
|
-
const rowLimit = `$top=${Number(args.options.pageSize) * Number(args.options.pageNumber)}`;
|
|
72
|
-
const filter = args.options.filter ? `$filter=${encodeURIComponent(args.options.filter)}` : ``;
|
|
73
|
-
const fieldSelect = `?$select=Id&${rowLimit}&${filter}`;
|
|
74
|
-
const requestOptions = {
|
|
75
|
-
url: `${requestUrl}/items${fieldSelect}`,
|
|
76
|
-
headers: {
|
|
77
|
-
'accept': 'application/json;odata=nometadata',
|
|
78
|
-
'X-RequestDigest': formDigestValue
|
|
79
|
-
},
|
|
80
|
-
responseType: 'json'
|
|
125
|
+
};
|
|
126
|
+
if (skipTokenId !== undefined) {
|
|
127
|
+
requestBody.query.ListItemCollectionPosition = {
|
|
128
|
+
"PagingInfo": `Paged=TRUE&p_ID=${skipTokenId}`
|
|
81
129
|
};
|
|
82
|
-
res = yield request_1.default.get(requestOptions);
|
|
83
130
|
}
|
|
84
|
-
const skipTokenId = (res && res.value && res.value.length && res.value[res.value.length - 1]) ? res.value[res.value.length - 1].Id : 0;
|
|
85
|
-
const skipToken = (args.options.pageNumber && Number(args.options.pageNumber) > 0 && skipTokenId > 0) ? `$skiptoken=Paged=TRUE%26p_ID=${res.value[res.value.length - 1].Id}` : ``;
|
|
86
|
-
const rowLimit = args.options.pageSize ? `$top=${args.options.pageSize}` : ``;
|
|
87
|
-
const filter = args.options.filter ? `$filter=${encodeURIComponent(args.options.filter)}` : ``;
|
|
88
|
-
const fieldExpand = expandFieldsArray.length > 0 ? `&$expand=${expandFieldsArray.join(",")}` : ``;
|
|
89
|
-
const fieldSelect = fieldsArray.length > 0 ?
|
|
90
|
-
`?$select=${formatting_1.formatting.encodeQueryParameter(fieldsArray.join(","))}${fieldExpand}&${rowLimit}&${skipToken}&${filter}` :
|
|
91
|
-
`?${rowLimit}&${skipToken}&${filter}`;
|
|
92
|
-
const requestBody = args.options.camlQuery ?
|
|
93
|
-
{
|
|
94
|
-
"query": {
|
|
95
|
-
"ViewXml": args.options.camlQuery
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
: ``;
|
|
99
131
|
const requestOptions = {
|
|
100
|
-
url: `${
|
|
132
|
+
url: `${listApiUrl}/GetItems`,
|
|
101
133
|
headers: {
|
|
102
134
|
'accept': 'application/json;odata=nometadata',
|
|
103
135
|
'X-RequestDigest': formDigestValue
|
|
@@ -105,13 +137,39 @@ class SpoListItemListCommand extends SpoCommand_1.default {
|
|
|
105
137
|
responseType: 'json',
|
|
106
138
|
data: requestBody
|
|
107
139
|
};
|
|
108
|
-
const listItemInstances =
|
|
109
|
-
listItemInstances.value.
|
|
110
|
-
|
|
140
|
+
const listItemInstances = yield request_1.default.post(requestOptions);
|
|
141
|
+
skipTokenId = listItemInstances.value.length > 0 ? listItemInstances.value[listItemInstances.value.length - 1].Id : undefined;
|
|
142
|
+
items.push(...listItemInstances.value);
|
|
143
|
+
} while (skipTokenId !== undefined);
|
|
144
|
+
return items;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
getExpandFieldsArray(fieldsArray) {
|
|
148
|
+
const fieldsWithSlash = fieldsArray.filter(item => item.includes('/'));
|
|
149
|
+
const fieldsToExpand = fieldsWithSlash.map(e => e.split('/')[0]);
|
|
150
|
+
const expandFieldsArray = fieldsToExpand.filter((item, pos) => fieldsToExpand.indexOf(item) === pos);
|
|
151
|
+
return expandFieldsArray;
|
|
152
|
+
}
|
|
153
|
+
getLastItemIdForPage(logger, options, listApiUrl) {
|
|
154
|
+
var _a;
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
if (!options.pageNumber || Number(options.pageNumber) === 0) {
|
|
157
|
+
return undefined;
|
|
111
158
|
}
|
|
112
|
-
|
|
113
|
-
|
|
159
|
+
if (this.verbose) {
|
|
160
|
+
logger.logToStderr(`Getting skipToken Id for page ${options.pageNumber}`);
|
|
114
161
|
}
|
|
162
|
+
const rowLimit = `$top=${Number(options.pageSize) * Number(options.pageNumber)}`;
|
|
163
|
+
const filter = options.filter ? `$filter=${encodeURIComponent(options.filter)}` : ``;
|
|
164
|
+
const requestOptions = {
|
|
165
|
+
url: `${listApiUrl}/items?$select=Id&${rowLimit}&${filter}`,
|
|
166
|
+
headers: {
|
|
167
|
+
'accept': 'application/json;odata=nometadata'
|
|
168
|
+
},
|
|
169
|
+
responseType: 'json'
|
|
170
|
+
};
|
|
171
|
+
const response = yield request_1.default.get(requestOptions);
|
|
172
|
+
return (_a = response.value[response.value.length - 1]) === null || _a === void 0 ? void 0 : _a.Id;
|
|
115
173
|
});
|
|
116
174
|
}
|
|
117
175
|
}
|
|
@@ -155,16 +213,16 @@ _SpoListItemListCommand_instances = new WeakSet(), _SpoListItemListCommand_initT
|
|
|
155
213
|
return isValidSharePointUrl;
|
|
156
214
|
}
|
|
157
215
|
if (args.options.camlQuery && args.options.fields) {
|
|
158
|
-
return `
|
|
216
|
+
return `You cannot use the fields-option when specifying a camlQuery`;
|
|
159
217
|
}
|
|
160
218
|
if (args.options.camlQuery && args.options.pageSize) {
|
|
161
|
-
return `
|
|
219
|
+
return `You cannot use the pageSize-option when specifying a camlQuery`;
|
|
162
220
|
}
|
|
163
221
|
if (args.options.camlQuery && args.options.pageNumber) {
|
|
164
|
-
return `
|
|
222
|
+
return `You cannot use the pageNumber-option when specifying a camlQuery`;
|
|
165
223
|
}
|
|
166
224
|
if (args.options.pageSize && isNaN(Number(args.options.pageSize))) {
|
|
167
|
-
return `pageSize must be numeric`;
|
|
225
|
+
return `pageSize ${args.options.pageSize} must be numeric`;
|
|
168
226
|
}
|
|
169
227
|
if (args.options.pageNumber && !args.options.pageSize) {
|
|
170
228
|
return `pageSize must be specified if pageNumber is specified`;
|
package/dist/request.js
CHANGED
|
@@ -123,6 +123,7 @@ class Request {
|
|
|
123
123
|
if (!this._logger) {
|
|
124
124
|
return Promise.reject('Logger not set on the request object');
|
|
125
125
|
}
|
|
126
|
+
this.updateRequestForCloudType(options, Auth_1.default.service.cloudType);
|
|
126
127
|
return new Promise((_resolve, _reject) => {
|
|
127
128
|
(() => {
|
|
128
129
|
if (options.headers && options.headers['x-anonymous']) {
|
|
@@ -181,6 +182,12 @@ class Request {
|
|
|
181
182
|
});
|
|
182
183
|
});
|
|
183
184
|
}
|
|
185
|
+
updateRequestForCloudType(options, cloudType) {
|
|
186
|
+
const url = new URL(options.url);
|
|
187
|
+
const hostname = `${url.protocol}//${url.hostname}`;
|
|
188
|
+
const cloudUrl = Auth_1.Auth.getEndpointForResource(hostname, cloudType);
|
|
189
|
+
options.url = options.url.replace(hostname, cloudUrl);
|
|
190
|
+
}
|
|
184
191
|
}
|
|
185
192
|
exports.default = new Request();
|
|
186
193
|
//# sourceMappingURL=request.js.map
|