From dcdcf287af97db63c217c6c430a771eae6ccf43d Mon Sep 17 00:00:00 2001 From: "guokai.jgk" Date: Sat, 31 Oct 2020 21:04:06 +0800 Subject: [PATCH] feat: add jsonp datahandler --- .../datasource-engine/src/handlers/fetch.ts | 24 ------- .../datasource-engine/src/handlers/mtop.ts | 18 ----- .../src/handlers/url-params.ts | 12 ---- .../datasource-jsonp-handler/.eslintignore | 3 + .../datasource-jsonp-handler/.eslintrc.js | 7 ++ .../datasource-jsonp-handler/.prettierrc.js | 4 ++ .../datasource-jsonp-handler/package.json | 29 +++++++++ .../datasource-jsonp-handler/src/index.ts | 31 +++++++++ .../datasource-jsonp-handler/tsconfig.json | 65 +++++++++++++++++++ 9 files changed, 139 insertions(+), 54 deletions(-) delete mode 100644 packages/datasource-engine/src/handlers/fetch.ts delete mode 100644 packages/datasource-engine/src/handlers/mtop.ts delete mode 100644 packages/datasource-engine/src/handlers/url-params.ts create mode 100644 packages/datasource-jsonp-handler/.eslintignore create mode 100644 packages/datasource-jsonp-handler/.eslintrc.js create mode 100644 packages/datasource-jsonp-handler/.prettierrc.js create mode 100644 packages/datasource-jsonp-handler/package.json create mode 100644 packages/datasource-jsonp-handler/src/index.ts create mode 100644 packages/datasource-jsonp-handler/tsconfig.json diff --git a/packages/datasource-engine/src/handlers/fetch.ts b/packages/datasource-engine/src/handlers/fetch.ts deleted file mode 100644 index d0f6d344b..000000000 --- a/packages/datasource-engine/src/handlers/fetch.ts +++ /dev/null @@ -1,24 +0,0 @@ -import request from 'universal-request'; -import type { AsObject, RequestOptions } from 'universal-request/lib/types'; - -import { DataSourceOptions, RequestHandler } from '../types'; - -const fetchHandler: RequestHandler = async ({ - url, - uri, - data, - params, - ...otherOptions -}: DataSourceOptions) => { - const reqOptions = { - url: ((url || uri) as unknown) as string, - data: ((data || params) as unknown) as AsObject, - ...otherOptions, - }; - - const res = await request(reqOptions as RequestOptions); - - return res; -}; - -export default fetchHandler; diff --git a/packages/datasource-engine/src/handlers/mtop.ts b/packages/datasource-engine/src/handlers/mtop.ts deleted file mode 100644 index 4894b9ad9..000000000 --- a/packages/datasource-engine/src/handlers/mtop.ts +++ /dev/null @@ -1,18 +0,0 @@ -import mtop from '@ali/universal-mtop'; -import { RequestHandler } from '../types'; - -const mtopHandler: RequestHandler = async (options) => { - const { api, uri, data, params, type, method, ...otherOptions } = options; - const reqOptions = { - ...otherOptions, - api: api || uri, - data: data || params, - type: type || method, - }; - - const res = await mtop(reqOptions); - - return res; -}; - -export default mtopHandler; diff --git a/packages/datasource-engine/src/handlers/url-params.ts b/packages/datasource-engine/src/handlers/url-params.ts deleted file mode 100644 index 67540c9f2..000000000 --- a/packages/datasource-engine/src/handlers/url-params.ts +++ /dev/null @@ -1,12 +0,0 @@ -import qs from 'query-string'; -import { RequestHandler } from '../types'; - -export default function urlParamsHandler(search: string | Record): RequestHandler { - const urlParams = typeof search === 'string' ? qs.parse(search) : search; - - return async () => { - return { - data: urlParams, - }; - }; -} diff --git a/packages/datasource-jsonp-handler/.eslintignore b/packages/datasource-jsonp-handler/.eslintignore new file mode 100644 index 000000000..fecb7c26d --- /dev/null +++ b/packages/datasource-jsonp-handler/.eslintignore @@ -0,0 +1,3 @@ +/node_modules +/es +/lib \ No newline at end of file diff --git a/packages/datasource-jsonp-handler/.eslintrc.js b/packages/datasource-jsonp-handler/.eslintrc.js new file mode 100644 index 000000000..8c13fcaf4 --- /dev/null +++ b/packages/datasource-jsonp-handler/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: '../../.eslintrc', + rules: { + '@typescript-eslint/no-parameter-properties': 1, + 'no-param-reassign': 0, + }, +}; diff --git a/packages/datasource-jsonp-handler/.prettierrc.js b/packages/datasource-jsonp-handler/.prettierrc.js new file mode 100644 index 000000000..de2f53cdf --- /dev/null +++ b/packages/datasource-jsonp-handler/.prettierrc.js @@ -0,0 +1,4 @@ +module.exports = { + singleQuote: true, + trailingComma: 'all', +}; diff --git a/packages/datasource-jsonp-handler/package.json b/packages/datasource-jsonp-handler/package.json new file mode 100644 index 000000000..e2f1d5c1f --- /dev/null +++ b/packages/datasource-jsonp-handler/package.json @@ -0,0 +1,29 @@ +{ + "name": "@ali/datasource-jsonp-handler", + "version": "1.0.0-alpha.1", + "main": "lib/index.js", + "module": "es/index.js", + "typings": "es/index.d.ts", + "files": [ + "src", + "lib", + "es" + ], + "scripts": { + "dev": "tsc --watch", + "clean": "rm -rf es lib", + "build": "npm run clean && tsc && tsc --outDir ./lib --module commonjs ", + "prepublishOnly": "npm run build" + }, + "dependencies": { + "@ali/lowcode-types": "1.0.13-alpha.1", + "jsonp": "^0.2.1", + "typescript": "^3.9.7" + }, + "publishConfig": { + "registry": "https://registry.npm.alibaba-inc.com" + }, + "devDependencies": { + "@types/jsonp": "^0.2.0" + } +} diff --git a/packages/datasource-jsonp-handler/src/index.ts b/packages/datasource-jsonp-handler/src/index.ts new file mode 100644 index 000000000..ca2d58bf8 --- /dev/null +++ b/packages/datasource-jsonp-handler/src/index.ts @@ -0,0 +1,31 @@ +import { RuntimeOptionsConfig } from '@ali/lowcode-types'; +import jsonp from 'jsonp'; + +const handleJsonpFetch = (url: string, param: string, name: string) => { + return new Promise((res, rej) => { + jsonp(url, { param, name }, (error: Error | null, data: any) => { + if (error) { + return rej(error); + } + res({ data }); + }); + }); +}; + +// config 留着扩展 +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function createJsonpHandler(config?: Record) { + // eslint-disable-next-line space-before-function-paren + return async function(options: RuntimeOptionsConfig) { + const params = + typeof options.params === 'object' + ? JSON.stringify(options.params) + : options.params; + const response = await handleJsonpFetch( + options.uri, + params || '', + options.name as string | '', + ); + return response; + }; +} diff --git a/packages/datasource-jsonp-handler/tsconfig.json b/packages/datasource-jsonp-handler/tsconfig.json new file mode 100644 index 000000000..eeea7a79b --- /dev/null +++ b/packages/datasource-jsonp-handler/tsconfig.json @@ -0,0 +1,65 @@ +{ + "compilerOptions": { + "outDir": "es", + "target": "es6", + "module": "esnext", + /* 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": "esnext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "lib": ["ESNext", "DOM"] /* 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', or 'react'. */ + "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": "es" /* 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": true, /* 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. */ + /* 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 */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */, + "skipLibCheck": true + }, + "include": ["src/**/*"] +}