From dcd8a56452322fe99e5a90415b9f15b7f0067014 Mon Sep 17 00:00:00 2001 From: jey Date: Tue, 1 Mar 2022 13:38:02 +0530 Subject: [PATCH] i18n API box sample web component --- samples/web-components/README.md | 1 + .../api-gallery-i18n/.eslintrc.json | 33 +++ .../api-gallery-i18n/.gitattributes | 2 + .../api-gallery-i18n/.gitignore | 82 +++++++ .../web-components/api-gallery-i18n/LICENSE | 21 ++ .../web-components/api-gallery-i18n/README.md | 26 +++ .../api-gallery-i18n/package.json | 35 +++ .../api-gallery-i18n/sample.png | Bin 0 -> 58097 bytes .../src/abstract.portal.element.ts | 60 ++++++ .../api-gallery-i18n/api-gallery-i18ninfo.ts | 201 ++++++++++++++++++ .../api-gallery-i18n/src/index.ts | 4 + .../src/model/context.model.ts | 5 + .../src/model/data/alldata.model.ts | 120 +++++++++++ .../src/service/request.service.ts | 56 +++++ .../api-gallery-i18n/tsconfig.json | 71 +++++++ .../api-gallery-i18n/webpack.config.js | 24 +++ 16 files changed, 741 insertions(+) create mode 100644 samples/web-components/api-gallery-i18n/.eslintrc.json create mode 100644 samples/web-components/api-gallery-i18n/.gitattributes create mode 100644 samples/web-components/api-gallery-i18n/.gitignore create mode 100644 samples/web-components/api-gallery-i18n/LICENSE create mode 100644 samples/web-components/api-gallery-i18n/README.md create mode 100644 samples/web-components/api-gallery-i18n/package.json create mode 100644 samples/web-components/api-gallery-i18n/sample.png create mode 100644 samples/web-components/api-gallery-i18n/src/abstract.portal.element.ts create mode 100644 samples/web-components/api-gallery-i18n/src/components/api-gallery-i18n/api-gallery-i18ninfo.ts create mode 100644 samples/web-components/api-gallery-i18n/src/index.ts create mode 100644 samples/web-components/api-gallery-i18n/src/model/context.model.ts create mode 100644 samples/web-components/api-gallery-i18n/src/model/data/alldata.model.ts create mode 100644 samples/web-components/api-gallery-i18n/src/service/request.service.ts create mode 100644 samples/web-components/api-gallery-i18n/tsconfig.json create mode 100644 samples/web-components/api-gallery-i18n/webpack.config.js diff --git a/samples/web-components/README.md b/samples/web-components/README.md index f55028e..69c0ff8 100644 --- a/samples/web-components/README.md +++ b/samples/web-components/README.md @@ -5,4 +5,5 @@ | 3 | Simple banner | custom-banner | ![Home](banner/showcase.png) | [View](https://github.com/SoftwareAG/webmethods-developer-portal/tree/main/samples/web-components/banner) | | 4 | Customized gallery | api-gallery-with-filter | ![Home](api-gallery-with-filter/showcase.png) | [View](https://github.com/SoftwareAG/webmethods-developer-portal/tree/main/samples/web-components/api-gallery-with-filter) | | 5 | Customized API box | api-gallery-box | ![Home](api-gallery-box/showcase.png) | [View](https://github.com/SoftwareAG/webmethods-developer-portal/tree/main/samples/web-components/api-gallery-box) | +| 6 | API box with i18n switch | api-gallery-i18ninfo | ![Home](api-gallery-i18n/sample.png) | [View](https://github.com/SoftwareAG/webmethods-developer-portal/tree/main/samples/web-components/api-gallery-i18n) | diff --git a/samples/web-components/api-gallery-i18n/.eslintrc.json b/samples/web-components/api-gallery-i18n/.eslintrc.json new file mode 100644 index 0000000..a3d140b --- /dev/null +++ b/samples/web-components/api-gallery-i18n/.eslintrc.json @@ -0,0 +1,33 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "linebreak-style": [ + "error", + "windows" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ] + } +} diff --git a/samples/web-components/api-gallery-i18n/.gitattributes b/samples/web-components/api-gallery-i18n/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/samples/web-components/api-gallery-i18n/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/samples/web-components/api-gallery-i18n/.gitignore b/samples/web-components/api-gallery-i18n/.gitignore new file mode 100644 index 0000000..c00d361 --- /dev/null +++ b/samples/web-components/api-gallery-i18n/.gitignore @@ -0,0 +1,82 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# FuseBox cache +.fusebox/ + +.idea + +public/bundle.js + +package-lock.json diff --git a/samples/web-components/api-gallery-i18n/LICENSE b/samples/web-components/api-gallery-i18n/LICENSE new file mode 100644 index 0000000..632536e --- /dev/null +++ b/samples/web-components/api-gallery-i18n/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Nagarajan Sivaraman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/samples/web-components/api-gallery-i18n/README.md b/samples/web-components/api-gallery-i18n/README.md new file mode 100644 index 0000000..8ae79bb --- /dev/null +++ b/samples/web-components/api-gallery-i18n/README.md @@ -0,0 +1,26 @@ +# About Web Component Samples + + +### Development +This project uses `Typescript` and `Webpack` to create and build one or more web components to a single JavaScript file. + + +### Setup + +To download and install the packages run the install command
+`npm run install` + + +To import the web-component into the theme, it needs to be compiled to a single JavaScript file. +To build and generate the single JavaScript file, you need to run the build command.
+ `npm run build` + + +The required JavaScript file will be generated as `bundle.js` and would be available under the folder `public`. + +### Examples included + +`api-gallery-i18ninfo` + +This element renders an available localization for this API. On click of particular flag the corresponding locale data will be rendered. +This element need to be placed inside the API default box. diff --git a/samples/web-components/api-gallery-i18n/package.json b/samples/web-components/api-gallery-i18n/package.json new file mode 100644 index 0000000..b647cfe --- /dev/null +++ b/samples/web-components/api-gallery-i18n/package.json @@ -0,0 +1,35 @@ +{ + "name": "ts-web-components", + "version": "1.0.0", + "description": "Webcomponents using typscript + webpack", + "main": "index.js", + "scripts": { + "serve": "webpack serve", + "lint": "eslint", + "build": "webpack", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/school-coder/ts-web-components.git" + }, + "keywords": [ + "web-component" + ], + "author": "Nagarajan Sivaraman", + "license": "MIT", + "bugs": { + "url": "https://github.com/school-coder/ts-web-components/issues" + }, + "homepage": "https://github.com/school-coder/ts-web-components#readme", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.25.0", + "@typescript-eslint/parser": "^4.25.0", + "eslint": "^7.27.0", + "ts-loader": "^9.2.2", + "typescript": "^4.2.4", + "webpack": "^5.37.1", + "webpack-cli": "^4.7.0", + "webpack-dev-server": "^4.7.4" + } +} diff --git a/samples/web-components/api-gallery-i18n/sample.png b/samples/web-components/api-gallery-i18n/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..8906feaaae045722b5ec7890b92a62980ed992e6 GIT binary patch literal 58097 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 literal 0 HcmV?d00001 diff --git a/samples/web-components/api-gallery-i18n/src/abstract.portal.element.ts b/samples/web-components/api-gallery-i18n/src/abstract.portal.element.ts new file mode 100644 index 0000000..e207fed --- /dev/null +++ b/samples/web-components/api-gallery-i18n/src/abstract.portal.element.ts @@ -0,0 +1,60 @@ +import {ContextModel} from './model/context.model'; + +/** + * Developer Portal requires the web-components, created by Administrators, to extend this class AbstractPortalElement + * + * Developer Portal rendering engine will invoke setContext method to set applicable context data, navigator function and localize function. + * + * It is recommended to write the rendering logic of the web-components with render() function as the initiator. + */ + +export abstract class AbstractPortalElement extends HTMLElement { + + private context: ContextModel; + + /** + * Starting point of the rendering logic. The method will be implemented by extending web-component owned by administrator. + */ + abstract render(): void | Promise; + + /** + * This method will be invoked by web-component rendering engine + */ + setContext(context: ContextModel): void { + this.context = context; + this.render(); + } + + /** + * returns the context data specific to the use-case, if applicable. + * @protected + */ + protected getData(): any { + if (this.context && this.context.getData) { + return this.context.getData(); + } + } + + /** + * navigate to the location mentioned. + * @param path + * @protected + */ + protected navigate(path: string): void { + if (this.context && this.context.navigate) { + this.context.navigate(path); + } + } + + /** + * Provides the value for the given property key. If the key doesnt exist, key string itself will be returned. + * @param key + * @protected + */ + protected getLocaleString(key: string): string { + if (this.context && this.context.getLocaleString) { + return this.context.getLocaleString(key); + } + return key; + } +} diff --git a/samples/web-components/api-gallery-i18n/src/components/api-gallery-i18n/api-gallery-i18ninfo.ts b/samples/web-components/api-gallery-i18n/src/components/api-gallery-i18n/api-gallery-i18ninfo.ts new file mode 100644 index 0000000..8591e54 --- /dev/null +++ b/samples/web-components/api-gallery-i18n/src/components/api-gallery-i18n/api-gallery-i18ninfo.ts @@ -0,0 +1,201 @@ +/** + * MIT License + * + * Copyright (c) 2022 Software AG, Darmstadt, Germany and/or its licensors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + + +import {AbstractPortalElement} from '../../abstract.portal.element'; +import {RequestDataService} from '../../service/request.service'; +import {AllData, LEExcludingBox} from '../../model/data/alldata.model'; + +/** + * This web component will add a locale icon for each of the locales configured for an API. + * It is designed (and tested) to work only when placed on the 'API Default Box' component. + * Right now, it will only work with a small list of locales (en, de, fr, es, jp, ru). + */ +export class ApiGalleryI18ninfo extends AbstractPortalElement { + locales: any = {}; + currentLocale = ''; + theShadowRoot: ShadowRoot; + allEventListeners: any[] = []; + + constructor() { + super(); + } + + connectedCallback() { + this.theShadowRoot = this.attachShadow({ mode: 'open' }); + } + + async render(): Promise { + const service = new RequestDataService(); + if (this.getData().id && this.checkIfValidUUID(this.getData().id)) { + // retrieve the locale information configured for this API + const thisData: AllData = await service.getAsJSON( + '/portal/rest/v1/apis/' + this.getData().id + '/i18n' + ); + const apiLocales: string[] = []; + if (thisData.summary && thisData.summary.localStrings) { + for (const item in thisData.summary.localStrings) { + apiLocales.push(item); + } + } + + const rootDiv = document.createElement('div'); + rootDiv.className = 'i18n-wrapper'; + + apiLocales.forEach((l) => { + const localeItem = document.createElement('span'); + // listen to the click events to swith locale in the title/summary/description of the api + localeItem.addEventListener('click', (evt) => { + evt.preventDefault(); + this.switchLocale(l); + }); + + // localeItem.innerText = l; + const country = l.substring(l.indexOf('_') + 1); + localeItem.className = 'fi fi-' + country.toLowerCase(); + rootDiv.appendChild(localeItem); + + // store name, summary and description for later usage + this.locales[l] = { + name: thisData.name.localStrings[l as LEExcludingBox], + summary: thisData.summary.localStrings[l as LEExcludingBox], + description: thisData.description.localStrings[l as LEExcludingBox], + }; + }); + // to enable more locales, the list below should be enhanced with the needed fi-* and fi-*.fis classes + this.shadowRoot.innerHTML = ` + `; + this.shadowRoot.appendChild(rootDiv); + } else { + console.debug( + '+-+ api-gallery-i18n: no api id found to check for locales... only an empty box will be rendered' + ); + const rootHtml = document.createElement('div'); + rootHtml.className = 'i18n-wrapper'; + rootHtml.innerHTML = 'i18n locale icons'; + this.shadowRoot.innerHTML = ` + `; + this.shadowRoot.appendChild(rootHtml); + } + } + doSwitch(event: any, localeCode: string, me: any) { + event.preventDefault(); + this.switchLocale(localeCode); + } + + switchLocale(l: any) { + // go up the html tree to match the api name element + const apiTitleElement = this.getClosestBySelector( + this, + `yap-div > yap-link[data-yap-name="${this.getData().name}"]` + ); + if (apiTitleElement !== null) { + const linkElement = apiTitleElement.querySelector('a'); + if (linkElement !== null) { + linkElement.textContent = this.locales[l].name; + } + const summaryElement = + apiTitleElement.parentElement.querySelector('yap-paragraph p'); + if (summaryElement !== null) { + summaryElement.textContent = this.locales[l].summary; + } + } + } + + getClosestBySelector(elem: any, selector: string) { + for (; elem && elem !== document; elem = elem.parentNode) { + const found = elem.querySelector(selector); + if (found != null) return found; + } + return null; + } + private checkIfValidUUID(str: string) { + // Regular expression to check if string is a valid UUID + const regexExp = + /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/gi; + + return regexExp.test(str); + } +} diff --git a/samples/web-components/api-gallery-i18n/src/index.ts b/samples/web-components/api-gallery-i18n/src/index.ts new file mode 100644 index 0000000..a34b61c --- /dev/null +++ b/samples/web-components/api-gallery-i18n/src/index.ts @@ -0,0 +1,4 @@ +import {ApiGalleryI18ninfo} from './components/api-gallery-i18n/api-gallery-i18ninfo'; + + +customElements.define('api-gallery-i18ninfo', ApiGalleryI18ninfo); diff --git a/samples/web-components/api-gallery-i18n/src/model/context.model.ts b/samples/web-components/api-gallery-i18n/src/model/context.model.ts new file mode 100644 index 0000000..39793d4 --- /dev/null +++ b/samples/web-components/api-gallery-i18n/src/model/context.model.ts @@ -0,0 +1,5 @@ +export class ContextModel { + getData: () => any; + navigate: (path: string) => void; + getLocaleString: (key: string) => string; +} diff --git a/samples/web-components/api-gallery-i18n/src/model/data/alldata.model.ts b/samples/web-components/api-gallery-i18n/src/model/data/alldata.model.ts new file mode 100644 index 0000000..3a8f3ad --- /dev/null +++ b/samples/web-components/api-gallery-i18n/src/model/data/alldata.model.ts @@ -0,0 +1,120 @@ +export class AllData { + name: Name + summary: Summary + description: Description + owner: string + id: string + modified: number + created: any + documentType: string + externalRefKey: string + providerRef: string + type: string + version: string + icon: Icon + systemVersion: string + versionFamilyRef: string + latest: string + follower: any + providerType: any + viewType: any + tags: string[] + communities: string[] + categories: Category[] + businessTerms: any[] + endPoints: any[] + attachments: Attachment[] + maturityStatus: MaturityStatu[] + policies: Policy[] + apiProperties: any[] + securitySchemes: SecurityScheme[] + scopes: any[] + endpointIds: string[] + rating: number + consumes: string[] + produces: string[] + resources: any[] + parameters: any[] + soapMethods: any[] + components: any[] + resourceIds: string[] + soapMethodIds: any[] + componentIds: string[] + hybrid: boolean + } + + export interface Name { + localStrings: LocalStrings + } + + export interface LocalStrings { + en_US : string; + de_DE : string; + ru_RU : string; + fr_FR : string; + es_ES : string; + jp_JP : string; + } + export type LEExcludingBox = Exclude; + + export interface Summary { + localStrings: LocalStrings + } + + + export interface Description { + localStrings: LocalStrings + } + + export interface Icon { + url: string + type: string + } + + export interface Category { + name: Name + summary: any + description: any + cname: string + } + + export interface Attachment { + name: Name + summary: any + description: any + uri: string + } + + export interface MaturityStatu { + name: Name + summary: any + description: any + cname: string + } + + export interface Policy { + name: Name + summary: Summary + description: Description + categories: any[] + providerRef: any + } + + export interface SecurityScheme { + type: string + description: any + name?: string + $ref: any + in?: string + scheme: any + bearerFormat: any + flows: any + openIdConnectUrl: any + } + + // export class AllLocales { + // "de_DE": string; + // "en_US": string; + // "ru_RU": string; + // "fr_FR": string; + // } \ No newline at end of file diff --git a/samples/web-components/api-gallery-i18n/src/service/request.service.ts b/samples/web-components/api-gallery-i18n/src/service/request.service.ts new file mode 100644 index 0000000..b2e4531 --- /dev/null +++ b/samples/web-components/api-gallery-i18n/src/service/request.service.ts @@ -0,0 +1,56 @@ +/** + * Data service - For HTTP Invocation + */ +export class RequestDataService { + + /** + * Returns the data for GET request. + * @param url + */ + getAsJSON(url: string): Promise { + return fetch(new Request(url)).then((response) => { + return response.json(); + }).then(function(text) { + return text; + }); + } + + /** + * Returns the data for POST request for the given url and payload + * @param url + * @param body + */ + postAsJSON(url: string, body: string): Promise { + return fetch(url, { + method: 'post', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'xsrf-token': this.getCookie('xsrf-token') + }, + body + }).then((response) => { + return response.json(); + }).then(function(text) { + return text; + }); + } + + /** + * Get the cookie value for the given name. + * @param name + */ + getCookie(name: string): string { + const nameLenPlus = (name.length + 1); + return document.cookie + .split(';') + .map(c => c.trim()) + .filter(cookie => { + return cookie.substring(0, nameLenPlus) === `${name}=`; + }) + .map(cookie => { + return (cookie.substring(nameLenPlus)); + })[0] || null; + } + +} diff --git a/samples/web-components/api-gallery-i18n/tsconfig.json b/samples/web-components/api-gallery-i18n/tsconfig.json new file mode 100644 index 0000000..232ef61 --- /dev/null +++ b/samples/web-components/api-gallery-i18n/tsconfig.json @@ -0,0 +1,71 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + "strictNullChecks": false, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +} diff --git a/samples/web-components/api-gallery-i18n/webpack.config.js b/samples/web-components/api-gallery-i18n/webpack.config.js new file mode 100644 index 0000000..81bef7d --- /dev/null +++ b/samples/web-components/api-gallery-i18n/webpack.config.js @@ -0,0 +1,24 @@ +const path = require('path'); + +module.exports = { + mode: "production", + // devtool: 'eval-source-map', + entry: './src/index.ts', + module: { + rules: [ + { + test: /\.ts$/, + use: 'ts-loader', + include: [path.resolve(__dirname, 'src')] + } + ] + }, + resolve: { + extensions: ['.ts'] + }, + output: { + publicPath: "public", + filename: "bundle.js", + path: path.resolve(__dirname, 'public') + } +}