diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 0000000..3c6e704 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,71 @@ +name: Checks +on: + pull_request: + # we're doing the filtering for branches and actions in each step, + # this one here works not as expected and could be misleading +# branches: +# - migrating-to-yaml-syntax +# - master +# action: +# - opened +# - edited +# - synchronize +jobs: + checks: + name: Formatting checks + runs-on: ubuntu-latest + steps: + - name: Checkout branch + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + uses: actions/checkout@master + + - name: Install npm + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + uses: actions/npm@master + with: + args: install + + - name: Npm check + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + uses: actions/npm@master + with: + args: run check --if-present + + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout branch + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + uses: actions/checkout@master + + - name: Checkout master + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + uses: actions/checkout@master + with: + ref: master + + - name: Check merge + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + run: | + git config --global user.name "Spring Media CD" + git config --global user.email "ps-support-og@moveoffice.com" + git merge ${{ github.event.pull_request.head.sha }} -m"prchecker" --stat + + - name: Install npm + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + uses: actions/npm@master + with: + args: install + + - name: Test npm + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + uses: actions/npm@master + with: + args: run test + + - name: Build npm + if: github.event.action == 'opened' || github.event.action == 'edited' || github.event.action == 'synchronize' + uses: actions/npm@master + with: + args: run build diff --git a/.github/workflows/push_master.yml b/.github/workflows/push_master.yml new file mode 100644 index 0000000..01f2c14 --- /dev/null +++ b/.github/workflows/push_master.yml @@ -0,0 +1,46 @@ +name: Deployment +on: + push: + branches: + - master + +jobs: + checks: + name: Formatting checks + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@master + + - name: Install npm + uses: actions/npm@master + with: + args: install + + - name: Npm check + uses: actions/npm@master + with: + args: run check --if-present + + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout branch + uses: actions/checkout@master + + + - name: Install npm + uses: actions/npm@master + with: + args: install + + - name: Test npm + uses: actions/npm@master + with: + args: run test + + - name: Build npm + uses: actions/npm@master + with: + args: run build diff --git a/dist/apiprovide.cjs.js b/dist/apiprovide.cjs.js index 8ef80ca..997da0b 100644 --- a/dist/apiprovide.cjs.js +++ b/dist/apiprovide.cjs.js @@ -2,36 +2,36 @@ Object.defineProperty(exports, '__esModule', { value: true }); -function provide(packageName, pack) { - // -- START -- static loader - var unresolvedPackages = {}; - var providedPackages = {}; - var loaderName = 'pssmasloader'; - var loader = window[loaderName] = window[loaderName] || { - _: { - u: unresolvedPackages, - p: providedPackages, - }, - require: function (packageName, cb) { - var pack = providedPackages[packageName]; - if (pack !== undefined) { - cb(pack, null); - } - else { - unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; - unresolvedPackages[packageName].push(cb); - } - }, - }; - unresolvedPackages = loader._.u; - providedPackages = loader._.p; - // -- END -- static loader - var unresolvedRequires = unresolvedPackages[packageName] || []; - providedPackages[packageName] = pack; - for (var i = 0; i < unresolvedRequires.length; i++) { - unresolvedRequires[i](pack, null); - } - return pack; +function provide(packageNameActual, packActual) { + // -- START -- static loader + var unresolvedPackages = {}; + var providedPackages = {}; + var loaderName = "pssmasloader"; + var loader = (window[loaderName] = window[loaderName] || { + _: { + u: unresolvedPackages, + p: providedPackages + }, + require: function (packageName, cb) { + var pack = providedPackages[packageName]; + if (pack !== undefined) { + cb(pack, null); + } + else { + unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; + unresolvedPackages[packageName].push(cb); + } + } + }); + unresolvedPackages = loader._.u; + providedPackages = loader._.p; + // -- END -- static loader + var unresolvedRequires = unresolvedPackages[packageNameActual] || []; + providedPackages[packageNameActual] = packActual; + for (var i = 0; i < unresolvedRequires.length; i++) { + unresolvedRequires[i](packActual, null); + } + return packActual; } exports.provide = provide; diff --git a/dist/apiprovide.d.ts b/dist/apiprovide.d.ts index 836d9a2..0466cfd 100644 --- a/dist/apiprovide.d.ts +++ b/dist/apiprovide.d.ts @@ -1 +1 @@ -export declare function provide(packageName: string, pack: any): any; +export declare function provide(packageNameActual: string, packActual: any): any; diff --git a/dist/apiprovide.esm.js b/dist/apiprovide.esm.js index 519793e..e801f64 100644 --- a/dist/apiprovide.esm.js +++ b/dist/apiprovide.esm.js @@ -1,33 +1,33 @@ -function provide(packageName, pack) { - // -- START -- static loader - var unresolvedPackages = {}; - var providedPackages = {}; - var loaderName = 'pssmasloader'; - var loader = window[loaderName] = window[loaderName] || { - _: { - u: unresolvedPackages, - p: providedPackages, - }, - require: function (packageName, cb) { - var pack = providedPackages[packageName]; - if (pack !== undefined) { - cb(pack, null); - } - else { - unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; - unresolvedPackages[packageName].push(cb); - } - }, - }; - unresolvedPackages = loader._.u; - providedPackages = loader._.p; - // -- END -- static loader - var unresolvedRequires = unresolvedPackages[packageName] || []; - providedPackages[packageName] = pack; - for (var i = 0; i < unresolvedRequires.length; i++) { - unresolvedRequires[i](pack, null); - } - return pack; +function provide(packageNameActual, packActual) { + // -- START -- static loader + var unresolvedPackages = {}; + var providedPackages = {}; + var loaderName = "pssmasloader"; + var loader = (window[loaderName] = window[loaderName] || { + _: { + u: unresolvedPackages, + p: providedPackages + }, + require: function (packageName, cb) { + var pack = providedPackages[packageName]; + if (pack !== undefined) { + cb(pack, null); + } + else { + unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; + unresolvedPackages[packageName].push(cb); + } + } + }); + unresolvedPackages = loader._.u; + providedPackages = loader._.p; + // -- END -- static loader + var unresolvedRequires = unresolvedPackages[packageNameActual] || []; + providedPackages[packageNameActual] = packActual; + for (var i = 0; i < unresolvedRequires.length; i++) { + unresolvedRequires[i](packActual, null); + } + return packActual; } export { provide }; diff --git a/dist/ps-web-apis.cjs.js b/dist/ps-web-apis.cjs.js index 86d3fd2..91b2249 100644 --- a/dist/ps-web-apis.cjs.js +++ b/dist/ps-web-apis.cjs.js @@ -2,46 +2,46 @@ Object.defineProperty(exports, '__esModule', { value: true }); -function requireApi(name) { - // -- START -- static loader - var unresolvedPackages = {}; - var providedPackages = {}; - var loaderName = 'pssmasloader'; - // set or reuse existing loader implementation - var loader = window[loaderName] = window[loaderName] || { - // Requires packageName and returns it via callback - require: function (packageName, cb) { - var pack = providedPackages[packageName]; - if (pack !== undefined) { - // -- will callback directly if required functionality was already provided - cb(pack, null); - } - else { - // -- will queue callbacks if required functionality is not yet available - unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; - unresolvedPackages[packageName].push(cb); - } - }, - // private state - _: { - u: unresolvedPackages, - p: providedPackages, - } - }; - // -- END -- static loader - return new Promise(function (resolve, reject) { - loader.require(name, function (res, error) { - if (error) { - reject(error); - } - else { - resolve(res); - } - }); - }); -} -function whoamiV1() { - return requireApi('whoami:v1'); +function requireApi(name) { + // -- START -- static loader + var unresolvedPackages = {}; + var providedPackages = {}; + var loaderName = "pssmasloader"; + // set or reuse existing loader implementation + var loader = (window[loaderName] = window[loaderName] || { + // Requires packageName and returns it via callback + require: function (packageName, cb) { + var pack = providedPackages[packageName]; + if (pack !== undefined) { + // -- will callback directly if required functionality was already provided + cb(pack, null); + } + else { + // -- will queue callbacks if required functionality is not yet available + unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; + unresolvedPackages[packageName].push(cb); + } + }, + // private state + _: { + u: unresolvedPackages, + p: providedPackages + } + }); + // -- END -- static loader + return new Promise(function (resolve, reject) { + loader.require(name, function (res, error) { + if (error) { + reject(error); + } + else { + resolve(res); + } + }); + }); +} +function whoamiV1() { + return requireApi("whoami:v1"); } exports.whoamiV1 = whoamiV1; diff --git a/dist/ps-web-apis.d.ts b/dist/ps-web-apis.d.ts index 5cf2965..fc282fa 100644 --- a/dist/ps-web-apis.d.ts +++ b/dist/ps-web-apis.d.ts @@ -1,37 +1,37 @@ -export interface WhoamiV1 { - /** - * gives information if user is currently loggedin from ui perspective - */ - isLoggedIn(): boolean; - /** - * will assert valid not outdated session before fetch will be done. backend credentials will be added automatically - * an error is resolved if session is invalid and not refeshable (= user logged out) - */ - authorizedFetch: (input: RequestInfo, init?: RequestInit) => Promise; - /** - * will assert valid not outdated session before promise is resolved - * an error is resolved if session is invalid and not refeshable (= user logged out) - */ - ensureUserHasAuthorization(): Promise; - /** - * will start login-process (e.g. go to sso-login) - */ - doLogin(additionalParameter?: Map): void; - /** - * will start registration-process (e.g. go to sso-register) - */ - doRegister(additionalParameter?: Map): void; - /** - * will start logout-process (e.g. go to sso-logout) - */ - doLogout(additionalParameter?: Map): void; - /** - * will start logout-process and redirect user to portal homepage afterwards (e.g. go to sso-logout) - */ - doLogoutToHome(additionalParameter?: Map): void; - /** - * will update access token and therefore content entitlements to current state - */ - forceAccessTokenRefresh(): Promise; -} -export declare function whoamiV1(): Promise; +export interface WhoamiV1 { + /** + * will assert valid not outdated session before fetch will be done. backend credentials will be added automatically + * an error is resolved if session is invalid and not refeshable (= user logged out) + */ + authorizedFetch: (input: RequestInfo, init?: RequestInit) => Promise; + /** + * gives information if user is currently loggedin from ui perspective + */ + isLoggedIn(): boolean; + /** + * will assert valid not outdated session before promise is resolved + * an error is resolved if session is invalid and not refeshable (= user logged out) + */ + ensureUserHasAuthorization(): Promise; + /** + * will start login-process (e.g. go to sso-login) + */ + doLogin(additionalParameter?: Map): void; + /** + * will start registration-process (e.g. go to sso-register) + */ + doRegister(additionalParameter?: Map): void; + /** + * will start logout-process (e.g. go to sso-logout) + */ + doLogout(additionalParameter?: Map): void; + /** + * will start logout-process and redirect user to portal homepage afterwards (e.g. go to sso-logout) + */ + doLogoutToHome(additionalParameter?: Map): void; + /** + * will update access token and therefore content entitlements to current state + */ + forceAccessTokenRefresh(): Promise; +} +export declare function whoamiV1(): Promise; diff --git a/dist/ps-web-apis.esm.js b/dist/ps-web-apis.esm.js index b4659a3..5eb2db6 100644 --- a/dist/ps-web-apis.esm.js +++ b/dist/ps-web-apis.esm.js @@ -1,43 +1,43 @@ -function requireApi(name) { - // -- START -- static loader - var unresolvedPackages = {}; - var providedPackages = {}; - var loaderName = 'pssmasloader'; - // set or reuse existing loader implementation - var loader = window[loaderName] = window[loaderName] || { - // Requires packageName and returns it via callback - require: function (packageName, cb) { - var pack = providedPackages[packageName]; - if (pack !== undefined) { - // -- will callback directly if required functionality was already provided - cb(pack, null); - } - else { - // -- will queue callbacks if required functionality is not yet available - unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; - unresolvedPackages[packageName].push(cb); - } - }, - // private state - _: { - u: unresolvedPackages, - p: providedPackages, - } - }; - // -- END -- static loader - return new Promise(function (resolve, reject) { - loader.require(name, function (res, error) { - if (error) { - reject(error); - } - else { - resolve(res); - } - }); - }); -} -function whoamiV1() { - return requireApi('whoami:v1'); +function requireApi(name) { + // -- START -- static loader + var unresolvedPackages = {}; + var providedPackages = {}; + var loaderName = "pssmasloader"; + // set or reuse existing loader implementation + var loader = (window[loaderName] = window[loaderName] || { + // Requires packageName and returns it via callback + require: function (packageName, cb) { + var pack = providedPackages[packageName]; + if (pack !== undefined) { + // -- will callback directly if required functionality was already provided + cb(pack, null); + } + else { + // -- will queue callbacks if required functionality is not yet available + unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; + unresolvedPackages[packageName].push(cb); + } + }, + // private state + _: { + u: unresolvedPackages, + p: providedPackages + } + }); + // -- END -- static loader + return new Promise(function (resolve, reject) { + loader.require(name, function (res, error) { + if (error) { + reject(error); + } + else { + resolve(res); + } + }); + }); +} +function whoamiV1() { + return requireApi("whoami:v1"); } export { whoamiV1 }; diff --git a/package-lock.json b/package-lock.json index ca7b86d..ddd165d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2537,6 +2537,15 @@ "normalize-path": "^2.1.1" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -3221,6 +3230,12 @@ } } }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", @@ -3564,6 +3579,12 @@ "mime-types": "^2.1.12" } }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -5468,6 +5489,16 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -6193,6 +6224,12 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prettier": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", + "dev": true + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -6925,6 +6962,12 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -7184,6 +7227,50 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, + "tslint": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.0.tgz", + "integrity": "sha512-2vqIvkMHbnx8acMogAERQ/IuINOq6DFqgF8/VDvhEkBqQh/x6SP0Y+OHnKth9/ZcHQSroOZwUQSN18v8KKF0/g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/package.json b/package.json index 3b55d3f..5548cf8 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,14 @@ "module": "dist/ps-web-apis.esm.js", "types": "dist/ps-web-apis.d.ts", "scripts": { + "all": "npm run format && npm run lint && npm run build && npm run test", "build": "rollup -c", - "test": "jest --coverage" + "test": "jest --coverage", + "check": "npm run format-check && npm run lint-check", + "format": "prettier --print-width 140 --tab-width 4 --write '{src,test}/**/*.{ts,tsx}'", + "format-check": "prettier --print-width 140 --tab-width 4 --list-different 'src/**/*.{ts,tsx}'", + "lint": "tslint --fix './src/**/*.{ts,tsx}'", + "lint-check": "tslint './src/**/*.{ts,tsx}'" }, "repository": { "type": "git", @@ -25,6 +31,7 @@ "@types/jest": "^24.0.9", "@types/sinon": "^7.0.8", "jest": "^24.1.0", + "prettier": "^1.18.2", "rollup": "^1.4.0", "rollup-plugin-commonjs": "^9.2.1", "rollup-plugin-node-resolve": "^4.0.1", @@ -35,6 +42,7 @@ "sinon": "^7.2.5", "ts-jest": "^24.0.0", "tslib": "^1.9.3", + "tslint": "^5.20.0", "typescript": "^3.3.3333" } } diff --git a/src/apiprovide.ts b/src/apiprovide.ts index f3dd772..5a88114 100644 --- a/src/apiprovide.ts +++ b/src/apiprovide.ts @@ -1,32 +1,32 @@ -export function provide(packageName: string, pack: any) { +export function provide(packageNameActual: string, packActual: any) { // -- START -- static loader let unresolvedPackages = {} as any; let providedPackages = {} as any; - const loaderName = 'pssmasloader'; - const loader = (window as any)[loaderName] = (window as any)[loaderName] || { + const loaderName = "pssmasloader"; + const loader = ((window as any)[loaderName] = (window as any)[loaderName] || { _: { u: unresolvedPackages, - p: providedPackages, + p: providedPackages }, require(packageName: string, cb: any) { const pack = providedPackages[packageName]; if (pack !== undefined) { - cb(pack, null) + cb(pack, null); } else { - unresolvedPackages[packageName] = unresolvedPackages[packageName] || [] - unresolvedPackages[packageName].push(cb) + unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; + unresolvedPackages[packageName].push(cb); } - }, - } + } + }); unresolvedPackages = loader._.u; providedPackages = loader._.p; // -- END -- static loader - var unresolvedRequires = unresolvedPackages[packageName] || []; - providedPackages[packageName] = pack; - for (var i = 0; i < unresolvedRequires.length; i++) { - unresolvedRequires[i](pack, null); + const unresolvedRequires = unresolvedPackages[packageNameActual] || []; + providedPackages[packageNameActual] = packActual; + for (let i = 0; i < unresolvedRequires.length; i++) { + unresolvedRequires[i](packActual, null); } - return pack; + return packActual; } diff --git a/src/ps-web-apis.ts b/src/ps-web-apis.ts index dbae7ed..2cf6913 100644 --- a/src/ps-web-apis.ts +++ b/src/ps-web-apis.ts @@ -1,79 +1,79 @@ -function requireApi(name: string) : Promise { +function requireApi(name: string): Promise { // -- START -- static loader - let unresolvedPackages = {} as any; - let providedPackages = {} as any; - const loaderName = 'pssmasloader'; + const unresolvedPackages = {} as any; + const providedPackages = {} as any; + const loaderName = "pssmasloader"; // set or reuse existing loader implementation - const loader = (window as any)[loaderName] = (window as any)[loaderName] || { - // Requires packageName and returns it via callback + const loader = ((window as any)[loaderName] = (window as any)[loaderName] || { + // Requires packageName and returns it via callback require(packageName: string, cb: any) { const pack = providedPackages[packageName]; if (pack !== undefined) { // -- will callback directly if required functionality was already provided - cb(pack, null) + cb(pack, null); } else { // -- will queue callbacks if required functionality is not yet available - unresolvedPackages[packageName] = unresolvedPackages[packageName] || [] - unresolvedPackages[packageName].push(cb) + unresolvedPackages[packageName] = unresolvedPackages[packageName] || []; + unresolvedPackages[packageName].push(cb); } }, // private state _: { u: unresolvedPackages, - p: providedPackages, + p: providedPackages } - } + }); // -- END -- static loader - return new Promise(function(resolve, reject) { - loader.require(name, function(res: T, error: any) { + return new Promise((resolve, reject) => { + loader.require(name, (res: T, error: any) => { if (error) { - reject(error) + reject(error); } else { - resolve(res) + resolve(res); } - }) - }) + }); + }); } -export interface WhoamiV1 { - /** - * gives information if user is currently loggedin from ui perspective - */ - isLoggedIn(): boolean +export interface WhoamiV1 { /** * will assert valid not outdated session before fetch will be done. backend credentials will be added automatically * an error is resolved if session is invalid and not refeshable (= user logged out) */ - authorizedFetch: (input: RequestInfo, init?: RequestInit) => Promise + authorizedFetch: (input: RequestInfo, init?: RequestInit) => Promise; + /** + * gives information if user is currently loggedin from ui perspective + */ + isLoggedIn(): boolean; /** * will assert valid not outdated session before promise is resolved * an error is resolved if session is invalid and not refeshable (= user logged out) */ - ensureUserHasAuthorization(): Promise + ensureUserHasAuthorization(): Promise; /** * will start login-process (e.g. go to sso-login) */ - doLogin(additionalParameter?: Map): void - /** + doLogin(additionalParameter?: Map): void; + /** * will start registration-process (e.g. go to sso-register) */ - doRegister(additionalParameter?: Map): void + doRegister(additionalParameter?: Map): void; /** * will start logout-process (e.g. go to sso-logout) */ - doLogout(additionalParameter?: Map): void + doLogout(additionalParameter?: Map): void; /** * will start logout-process and redirect user to portal homepage afterwards (e.g. go to sso-logout) */ - doLogoutToHome(additionalParameter?: Map): void + doLogoutToHome(additionalParameter?: Map): void; /** - * will update access token and therefore content entitlements to current state + * will update access token and therefore content entitlements to current state */ - forceAccessTokenRefresh(): Promise + forceAccessTokenRefresh(): Promise; } -export function whoamiV1() : Promise { - return requireApi('whoami:v1'); +export function whoamiV1(): Promise { + return requireApi("whoami:v1"); } diff --git a/test/apiprovide.test.ts b/test/apiprovide.test.ts index ebba517..c519919 100644 --- a/test/apiprovide.test.ts +++ b/test/apiprovide.test.ts @@ -1,43 +1,41 @@ +import sinon from "sinon"; -import sinon from 'sinon'; - -import {provide} from '../src/apiprovide' -describe('apiprovide', () => { - - it('puts provided api in the provided pile (own loader)', () => { +import { provide } from "../src/apiprovide"; +describe("apiprovide", () => { + it("puts provided api in the provided pile (own loader)", () => { // given const fakeApi = {} as any; - const window : any = (global as any).window = {} - + const window: any = ((global as any).window = {}); + // when: providing the API - provide('whoareyou', fakeApi) + provide("whoareyou", fakeApi); // then - expect(window.pssmasloader._.p['whoareyou']).toEqual(fakeApi); - }) + expect(window.pssmasloader._.p["whoareyou"]).toEqual(fakeApi); + }); - it('puts provided api in the provided pile (3rd party loader)', () => { + it("puts provided api in the provided pile (3rd party loader)", () => { // given const fakeApi = {} as any; - const window : any = (global as any).window = { + const window: any = ((global as any).window = { pssmasloader: { _: { p: {}, u: {} } } - } + }); const providedPackagesPile = window.pssmasloader._.p; - + // when: providing the API - provide('whoareyou', fakeApi) + provide("whoareyou", fakeApi); // then - expect(window.pssmasloader._.p['whoareyou']).toEqual(fakeApi); + expect(window.pssmasloader._.p["whoareyou"]).toEqual(fakeApi); expect(providedPackagesPile).toEqual(window.pssmasloader._.p); - }) + }); - it('calls up unresolved requires previous to providing', () => { + it("calls up unresolved requires previous to providing", () => { // given const fakeApi = {} as any; const whoareYouRequest = sinon.spy(); @@ -51,47 +49,46 @@ describe('apiprovide', () => { } } } - } - + }; + // when: providing the API - provide('whoareyou', fakeApi) + provide("whoareyou", fakeApi); // then sinon.assert.calledWith(whoareYouRequest, fakeApi, null); sinon.assert.calledWith(whoareYouRequest2, fakeApi, null); - }) + }); - it('installs its own loader that is able to queue unresolved packages', () => { + it("installs its own loader that is able to queue unresolved packages", () => { // given - const window : any = (global as any).window = {} - + const window: any = ((global as any).window = {}); + // when: providing the API - provide('whoareyou', {}) + provide("whoareyou", {}); // and when: 3rd party services uses the require functionality again - const fooCb = () => {} - window.pssmasloader.require('fooservice:v1', fooCb) + const fooCb = () => {}; + window.pssmasloader.require("fooservice:v1", fooCb); // then - expect(window.pssmasloader._.u['fooservice:v1']).toEqual([fooCb]); - }) + expect(window.pssmasloader._.u["fooservice:v1"]).toEqual([fooCb]); + }); - it('installs its own loader that is able to load provided packages', () => { + it("installs its own loader that is able to load provided packages", () => { // given const fooApi = {}; - const window : any = (global as any).window = {} - + const window: any = ((global as any).window = {}); + // when: providing the API - provide('whoareyou', {}); + provide("whoareyou", {}); // and when: service is registered - window.pssmasloader._.p['fooservice:v1'] = fooApi; + window.pssmasloader._.p["fooservice:v1"] = fooApi; // and when: 3rd party services uses the require functionality again const requireCb = sinon.spy(); - window.pssmasloader.require('fooservice:v1', requireCb) - - sinon.assert.calledWith(requireCb, fooApi, null) - }) + window.pssmasloader.require("fooservice:v1", requireCb); -}) \ No newline at end of file + sinon.assert.calledWith(requireCb, fooApi, null); + }); +}); diff --git a/test/whoami-api.test.ts b/test/whoami-api.test.ts index d182b74..8077ae8 100644 --- a/test/whoami-api.test.ts +++ b/test/whoami-api.test.ts @@ -1,100 +1,96 @@ -import sinon from 'sinon'; -import {whoamiV1, WhoamiV1} from '../src/ps-web-apis' +import sinon from "sinon"; +import { whoamiV1, WhoamiV1 } from "../src/ps-web-apis"; -describe('whoami-api loader', () => { - it('uses preexisting require to get the api if necessary', async () => { +describe("whoami-api loader", () => { + it("uses preexisting require to get the api if necessary", async () => { // given const fakeApi = {} as WhoamiV1; (global as any).window = { pssmasloader: { require(name: string, cb: any) { - expect(name).toBe('whoami:v1'); - cb(fakeApi, null) + expect(name).toBe("whoami:v1"); + cb(fakeApi, null); } } - } - + }; + // when const api = await whoamiV1(); // then expect(api).toBe(fakeApi); - }) + }); - it('throws promise correctly should an error occur', async () => { + it("throws promise correctly should an error occur", async () => { // given - const err = new Error('moep moep'); + const err = new Error("moep moep"); (global as any).window = { pssmasloader: { require(name: string, cb: any) { - cb(null, err) + cb(null, err); } } - } - + }; + // when expect(whoamiV1()) - // then - .rejects.toBe(err) - }) + // then + .rejects.toBe(err); + }); - - it('installs its own require in the loader should that not exist yet and register itself into the unresolved package pile', async () => { + it("installs its own require in the loader should that not exist yet and register itself into the unresolved package pile", async () => { // given const fakeApi = {} as WhoamiV1; - const window : any = (global as any).window = {} - + const window: any = ((global as any).window = {}); + // when: requesting the API const pendingWhoamiApi = whoamiV1(); // then: expect(window.pssmasloader.require).toBeDefined(); expect(window.pssmasloader._.u).toBeDefined(); - expect(window.pssmasloader._.u['whoami:v1']).toBeDefined(); - expect(window.pssmasloader._.u['whoami:v1'].length).toBe(1); + expect(window.pssmasloader._.u["whoami:v1"]).toBeDefined(); + expect(window.pssmasloader._.u["whoami:v1"].length).toBe(1); expect(window.pssmasloader._.p).toBeDefined(); // and when: someone then provides the unresolved package - window.pssmasloader._.u['whoami:v1'][0](fakeApi, null) + window.pssmasloader._.u["whoami:v1"][0](fakeApi, null); // then: the promise resolved expect(await pendingWhoamiApi).toBe(fakeApi); - }) + }); - it('installs its own loader that is able to queue unresolved packages', () => { + it("installs its own loader that is able to queue unresolved packages", () => { // given const fakeApi = {} as WhoamiV1; - const window : any = (global as any).window = {} - + const window: any = ((global as any).window = {}); + // when: requesting the API whoamiV1(); // and when: 3rd party services uses the require functionality again - const fooCb = () => {} - window.pssmasloader.require('fooservice:v1', fooCb) + const fooCb = () => {}; + window.pssmasloader.require("fooservice:v1", fooCb); // then - expect(window.pssmasloader._.u['fooservice:v1']).toEqual([fooCb]); - }) + expect(window.pssmasloader._.u["fooservice:v1"]).toEqual([fooCb]); + }); - it('installs its own loader that is able to load provided packages', () => { + it("installs its own loader that is able to load provided packages", () => { // given const fooApi = {}; - const window : any = (global as any).window = {} - + const window: any = ((global as any).window = {}); + // when: requesting the API whoamiV1(); - // and when: service is registered - window.pssmasloader._.p['fooservice:v1'] = fooApi; + window.pssmasloader._.p["fooservice:v1"] = fooApi; // and when: 3rd party services uses the require functionality again const requireCb = sinon.spy(); - window.pssmasloader.require('fooservice:v1', requireCb) - - sinon.assert.calledWith(requireCb, fooApi, null) - }) - + window.pssmasloader.require("fooservice:v1", requireCb); -}) \ No newline at end of file + sinon.assert.calledWith(requireCb, fooApi, null); + }); +}); diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..aef49b7 --- /dev/null +++ b/tslint.json @@ -0,0 +1,24 @@ +{ + "defaultSeverity": "error", + "extends": ["tslint:latest"], + "jsRules": {}, + "rules": { + "ordered-imports": false, + "interface-name": false, + "interface-over-type-literal": false, + "trailing-comma": false, + "jsx-no-multiline-js": false, + "jsx-no-lambda": false, + "jsx-boolean-value": false, + "object-literal-sort-keys": false, + "object-literal-key-quotes": false, + "no-unused-expression": false, + "semicolon": [true, "always", "ignore-bound-class-methods"], + "prefer-for-of": false, + "no-submodule-imports": false, + "jsx-curly-spacing": false, + "max-line-length": [true, 140], + "arrow-parens": false + }, + "rulesDirectory": [] +}