Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions examples/embed.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ import {render as renderAmis, makeTranslator} from 'amis-core';
import 'amis/lib/minimal';

import 'amis-ui/lib/locale/en-US';
import 'amis-ui/lib/locale/zh-CN';
import 'amis-ui/lib/locale/en-US';
import 'amis-ui/lib/locale/de-DE';
import 'amis-ui/lib/themes/cxd';
import 'amis-ui/lib/themes/ang';
import 'amis-ui/lib/themes/antd';
import 'amis-ui/lib/themes/dark';

import 'history';
import {attachmentAdpator} from 'amis-core';
import {pdfUrlLoad} from './loadPdfjsWorker';
Expand Down
7 changes: 7 additions & 0 deletions packages/amis-core/__tests__/jest.setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,10 @@ global.afterAll(() => {
console.error = originalError;
cleanup();
});

// expect.addSnapshotSerializer({
// test: val => typeof val === 'string' && /^[a-z0-9]{12}$/.test(val),
// print: val => {
// return JSON.stringify('__guid_dynamic_value__');
// }
// });
3 changes: 1 addition & 2 deletions packages/amis-core/src/components/PopOver.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
import React from 'react';
import {findDOMNode} from 'react-dom';
import {ClassNamesFn, themeable} from '../theme';
import {autobind, camel, preventDefault} from '../utils';
import {autobind, camel, preventDefault, TestIdBuilder} from '../utils';
import {SubPopoverDisplayedID} from './Overlay';
import type {TestIdBuilder} from 'amis-core';

export interface Offset {
x: number;
Expand Down
3 changes: 2 additions & 1 deletion packages/amis-core/src/factory.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,8 @@ function rendererToComponent(
export function registerRenderer(config: RendererConfig): RendererConfig {
if (!config.test && !config.type) {
throw new TypeError('please set config.type or config.test');
} else if (!config.type) {
} else if (!config.type && config.name !== 'static') {
// todo static 目前还没办法不用 test 来实现
console.warn(
`config.type is recommended for register renderer(${config.test})`
);
Expand Down
3 changes: 2 additions & 1 deletion packages/amis-core/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export * from './store';
import * as utils from './utils/helper';
import {getEnv} from 'mobx-state-tree';

import {RegisterStore, RendererStore} from './store';
import {RegisterStore, registerStore, RendererStore} from './store';
import type {IColumn, IColumn2, IRow, IRow2} from './store';
import {
setDefaultLocale,
Expand Down Expand Up @@ -133,6 +133,7 @@ export {
RendererEnv,
EnvContext,
RegisterStore,
registerStore,
FormItem,
FormItemWrap,
FormItemProps,
Expand Down
1 change: 1 addition & 0 deletions packages/amis-core/src/store/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ export {iRendererStore, IIRendererStore};
export const RegisterStore = function (store: any) {
allowedStoreList.push(store as any);
};
export const registerStore = RegisterStore;

export {
ServiceStore,
Expand Down
24 changes: 14 additions & 10 deletions packages/amis-core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,18 @@ export type ClassName =
[propName: string]: boolean | undefined | null | string;
};

export type RequestAdaptor = (
api: ApiObject,
context: any
) => ApiObject | Promise<ApiObject>;

export type ResponseAdaptor = (
payload: object,
response: fetcherResult,
api: ApiObject,
context: any
) => any;

export interface ApiObject extends BaseApiObject {
config?: {
withCredentials?: boolean;
Expand All @@ -228,16 +240,8 @@ export interface ApiObject extends BaseApiObject {
body?: PlainObject;
query?: PlainObject;
mockResponse?: PlainObject;
adaptor?: (
payload: object,
response: fetcherResult,
api: ApiObject,
context: any
) => any;
requestAdaptor?: (
api: ApiObject,
context: any
) => ApiObject | Promise<ApiObject>;
adaptor?: ResponseAdaptor;
requestAdaptor?: RequestAdaptor;
/**
* api 发送上下文,可以用来传递一些数据给 api 的 adaptor
* @readonly
Expand Down
156 changes: 118 additions & 38 deletions packages/amis-core/src/utils/api.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
import omit from 'lodash/omit';
import {Api, ApiObject, EventTrack, fetcherResult, Payload} from '../types';
import {
Api,
ApiObject,
EventTrack,
fetcherResult,
Payload,
RequestAdaptor,
ResponseAdaptor
} from '../types';
import {FetcherConfig} from '../factory';
import {tokenize, dataMapping, escapeHtml} from './tpl-builtin';
import {evalExpression} from './tpl';
Expand Down Expand Up @@ -33,6 +41,44 @@ interface ApiCacheConfig extends ApiObject {
}

const apiCaches: Array<ApiCacheConfig> = [];
const requestAdaptors: Array<RequestAdaptor> = [];
const responseAdaptors: Array<ResponseAdaptor> = [];

/**
* 添加全局发送适配器
* @param adaptor
*/
export function addApiRequestAdaptor(adaptor: RequestAdaptor) {
requestAdaptors.push(adaptor);
return () => removeApiRequestAdaptor(adaptor);
}

/**
* 删除全局发送适配器
* @param adaptor
*/
export function removeApiRequestAdaptor(adaptor: RequestAdaptor) {
const idx = requestAdaptors.findIndex(i => i === adaptor);
~idx && requestAdaptors.splice(idx, 1);
}

/**
* 添加全局响应适配器
* @param adaptor
*/
export function addApiResponseAdator(adaptor: ResponseAdaptor) {
responseAdaptors.push(adaptor);
return () => removeApiResponseAdaptor(adaptor);
}

/**
* 删除全局响应适配器
* @param adaptor
*/
export function removeApiResponseAdaptor(adaptor: ResponseAdaptor) {
const idx = responseAdaptors.findIndex(i => i === adaptor);
~idx && responseAdaptors.splice(idx, 1);
}

const isIE = !!(document as any).documentMode;

Expand Down Expand Up @@ -488,25 +534,40 @@ export function wrapFetcher(
api = buildApi(api, data, options) as ApiObject;
(api as ApiObject).context = data;

const adaptors = requestAdaptors.concat();
if (api.requestAdaptor) {
debug('api', 'before requestAdaptor', api);
const originQuery = api.query;
const originQueryCopy = isPlainObject(api.query)
? cloneDeep(api.query)
: api.query;
api = (await api.requestAdaptor(api, data)) || api;

if (
api.query !== originQuery ||
(isPlainObject(api.query) && !isEqual(api.query, originQueryCopy))
) {
// 如果 api.data 有变化,且是 get 请求,那么需要重新构建 url
const idx = api.url.indexOf('?');
api.url = `${~idx ? api.url.substring(0, idx) : api.url}?${qsstringify(
api.query
)}`;
}
debug('api', 'after requestAdaptor', api);
const adaptor = api.requestAdaptor;
adaptors.unshift(async (api: ApiObject, context) => {
const originQuery = api.query;
const originQueryCopy = isPlainObject(api.query)
? cloneDeep(api.query)
: api.query;

debug('api', 'before requestAdaptor', api);
api = (await adaptor.call(api, api, context)) || api;

if (
api.query !== originQuery ||
(isPlainObject(api.query) && !isEqual(api.query, originQueryCopy))
) {
// 如果 api.data 有变化,且是 get 请求,那么需要重新构建 url
const idx = api.url.indexOf('?');
api.url = `${
~idx ? api.url.substring(0, idx) : api.url
}?${qsstringify(api.query)}`;
}
debug('api', 'after requestAdaptor', api);
return api;
});
}

// 执行所有的发送适配器
if (adaptors.length) {
api = await adaptors.reduce(async (api, fn) => {
let ret: any = await api;
ret = (await fn(ret, data)) || ret;
return ret as ApiObject;
}, Promise.resolve(api));
}

if (
Expand Down Expand Up @@ -589,31 +650,50 @@ export function wrapFetcher(
return wrappedFetcher;
}

export function wrapAdaptor(
export async function wrapAdaptor(
promise: Promise<fetcherResult>,
api: ApiObject,
context: any
) {
const adaptor = api.adaptor;
return adaptor
? promise
.then(async response => {
debug('api', 'before adaptor data', (response as any).data);
let result = adaptor((response as any).data, response, api, context);

if (result?.then) {
result = await result;
}
const adaptors = responseAdaptors.concat();
if (api.adaptor) {
const adaptor = api.adaptor;
adaptors.push(
async (
payload: object,
response: fetcherResult,
api: ApiObject,
context: any
) => {
debug('api', 'before adaptor data', (response as any).data);
let result = adaptor((response as any).data, response, api, context);

if (result?.then) {
result = await result;
}

debug('api', 'after adaptor data', result);
debug('api', 'after adaptor data', result);
return result;
}
);
}

return {
...response,
data: result
};
})
.then(ret => responseAdaptor(ret, api))
: promise.then(ret => responseAdaptor(ret, api));
const response = await adaptors.reduce(async (promise, adaptor) => {
let response: any = await promise;
let result =
adaptor(response.data, response, api, context) ?? response.data;

if (result?.then) {
result = await result;
}

return {
...response,
data: result
} as fetcherResult;
}, promise);

return responseAdaptor(response, api);
}

/**
Expand Down
22 changes: 20 additions & 2 deletions packages/amis-formula/rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const external = id =>

export default [
{
input: ['./src/index.ts', './src/doc.ts'],
input: ['./src/index.ts'],
output: [
{
...settings,
Expand All @@ -45,7 +45,7 @@ export default [
plugins: getPlugins('cjs')
},
{
input: ['./src/index.ts', './src/doc.ts'],
input: ['./src/index.ts'],
output: [
{
...settings,
Expand All @@ -61,6 +61,23 @@ export default [
}
];

function transpileDynamicImportForCJS(options) {
return {
name: 'transpile-dynamic-import-for-cjs',
renderDynamicImport({format, targetModuleId}) {
if (format !== 'cjs') {
return null;
}

return {
left: 'Promise.resolve().then(function() {return new Promise(function(fullfill) {require([',
right:
', "tslib"], function(mod, tslib) {fullfill(tslib.__importStar(mod))})})})'
};
}
};
}

function getPlugins(format = 'esm') {
const typeScriptOptions = {
typescript: require('typescript'),
Expand All @@ -83,6 +100,7 @@ function getPlugins(format = 'esm') {
};

return [
transpileDynamicImportForCJS(),
json(),
resolve({
jsnext: true,
Expand Down
24 changes: 6 additions & 18 deletions packages/amis-formula/scripts/genDoc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,26 +89,14 @@ async function main(...params: Array<any>) {

fs.writeFileSync(
outputFile,
`/**\n * 公式文档 请运行 \`npm run genDoc\` 自动生成\n */\nexport const doc: ${[
`{`,
` name: string;`,
` description: string;`,
` example: string;`,
` params: {`,
` type: string;`,
` name: string;`,
` description: string | null;`,
` }[];`,
` returns: {`,
` type: string;`,
` description: string | null;`,
` };`,
` namespace: string;`,
`}[]`
].join('\n')} = ${JSON.stringify(result, null, 2).replace(
`/**\n * 公式文档 请运行 \`npm run genDoc\` 自动生成\n */\n
import {bulkRegisterFunctionDoc} from './function';

bulkRegisterFunctionDoc(${JSON.stringify(result, null, 2).replace(
/\"(\w+)\"\:/g,
(_, key) => `${key}:`
)};`,
)});
`,
'utf8'
);
console.log(`公式文档生成 > ${outputFile}`);
Expand Down
Loading