UNPKG

8.4 kBJavaScriptView Raw
1import { __decorate } from "tslib";
2import { isUrlAbsolute, combine } from "@pnp/core";
3import { body } from "@pnp/queryable";
4import { _SPCollection, spInvokableFactory, _SPInstance, deleteableWithETag, SPInstance, } from "../spqueryable.js";
5import { odataUrlFrom } from "../utils/odata-url-from.js";
6import { Item } from "../items/types.js";
7import { defaultPath } from "../decorators.js";
8import { spPost, spPostMerge } from "../operations.js";
9import { escapeQueryStrValue } from "../utils/escape-query-str.js";
10import { extractWebUrl } from "../utils/extract-web-url.js";
11import { toResourcePath } from "../utils/to-resource-path.js";
12let _Folders = class _Folders extends _SPCollection {
13 /**
14 * Gets a folder by it's name
15 *
16 * @param name Folder's name
17 */
18 getByUrl(name) {
19 return Folder(this).concat(`('${escapeQueryStrValue(name)}')`);
20 }
21 /**
22 * Adds a new folder by path and should be prefered over add
23 *
24 * @param serverRelativeUrl The server relative url of the new folder to create
25 * @param overwrite True to overwrite an existing folder, default false
26 */
27 async addUsingPath(serverRelativeUrl, overwrite = false) {
28 const data = await spPost(Folders(this, `addUsingPath(DecodedUrl='${escapeQueryStrValue(serverRelativeUrl)}',overwrite=${overwrite})`));
29 return {
30 data,
31 folder: folderFromServerRelativePath(this, data.ServerRelativeUrl),
32 };
33 }
34};
35_Folders = __decorate([
36 defaultPath("folders")
37], _Folders);
38export { _Folders };
39export const Folders = spInvokableFactory(_Folders);
40export class _Folder extends _SPInstance {
41 constructor() {
42 super(...arguments);
43 this.delete = deleteableWithETag();
44 }
45 /**
46 * Gets this folder's sub folders
47 *
48 */
49 get folders() {
50 return Folders(this);
51 }
52 /**
53 * Gets this folder's list item field values
54 *
55 */
56 get listItemAllFields() {
57 return SPInstance(this, "listItemAllFields");
58 }
59 /**
60 * Gets the parent folder, if available
61 *
62 */
63 get parentFolder() {
64 return Folder(this, "parentFolder");
65 }
66 /**
67 * Gets this folder's properties
68 *
69 */
70 get properties() {
71 return SPInstance(this, "properties");
72 }
73 /**
74 * Updates folder's properties
75 * @param props Folder's properties to update
76 */
77 async update(props) {
78 const data = await spPostMerge(this, body(props));
79 return {
80 data,
81 folder: this,
82 };
83 }
84 /**
85 * Moves the folder to the Recycle Bin and returns the identifier of the new Recycle Bin item.
86 */
87 recycle() {
88 return spPost(Folder(this, "recycle"));
89 }
90 /**
91 * Gets the associated list item for this folder, loading the default properties
92 */
93 async getItem(...selects) {
94 const q = this.listItemAllFields;
95 const d = await q.select(...selects)();
96 if (d["odata.null"]) {
97 throw Error("No associated item was found for this folder. It may be the root folder, which does not have an item.");
98 }
99 return Object.assign(Item([this, odataUrlFrom(d)]), d);
100 }
101 /**
102 * Moves a folder by path to destination path
103 * Also works with different site collections.
104 *
105 * @param destUrl Absolute or relative URL of the destination path
106 * @param keepBoth Keep both if folder with the same name in the same location already exists?
107 */
108 async moveByPath(destUrl, KeepBoth = false) {
109 const urlInfo = await this.getParentInfos();
110 const uri = new URL(urlInfo.ParentWeb.Url);
111 await spPost(Folder([this, uri.origin], "/_api/SP.MoveCopyUtil.MoveFolderByPath()"), body({
112 destPath: toResourcePath(isUrlAbsolute(destUrl) ? destUrl : combine(uri.origin, destUrl)),
113 options: {
114 KeepBoth,
115 ResetAuthorAndCreatedOnCopy: true,
116 ShouldBypassSharedLocks: true,
117 },
118 srcPath: toResourcePath(combine(uri.origin, urlInfo.Folder.ServerRelativeUrl)),
119 }));
120 }
121 /**
122 * Copies a folder by path to destination path
123 * Also works with different site collections.
124 *
125 * @param destUrl Absolute or relative URL of the destination path
126 * @param keepBoth Keep both if folder with the same name in the same location already exists?
127 */
128 async copyByPath(destUrl, KeepBoth = false) {
129 const urlInfo = await this.getParentInfos();
130 const uri = new URL(urlInfo.ParentWeb.Url);
131 await spPost(Folder([this, uri.origin], "/_api/SP.MoveCopyUtil.CopyFolderByPath()"), body({
132 destPath: toResourcePath(isUrlAbsolute(destUrl) ? destUrl : combine(uri.origin, destUrl)),
133 options: {
134 KeepBoth: KeepBoth,
135 ResetAuthorAndCreatedOnCopy: true,
136 ShouldBypassSharedLocks: true,
137 },
138 srcPath: toResourcePath(combine(uri.origin, urlInfo.Folder.ServerRelativeUrl)),
139 }));
140 }
141 /**
142 * Deletes the folder object with options.
143 *
144 * @param parameters Specifies the options to use when deleting a folder.
145 */
146 async deleteWithParams(parameters) {
147 return spPost(Folder(this, "DeleteWithParameters"), body({ parameters }));
148 }
149 /**
150 * Create the subfolder inside the current folder, as specified by the leafPath
151 *
152 * @param leafPath leafName of the new folder
153 */
154 async addSubFolderUsingPath(leafPath) {
155 await spPost(Folder(this, "AddSubFolderUsingPath"), body({ leafPath: toResourcePath(leafPath) }));
156 return this.folders.getByUrl(leafPath);
157 }
158 /**
159 * Gets the parent information for this folder's list and web
160 */
161 async getParentInfos() {
162 const urlInfo = await this.select("ServerRelativeUrl", "ListItemAllFields/ParentList/Id", "ListItemAllFields/ParentList/RootFolder/UniqueId", "ListItemAllFields/ParentList/RootFolder/ServerRelativeUrl", "ListItemAllFields/ParentList/RootFolder/ServerRelativePath", "ListItemAllFields/ParentList/ParentWeb/Id", "ListItemAllFields/ParentList/ParentWeb/Url", "ListItemAllFields/ParentList/ParentWeb/ServerRelativeUrl", "ListItemAllFields/ParentList/ParentWeb/ServerRelativePath").expand("ListItemAllFields/ParentList", "ListItemAllFields/ParentList/RootFolder", "ListItemAllFields/ParentList/ParentWeb")();
163 return {
164 Folder: {
165 ServerRelativeUrl: urlInfo.ServerRelativeUrl,
166 },
167 ParentList: {
168 Id: urlInfo.ListItemAllFields.ParentList.Id,
169 RootFolderServerRelativePath: urlInfo.ListItemAllFields.ParentList.RootFolder.ServerRelativePath,
170 RootFolderServerRelativeUrl: urlInfo.ListItemAllFields.ParentList.RootFolder.ServerRelativeUrl,
171 RootFolderUniqueId: urlInfo.ListItemAllFields.ParentList.RootFolder.UniqueId,
172 },
173 ParentWeb: {
174 Id: urlInfo.ListItemAllFields.ParentList.ParentWeb.Id,
175 ServerRelativePath: urlInfo.ListItemAllFields.ParentList.ParentWeb.ServerRelativePath,
176 ServerRelativeUrl: urlInfo.ListItemAllFields.ParentList.ParentWeb.ServerRelativeUrl,
177 Url: urlInfo.ListItemAllFields.ParentList.ParentWeb.Url,
178 },
179 };
180 }
181 /**
182 * Gets the shareable item associated with this folder
183 */
184 async getShareable() {
185 // sharing only works on the item end point, not the file one
186 const d = await SPInstance(this, "listItemAllFields").select("odata.id")();
187 return Item([this, odataUrlFrom(d)]);
188 }
189}
190export const Folder = spInvokableFactory(_Folder);
191/**
192 * Creates an IFolder instance given a base object and a server relative path
193 *
194 * @param base Valid SPQueryable from which the observers will be used and the web url extracted
195 * @param serverRelativePath The server relative url to the folder (ex: '/sites/dev/documents/folder3')
196 * @returns IFolder instance referencing the folder described by the supplied parameters
197 */
198export function folderFromServerRelativePath(base, serverRelativePath) {
199 return Folder([base, extractWebUrl(base.toUrl())], `_api/web/getFolderByServerRelativePath(decodedUrl='${escapeQueryStrValue(serverRelativePath)}')`);
200}
201//# sourceMappingURL=types.js.map
\No newline at end of file