SharePoint JavaScript Core Library (PnP JS Core) wrapper helper for Node.js
npm install sp-pnp-nodesp-pnp-node and node-pnp-sp libraries. I'm keeping sp-pnp-node not archived and update it from time to time only because of some production implementations which I'm too lazy to migrate to pnp-auth right away.
sp-pnp-node provides a simple way for using PnPjs in Node.js with support of various authentication strategies.
bash
npm install sp-pnp-node @pnp/pnpjs@^1.3.11
`
Usage examples
$3
Can be as simple as 5 lines of code:
`typescript
import { Web } from '@pnp/sp';
import { PnpNode } from 'sp-pnp-node';
new PnpNode().init().then(settings => {
const web = new Web(settings.siteUrl);
/// ... // <<< Here goes PnP JS Core code
}).catch(console.log);
`
!demo
sp-pnp-node has two modes:
- ambient init - wraps PnPjs with promise based auth wizard helper
- factory - fetchClientFactory implementation
_When to use ambient init_: in scripts with user interaction involved when there is no information about authentication and target invironment before script is executed. SharePoint url and the creds are prompted in a console.
In CI/CD scenarios, factory approach is recommended over interactive console as it can lead to a task stuck.
$3
#### Ambient init example
`typescript
import { Web } from '@pnp/sp';
import { PnpNode, IPnpNodeSettings } from 'sp-pnp-node';
const optionalInitSettings: IPnpNodeSettings = {
// ...
};
new PnpNode(optionalInitSettings).init().then((settings: IPnpNodeSettings) => {
// Here goes PnP JS Core code >>>
const web = new Web(settings.siteUrl);
// Any SPWeb url can be used for new Web(...)
// not necessarily which is provided in optionalInitSettings
// Get all list example
web.lists.get()
.then(lists => {
console.log(lists.map(list => list.Title));
})
.catch(console.log);
// <<< Here goes PnP JS Core code
}).catch(console.log);
`
#### Factory example
`typescript
import * as pnp from '@pnp/sp';
import { PnpNode, IPnpNodeSettings } from 'sp-pnp-node';
const config = require('../config/private.json');
const pnpNodeSettings: IPnpNodeSettings = {
// siteUrl - Optional if baseUrl is in pnp.setup or in case of new Web(url)
siteUrl: config.siteUrl,
authOptions: config
};
pnp.sp.setup({
sp: {
fetchClientFactory: () => new PnpNode(pnpNodeSettings),
// baseUrl - Optional if siteUrl is in IPnpNodeSettings or in case of new Web(url)
baseUrl: config.siteUrl
}
});
pnp.sp.web.get()
.then(console.log)
.catch(console.log);
// Or
/*
new Web('http://adhoc.url/sites/site').get()
.then(console.log)
.catch(console.log);
*/
`
$3
`javascript
const { Web } = require('@pnp/sp');
const { PnpNode } = require('sp-pnp-node');
new PnpNode().init().then(settings => {
// Here goes PnP JS Core code >>>
const web = new Web(settings.siteUrl);
// Get all content types example
web.contentTypes.get()
.then(cts => {
console.log(cts.map(ct => {
return {
name: ct.Name,
description: ct.Description
};
}));
})
.catch(console.log);
// <<< Here goes PnP JS Core code
}).catch(console.log);
`
$3
`typescript
import { sp } from '@pnp/sp';
import { PnpNode, IPnpNodeSettings } from 'sp-pnp-node';
new PnpNode().init().then((settings: IPnpNodeSettings) => {
sp.setup({
sp: {
headers: {
// 'Accept': 'application/json;odata=verbose'
'Accept': 'application/json;odata=minimalmetadata'
// 'Accept': 'application/json;odata=nometadata'
}
}
});
// ...
}).catch(console.log);
`
Initiation settings
`typescript
import { PnpNode } from 'sp-pnp-node';
const pnpNodeSettings: IPnpNodeSettings = {
/// ...
};
new PnpNode(pnpNodeSettings).init().then(settings => {
// Here goes PnP JS Core code
}).catch(console.log);
`
$3
`typescript
import { PnpNode } from 'sp-pnp-node';
declare const global: any;
new PnpNode().init().then(settings => {
// Any raw RESP API requests with Fetch client
global.fetch(${settings.siteUrl}/_api/web, {
method: 'GET',
headers: {
accept: 'application/json;odata=minimalmetadata'
}
})
.then(response => response.json())
.then(console.log)
.catch(console.log);
});
`
$3
- siteUrl?: string; // Optional SPWeb url
- authOptions?: IAuthOptions; node-sp-auth credentials options
- config?: IAuthConf; node-sp-auth-config options
- configPath?: string; // Path to auth config .json | Default is './config/private.json'
- encryptPassword?: boolean; // Encrypts password to a machine-bind hash | Default is 'true'
- saveConfigOnDisk?: boolean; // Saves config .json to disk | Default is 'true'
Settings can be left blank. Auth options in such a case will be asked by node-sp-auth-config options in a wizard like approach.
$3
- No initial settings (defaults): wizard approach, covers console applications cases with user interaction
- With explicitly defined authOptions:
- external tools is in charge for preparing auth credentials in node-sp-auth` format