mirror of
https://github.com/sasjs/adapter.git
synced 2025-12-11 01:14:36 +00:00
312 lines
39 KiB
HTML
312 lines
39 KiB
HTML
<!doctype html>
|
|
<html class="default no-js">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<title>@sasjs/adapter</title>
|
|
<meta name="description" content="">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<link rel="stylesheet" href="assets/css/main.css">
|
|
<script async src="assets/js/search.js" id="search-script"></script>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<div class="tsd-page-toolbar">
|
|
<div class="container">
|
|
<div class="table-wrap">
|
|
<div class="table-cell" id="tsd-search" data-index="assets/js/search.json" data-base=".">
|
|
<div class="field">
|
|
<label for="tsd-search-field" class="tsd-widget search no-caption">Search</label>
|
|
<input id="tsd-search-field" type="text" />
|
|
</div>
|
|
<ul class="results">
|
|
<li class="state loading">Preparing search index...</li>
|
|
<li class="state failure">The search index is not available</li>
|
|
</ul>
|
|
<ul class="results-priority" style="display:none">
|
|
</ul>
|
|
<a href="index.html" class="title">@sasjs/adapter</a>
|
|
 <a href="https://github.com/sasjs/adapter" class="title">SASjs on Github</a>
|
|
 <a href="https://sasjs.io" class="title">SASjs.io</a>
|
|
 <a href="https://github.com/sasjs/cli" class="title">SASjs CLI</a>
|
|
 <a href="https://github.com/sasjs/react-seed-app" class="title">React Seed App</a>
|
|
</div>
|
|
<div class="table-cell" id="tsd-widgets">
|
|
<div id="tsd-filter">
|
|
<a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a>
|
|
<div class="tsd-filter-group">
|
|
<div class="tsd-select" id="tsd-filter-visibility">
|
|
<span class="tsd-select-label">All</span>
|
|
<ul class="tsd-select-list">
|
|
<li data-value="public">Public</li>
|
|
<li data-value="protected">Public/Protected</li>
|
|
<li data-value="private" class="selected">All</li>
|
|
</ul>
|
|
</div>
|
|
<input type="checkbox" id="tsd-filter-inherited" checked />
|
|
<label class="tsd-widget" for="tsd-filter-inherited">Inherited</label>
|
|
</div>
|
|
</div>
|
|
<a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="tsd-page-title">
|
|
<div class="container">
|
|
<ul class="tsd-breadcrumb">
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
<div class="container container-main">
|
|
<div class="row">
|
|
<div class="col-3 col-menu menu-sticky-wrap menu-highlight">
|
|
<nav class="tsd-navigation outline primary">
|
|
<a style="margin-left:0em" href="modules.html">Modules</a>
|
|
<ul style="display:none">
|
|
{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
<div class="col-7 offset-3 col-content">
|
|
<h1>@sasjs/adapter</h1>
|
|
<div class="tsd-panel tsd-typography">
|
|
<a href="#sasjsadapter" id="sasjsadapter" style="color: inherit; text-decoration: none;">
|
|
<h1>@sasjs/adapter</h1>
|
|
</a>
|
|
<p><a href="http://npmjs.org/package/@sasjs/adapter"><img src="https://img.shields.io/npm/v/@sasjs/adapter.svg" alt="npm package"></a>
|
|
<a href="https://github.com/sasjs/adapter/blob/main/.github/workflows/build.yml"><img src="https://github.com/sasjs/adapter/actions/workflows/build.yml/badge.svg" alt="Github Workflow"></a>
|
|
<a href="https://github.com/sasjs/adapter/blob/main/package.json"><img src="https://david-dm.org/sasjs/adapter.svg" alt="Dependency Status"></a>
|
|
<a href=""><img src="https://img.shields.io/npm/dt/@sasjs/adapter" alt="npm"></a>
|
|
<img src="https://img.shields.io/snyk/vulnerabilities/npm/@sasjs/adapter" alt="Snyk Vulnerabilities for npm package">
|
|
<a href="/LICENSE"><img src="https://img.shields.io/apm/l/atomic-design-ui.svg" alt="License"></a>
|
|
<img src="https://img.shields.io/github/languages/top/sasjs/adapter" alt="GitHub top language">
|
|
<img src="https://img.shields.io/github/issues/sasjs/adapter" alt="GitHub issues">
|
|
<a href="https://gitpod.io/#https://github.com/sasjs/adapter"><img src="https://img.shields.io/badge/Gitpod-ready--to--code-908a85?logo=gitpod" alt="Gitpod ready-to-code"></a></p>
|
|
<p>SASjs is a open-source framework for building Web Apps on SAS® platforms. You can use as much or as little of it as you like. This repository contains the JS adapter, the part that handles the to/from SAS communication on the client side. There are 3 ways to install it:</p>
|
|
<p>1 - <code>npm install @sasjs/adapter</code> - for use in a node project</p>
|
|
<p>2 - <a href="https://cdn.jsdelivr.net/npm/@sasjs/adapter@2/index.js">Download</a> and use a copy of the latest JS file</p>
|
|
<p>3 - Reference directly from the CDN - in which case click <a href="https://www.jsdelivr.com/package/npm/@sasjs/adapter?tab=collection">here</a> and select "SRI" to get the script tag with the integrity hash.</p>
|
|
<p>If you are short on time and just need to build an app quickly, then check out <a href="https://vimeo.com/393161794">this video</a> and the <a href="https://github.com/sasjs/react-seed-app">react-seed-app</a> which provides some boilerplate.</p>
|
|
<p>For more information on building web apps with SAS, check out <a href="https://sasjs.io">sasjs.io</a></p>
|
|
<a href="#none-of-this-makes-sense-how-do-i-build-an-app-with-it" id="none-of-this-makes-sense-how-do-i-build-an-app-with-it" style="color: inherit; text-decoration: none;">
|
|
<h2>None of this makes sense. How do I build an app with it?</h2>
|
|
</a>
|
|
<p>Ok ok. Deploy this <a href="https://raw.githubusercontent.com/sasjs/adapter/master/example.html">example.html</a> file to your web server, and update <code>servertype</code> to <code>SAS9</code> or <code>SASVIYA</code> depending on your backend.</p>
|
|
<p>The backend part can be deployed as follows:</p>
|
|
<pre><code class="language-sas"><span class="hljs-built_in">%let</span> appLoc=/Public/app/readme; <span class="hljs-comment">/* Metadata or Viya Folder per SASjs config */</span>
|
|
<span class="hljs-meta">filename</span> mc url <span class="hljs-string">"https://raw.githubusercontent.com/sasjs/core/main/all.sas"</span>;
|
|
<span class="hljs-name">%inc</span> mc; <span class="hljs-comment">/* compile macros (can also be downloaded & compiled seperately) */</span>
|
|
<span class="hljs-meta">filename</span> ft15f001 temp;
|
|
parm<span class="hljs-emphasis">cards4;
|
|
%webout(FETCH) /* receive all data as SAS datasets */
|
|
proc sql;
|
|
create table areas as select make,mean(invoice) as avprice
|
|
from sashelp.cars
|
|
where type in (select type from work.fromjs)
|
|
group by 1;
|
|
%webout(OPEN)
|
|
%webout(OBJ,areas)
|
|
%webout(CLOSE)
|
|
;;;;
|
|
%mp_createwebservice(path=&appLoc/common,name=getdata)</span>
|
|
</code></pre>
|
|
<p>You now have a simple web app with a backend service!</p>
|
|
<a href="#detailed-overview" id="detailed-overview" style="color: inherit; text-decoration: none;">
|
|
<h2>Detailed Overview</h2>
|
|
</a>
|
|
<p>The SASjs adapter is a JS library and a set of SAS Macros that handle the communication between the frontend app and backend SAS services.</p>
|
|
<p>There are three parts to consider:</p>
|
|
<ol>
|
|
<li>JS request / response</li>
|
|
<li>SAS inputs / outputs</li>
|
|
<li>Configuration</li>
|
|
</ol>
|
|
<a href="#js-request--response" id="js-request--response" style="color: inherit; text-decoration: none;">
|
|
<h3>JS Request / Response</h3>
|
|
</a>
|
|
<p>To install the library you can simply run <code>npm i @sasjs/adapter</code> or include a <code><script></code> tag with a reference to our <a href="https://www.jsdelivr.com/package/npm/@sasjs/adapter">CDN</a>.</p>
|
|
<p>Full technical documentation is available <a href="https://adapter.sasjs.io">here</a>. The main parts are:</p>
|
|
<a href="#instantiation" id="instantiation" style="color: inherit; text-decoration: none;">
|
|
<h3>Instantiation</h3>
|
|
</a>
|
|
<p>The following code will instantiate an instance of the adapter:</p>
|
|
<pre><code class="language-javascript"><span class="hljs-keyword">let</span> sasJs = <span class="hljs-keyword">new</span> SASjs.default(
|
|
{
|
|
<span class="hljs-attr">appLoc</span>: <span class="hljs-string">"/Your/SAS/Folder"</span>,
|
|
<span class="hljs-attr">serverType</span>:<span class="hljs-string">"SAS9"</span>
|
|
}
|
|
);
|
|
</code></pre>
|
|
<p>If you've installed it via NPM, you can import it as a default import like so:</p>
|
|
<pre><code class="language-js"> <span class="hljs-keyword">import</span> SASjs <span class="hljs-keyword">from</span> <span class="hljs-string">'@sasjs/adapter'</span>;
|
|
</code></pre>
|
|
<p>You can then instantiate it with:</p>
|
|
<pre><code class="language-js"><span class="hljs-keyword">const</span> sasJs = <span class="hljs-keyword">new</span> SASjs({your config})
|
|
</code></pre>
|
|
<p>More on the config later.</p>
|
|
<a href="#sas-logon" id="sas-logon" style="color: inherit; text-decoration: none;">
|
|
<h3>SAS Logon</h3>
|
|
</a>
|
|
<p>The login process can be handled directly, as below, or as a callback function to a SAS request.</p>
|
|
<pre><code class="language-javascript">sasJs.logIn(<span class="hljs-string">'USERNAME'</span>,<span class="hljs-string">'PASSWORD'</span>
|
|
).then(<span class="hljs-function">(<span class="hljs-params">response</span>) =></span> {
|
|
<span class="hljs-keyword">if</span> (response.isLoggedIn === <span class="hljs-literal">true</span>) {
|
|
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">'do stuff'</span>)
|
|
} <span class="hljs-keyword">else</span> {
|
|
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">'do other stuff'</span>)
|
|
}
|
|
}
|
|
</code></pre>
|
|
<a href="#request--response" id="request--response" style="color: inherit; text-decoration: none;">
|
|
<h3>Request / Response</h3>
|
|
</a>
|
|
<p>A simple request can be sent to SAS in the following fashion:</p>
|
|
<pre><code class="language-javascript">sasJs.request(<span class="hljs-string">"/path/to/my/service"</span>, dataObject)
|
|
.then(<span class="hljs-function">(<span class="hljs-params">response</span>) =></span> {
|
|
<span class="hljs-comment">// all tables are in the response object, eg:</span>
|
|
<span class="hljs-built_in">console</span>.log(response.tablewith2cols1row[<span class="hljs-number">0</span>].COL1.value)
|
|
})
|
|
</code></pre>
|
|
<p>We supply the path to the SAS service, and a data object. The data object can be null (for services with no input), or can contain one or more tables in the following format:</p>
|
|
<pre><code class="language-javascript"><span class="hljs-keyword">let</span> dataObject={
|
|
<span class="hljs-string">"tablewith2cols1row"</span>: [{
|
|
<span class="hljs-string">"col1"</span>: <span class="hljs-string">"val1"</span>,
|
|
<span class="hljs-string">"col2"</span>: <span class="hljs-number">42</span>
|
|
}],
|
|
<span class="hljs-string">"tablewith1col2rows"</span>: [{
|
|
<span class="hljs-string">"col"</span>: <span class="hljs-string">"row1"</span>
|
|
}, {
|
|
<span class="hljs-string">"col"</span>: <span class="hljs-string">"row2"</span>
|
|
}]
|
|
};
|
|
</code></pre>
|
|
<p>There are optional parameters such as a config object and a callback login function.</p>
|
|
<p>The response object will contain returned tables and columns. Table names are always lowercase, and column names uppercase.</p>
|
|
<p>The adapter will also cache the logs (if debug enabled) and even the work tables. For performance, it is best to keep debug mode off.</p>
|
|
<a href="#sas-inputs--outputs" id="sas-inputs--outputs" style="color: inherit; text-decoration: none;">
|
|
<h2>SAS Inputs / Outputs</h2>
|
|
</a>
|
|
<p>The SAS side is handled by a number of macros in the <a href="https://github.com/sasjs/core">macro core</a> library.</p>
|
|
<p>The following snippet shows the process of SAS tables arriving / leaving:</p>
|
|
<pre><code class="language-sas"><span class="hljs-comment">/* fetch all input tables sent from frontend - they arrive as work tables */</span>
|
|
<span class="hljs-name">%webout</span>(FETCH)
|
|
|
|
<span class="hljs-comment">/* some sas code */</span>
|
|
<span class="hljs-keyword">data </span>some sas tables;
|
|
<span class="hljs-meta">set</span> <span class="hljs-meta">from</span> js;
|
|
<span class="hljs-keyword">run;</span>
|
|
|
|
<span class="hljs-name">%webout</span>(OPEN) <span class="hljs-comment">/* open the JSON to be returned */</span>
|
|
<span class="hljs-name">%webout</span>(OBJ,some) <span class="hljs-comment">/* `some` table is sent in object format */</span>
|
|
<span class="hljs-name">%webout</span>(ARR,sas) <span class="hljs-comment">/* `sas` table is sent in array format, smaller filesize */</span>
|
|
<span class="hljs-name">%webout</span>(OBJ,tables,fmt=N) <span class="hljs-comment">/* unformatted (raw) data */</span>
|
|
<span class="hljs-name">%webout</span>(OBJ,tables,<span class="hljs-meta">label</span>=newtable) <span class="hljs-comment">/* rename tables on export */</span>
|
|
<span class="hljs-name">%webout</span>(CLOSE) <span class="hljs-comment">/* close the JSON and send some extra useful variables too */</span>
|
|
</code></pre>
|
|
<a href="#configuration" id="configuration" style="color: inherit; text-decoration: none;">
|
|
<h2>Configuration</h2>
|
|
</a>
|
|
<p>Configuration on the client side involves passing an object on startup, which can also be passed with each request. Technical documentation on the SASjsConfig class is available <a href="https://adapter.sasjs.io/classes/types.sasjsconfig.html">here</a>. The main config items are:</p>
|
|
<ul>
|
|
<li><code>appLoc</code> - this is the folder under which the SAS services will be created.</li>
|
|
<li><code>serverType</code> - either <code>SAS9</code> or <code>SASVIYA</code>.</li>
|
|
<li><code>serverUrl</code> - the location (including http protocol and port) of the SAS Server. Can be omitted, eg if serving directly from the SAS Web Server, or in streaming mode.</li>
|
|
<li><code>debug</code> - if <code>true</code> then SAS Logs and extra debug information is returned.</li>
|
|
<li><code>LoginMechanism</code> - either <code>Default</code> or <code>Redirected</code>. If <code>Redirected</code> then authentication occurs through the injection of an additional screen, which contains the SASLogon prompt. This allows for more complex authentication flows (such as 2FA) and avoids the need to handle passwords in the application itself. The styling of the redirect flow can also be modified. If left at "Default" then the developer must capture the username and password and use these with the <code>.login()</code> method.</li>
|
|
<li><code>useComputeApi</code> - Only relevant when the serverType is <code>SASVIYA</code>. If <code>true</code> the <a href="#using-the-compute-api">Compute API</a> is used. If <code>false</code> the <a href="#using-the-jes-api">JES API</a> is used. If <code>null</code> or <code>undefined</code> the <a href="#using-jes-web-app">Web</a> approach is used.</li>
|
|
<li><code>contextName</code> - Compute context on which the requests will be called. If missing or not provided, defaults to <code>Job Execution Compute context</code>.</li>
|
|
</ul>
|
|
<p>The adapter supports a number of approaches for interfacing with Viya (<code>serverType</code> is <code>SASVIYA</code>). For maximum performance, be sure to <a href="https://sasjs.io/guide-viya/#shared-account-and-server-re-use">configure your compute context</a> with <code>reuseServerProcesses</code> as <code>true</code> and a system account in <code>runServerAs</code>. This functionality is available since Viya 3.5. This configuration is supported when <a href="https://sasjs.io/sasjs-cli-context/#sasjs-context-create">creating contexts using the CLI</a>.</p>
|
|
<a href="#using-jes-web-app" id="using-jes-web-app" style="color: inherit; text-decoration: none;">
|
|
<h3>Using JES Web App</h3>
|
|
</a>
|
|
<p>In this setup, all requests are routed through the JES web app, at <code>YOURSERVER/SASJobExecution?_program=/your/program</code>. This is the most reliable method, and also the slowest. One request is made to the JES app, and remaining requests (getting job uri, session spawning, passing parameters, running the program, fetching the log) are handled by the SAS server inside the JES app.</p>
|
|
<pre><code>{
|
|
appLoc:<span class="hljs-string">"/Your/Path"</span>,
|
|
serverType:<span class="hljs-string">"SASVIYA"</span>,
|
|
contextName: <span class="hljs-string">'yourComputeContext'</span>
|
|
}
|
|
</code></pre>
|
|
<p>Note - to use the web approach, the <code>useComputeApi</code> property must be <code>undefined</code> or <code>null</code>.</p>
|
|
<a href="#using-the-jes-api" id="using-the-jes-api" style="color: inherit; text-decoration: none;">
|
|
<h3>Using the JES API</h3>
|
|
</a>
|
|
<p>Here we are running Jobs using the Job Execution Service except this time we are making the requests directly using the REST API instead of through the JES Web App. This is helpful when we need to call web services outside of a browser (eg with the SASjs CLI or other commandline tools). To save one network request, the adapter prefetches the JOB URIs and passes them in the <code>__job</code> parameter. Depending on your network bandwidth, it may or may not be faster than the JES Web approach.</p>
|
|
<p>This approach (<code>useComputeApi: false</code>) also ensures that jobs are displayed in Environment Manager.</p>
|
|
<pre><code class="language-json">{
|
|
appLoc:"/Your/Path",
|
|
serverType:"SASVIYA",
|
|
useComputeApi: false,
|
|
contextName: 'yourComputeContext'
|
|
}
|
|
</code></pre>
|
|
<a href="#using-the-compute-api" id="using-the-compute-api" style="color: inherit; text-decoration: none;">
|
|
<h3>Using the Compute API</h3>
|
|
</a>
|
|
<p>This approach is by far the fastest, as a result of the optimisations we have built into the adapter. With this configuration, in the first sasjs request, we take a URI map of the services in the target folder, and create a session manager. This manager will spawn a additional session every time a request is made. Subsequent requests will use the existing 'hot' session, if it exists. Sessions are always deleted after every use, which actually makes this <em>less</em> resource intensive than a typical JES web app, in which all sessions are kept alive by default for 15 minutes.</p>
|
|
<p>With this approach (<code>useComputeApi: true</code>), the requests/logs will <em>not</em> appear in the list in Environment manager.</p>
|
|
<pre><code class="language-json">{
|
|
appLoc:"/Your/Path",
|
|
serverType:"SASVIYA",
|
|
useComputeApi: true,
|
|
contextName: "yourComputeContext"
|
|
}
|
|
</code></pre>
|
|
<a href="#more-resources" id="more-resources" style="color: inherit; text-decoration: none;">
|
|
<h1>More resources</h1>
|
|
</a>
|
|
<p>For more information and examples specific to this adapter you can check out the <a href="https://sasjs.io/sasjs-adapter/">user guide</a> or the <a href="http://adapter.sasjs.io/">technical</a> documentation.</p>
|
|
<p>For more information on building web apps in general, check out these <a href="https://sasjs.io/training/resources/">resources</a> or contact the <a href="https://www.linkedin.com/in/allanbowe/">author</a> directly.</p>
|
|
<p>If you are a SAS 9 or SAS Viya customer you can also request a copy of <a href="https://datacontroller.io">Data Controller</a> - free for up to 5 users, this tool makes use of all parts of the SASjs framework.</p>
|
|
<a href="#star-gazing" id="star-gazing" style="color: inherit; text-decoration: none;">
|
|
<h2>Star Gazing</h2>
|
|
</a>
|
|
<p>If you find this library useful, help us grow our star graph!</p>
|
|
<p><img src="https://starchart.cc/sasjs/adapter.svg" alt=""></p>
|
|
<a href="#contributors-✨" id="contributors-✨" style="color: inherit; text-decoration: none;">
|
|
<h2>Contributors ✨</h2>
|
|
</a>
|
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
<p><a href="#contributors-"><img src="https://img.shields.io/badge/all_contributors-7-orange.svg?style=flat-square" alt="All Contributors"></a></p>
|
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
<p>Thanks goes to these wonderful people (<a href="https://allcontributors.org/docs/en/emoji-key">emoji key</a>):</p>
|
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
<!-- prettier-ignore-start -->
|
|
<!-- markdownlint-disable -->
|
|
<table>
|
|
<tr>
|
|
<td align="center"><a href="https://krishna-acondy.io/"><img src="https://avatars.githubusercontent.com/u/2980428?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Krishna Acondy</b></sub></a><br /><a href="https://github.com/sasjs/adapter/commits?author=krishna-acondy" title="Code">💻</a> <a href="#infra-krishna-acondy" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#blog-krishna-acondy" title="Blogposts">📝</a> <a href="#content-krishna-acondy" title="Content">🖋</a> <a href="#ideas-krishna-acondy" title="Ideas, Planning, & Feedback">🤔</a> <a href="#video-krishna-acondy" title="Videos">📹</a></td>
|
|
<td align="center"><a href="https://www.erudicat.com/"><img src="https://avatars.githubusercontent.com/u/25773492?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yury Shkoda</b></sub></a><br /><a href="https://github.com/sasjs/adapter/commits?author=YuryShkoda" title="Code">💻</a> <a href="#infra-YuryShkoda" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-YuryShkoda" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sasjs/adapter/commits?author=YuryShkoda" title="Tests">⚠️</a> <a href="#video-YuryShkoda" title="Videos">📹</a></td>
|
|
<td align="center"><a href="https://github.com/medjedovicm"><img src="https://avatars.githubusercontent.com/u/18329105?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mihajlo Medjedovic</b></sub></a><br /><a href="https://github.com/sasjs/adapter/commits?author=medjedovicm" title="Code">💻</a> <a href="#infra-medjedovicm" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/sasjs/adapter/commits?author=medjedovicm" title="Tests">⚠️</a> <a href="https://github.com/sasjs/adapter/pulls?q=is%3Apr+reviewed-by%3Amedjedovicm" title="Reviewed Pull Requests">👀</a></td>
|
|
<td align="center"><a href="https://github.com/allanbowe"><img src="https://avatars.githubusercontent.com/u/4420615?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Allan Bowe</b></sub></a><br /><a href="https://github.com/sasjs/adapter/commits?author=allanbowe" title="Code">💻</a> <a href="https://github.com/sasjs/adapter/pulls?q=is%3Apr+reviewed-by%3Aallanbowe" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sasjs/adapter/commits?author=allanbowe" title="Tests">⚠️</a> <a href="#mentoring-allanbowe" title="Mentoring">🧑🏫</a> <a href="#maintenance-allanbowe" title="Maintenance">🚧</a></td>
|
|
<td align="center"><a href="https://github.com/saadjutt01"><img src="https://avatars.githubusercontent.com/u/8914650?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Muhammad Saad </b></sub></a><br /><a href="https://github.com/sasjs/adapter/commits?author=saadjutt01" title="Code">💻</a> <a href="https://github.com/sasjs/adapter/pulls?q=is%3Apr+reviewed-by%3Asaadjutt01" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sasjs/adapter/commits?author=saadjutt01" title="Tests">⚠️</a> <a href="#mentoring-saadjutt01" title="Mentoring">🧑🏫</a> <a href="#infra-saadjutt01" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
|
<td align="center"><a href="https://github.com/sabhas"><img src="https://avatars.githubusercontent.com/u/82647447?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sabir Hassan</b></sub></a><br /><a href="https://github.com/sasjs/adapter/commits?author=sabhas" title="Code">💻</a> <a href="https://github.com/sasjs/adapter/pulls?q=is%3Apr+reviewed-by%3Asabhas" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sasjs/adapter/commits?author=sabhas" title="Tests">⚠️</a> <a href="#ideas-sabhas" title="Ideas, Planning, & Feedback">🤔</a></td>
|
|
<td align="center"><a href="https://github.com/VladislavParhomchik"><img src="https://avatars.githubusercontent.com/u/83717836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>VladislavParhomchik</b></sub></a><br /><a href="https://github.com/sasjs/adapter/commits?author=VladislavParhomchik" title="Tests">⚠️</a> <a href="https://github.com/sasjs/adapter/pulls?q=is%3Apr+reviewed-by%3AVladislavParhomchik" title="Reviewed Pull Requests">👀</a></td>
|
|
</tr>
|
|
</table>
|
|
<!-- markdownlint-restore -->
|
|
<!-- prettier-ignore-end -->
|
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
|
<p>This project follows the <a href="https://github.com/all-contributors/all-contributors">all-contributors</a> specification. Contributions of any kind welcome!</p>
|
|
</div>
|
|
<!--{"options":"/Users/saadjutt/projects/macropeople/sasjs/adapter","tsconfig":"/Users/saadjutt/projects/macropeople/sasjs/adapter","inputFiles":["/Users/saadjutt/projects/macropeople/sasjs/adapter/src/ContextManager.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/SAS9ApiClient.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/SASViyaApiClient.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/SASViyaApiClient.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/SASjs.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/SASjsApiClient.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/SessionManager.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/index.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/__mocks__/axios.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/executeScript.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/getFileStream.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/pollJobState.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/saveLog.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/uploadTables.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/writeStream.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/spec/executeScript.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/spec/getFileStream.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/spec/mockResponses.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/spec/pollJobState.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/spec/saveLog.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/spec/uploadTables.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/api/viya/spec/writeStream.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/AuthManager.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/getAccessTokenForSasjs.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/getAccessTokenForViya.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/getAuthCodeForSasjs.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/getTokens.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/index.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/isAuthorizeFormRequired.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/isLoginRequired.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/openWebPage.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/refreshTokensForSasjs.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/refreshTokensForViya.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/verifySas9Login.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/verifySasViyaLogin.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/AuthManager.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/getAccessTokenForSasjs.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/getAccessTokenForViya.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/getTokens.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/mockResponses.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/openWebPage.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/refreshTokensForSasjs.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/refreshTokensForViya.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/verifySas9Login.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/auth/spec/verifySasViyaLogin.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/file/generateFileUploadForm.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/file/generateTableUploadForm.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/job-execution/ComputeJobExecutor.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/job-execution/FileUploader.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/job-execution/JesJobExecutor.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/job-execution/JobExecutor.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/job-execution/Sas9JobExecutor.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/job-execution/WebJobExecutor.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/job-execution/index.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/request/RequestClient.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/request/Sas9RequestClient.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/request/SasjsRequestClient.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/ContextManager.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/FileUploader.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/FolderOperations.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/RequestClient.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/SAS_server_app.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/SessionManager.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/utils/getValidJson.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/utils/isUrl.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/utils/parseGeneratedCode.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/test/utils/parseSourceCode.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/Context.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/CsrfToken.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/ExecuteScript.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/File.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/FileTree.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/Folder.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/Job.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/JobDefinition.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/JobResult.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/Link.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/LogStatistics.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/Login.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/PollOptions.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/Process.d.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/SASjsConfig.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/SASjsRequest.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/Session.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/UploadFile.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/WriteStream.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/index.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/AuthorizeError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/ComputeJobExecutionError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/ErrorResponse.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/InternalServerError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/InvalidJsonError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/JobExecutionError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/JobStatePollError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/JsonParseArrayError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/LoginRequiredError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/NoSessionStateError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/NotFoundError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/RootFolderNotFoundError.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/RootFolderNotFoundError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/SAS9AuthError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/WeboutResponseError.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/types/errors/index.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/appendExtraResponseAttributes.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/asyncForEach.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/compareTimestamps.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/convertToCsv.spec.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/convertToCsv.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/createAxiosInstance.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/delay.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/fetchLogByChunks.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/formatDataForRequest.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/getValidJson.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/index.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/isIeOrEdge.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/isNode.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/isRelativePath.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/isUri.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/isUrl.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/needsRetry.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/parseGeneratedCode.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/parseSasViyaLog.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/parseSourceCode.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/parseViyaDebugResponse.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/parseWeboutResponse.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/serialize.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/splitChunks.ts","/Users/saadjutt/projects/macropeople/sasjs/adapter/src/utils/loginPrompt/index.ts"],"mode":1,"includeDeclarations":true,"entryPoint":"","exclude":["**/*+(index|.spec|.e2e).ts"],"externalPattern":[],"excludeExternals":true,"excludeNotExported":true,"excludeNotDocumented":false,"excludePrivate":true,"excludeProtected":false,"ignoreCompilerErrors":true,"disableSources":false,"includes":"","media":"","out":"docs","json":"","theme":"./node_modules/typedoc-neo-theme/bin/default","name":"","includeVersion":false,"excludeTags":[],"readme":"","defaultCategory":"Other","categoryOrder":[],"categorizeByGroup":true,"gitRevision":"","gitRemote":"origin","gaID":"","gaSite":"auto","hideGenerator":false,"toc":[],"disableOutputCheck":true,"help":false,"version":false,"plugin":[],"logger":"console","listInvalidSymbolLinks":false,"links":[{"label":"SASjs on Github","url":"https://github.com/sasjs/adapter"},{"label":"SASjs.io","url":"https://sasjs.io"},{"label":"SASjs CLI","url":"https://github.com/sasjs/cli"},{"label":"React Seed App","url":"https://github.com/sasjs/react-seed-app"}],"outline":[{"SAS Adapter":{"SASjs":"classes/reflection-717.reflection-180.sasjs","Types":"modules/types"},"SAS Viya API Client":"classes/reflection-717.reflection-180.sasviyaapiclient","SAS 9 API Client":"classes/reflection-717.reflection-180.sas9apiclient"}],"source":[{"path":"https://github.com/sasjs/adapter/blob/master/src/","line":"L"}],"disableAutoModuleName":"false"}-->
|
|
</div>
|
|
<div class="col-2 col-menu secondary-menu">
|
|
<nav class="tsd-navigation secondary menu-sticky">
|
|
<ul class="before-current">
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<footer class="with-border-bottom">
|
|
</footer>
|
|
<div class="container tsd-generator">
|
|
<p>Generated using <a href="http://typedoc.org/" target="_blank">TypeDoc</a></p>
|
|
</div>
|
|
<div class="overlay"></div>
|
|
<script src="assets/js/main.js"></script>
|
|
</body>
|
|
</html> |