@umijs/plugins
Version:
151 lines (143 loc) • 4.37 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/initial-state.ts
var initial_state_exports = {};
__export(initial_state_exports, {
default: () => initial_state_default
});
module.exports = __toCommonJS(initial_state_exports);
var import_umi = require("umi");
var import_withTmpPath = require("./utils/withTmpPath");
var initial_state_default = (api) => {
api.describe({
config: {
schema({ zod }) {
return zod.object({
loading: zod.string()
}).partial();
}
},
enableBy: api.EnableBy.config
});
api.register({
key: "addExtraModels",
fn: () => [
(0, import_withTmpPath.withTmpPath)({
api,
path: '@@initialState.ts#{"namespace":"@@initialState"}'
})
]
});
api.addRuntimePluginKey(() => ["getInitialState"]);
api.addRuntimePlugin(() => {
return [(0, import_withTmpPath.withTmpPath)({ api, path: "runtime.tsx" })];
});
api.onGenerateFiles(() => {
var _a;
const { loading } = api.config.initialState;
api.writeTmpFile({
path: "Provider.tsx",
content: `
import React from 'react';
import { useModel } from '@@/plugin-model';
${loading ? `import Loading from '${loading}'` : `function Loading() { return <div />; }`}
export default function InitialStateProvider(props: any) {
const appLoaded = React.useRef(false);
const { loading = false } = useModel("@@initialState") || {};
React.useEffect(() => {
if (!loading) {
appLoaded.current = true;
}
}, [loading]);
if (loading && !appLoaded.current) {
return <Loading />;
}
return props.children;
}
`
});
api.writeTmpFile({
path: "@@initialState.ts",
content: ((_a = api.appData.appJS) == null ? void 0 : _a.exports.includes("getInitialState")) ? `
import { useState, useEffect, useCallback } from 'react';
import { getInitialState } from '@/app';
export type InitialStateType = Awaited<ReturnType<typeof getInitialState>> | undefined;
const initState = {
initialState: undefined as InitialStateType,
loading: true,
error: undefined,
};
export default () => {
const [state, setState] = useState(initState);
const refresh = useCallback(async () => {
setState((s) => ({ ...s, loading: true, error: undefined }));
try {
const ret = await getInitialState();
setState((s) => ({ ...s, initialState: ret, loading: false }));
} catch (e) {
setState((s) => ({ ...s, error: e, loading: false }));
}
}, []);
const setInitialState = useCallback(
async (
initialState: InitialStateType | ((initialState: InitialStateType) => InitialStateType),
) => {
setState((s) => {
if (typeof initialState === 'function') {
return { ...s, initialState: initialState(s.initialState), loading: false };
}
return { ...s, initialState, loading: false };
});
},
[],
);
useEffect(() => {
refresh();
}, []);
return {
...state,
refresh,
setInitialState,
};
}
` : `
export default () => ({ loading: false, refresh: () => {} })
`
});
api.writeTmpFile({
path: "runtime.tsx",
content: `
import React from 'react';
import Provider from './Provider';
export function dataflowProvider(container) {
return <Provider>{ container }</Provider>;
}
`
});
api.writeTmpFile({
path: import_umi.RUNTIME_TYPE_FILE_NAME,
content: `
export interface IRuntimeConfig {
getInitialState?: () => Promise<Record<string, any>>
}
`
});
});
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {});