diff --git a/.DS_Store b/.DS_Store
index 9e5bbdc..4ee0774 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/.babelrc b/.babelrc
new file mode 100644
index 0000000..a2309a2
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,7 @@
+{
+ "presets": ["@babel/env", "@babel/typescript"],
+ "plugins": [
+ "@babel/proposal-class-properties",
+ "@babel/proposal-object-rest-spread"
+ ]
+}
diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 0000000..7106f71
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,67 @@
+version: 2.1
+
+executors:
+ base:
+ docker:
+ - image: circleci/node:14
+ working_directory: /home/circleci/pdjs
+
+jobs:
+ build:
+ executor: base
+ steps:
+ - checkout
+ - restore_cache:
+ key: dependency-cache-{{ checksum "package-lock.json" }}
+ - run:
+ name: Install NPM
+ command: npm ci --prefer-offline
+ - save_cache:
+ key: dependency-cache-{{ checksum "package-lock.json" }}
+ paths:
+ - ./node_modules
+ - run:
+ name: Build packages
+ command: npm run build
+ - store_artifacts:
+ path: dist
+ lint:
+ executor: base
+ steps:
+ - checkout
+ - restore_cache:
+ key: dependency-cache-{{ checksum "package-lock.json" }}
+ - run:
+ name: Install NPM
+ command: npm ci --prefer-offline
+ - save_cache:
+ key: dependency-cache-{{ checksum "package-lock.json" }}
+ paths:
+ - ./node_modules
+ - run:
+ name: Lint
+ command: npm run lint
+ test:
+ executor: base
+ steps:
+ - checkout
+ - restore_cache:
+ key: dependency-cache-{{ checksum "package-lock.json" }}
+ - run:
+ name: Install NPM
+ command: npm ci --prefer-offline
+ - save_cache:
+ key: dependency-cache-{{ checksum "package-lock.json" }}
+ paths:
+ - ./node_modules
+ - run:
+ name: Test
+ command: npm run test
+
+
+workflows:
+ build-and-test:
+ jobs:
+ - build
+ - lint
+ - test
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..2fde08f
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,2 @@
+dist/*
+build/*
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..f95bb33
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "./node_modules/gts/"
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dd87e2d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+build
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..a7e8e21
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,2 @@
+build
+dist
\ No newline at end of file
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 0000000..c5166c2
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ ...require('gts/.prettierrc.json'),
+};
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 07eb0df..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Contributing to PDJS
-
-This project is work of [many contributors](https://github.com/PagerDuty/pdjs/graphs/contributors).
-
-You're encouraged to submit [pull requests](https://github.com/PagerDuty/pdjs/pulls), [propose features and discuss issues](https://github.com/PagerDuty/pdjs/issues).
-
-In the examples below, substitute your Github username for `contributor` in URLs.
-
-## Create a Topic Branch
-
-Create a topic branch for your feature or bug fix.
-
-```
-git checkout master
-git pull origin master
-git checkout -b my-branch
-```
-
-## Write Code
-
-Implement your feature or bug fix.
-
-## Write Documentation
-
-Document any external behavior in the [README](README.md).
-
-## Commit Changes
-
-Make sure git knows your name and email address:
-
-```
-git config --global user.name "Your Name"
-git config --global user.email "contributor@example.com"
-```
-
-Writing good commit logs is important. A commit log should accurately describe what changes were introduced
-
-```
-git add ...
-git commit
-```
-
-## Push
-
-```
-git push origin my-branch
-```
-
-## Make a Pull Request
-
-Go to https://github.com/PagerDuty/pdjs and select your feature branch.
-Click the 'Pull Request' button and fill out the form.
-
-
-## Check on Your Pull Request
-
-Check your pull request to see whether its been approved or not.
-
-## Be Patient
-
-It's likely that your change will not be merged right away and maintainers might require some changes to your code
-
-## Thank You
-
-Thanks for contributing! We really do value your time and effort.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/PDJS-es6.js b/PDJS-es6.js
deleted file mode 100644
index 791fbbc..0000000
--- a/PDJS-es6.js
+++ /dev/null
@@ -1,93 +0,0 @@
-class PDJSObj{
- function logg(str) {
- if (this.logging) {
- return console.log(str);
- }
- }
-
- function req(){
- return this.req_count++;
- }
-
- constructor(params) {
- let _ref;
- if (params == null) {
- params = {};
- }
- this.subdomain = params.subdomain;
- this.async = (_ref = params.async === false) != null ? _ref : {
- "false": true
- };
- this.token = params.token;
- this.refresh = params.refresh || 60;
- this.refresh_in_ms = this.refresh * 1000;
- this.protocol = params.protocol || "https";
- this.server = params.server || "pagerduty.com";
- this.logging = params.logging || false;
- this.req_count = 1;
- this.api_version = params.api_version || "v2";
- this.logg("Initializing PDJSobj");
- }
-
- function no_success_function(json, callerparams) {
- this.logg("no success function defined for " + callerparams.res);
- return this.logg(json);
- }
-
- function error_function(err, callerparams) {
- let anyerror, error_detail;
- console.log("Error for " + callerparams.res);
- console.log(err.status);
- error_detail = err.responseText;
- try {
- error_detail = JSON.parse(error_detail);
- } catch (_error) {
- anyerror = _error;
- this.logg("Not an JSON error");
- }
- return console.log(error_detail);
- };
- }
-
- function api(params){
- if (params == null) {
- params = {};
- }
- this.logg("Call to API: " + params.res);
- params.url = params.url || this.protocol + "://api." + this.server + "/" + params.res;
- params.attempt = params.attempt || 0;
- params.async = params.async || this.async;
- params.headers = params.headers || {};
- params.contentType = "application/json; charset=utf-8";
- params.dataType = "json";
- if(this.api_version == "v2"){
- params.accepts = {json: 'application/vnd.pagerduty+json;version=2'};
- }
- params.data = params.data || {};
- params.data.PDJSversion = PDJSobj.version;
- params.data.request_count = this.req();
- params.data.attempt = params.attempt++;
- this.logg("params.data:");
- this.logg(params.data);
- params.type = (params.type || "GET").toUpperCase();
- if (params.type === "POST" || params.type === "PUT") {
- params.data = JSON.stringify(params.data);
- }
- params.headers.Authorization = 'Token token=' + this.token;
- params.error = params.error || (function(_this) {
- return function(err) {
- return _this.error_function(err, params);
- };
- })(this);
- params.success = params.success || (function(_this) {
- return function(data) {
- return _this.no_success_function(data, params);
- };
- })(this);
- this.logg(params);
- return $.ajax(params);
- }
-
-
-
-}
diff --git a/README.md b/README.md
old mode 100755
new mode 100644
index b412289..f264e90
--- a/README.md
+++ b/README.md
@@ -1,143 +1,170 @@
-PDJS (PagerDuty based JavaScript API)
-====
-This is a simple client-side JavaScript wrapper to the [PagerDuty API](https://v2.developer.pagerduty.com/v2/docs).
-
-## Making an API request
-### Setup PDJSobj
-1. First, you'll need the following dependencies included in your project to utilize PDJS.
- * [pdjs.js](https://github.com/PagerDuty/pdjs) -- you can download it and manually add it to your project. Or, `npm i pagerduty-pdjs`.
-1. Create a `PDJSobj` object, setting values for the `subdomain`, `token`, and `api_version` fields on the object.
-```javascript
-var PDJS = new PDJSobj({
- subdomain: 'webdemo',
- token: 'rcgtBVpizBZQjDzE3Hub',
- api_version: 'v1',
- logging: true
-});
+# README
+
+A simple JavaScript wrapper for the PagerDuty APIs.
+
+ - Supports Node and Browser environments
+ - Supports REST and Events v2 APIs.
+ - Supports both offset and cursor based pagination
+
+For full [API Reference see this page.](https://developer.pagerduty.com/api-reference)
+
+## Installation
+
+```bash
+npm install --save @pagerduty/pdjs
```
- * `subdomain` -- for this example we're using the `webdemo`, but you would want to put in your subdomain.
- * `token` -- your [API token](https://support.pagerduty.com/docs/using-the-api#section-generating-a-general-access-rest-api-key). The one above is to provide read-only access to the `webdemo` account. You can decide what kind of access your token will provide when you create it.
- * `api_version` -- By default, `PDJS` uses version 2 of the PagerDuty REST and Events API. To request version 1, the api version needs to be specified here. The **api_version** parameter is optional.
-
-### Call API:
-The most basic way to make an API call with `PDJS` is to use the `PDJS.api()` function.
+## Usage
+
+### REST API
+
+REST API calls can be done using the convenience methods or by passing in a `url` or `endpoint`.
+
+#### Convenience Methods
+
+There are some simply convience methods. `get()`, `post()`, `put()`, and `delete()`.
+
```javascript
-PDJS.api({
- res: 'services',
- data: {
- limit: 20,
- },
- success: function (data) {
- console.log(data)
- },
-})
+import {api} from 'pdjs';
+
+const pd = api({token: 'someToken1234567890'})
+
+pd.get('/incidents')
+ .then({data, resource, next} => console.log(data, resource, next))
+ .catch(console.error);
+
+// Similarly, for `post`, `put`, `patch` and `delete`.
+pd.post('/incidents', { data: { ... } }).then(...)
```
- * `res` -- the API endpoint and path you're calling*
- * `data` -- the query-string parameters that can be appended to the endpoint. This parameter is optional.
- * `success` -- the callback function that is called when the API call completes successfully. This is **required**.
- * `error` -- the callback function that is called when there is an error with the API call. This parameter is optional, though recommended.
-*In addition to specififying the endpoint, the `res` parameter may have an ID in it. For example, here's how to get the [notes](https://v2.developer.pagerduty.com/v2/page/api-reference#!/Incidents/get_incidents_id_notes) for an `incident` with the ID of `PNCII2E`.
+#### `url` or `endpoint`
```javascript
-PDJS.api({
- res: 'incidents/PNCII2E/notes',
- success: function (data) {
- alert(JSON.stringify(data))
- },
-})
+// Calling the returned function with a `endpoint` or `url` will also send it.
+pd({
+ method: 'post',
+ endpoint: '/incidents',
+ data: {
+ ...
+ }
+}).then(...)
```
-### PUT and POST
-`POST` and `PUT` requests are also supported.
-For instance, the following snippet adds a `contact_method` for `user: test@example.com`, and then adding a notification rule to alert that email address after 900 minutes:
+#### The Response Object
+
+The PD object always returns an APIResponse object which contains some raw data as well as a convenient shortcut to directly access the returns Resource.
```javascript
-add_contact_method = function(user_id) {
- PDJS.api({
- res: `users/${user_id}/contact_methods`,
- type: 'POST',
- data: {
- contact_method: {
- type:'email_contact_method',
- address:'test4@example.com',
- label: 'Added from PDJS',
- }
- },
- success: function (data) {
- console.log('New contact method ID: ' + data.contact_method.id)
- add_notification_rule(user_id, data.contact_method, 900)
- }
- })
-}
-add_notification_rule = function(user_id, contact_method, start_delay_in_minutes) {
- PDJS.api({
- res: `users/${user_id}/notification_rules`,
- type: 'POST',
- data: {
- notification_rule: {
- type: "assignment_notification_rule",
- contact_method: contact_method,
- start_delay_in_minutes: start_delay_in_minutes,
- urgency: "high"
- }
- },
- success: function (data) {
- console.log(data)
- console.log('New notification rule ID: ' + data.notification_rule.id)
- }
+pd.get('/incidents')
+ .then({resource, data, response, next} => {
+ console.log(resource); // Contains the data of resource request. In this example the 'incidents' data.
+ console.log(data); // The raw data returned from the API, also contains pagination information.
+ console.log(response); // The response object returned from the cross-fetch
+ console.log(next); // A convenience function to help with pagination
})
-}
+ .catch(console.error);
-add_contact_method('PRJRF7T');
```
-To see this code in action go to the [add_contact_method example](examples/add_contact_method.html).
-## The *api_all* helper
+### Events API
+
+Events V2 is supported along with Change Events.
-In addition to `PDJS.api()` there's also `PDJS.api_all()` which is a helper method that will handle limits and offsets for lists longer than 100 elements:
```javascript
-PDJS.api_all({
- res: 'incidents',
+import {event} from 'pdjs';
+
+event({
data: {
- since: '2013-08-01T09:53:17-07:00',
- until: '2013-08-14T09:53:17-07:00',
- status: 'resolved',
- fields: 'incident_number,status,created_on,service'
- },
- final_success: function(data) {
- console.log(data.total + ' objects!');
- console.log(data);
+ routing_key: 'YOUR_ROUTING_KEY',
+ event_action: 'trigger',
+ dedup_key: 'test_incident_2_88f520',
+ payload: {
+ summary: 'Test Event V2',
+ source: 'test-source',
+ severity: 'error',
+ },
},
- incremental_success: function(data) {
- console.log('Got data');
- }
})
+ .then(console.log)
+ .catch(console.error);
```
-It works the same as `PDJS.api()`, except you'll need to specify one or more of:
- * a *function* to run on **final_success** at the end
- * a *function* to run on each **incremental_success**
+#### Convenience Methods
-That's kind of nifty.
+```javascript
+import {change, trigger, acknowledge, resolve} from 'pdjs';
+
+change({
+ "routing_key": "YOUR_ROUTING_KEY",
+ "payload": {
+ "summary": "Build Success:!",
+ "timestamp": "2015-07-17T08:42:58.315+0000",
+ "source": "prod-build-agent",
+ "custom_details": {
+ "build_state": "passed",
+ "build_number": "220",
+ "run_time": "1337s"
+ }
+ },
+ "links": [{
+ "href": "https://buildpipeline.com",
+ "text": "View in Build Pipeline"
+ }]
+})
+ .then(console.log)
+ .catch(console.error);
+
+trigger({...})
+ .then(console.log)
+ .catch(console.error);
+acknowledge({...})
+ .then(console.log)
+ .catch(console.error);
+resolve({...})
+ .then(console.log)
+ .catch(console.error);
+```
+
+### Pagination
+
+There's an async `all` that attempts to fetch all pages for a given endpoint and set of parameters. For convenience this function supports both offset and cursor based pagination.
+
+Note that the PagerDuty API has a limit of 10,000 for most endpoints and recommends using parameters to refine searches where more results are necessary. More information can be found in the [Developer Documentation.](https://developer.pagerduty.com/docs/rest-api-v2/pagination/)
+
+```javascript
+import {all} from 'pdjs';
+
+// List every API-accessible incident.
+const responses = await all({
+ token: 'someToken1234567890',
+ endpoint: '/incidents',
+ limit: 5000,
+});
-## Examples
+for (response of responses) {
+ console.log(response.data);
+}
+```
-To get an idea for how `PDJS` works, there's an examples directory:
+### Retries
- * [examples/incidents.html](https://pagerduty.github.io/pdjs/examples/incidents.html) polls the [incidents](http://developer.pagerduty.com/documentation/rest/incidents/list) api and displays the triggered & acknowledged incidents
- * [examples/report.html](https://pagerduty.github.io/pdjs/examples/report.html) shows off *api_all* by looping through all the events on my webdemo account for the last 30 days and prints them out as a CSV-esque thing that you could paste into a CSV file
+There is some very simple retry logic baked into each request in the case that the PagerDuty API rate limits your requests (only when it responds HTTP Code 429). Requests will retry 3 times waiting 20 seconds between each request. If the request is still being rate limited after 3 attemps the client will simply return the 429 response.
-## Compiling the Base Script:
-`PDJS` is written in [CoffeeScript](http://coffeescript.org/). To make changes to the library, you'll edit the `coffee/pdjsbase.coffee` file and compile it by running the command below from the `pdjs` directory to produce the JavaScript.
+### Browser
-`coffee --output js/pdjs.js --compile --watch coffee/ `
+Two browser-ready scripts are provided:
-## More info
-This project is for client-side JavaScript. If you're looking for a Node library, we recommend the [node-pagerduty](https://github.com/kmart2234/node-pagerduty) library.
+- [dist/pdjs.js](https://raw.githubusercontent.com/PagerDuty/pdjs/main/dist/pdjs.js): For browsers supporting `fetch`.
+- [dist/pdjs-legacy.js](https://raw.githubusercontent.com/PagerDuty/pdjs/maindist/pdjs-legacy.js): For older browsers requiring a `fetch` polyfill -- mostly IE 11.
-Are you using this library or have questions? Let us know by posting to the [PagerDuty Community Developer Forum](https://community.pagerduty.com/c/dev).
+Either of these files can be used by copying them into your project and including them directly, with all functions namespaced `PagerDuty`:
-You might notice that PDJS sends along some extra parameters, nothing scary, we use those to track QoS across our language-specific libraries.
+```html
+
+
+```
diff --git a/coffee/pdjsbase.coffee b/coffee/pdjsbase.coffee
deleted file mode 100644
index 7e3032b..0000000
--- a/coffee/pdjsbase.coffee
+++ /dev/null
@@ -1,164 +0,0 @@
-class window.PDJSobj
- @version = "PDJS-1.1.0"
- logg: (str) ->
- if(this.logging)
- console.log(str)
- req: () ->
- return this.req_count++
-
- constructor: (params = {}) ->
- this.async = params.async == false ? false : true;
- this.token = params.token
- this.refresh = params.refresh || 60
- this.refresh_in_ms = this.refresh * 1000
- this.protocol = params.protocol || "https"
- this.server = params.server || "pagerduty.com"
- this.logging = params.logging || false
- this.req_count = 1
- this.logg("Initializing PDJSobj")
-
- # If you don't specify a callback, show something useful for debugging
- no_success_function: (json, callerparams) ->
- this.logg("no success function defined for "+ callerparams.res)
- this.logg(json)
-
- # If you don't override the callback on error we do the basic error handling
- error_function: (err, callerparams) ->
- console.log("Error for "+callerparams.res)
- console.log(err.status)
- error_detail = err.responseText
- try
- error_detail = JSON.parse(error_detail)
- catch anyerror
- this.logg("Not an JSON error")
- console.log(error_detail)
- # PDJStools.logg(err)
- # TODO Handle these:
- # 0 Failed to connect to anything
- # 401 bad auth
- # 400 Thing not found
-
- api: (params = {}) ->
- this.logg("Call to API: "+ params.res)
- #PDJStools.logg(params)
- params.url = params.url || @protocol+"://api."+this.server+"/"+params.res
- params.attempt = params.attempt || 0
- params.async = params.async || this.async # For batch jobs, async helps us avoid getting throttled
- params.headers = params.headers || {}
- params.contentType = "application/json; charset=utf-8"
- params.dataType = "json"
- params.accepts = { json: 'application/vnd.pagerduty+json;version=2' }
- params.data = params.data || {}
- params.data.PDJSversion = PDJSobj.version
- params.data.request_count = this.req()
- params.data.attempt = params.attempt++
- this.logg("params.data:")
- this.logg(params.data)
- params.type = (params.type||"GET").toUpperCase()
- if(params.type=="POST" || params.type=="PUT") # the update APIs expect the data in the body to be JSON
- params.data = JSON.stringify(params.data)
- params.headers.Authorization = 'Token token='+this.token
- params.error = params.error || ((err) =>
- this.error_function(err, params))
- params.success = params.success || ((data) =>
- this.no_success_function(data, params))
- this.logg(params)
- this.sendRequest(params)
-
- # For list queries, this will recursively keep getting the next offset
- api_all: (params = {}, datasofar=[]) ->
- params.data = params.data || {}
- params.data.limit = 100
- params.data.offset = params.data.offset || 0
- params.final_success = params.final_success || ((data) =>
- this.no_success_function(data, params))
- params.incremental_success = params.incremental_success || ((data) =>
- 0)
- params.success = ((data) =>
- data.res = params.res
- params.incremental_success(data[params.res])
- datasofar = datasofar.concat(data[params.res])
- window.datasofar = datasofar
- window.d = data
- if(data.total > data.limit+data.offset)
- this.logg("Getting more")
- params.data.offset+=params.data.limit
- this.api_all(params, datasofar)
- else
- this.logg("All done")
- this.logg(params)
- data[params.res] = datasofar
- data.res = params.res
- data.offset = 0
- data.limit = data.total
- this.logg(data)
- params.final_success(data))
-
- this.logg(params)
- this.api(params)
-
- # the event API is different enough to have its own function
- event: (params = {}) ->
- this.logg("Create an event")
- params.type = "POST"
- params.url = params.url || @protocol+"://events."+this.server+"/generic/2010-04-15/create_event.json"
-
- params.data = params.data || {}
- params.headers = params.headers || {}
- params.data.service_key = params.data.service_key || params.service_key || this.logg("No service key")
- params.data.event_type = params.data.event_type || params.event_type || "trigger"
- params.data.incident_key = params.data.incident_key || params.incident_key || "Please specify an incident_key"
- params.data.client = params.data.client || params.client if params.client
- params.data.client_url = params.data.client_url || params.client_url if params.client_url
- params.data.description = params.data.description || params.description || "No description provided"
- params.data.details = params.data.details || params.details || {}
- params.data.contexts = params.data.contexts || params.contexts || {}
- params.data = JSON.stringify(params.data)
-
- params.contentType = "application/json; charset=utf-8"
- params.dataType = "json"
- params.error = params.error || ((err) =>
- this.error_function(err, params))
- params.success = params.success || ((data) =>
- this.no_success_function(data, params))
- this.sendRequest(params)
-
- # Shortcut methods
- trigger: (params = {}) ->
- params.event_type = "trigger"
- this.event(params)
- # Todo: add some examples to the docs
- acknowledge: (params = {}) ->
- params.event_type = "acknowledge"
- this.event(params)
- resolve: (params = {}) ->
- params.event_type = "resolve"
- this.event(params)
-
-
- sendRequest: (params = {}) ->
- { accepts, contentType, data, error, headers, success, type, url } = params
- xhr = new XMLHttpRequest();
-
- if type is 'GET'
- query = ''
- Object.keys(data).map (key) ->
- if query != ''
- query += '&'
- query += key + '=' + encodeURIComponent(data[key])
-
- url += '?' + query
-
- xhr.open(type, url)
- xhr.setRequestHeader('Content-Type', contentType)
- xhr.setRequestHeader('Authorization', headers.Authorization)
- if accepts?.json?
- xhr.setRequestHeader('Accept', accepts.json)
-
- xhr.onload = () ->
- if xhr.status >= 200 and xhr.status < 300
- success(JSON.parse(xhr.responseText))
- else
- error(JSON.parse(xhr.responseText))
-
- xhr.send(data)
diff --git a/dist/pdjs-legacy.js b/dist/pdjs-legacy.js
new file mode 100644
index 0000000..9807a9e
--- /dev/null
+++ b/dist/pdjs-legacy.js
@@ -0,0 +1,2 @@
+var PagerDuty;PagerDuty=(()=>{var t={988:(t,e)=>{"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var r=0;r{"use strict";r.r(e),r.d(e,{acknowledge:()=>F,all:()=>A,api:()=>T,change:()=>C,event:()=>q,resolve:()=>L,trigger:()=>M});var n=r(98),o=r.n(n),i=r(988),u=r(818);function s(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function a(t){for(var e=1;e=0||(o[r]=t[r]);return o}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function l(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=e,o=r.queryParameters,i=r.requestTimeout,u=void 0===i?3e4:i,s=f(r,["queryParameters","requestTimeout"]);return t=d(t=new URL(t.toString()),o),e=b(e,u),p(t.toString(),3,a(a({},s),{},{headers:new n.Headers(a(a({"Content-Type":"application/json; charset=utf-8"},h()),s.headers))}))}function p(t,e,r){return new Promise((function(n,i){o()(t,r).then((function(o){if(0===e)return n(o);if(429===o.status){var u=r.retryTimeout;y(void 0===u?2e4:u).then((function(){p(t,e-1,r).then(n).catch(i)}))}else n(o)}))}))}var y=function(t){return new Promise((function(e){return setTimeout(e,t)}))};function h(){return u.jU?{}:{"User-Agent":"pdjs/".concat("2.0.0"," (").concat(process.version,"/").concat(process.platform,")")}}function d(t,e){if(!e)return t;for(var r=t.searchParams,n=function(){var t=i[o],n=e[t];Array.isArray(n)?n.forEach((function(e){r.append(t,e)})):r.append(t,n)},o=0,i=Object.keys(e);o]+)>/g,(function(t,e){return"$"+r[e]})))}if("function"==typeof e){var i=this;return n[Symbol.replace].call(this,t,(function(){var t=[];return t.push.apply(t,arguments),"object"!==v(t[t.length-1])&&t.push(u(t,i)),e.apply(this,t)}))}return n[Symbol.replace].call(this,t,e)},m.apply(this,arguments)}function g(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&P(t,e)}function O(t){var e="function"==typeof Map?new Map:void 0;return(O=function(t){if(null===t||(r=t,-1===Function.toString.call(r).indexOf("[native code]")))return t;var r;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return w(t,arguments,E(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),P(n,t)})(t)}function w(t,e,r){return(w=j()?Reflect.construct:function(t,e,r){var n=[null];n.push.apply(n,e);var o=new(Function.bind.apply(t,n));return r&&P(o,r.prototype),o}).apply(null,arguments)}function j(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}function P(t,e){return(P=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function E(t){return(E=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function S(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function x(t){for(var e=1;e=0||(o[r]=t[r]);return o}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}(t,["endpoint","server","token","url","version","data"]),y=x(x({method:"GET"},p),{},{headers:x({Accept:"application/vnd.pagerduty+json;version=".concat(f),Authorization:"Token token=".concat(s)},p.headers)});return r=y.method,!["PUT","POST","DELETE","PATCH"].includes(null!==(n=r.toUpperCase())&&void 0!==n?n:"GET")&&l?y.queryParameters=null!==(e=y.queryParameters)&&void 0!==e?e:l:y.body=JSON.stringify(l),R(null!=a?a:"https://".concat(u,"/").concat(o.replace(/^\/+/,"")),y)}function A(t){return T(t).then((function(t){return D([t])}))}function D(t){var e=t[t.length-1];return e.next?e.next().then((function(e){return D(t.concat([e]))})):Promise.resolve(t)}function R(t,e){return l(t,e).then((function(r){var n=r,o=function(t){var e=t.match(m(/.+.com\/([0-9A-Z_a-z]+)/,{resource:1}));return e?e[1]:null}(t);return r.json().then((function(i){return n.next=function(t,e,r){if(function(t){return void 0!==t.offset}(r)){if((null==r?void 0:r.more)&&void 0!==v(r.offset)&&r.limit)return function(){return R(t,x(x({},e),{},{queryParameters:x(x({},e.queryParameters),{},{limit:r.limit.toString(),offset:(r.limit+r.offset).toString()})}))}}else if(function(t){return void 0!==t.cursor}(r)&&(null==r?void 0:r.cursor))return function(){return R(t,x(x({},e),{},{queryParameters:x(x({},e.queryParameters),{},{cursor:r.cursor,limit:r.limit.toString()})}))}}(t,e,i),n.data=i,n.resource=o?i[o]:null,n.response=r,n}))}))}function B(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function U(t){for(var e=1;e=0||(o[r]=t[r]);return o}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}(t,["server","type","data"]),s="https://".concat(r,"/v2/enqueue");return"change"===o&&(s="https://".concat(r,"/v2/change/enqueue")),function(t,e){return l(t,e).then((function(t){var e=t;return t.json().then((function(r){return e.data=r,e.response=t,e}))}))}(s,U({method:"POST",body:JSON.stringify(i)},u))}var I=function(t){return function(e){return q(U(U({},e),{},{data:U(U({},e.data),{},k({},"event_action",t))}))}},M=I("trigger"),F=I("acknowledge"),L=I("resolve"),C=function(t){return q(U(U({},t),{},{type:"change"}))}},818:(t,e)=>{"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n="undefined"!=typeof window&&void 0!==window.document;"object"===("undefined"==typeof self?"undefined":r(self))&&self.constructor&&self.constructor.name,"undefined"!=typeof process&&null!=process.versions&&process.versions.node;e.jU=n},98:function(t,e){var r=function(t){function e(){this.fetch=!1,this.DOMException=t.DOMException}return e.prototype=t,new e}("undefined"!=typeof self?self:this);!function(t){!function(e){var r="URLSearchParams"in t,n="Symbol"in t&&"iterator"in Symbol,o="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),i="FormData"in t,u="ArrayBuffer"in t;if(u)var s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],a=ArrayBuffer.isView||function(t){return t&&s.indexOf(Object.prototype.toString.call(t))>-1};function c(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function f(t){return"string"!=typeof t&&(t=String(t)),t}function l(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return n&&(e[Symbol.iterator]=function(){return e}),e}function p(t){this.map={},t instanceof p?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function y(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function h(t){return new Promise((function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}}))}function d(t){var e=new FileReader,r=h(e);return e.readAsArrayBuffer(t),r}function b(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function v(){return this.bodyUsed=!1,this._initBody=function(t){var e;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:o&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:i&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:r&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():u&&o&&(e=t)&&DataView.prototype.isPrototypeOf(e)?(this._bodyArrayBuffer=b(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):u&&(ArrayBuffer.prototype.isPrototypeOf(t)||a(t))?this._bodyArrayBuffer=b(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},o&&(this.blob=function(){var t=y(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?y(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(d)}),this.text=function(){var t,e,r,n=y(this);if(n)return n;if(this._bodyBlob)return t=this._bodyBlob,r=h(e=new FileReader),e.readAsText(t),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?n:r),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&o)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(o)}function O(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}})),e}function w(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new p(e.headers),this.url=e.url||"",this._initBody(t)}g.prototype.clone=function(){return new g(this,{body:this._bodyInit})},v.call(g.prototype),v.call(w.prototype),w.prototype.clone=function(){return new w(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},w.error=function(){var t=new w(null,{status:0,statusText:""});return t.type="error",t};var j=[301,302,303,307,308];w.redirect=function(t,e){if(-1===j.indexOf(e))throw new RangeError("Invalid status code");return new w(null,{status:e,headers:{location:t}})},e.DOMException=t.DOMException;try{new e.DOMException}catch(t){e.DOMException=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack},e.DOMException.prototype=Object.create(Error.prototype),e.DOMException.prototype.constructor=e.DOMException}function P(t,r){return new Promise((function(n,i){var u=new g(t,r);if(u.signal&&u.signal.aborted)return i(new e.DOMException("Aborted","AbortError"));var s=new XMLHttpRequest;function a(){s.abort()}s.onload=function(){var t,e,r={status:s.status,statusText:s.statusText,headers:(t=s.getAllResponseHeaders()||"",e=new p,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();e.append(n,o)}})),e)};r.url="responseURL"in s?s.responseURL:r.headers.get("X-Request-URL");var o="response"in s?s.response:s.responseText;n(new w(o,r))},s.onerror=function(){i(new TypeError("Network request failed"))},s.ontimeout=function(){i(new TypeError("Network request failed"))},s.onabort=function(){i(new e.DOMException("Aborted","AbortError"))},s.open(u.method,u.url,!0),"include"===u.credentials?s.withCredentials=!0:"omit"===u.credentials&&(s.withCredentials=!1),"responseType"in s&&o&&(s.responseType="blob"),u.headers.forEach((function(t,e){s.setRequestHeader(e,t)})),u.signal&&(u.signal.addEventListener("abort",a),s.onreadystatechange=function(){4===s.readyState&&u.signal.removeEventListener("abort",a)}),s.send(void 0===u._bodyInit?null:u._bodyInit)}))}P.polyfill=!0,t.fetch||(t.fetch=P,t.Headers=p,t.Request=g,t.Response=w),e.Headers=p,e.Request=g,e.Response=w,e.fetch=P}({})}(r),delete r.fetch.polyfill,(e=r.fetch).default=r.fetch,e.fetch=r.fetch,e.Headers=r.Headers,e.Request=r.Request,e.Response=r.Response,t.exports=e}},e={};function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{}};return t[n].call(o.exports,o,o.exports,r),o.exports}return r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r(47)})();
+//# sourceMappingURL=pdjs-legacy.js.map
\ No newline at end of file
diff --git a/dist/pdjs-legacy.js.map b/dist/pdjs-legacy.js.map
new file mode 100644
index 0000000..f0fd07b
--- /dev/null
+++ b/dist/pdjs-legacy.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack://PagerDuty/./node_modules/abortcontroller-polyfill/dist/cjs-ponyfill.js","webpack://PagerDuty/./src/common.ts","webpack://PagerDuty/./src/api.ts","webpack://PagerDuty/./src/events.ts","webpack://PagerDuty/./node_modules/browser-or-node/lib/index.js","webpack://PagerDuty/./node_modules/cross-fetch/dist/browser-ponyfill.js","webpack://PagerDuty/webpack/bootstrap","webpack://PagerDuty/webpack/startup","webpack://PagerDuty/webpack/runtime/compat get default export","webpack://PagerDuty/webpack/runtime/define property getters","webpack://PagerDuty/webpack/runtime/hasOwnProperty shorthand","webpack://PagerDuty/webpack/runtime/make namespace object"],"names":["_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","prototype","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","_setPrototypeOf","p","_assertThisInitialized","self","ReferenceError","_possibleConstructorReturn","call","_get","property","receiver","Reflect","get","base","object","hasOwnProperty","_superPropBase","desc","getOwnPropertyDescriptor","value","Emitter","this","type","callback","listeners","push","stack","l","splice","event","_this","debounce","setTimeout","defaultPrevented","AbortSignal","_Emitter","subClass","superClass","create","constructor","_inherits","Derived","hasNativeReflectConstruct","_super","construct","sham","Proxy","Date","toString","e","_isNativeReflectConstruct","result","Super","NewTarget","arguments","apply","_this2","aborted","onabort","AbortController","Event","document","createEvent","initEvent","createEventObject","bubbles","cancelable","signal","dispatchEvent","Symbol","toStringTag","exports","request","url","options","queryParameters","requestTimeout","rest","applyParameters","URL","applyTimeout","fetch_retry","headers","Headers","userAgentHeader","retries","Promise","resolve","reject","fetch","then","response","status","retryTimeout","retryTimeoutPromise","milliseconds","isBrowser","process","version","platform","combinedParameters","searchParams","parameter","Array","isArray","forEach","item","append","keys","search","init","timeout","controller","abort","api","apiParameters","endpoint","partialParameters","partial","shorthand","method","shorthandParameters","post","put","patch","all","partialCall","server","token","data","config","Accept","Authorization","includes","toUpperCase","body","JSON","stringify","apiRequest","replace","allInner","responses","next","concat","apiResponse","resource","match","resourceKey","json","undefined","offset","isOffsetPagination","more","limit","cursor","isCursorPagination","nextFunc","eventParameters","eventFetch","action","trigger","acknowledge","change","_typeof","iterator","obj","window","name","versions","node","__self__","root","F","DOMException","support","Blob","viewClasses","isArrayBufferView","ArrayBuffer","isView","indexOf","normalizeName","String","test","toLowerCase","normalizeValue","iteratorFor","items","shift","done","map","header","getOwnPropertyNames","consumed","bodyUsed","fileReaderReady","reader","onload","onerror","error","readBlobAsArrayBuffer","blob","FileReader","promise","readAsArrayBuffer","bufferClone","buf","slice","view","Uint8Array","byteLength","set","buffer","Body","_initBody","_bodyInit","_bodyText","isPrototypeOf","_bodyBlob","FormData","_bodyFormData","URLSearchParams","DataView","_bodyArrayBuffer","rejected","Error","arrayBuffer","text","readAsText","chars","fromCharCode","join","readArrayBufferAsText","formData","decode","parse","oldValue","has","thisArg","values","entries","methods","Request","input","upcased","credentials","mode","referrer","form","trim","split","bytes","decodeURIComponent","Response","bodyInit","ok","statusText","clone","redirectStatuses","redirect","RangeError","location","err","message","xhr","XMLHttpRequest","abortXhr","rawHeaders","getAllResponseHeaders","line","parts","responseURL","responseText","ontimeout","open","withCredentials","responseType","setRequestHeader","addEventListener","onreadystatechange","readyState","removeEventListener","send","polyfill","default","module","__webpack_module_cache__","__webpack_require__","moduleId","__webpack_modules__","n","getter","__esModule","d","a","definition","prop","r"],"mappings":"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","file":"pdjs-legacy.js","sourcesContent":["'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n}\n\nfunction _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n}\n\nfunction _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = _getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\n}\n\nfunction _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = _superPropBase(target, property);\n\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n}\n\nvar Emitter = /*#__PURE__*/function () {\n function Emitter() {\n _classCallCheck(this, Emitter);\n\n Object.defineProperty(this, 'listeners', {\n value: {},\n writable: true,\n configurable: true\n });\n }\n\n _createClass(Emitter, [{\n key: \"addEventListener\",\n value: function addEventListener(type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n\n this.listeners[type].push(callback);\n }\n }, {\n key: \"removeEventListener\",\n value: function removeEventListener(type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n\n var stack = this.listeners[type];\n\n for (var i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n return;\n }\n }\n }\n }, {\n key: \"dispatchEvent\",\n value: function dispatchEvent(event) {\n var _this = this;\n\n if (!(event.type in this.listeners)) {\n return;\n }\n\n var debounce = function debounce(callback) {\n setTimeout(function () {\n return callback.call(_this, event);\n });\n };\n\n var stack = this.listeners[event.type];\n\n for (var i = 0, l = stack.length; i < l; i++) {\n debounce(stack[i]);\n }\n\n return !event.defaultPrevented;\n }\n }]);\n\n return Emitter;\n}();\n\nvar AbortSignal = /*#__PURE__*/function (_Emitter) {\n _inherits(AbortSignal, _Emitter);\n\n var _super = _createSuper(AbortSignal);\n\n function AbortSignal() {\n var _this2;\n\n _classCallCheck(this, AbortSignal);\n\n _this2 = _super.call(this); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent\n // constructor has failed to run, then \"this.listeners\" will still be undefined and then we call\n // the parent constructor directly instead as a workaround. For general details, see babel bug:\n // https://github.com/babel/babel/issues/3041\n // This hack was added as a fix for the issue described here:\n // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042\n\n if (!_this2.listeners) {\n Emitter.call(_assertThisInitialized(_this2));\n } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and\n // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl\n\n\n Object.defineProperty(_assertThisInitialized(_this2), 'aborted', {\n value: false,\n writable: true,\n configurable: true\n });\n Object.defineProperty(_assertThisInitialized(_this2), 'onabort', {\n value: null,\n writable: true,\n configurable: true\n });\n return _this2;\n }\n\n _createClass(AbortSignal, [{\n key: \"toString\",\n value: function toString() {\n return '[object AbortSignal]';\n }\n }, {\n key: \"dispatchEvent\",\n value: function dispatchEvent(event) {\n if (event.type === 'abort') {\n this.aborted = true;\n\n if (typeof this.onabort === 'function') {\n this.onabort.call(this, event);\n }\n }\n\n _get(_getPrototypeOf(AbortSignal.prototype), \"dispatchEvent\", this).call(this, event);\n }\n }]);\n\n return AbortSignal;\n}(Emitter);\nvar AbortController = /*#__PURE__*/function () {\n function AbortController() {\n _classCallCheck(this, AbortController);\n\n // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and\n // we want Object.keys(new AbortController()) to be [] for compat with the native impl\n Object.defineProperty(this, 'signal', {\n value: new AbortSignal(),\n writable: true,\n configurable: true\n });\n }\n\n _createClass(AbortController, [{\n key: \"abort\",\n value: function abort() {\n var event;\n\n try {\n event = new Event('abort');\n } catch (e) {\n if (typeof document !== 'undefined') {\n if (!document.createEvent) {\n // For Internet Explorer 8:\n event = document.createEventObject();\n event.type = 'abort';\n } else {\n // For Internet Explorer 11:\n event = document.createEvent('Event');\n event.initEvent('abort', false, false);\n }\n } else {\n // Fallback where document isn't available:\n event = {\n type: 'abort',\n bubbles: false,\n cancelable: false\n };\n }\n }\n\n this.signal.dispatchEvent(event);\n }\n }, {\n key: \"toString\",\n value: function toString() {\n return '[object AbortController]';\n }\n }]);\n\n return AbortController;\n}();\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n // These are necessary to make sure that we get correct output for:\n // Object.prototype.toString.call(new AbortController())\n AbortController.prototype[Symbol.toStringTag] = 'AbortController';\n AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';\n}\n\nfunction polyfillNeeded(self) {\n if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {\n console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill');\n return true;\n } // Note that the \"unfetch\" minimal fetch polyfill defines fetch() without\n // defining window.Request, and this polyfill need to work on top of unfetch\n // so the below feature detection needs the !self.AbortController part.\n // The Request.prototype check is also needed because Safari versions 11.1.2\n // up to and including 12.1.x has a window.AbortController present but still\n // does NOT correctly implement abortable fetch:\n // https://bugs.webkit.org/show_bug.cgi?id=174980#c2\n\n\n return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController;\n}\n\n/**\n * Note: the \"fetch.Request\" default value is available for fetch imported from\n * the \"node-fetch\" package and not in browsers. This is OK since browsers\n * will be importing umd-polyfill.js from that path \"self\" is passed the\n * decorator so the default value will not be used (because browsers that define\n * fetch also has Request). One quirky setup where self.fetch exists but\n * self.Request does not is when the \"unfetch\" minimal fetch polyfill is used\n * on top of IE11; for this case the browser will try to use the fetch.Request\n * default value which in turn will be undefined but then then \"if (Request)\"\n * will ensure that you get a patched fetch but still no Request (as expected).\n * @param {fetch, Request = fetch.Request}\n * @returns {fetch: abortableFetch, Request: AbortableRequest}\n */\n\nfunction abortableFetchDecorator(patchTargets) {\n if ('function' === typeof patchTargets) {\n patchTargets = {\n fetch: patchTargets\n };\n }\n\n var _patchTargets = patchTargets,\n fetch = _patchTargets.fetch,\n _patchTargets$Request = _patchTargets.Request,\n NativeRequest = _patchTargets$Request === void 0 ? fetch.Request : _patchTargets$Request,\n NativeAbortController = _patchTargets.AbortController,\n _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL,\n __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;\n\n if (!polyfillNeeded({\n fetch: fetch,\n Request: NativeRequest,\n AbortController: NativeAbortController,\n __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL: __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL\n })) {\n return {\n fetch: fetch,\n Request: Request\n };\n }\n\n var Request = NativeRequest; // Note that the \"unfetch\" minimal fetch polyfill defines fetch() without\n // defining window.Request, and this polyfill need to work on top of unfetch\n // hence we only patch it if it's available. Also we don't patch it if signal\n // is already available on the Request prototype because in this case support\n // is present and the patching below can cause a crash since it assigns to\n // request.signal which is technically a read-only property. This latter error\n // happens when you run the main5.js node-fetch example in the repo\n // \"abortcontroller-polyfill-examples\". The exact error is:\n // request.signal = init.signal;\n // ^\n // TypeError: Cannot set property signal of # which has only a getter\n\n if (Request && !Request.prototype.hasOwnProperty('signal') || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {\n Request = function Request(input, init) {\n var signal;\n\n if (init && init.signal) {\n signal = init.signal; // Never pass init.signal to the native Request implementation when the polyfill has\n // been installed because if we're running on top of a browser with a\n // working native AbortController (i.e. the polyfill was installed due to\n // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our\n // fake AbortSignal to the native fetch will trigger:\n // TypeError: Failed to construct 'Request': member signal is not of type AbortSignal.\n\n delete init.signal;\n }\n\n var request = new NativeRequest(input, init);\n\n if (signal) {\n Object.defineProperty(request, 'signal', {\n writable: false,\n enumerable: false,\n configurable: true,\n value: signal\n });\n }\n\n return request;\n };\n\n Request.prototype = NativeRequest.prototype;\n }\n\n var realFetch = fetch;\n\n var abortableFetch = function abortableFetch(input, init) {\n var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : undefined;\n\n if (signal) {\n var abortError;\n\n try {\n abortError = new DOMException('Aborted', 'AbortError');\n } catch (err) {\n // IE 11 does not support calling the DOMException constructor, use a\n // regular error object on it instead.\n abortError = new Error('Aborted');\n abortError.name = 'AbortError';\n } // Return early if already aborted, thus avoiding making an HTTP request\n\n\n if (signal.aborted) {\n return Promise.reject(abortError);\n } // Turn an event into a promise, reject it once `abort` is dispatched\n\n\n var cancellation = new Promise(function (_, reject) {\n signal.addEventListener('abort', function () {\n return reject(abortError);\n }, {\n once: true\n });\n });\n\n if (init && init.signal) {\n // Never pass .signal to the native implementation when the polyfill has\n // been installed because if we're running on top of a browser with a\n // working native AbortController (i.e. the polyfill was installed due to\n // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our\n // fake AbortSignal to the native fetch will trigger:\n // TypeError: Failed to execute 'fetch' on 'Window': member signal is not of type AbortSignal.\n delete init.signal;\n } // Return the fastest promise (don't need to wait for request to finish)\n\n\n return Promise.race([cancellation, realFetch(input, init)]);\n }\n\n return realFetch(input, init);\n };\n\n return {\n fetch: abortableFetch,\n Request: Request\n };\n}\n\nexports.AbortController = AbortController;\nexports.AbortSignal = AbortSignal;\nexports.abortableFetch = abortableFetchDecorator;\n","/* LEGACY-BROWSER-SUPPORT-START */\nimport fetch, {Headers} from 'cross-fetch';\nimport {AbortController} from 'abortcontroller-polyfill/dist/cjs-ponyfill';\nimport {isBrowser} from 'browser-or-node';\n/* LEGACY-BROWSER-SUPPORT-END */\n\nconst VERSION = '2.0.0';\n\ntype QueryParameter = Record>;\n\nexport interface RequestOptions extends RequestInit {\n queryParameters?: QueryParameter;\n retryCount?: number;\n requestTimeout?: number;\n retryTimeout?: number;\n timeout?: number;\n}\n\nexport function request(\n url: string | URL,\n options: RequestOptions = {}\n): Promise {\n const {queryParameters, requestTimeout = 30000, ...rest} = options;\n\n url = new URL(url.toString());\n\n url = applyParameters(url, queryParameters);\n options = applyTimeout(options, requestTimeout);\n\n return fetch_retry(url.toString(), 3, {\n ...rest,\n headers: new Headers({\n 'Content-Type': 'application/json; charset=utf-8',\n /* LEGACY-BROWSER-SUPPORT-START */\n ...userAgentHeader(),\n /* LEGACY-BROWSER-SUPPORT-END */\n ...rest.headers,\n }),\n });\n}\n\nfunction fetch_retry(\n url: string,\n retries: number,\n options: RequestOptions\n): Promise {\n return new Promise((resolve, reject) => {\n fetch(url, options).then(response => {\n // We don't want to `reject` when retries have finished\n // Instead simply stop trying and return.\n if (retries === 0) return resolve(response);\n if (response.status === 429) {\n const {retryTimeout = 20000} = options;\n retryTimeoutPromise(retryTimeout).then(() => {\n fetch_retry(url, retries - 1, options)\n .then(resolve)\n .catch(reject);\n });\n } else {\n resolve(response);\n }\n });\n });\n}\n\nconst retryTimeoutPromise = (milliseconds: number) => {\n return new Promise(resolve => setTimeout(resolve, milliseconds));\n};\n\nfunction userAgentHeader(): object {\n if (isBrowser) return {};\n\n return {\n 'User-Agent': `pdjs/${VERSION} (${process.version}/${process.platform})`,\n };\n}\n\nfunction applyParameters(url: URL, queryParameters?: QueryParameter): URL {\n if (!queryParameters) return url;\n\n const combinedParameters = url.searchParams;\n\n for (const key of Object.keys(queryParameters)) {\n const parameter = queryParameters[key];\n if (Array.isArray(parameter)) {\n // Support for array based keys like `additional_fields[]`\n parameter.forEach(item => {\n combinedParameters.append(key, item);\n });\n } else {\n combinedParameters.append(key, parameter);\n }\n }\n\n url.search = combinedParameters.toString();\n return url;\n}\n\nfunction applyTimeout(init: RequestOptions, timeout?: number): RequestOptions {\n if (!timeout) return init;\n\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n\n return {\n ...init,\n signal: controller.signal,\n };\n}\n","import {request, RequestOptions} from './common';\n\nexport interface ShorthandCall {\n (res: string, apiParameters?: Partial): APIPromise;\n}\n\nexport interface PartialCall {\n (apiParameters: APIParameters): APIPromise;\n (apiParameters: Partial): PartialCall;\n get: ShorthandCall;\n post: ShorthandCall;\n put: ShorthandCall;\n patch: ShorthandCall;\n delete: ShorthandCall;\n all: (apiParameters: APIParameters) => Promise;\n}\n\nexport type APIParameters = RequestOptions & {\n endpoint?: string;\n url?: string;\n data?: object;\n token?: string;\n server?: string;\n version?: number;\n} & ({endpoint: string} | {url: string});\n\nexport type APIPromise = Promise;\n\nexport interface APIResponse extends Response {\n data: any;\n resource: any;\n response: Response;\n next?: () => APIPromise;\n}\n\nexport function api(apiParameters: APIParameters): APIPromise;\nexport function api(apiParameters: Partial): PartialCall;\nexport function api(\n apiParameters: Partial\n): APIPromise | PartialCall {\n // If the apiParameters don't include `endpoint` treat it as a partial\n // application.\n if (!apiParameters.endpoint && !apiParameters.url) {\n return partialCall(apiParameters);\n }\n\n const {\n endpoint,\n server = 'api.pagerduty.com',\n token,\n url,\n version = 2,\n data,\n ...rest\n } = apiParameters;\n\n const config: RequestOptions = {\n method: 'GET',\n ...rest,\n headers: {\n Accept: `application/vnd.pagerduty+json;version=${version}`,\n Authorization: `Token token=${token!}`,\n ...rest.headers,\n },\n };\n\n // Allow `data` for `queryParameters` for requests without bodies.\n if (isReadonlyRequest(config.method!) && data) {\n config.queryParameters =\n config.queryParameters ?? (data as Record);\n } else {\n config.body = JSON.stringify(data);\n }\n\n return apiRequest(\n url ?? `https://${server}/${endpoint!.replace(/^\\/+/, '')}`,\n config\n );\n}\n\nexport function all(apiParameters: APIParameters): Promise {\n return (api(apiParameters) as APIPromise).then(response =>\n allInner([response])\n );\n}\n\nfunction allInner(responses: APIResponse[]): Promise {\n const response = responses[responses.length - 1];\n\n if (!response.next) {\n return Promise.resolve(responses);\n }\n\n return response\n .next()\n .then(response => allInner(responses.concat([response])));\n}\n\nfunction apiRequest(url: string, options: RequestOptions): APIPromise {\n return request(url, options).then(\n (response: Response): APIPromise => {\n const apiResponse = response as APIResponse;\n const resource = resourceKey(url);\n return response.json().then(\n (data): APIResponse => {\n apiResponse.next = nextFunc(url, options, data);\n apiResponse.data = data;\n apiResponse.resource = resource ? data[resource] : null;\n apiResponse.response = response;\n return apiResponse;\n }\n );\n }\n );\n}\n\nfunction resourceKey(url: string) {\n const resource = url.match(/.+.com\\/(?[\\w]+)/);\n if (resource) {\n return resource[1];\n }\n return null;\n}\n\nfunction isReadonlyRequest(method: string) {\n return !['PUT', 'POST', 'DELETE', 'PATCH'].includes(\n method.toUpperCase() ?? 'GET'\n );\n}\n\ninterface OffsetPagination {\n type: 'offset';\n more?: boolean;\n offset?: number;\n limit?: number;\n}\n\ninterface CursorPagination {\n type: 'cursor';\n cursor?: string;\n limit?: number;\n}\n\nfunction isOffsetPagination(\n data: OffsetPagination | CursorPagination\n): data is OffsetPagination {\n if ((data as OffsetPagination).offset !== undefined) {\n return true;\n }\n return false;\n}\n\nfunction isCursorPagination(\n data: OffsetPagination | CursorPagination\n): data is CursorPagination {\n if ((data as CursorPagination).cursor !== undefined) {\n return true;\n }\n return false;\n}\n\nfunction nextFunc(\n url: string,\n options: RequestOptions,\n data: OffsetPagination | CursorPagination\n) {\n if (isOffsetPagination(data)) {\n if (data?.more && typeof data.offset !== undefined && data.limit) {\n return () =>\n apiRequest(url, {\n ...options,\n queryParameters: {\n ...options.queryParameters,\n limit: data.limit!.toString(),\n offset: (data.limit! + data.offset!).toString(),\n },\n });\n }\n } else if (isCursorPagination(data)) {\n if (data?.cursor) {\n return () =>\n apiRequest(url, {\n ...options,\n queryParameters: {\n ...options.queryParameters,\n cursor: data.cursor!,\n limit: data.limit!.toString(),\n },\n });\n }\n }\n\n return undefined;\n}\n\nfunction partialCall(apiParameters: Partial) {\n const partialParameters = apiParameters;\n const partial = ((apiParameters: Partial) =>\n api({...partialParameters, ...apiParameters})) as PartialCall;\n\n const shorthand = (method: string) => (\n endpoint: string,\n shorthandParameters?: Partial\n ): APIPromise =>\n api({\n endpoint,\n method,\n ...partialParameters,\n ...shorthandParameters,\n }) as APIPromise;\n\n partial.get = shorthand('get');\n partial.post = shorthand('post');\n partial.put = shorthand('put');\n partial.patch = shorthand('patch');\n partial.delete = shorthand('delete');\n\n partial.all = (apiParameters: APIParameters) => all(apiParameters);\n\n return partial;\n}\n","import {request, RequestOptions} from './common';\n\nexport type Action = 'trigger' | 'acknowledge' | 'resolve';\n\nexport type EventPromise = Promise;\n\nexport interface EventResponse extends Response {\n data: any;\n response: Response;\n}\n\nexport type Severity = 'critical' | 'error' | 'warning' | 'info';\n\nexport interface Image {\n src: string;\n href?: string;\n alt?: string;\n}\n\nexport interface Link {\n href: string;\n text?: string;\n}\n\nexport interface EventPayloadV2 {\n routing_key: string;\n event_action: Action;\n dedup_key?: string;\n payload: {\n summary: string;\n source: string;\n severity: Severity;\n timestamp?: string;\n component?: string;\n group?: string;\n class?: string;\n custom_details?: object;\n };\n images?: Array;\n links?: Array;\n}\n\nexport interface EventParameters extends RequestOptions {\n data: EventPayloadV2;\n type?: string;\n server?: string;\n}\n\nexport interface ChangePayload {\n routing_key: string;\n payload: {\n summary: string;\n source?: string;\n timestamp: string;\n custom_details: object;\n };\n links: Array;\n}\nexport interface ChangeParameters extends RequestOptions {\n data: ChangePayload;\n server?: string;\n}\n\nexport function event(eventParameters: EventParameters): EventPromise {\n const {\n server = 'events.pagerduty.com',\n type = 'event',\n data,\n ...config\n } = eventParameters;\n\n let url = `https://${server}/v2/enqueue`;\n if (type === 'change') {\n url = `https://${server}/v2/change/enqueue`;\n }\n\n return eventFetch(url, {\n method: 'POST',\n body: JSON.stringify(data),\n ...config,\n });\n}\n\nconst shorthand = (action: Action) => (\n eventParameters: EventParameters\n): EventPromise => {\n const typeField = 'event_action';\n\n return event({\n ...eventParameters,\n data: {\n ...eventParameters.data,\n [typeField]: action,\n },\n });\n};\n\nexport const trigger = shorthand('trigger');\nexport const acknowledge = shorthand('acknowledge');\nexport const resolve = shorthand('resolve');\nexport const change = (eventParameters: EventParameters) =>\n event({...eventParameters, type: 'change'});\n\nfunction eventFetch(url: string, options: RequestOptions): EventPromise {\n return request(url, options).then(\n (response: Response): EventPromise => {\n const apiResponse = response as EventResponse;\n return response.json().then(\n (data): EventResponse => {\n apiResponse.data = data;\n apiResponse.response = response;\n return apiResponse;\n }\n );\n }\n );\n}\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/* global window self */\n\nvar isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\n/* eslint-disable no-restricted-globals */\nvar isWebWorker = (typeof self === 'undefined' ? 'undefined' : _typeof(self)) === 'object' && self.constructor && self.constructor.name === 'DedicatedWorkerGlobalScope';\n/* eslint-enable no-restricted-globals */\n\nvar isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null;\n\n/**\n * @see https://github.com/jsdom/jsdom/releases/tag/12.0.0\n * @see https://github.com/jsdom/jsdom/issues/1537\n */\n/* eslint-disable no-undef */\nvar isJsDom = function isJsDom() {\n return typeof window !== 'undefined' && window.name === 'nodejs' || navigator.userAgent.includes('Node.js') || navigator.userAgent.includes('jsdom');\n};\n\nexports.isBrowser = isBrowser;\nexports.isWebWorker = isWebWorker;\nexports.isNode = isNode;\nexports.isJsDom = isJsDom;","var __self__ = (function (root) {\nfunction F() {\nthis.fetch = false;\nthis.DOMException = root.DOMException\n}\nF.prototype = root;\nreturn new F();\n})(typeof self !== 'undefined' ? self : this);\n(function(self) {\n\nvar irrelevant = (function (exports) {\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob:\n 'FileReader' in self &&\n 'Blob' in self &&\n (function() {\n try {\n new Blob();\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n };\n\n function isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue + ', ' + value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push(name);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) {\n items.push(value);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push([name, value]);\n });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsText(blob);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n this._bodyInit = body;\n if (!body) {\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n this._bodyText = body = Object.prototype.toString.call(body);\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n };\n }\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return methods.indexOf(upcased) > -1 ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n this.signal = input.signal;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.signal = options.signal || this.signal;\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n }\n\n Request.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n };\n\n function decode(body) {\n var form = new FormData();\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n headers.append(key, value);\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = 'statusText' in options ? options.statusText : 'OK';\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''});\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n exports.DOMException = self.DOMException;\n try {\n new exports.DOMException();\n } catch (err) {\n exports.DOMException = function(message, name) {\n this.message = message;\n this.name = name;\n var error = Error(message);\n this.stack = error.stack;\n };\n exports.DOMException.prototype = Object.create(Error.prototype);\n exports.DOMException.prototype.constructor = exports.DOMException;\n }\n\n function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n\n if (request.signal && request.signal.aborted) {\n return reject(new exports.DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest();\n\n function abortXhr() {\n xhr.abort();\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n resolve(new Response(body, options));\n };\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'));\n };\n\n xhr.onabort = function() {\n reject(new exports.DOMException('Aborted', 'AbortError'));\n };\n\n xhr.open(request.method, request.url, true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob';\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr);\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr);\n }\n };\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n }\n\n fetch.polyfill = true;\n\n if (!self.fetch) {\n self.fetch = fetch;\n self.Headers = Headers;\n self.Request = Request;\n self.Response = Response;\n }\n\n exports.Headers = Headers;\n exports.Request = Request;\n exports.Response = Response;\n exports.fetch = fetch;\n\n return exports;\n\n}({}));\n})(__self__);\ndelete __self__.fetch.polyfill\nexports = __self__.fetch // To enable: import fetch from 'cross-fetch'\nexports.default = __self__.fetch // For TypeScript consumers without esModuleInterop.\nexports.fetch = __self__.fetch // To enable: import {fetch} from 'cross-fetch'\nexports.Headers = __self__.Headers\nexports.Request = __self__.Request\nexports.Response = __self__.Response\nmodule.exports = exports\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(47);\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => module['default'] :\n\t\t() => module;\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/pdjs.js b/dist/pdjs.js
new file mode 100644
index 0000000..ad34b57
--- /dev/null
+++ b/dist/pdjs.js
@@ -0,0 +1,2 @@
+var PagerDuty;PagerDuty=(()=>{"use strict";var e={337:(e,t,r)=>{function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t,n=r.queryParameters,u=r.requestTimeout,i=void 0===u?3e4:u,f=c(r,["queryParameters","requestTimeout"]);return e=l(e=new URL(e.toString()),n),t=p(t,i),a(e.toString(),3,o(o({},f),{},{headers:new Headers(o({"Content-Type":"application/json; charset=utf-8"},f.headers))}))}function a(e,t,r){return new Promise((function(n,o){fetch(e,r).then((function(u){if(0===t)return n(u);if(429===u.status){var c=r.retryTimeout;f(void 0===c?2e4:c).then((function(){a(e,t-1,r).then(n).catch(o)}))}else n(u)}))}))}r.r(t),r.d(t,{acknowledge:()=>A,all:()=>S,api:()=>w,change:()=>C,event:()=>q,resolve:()=>M,trigger:()=>R});var f=function(e){return new Promise((function(t){return setTimeout(t,e)}))};function l(e,t){if(!t)return e;for(var r=e.searchParams,n=function(){var e=u[o],n=t[e];Array.isArray(n)?n.forEach((function(t){r.append(e,t)})):r.append(e,n)},o=0,u=Object.keys(t);o]+)>/g,(function(e,t){return"$"+r[t]})))}if("function"==typeof t){var u=this;return n[Symbol.replace].call(this,e,(function(){var e=[];return e.push.apply(e,arguments),"object"!==s(e[e.length-1])&&e.push(c(e,u)),t.apply(this,e)}))}return n[Symbol.replace].call(this,e,t)},y.apply(this,arguments)}function b(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&d(e,t)}function O(e){var t="function"==typeof Map?new Map:void 0;return(O=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return v(e,arguments,h(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),d(n,e)})(e)}function v(e,t,r){return(v=g()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&d(o,r.prototype),o}).apply(null,arguments)}function g(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function d(e,t){return(d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function h(e){return(h=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function m(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function j(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,["endpoint","server","token","url","version","data"]),y=j(j({method:"GET"},s),{},{headers:j({Accept:"application/vnd.pagerduty+json;version=".concat(l),Authorization:"Token token=".concat(i)},s.headers)});return r=y.method,!["PUT","POST","DELETE","PATCH"].includes(null!==(n=r.toUpperCase())&&void 0!==n?n:"GET")&&p?y.queryParameters=null!==(t=y.queryParameters)&&void 0!==t?t:p:y.body=JSON.stringify(p),E(null!=a?a:"https://".concat(c,"/").concat(o.replace(/^\/+/,"")),y)}function S(e){return w(e).then((function(e){return x([e])}))}function x(e){var t=e[e.length-1];return t.next?t.next().then((function(t){return x(e.concat([t]))})):Promise.resolve(e)}function E(e,t){return i(e,t).then((function(r){var n=r,o=function(e){var t=e.match(y(/.+.com\/([0-9A-Z_a-z]+)/,{resource:1}));return t?t[1]:null}(e);return r.json().then((function(u){return n.next=function(e,t,r){if(function(e){return void 0!==e.offset}(r)){if((null==r?void 0:r.more)&&void 0!==s(r.offset)&&r.limit)return function(){return E(e,j(j({},t),{},{queryParameters:j(j({},t.queryParameters),{},{limit:r.limit.toString(),offset:(r.limit+r.offset).toString()})}))}}else if(function(e){return void 0!==e.cursor}(r)&&(null==r?void 0:r.cursor))return function(){return E(e,j(j({},t),{},{queryParameters:j(j({},t.queryParameters),{},{cursor:r.cursor,limit:r.limit.toString()})}))}}(e,t,u),n.data=u,n.resource=o?u[o]:null,n.response=r,n}))}))}function T(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function D(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,["server","type","data"]),a="https://".concat(r,"/v2/enqueue");return"change"===o&&(a="https://".concat(r,"/v2/change/enqueue")),function(e,t){return i(e,t).then((function(e){var t=e;return e.json().then((function(r){return t.data=r,t.response=e,t}))}))}(a,D({method:"POST",body:JSON.stringify(u)},c))}var _=function(e){return function(t){return q(D(D({},t),{},{data:D(D({},t.data),{},k({},"event_action",e))}))}},R=_("trigger"),A=_("acknowledge"),M=_("resolve"),C=function(e){return q(D(D({},e),{},{type:"change"}))}}},t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={exports:{}};return e[n](o,o.exports,r),o.exports}return r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(337)})();
+//# sourceMappingURL=pdjs.js.map
\ No newline at end of file
diff --git a/dist/pdjs.js.map b/dist/pdjs.js.map
new file mode 100644
index 0000000..770a00b
--- /dev/null
+++ b/dist/pdjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack://PagerDuty/./src/common.ts","webpack://PagerDuty/./src/api.ts","webpack://PagerDuty/./src/events.ts","webpack://PagerDuty/webpack/bootstrap","webpack://PagerDuty/webpack/startup","webpack://PagerDuty/webpack/runtime/define property getters","webpack://PagerDuty/webpack/runtime/hasOwnProperty shorthand","webpack://PagerDuty/webpack/runtime/make namespace object"],"names":["request","url","options","queryParameters","requestTimeout","rest","applyParameters","URL","toString","applyTimeout","fetch_retry","headers","Headers","retries","Promise","resolve","reject","fetch","then","response","status","retryTimeout","retryTimeoutPromise","milliseconds","setTimeout","combinedParameters","searchParams","key","parameter","Array","isArray","forEach","item","append","Object","keys","search","init","timeout","controller","AbortController","abort","signal","api","apiParameters","endpoint","partialParameters","partial","shorthand","method","shorthandParameters","get","post","put","patch","all","partialCall","server","token","version","data","config","Accept","Authorization","includes","toUpperCase","body","JSON","stringify","apiRequest","replace","allInner","responses","length","next","concat","apiResponse","resource","match","resourceKey","json","undefined","offset","isOffsetPagination","more","limit","cursor","isCursorPagination","nextFunc","event","eventParameters","type","eventFetch","action","trigger","acknowledge","change","__webpack_module_cache__","__webpack_require__","moduleId","exports","module","__webpack_modules__","d","definition","o","defineProperty","enumerable","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value"],"mappings":"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","file":"pdjs.js","sourcesContent":["/* webpack-strip-block:removed */\n\nconst VERSION = '2.0.0';\n\ntype QueryParameter = Record>;\n\nexport interface RequestOptions extends RequestInit {\n queryParameters?: QueryParameter;\n retryCount?: number;\n requestTimeout?: number;\n retryTimeout?: number;\n timeout?: number;\n}\n\nexport function request(\n url: string | URL,\n options: RequestOptions = {}\n): Promise {\n const {queryParameters, requestTimeout = 30000, ...rest} = options;\n\n url = new URL(url.toString());\n\n url = applyParameters(url, queryParameters);\n options = applyTimeout(options, requestTimeout);\n\n return fetch_retry(url.toString(), 3, {\n ...rest,\n headers: new Headers({\n 'Content-Type': 'application/json; charset=utf-8',\n /* webpack-strip-block:removed */\n ...rest.headers,\n }),\n });\n}\n\nfunction fetch_retry(\n url: string,\n retries: number,\n options: RequestOptions\n): Promise {\n return new Promise((resolve, reject) => {\n fetch(url, options).then(response => {\n // We don't want to `reject` when retries have finished\n // Instead simply stop trying and return.\n if (retries === 0) return resolve(response);\n if (response.status === 429) {\n const {retryTimeout = 20000} = options;\n retryTimeoutPromise(retryTimeout).then(() => {\n fetch_retry(url, retries - 1, options)\n .then(resolve)\n .catch(reject);\n });\n } else {\n resolve(response);\n }\n });\n });\n}\n\nconst retryTimeoutPromise = (milliseconds: number) => {\n return new Promise(resolve => setTimeout(resolve, milliseconds));\n};\n\nfunction userAgentHeader(): object {\n if (isBrowser) return {};\n\n return {\n 'User-Agent': `pdjs/${VERSION} (${process.version}/${process.platform})`,\n };\n}\n\nfunction applyParameters(url: URL, queryParameters?: QueryParameter): URL {\n if (!queryParameters) return url;\n\n const combinedParameters = url.searchParams;\n\n for (const key of Object.keys(queryParameters)) {\n const parameter = queryParameters[key];\n if (Array.isArray(parameter)) {\n // Support for array based keys like `additional_fields[]`\n parameter.forEach(item => {\n combinedParameters.append(key, item);\n });\n } else {\n combinedParameters.append(key, parameter);\n }\n }\n\n url.search = combinedParameters.toString();\n return url;\n}\n\nfunction applyTimeout(init: RequestOptions, timeout?: number): RequestOptions {\n if (!timeout) return init;\n\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n\n return {\n ...init,\n signal: controller.signal,\n };\n}\n","import {request, RequestOptions} from './common';\n\nexport interface ShorthandCall {\n (res: string, apiParameters?: Partial): APIPromise;\n}\n\nexport interface PartialCall {\n (apiParameters: APIParameters): APIPromise;\n (apiParameters: Partial): PartialCall;\n get: ShorthandCall;\n post: ShorthandCall;\n put: ShorthandCall;\n patch: ShorthandCall;\n delete: ShorthandCall;\n all: (apiParameters: APIParameters) => Promise;\n}\n\nexport type APIParameters = RequestOptions & {\n endpoint?: string;\n url?: string;\n data?: object;\n token?: string;\n server?: string;\n version?: number;\n} & ({endpoint: string} | {url: string});\n\nexport type APIPromise = Promise;\n\nexport interface APIResponse extends Response {\n data: any;\n resource: any;\n response: Response;\n next?: () => APIPromise;\n}\n\nexport function api(apiParameters: APIParameters): APIPromise;\nexport function api(apiParameters: Partial): PartialCall;\nexport function api(\n apiParameters: Partial\n): APIPromise | PartialCall {\n // If the apiParameters don't include `endpoint` treat it as a partial\n // application.\n if (!apiParameters.endpoint && !apiParameters.url) {\n return partialCall(apiParameters);\n }\n\n const {\n endpoint,\n server = 'api.pagerduty.com',\n token,\n url,\n version = 2,\n data,\n ...rest\n } = apiParameters;\n\n const config: RequestOptions = {\n method: 'GET',\n ...rest,\n headers: {\n Accept: `application/vnd.pagerduty+json;version=${version}`,\n Authorization: `Token token=${token!}`,\n ...rest.headers,\n },\n };\n\n // Allow `data` for `queryParameters` for requests without bodies.\n if (isReadonlyRequest(config.method!) && data) {\n config.queryParameters =\n config.queryParameters ?? (data as Record);\n } else {\n config.body = JSON.stringify(data);\n }\n\n return apiRequest(\n url ?? `https://${server}/${endpoint!.replace(/^\\/+/, '')}`,\n config\n );\n}\n\nexport function all(apiParameters: APIParameters): Promise {\n return (api(apiParameters) as APIPromise).then(response =>\n allInner([response])\n );\n}\n\nfunction allInner(responses: APIResponse[]): Promise {\n const response = responses[responses.length - 1];\n\n if (!response.next) {\n return Promise.resolve(responses);\n }\n\n return response\n .next()\n .then(response => allInner(responses.concat([response])));\n}\n\nfunction apiRequest(url: string, options: RequestOptions): APIPromise {\n return request(url, options).then(\n (response: Response): APIPromise => {\n const apiResponse = response as APIResponse;\n const resource = resourceKey(url);\n return response.json().then(\n (data): APIResponse => {\n apiResponse.next = nextFunc(url, options, data);\n apiResponse.data = data;\n apiResponse.resource = resource ? data[resource] : null;\n apiResponse.response = response;\n return apiResponse;\n }\n );\n }\n );\n}\n\nfunction resourceKey(url: string) {\n const resource = url.match(/.+.com\\/(?[\\w]+)/);\n if (resource) {\n return resource[1];\n }\n return null;\n}\n\nfunction isReadonlyRequest(method: string) {\n return !['PUT', 'POST', 'DELETE', 'PATCH'].includes(\n method.toUpperCase() ?? 'GET'\n );\n}\n\ninterface OffsetPagination {\n type: 'offset';\n more?: boolean;\n offset?: number;\n limit?: number;\n}\n\ninterface CursorPagination {\n type: 'cursor';\n cursor?: string;\n limit?: number;\n}\n\nfunction isOffsetPagination(\n data: OffsetPagination | CursorPagination\n): data is OffsetPagination {\n if ((data as OffsetPagination).offset !== undefined) {\n return true;\n }\n return false;\n}\n\nfunction isCursorPagination(\n data: OffsetPagination | CursorPagination\n): data is CursorPagination {\n if ((data as CursorPagination).cursor !== undefined) {\n return true;\n }\n return false;\n}\n\nfunction nextFunc(\n url: string,\n options: RequestOptions,\n data: OffsetPagination | CursorPagination\n) {\n if (isOffsetPagination(data)) {\n if (data?.more && typeof data.offset !== undefined && data.limit) {\n return () =>\n apiRequest(url, {\n ...options,\n queryParameters: {\n ...options.queryParameters,\n limit: data.limit!.toString(),\n offset: (data.limit! + data.offset!).toString(),\n },\n });\n }\n } else if (isCursorPagination(data)) {\n if (data?.cursor) {\n return () =>\n apiRequest(url, {\n ...options,\n queryParameters: {\n ...options.queryParameters,\n cursor: data.cursor!,\n limit: data.limit!.toString(),\n },\n });\n }\n }\n\n return undefined;\n}\n\nfunction partialCall(apiParameters: Partial) {\n const partialParameters = apiParameters;\n const partial = ((apiParameters: Partial) =>\n api({...partialParameters, ...apiParameters})) as PartialCall;\n\n const shorthand = (method: string) => (\n endpoint: string,\n shorthandParameters?: Partial\n ): APIPromise =>\n api({\n endpoint,\n method,\n ...partialParameters,\n ...shorthandParameters,\n }) as APIPromise;\n\n partial.get = shorthand('get');\n partial.post = shorthand('post');\n partial.put = shorthand('put');\n partial.patch = shorthand('patch');\n partial.delete = shorthand('delete');\n\n partial.all = (apiParameters: APIParameters) => all(apiParameters);\n\n return partial;\n}\n","import {request, RequestOptions} from './common';\n\nexport type Action = 'trigger' | 'acknowledge' | 'resolve';\n\nexport type EventPromise = Promise;\n\nexport interface EventResponse extends Response {\n data: any;\n response: Response;\n}\n\nexport type Severity = 'critical' | 'error' | 'warning' | 'info';\n\nexport interface Image {\n src: string;\n href?: string;\n alt?: string;\n}\n\nexport interface Link {\n href: string;\n text?: string;\n}\n\nexport interface EventPayloadV2 {\n routing_key: string;\n event_action: Action;\n dedup_key?: string;\n payload: {\n summary: string;\n source: string;\n severity: Severity;\n timestamp?: string;\n component?: string;\n group?: string;\n class?: string;\n custom_details?: object;\n };\n images?: Array;\n links?: Array;\n}\n\nexport interface EventParameters extends RequestOptions {\n data: EventPayloadV2;\n type?: string;\n server?: string;\n}\n\nexport interface ChangePayload {\n routing_key: string;\n payload: {\n summary: string;\n source?: string;\n timestamp: string;\n custom_details: object;\n };\n links: Array;\n}\nexport interface ChangeParameters extends RequestOptions {\n data: ChangePayload;\n server?: string;\n}\n\nexport function event(eventParameters: EventParameters): EventPromise {\n const {\n server = 'events.pagerduty.com',\n type = 'event',\n data,\n ...config\n } = eventParameters;\n\n let url = `https://${server}/v2/enqueue`;\n if (type === 'change') {\n url = `https://${server}/v2/change/enqueue`;\n }\n\n return eventFetch(url, {\n method: 'POST',\n body: JSON.stringify(data),\n ...config,\n });\n}\n\nconst shorthand = (action: Action) => (\n eventParameters: EventParameters\n): EventPromise => {\n const typeField = 'event_action';\n\n return event({\n ...eventParameters,\n data: {\n ...eventParameters.data,\n [typeField]: action,\n },\n });\n};\n\nexport const trigger = shorthand('trigger');\nexport const acknowledge = shorthand('acknowledge');\nexport const resolve = shorthand('resolve');\nexport const change = (eventParameters: EventParameters) =>\n event({...eventParameters, type: 'change'});\n\nfunction eventFetch(url: string, options: RequestOptions): EventPromise {\n return request(url, options).then(\n (response: Response): EventPromise => {\n const apiResponse = response as EventResponse;\n return response.json().then(\n (data): EventResponse => {\n apiResponse.data = data;\n apiResponse.response = response;\n return apiResponse;\n }\n );\n }\n );\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tif(__webpack_module_cache__[moduleId]) {\n\t\treturn __webpack_module_cache__[moduleId].exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// module exports must be returned from runtime so entry inlining is disabled\n// startup\n// Load entry module and return exports\nreturn __webpack_require__(337);\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"sourceRoot":""}
\ No newline at end of file
diff --git a/examples/.DS_Store b/examples/.DS_Store
deleted file mode 100644
index 5008ddf..0000000
Binary files a/examples/.DS_Store and /dev/null differ
diff --git a/examples/add_contact_method.html b/examples/add_contact_method.html
deleted file mode 100644
index 96a4249..0000000
--- a/examples/add_contact_method.html
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-Add Contact Method For a PD User
-
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/browser.html b/examples/browser.html
new file mode 100644
index 0000000..b11596a
--- /dev/null
+++ b/examples/browser.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+