@heathenjs/taro-router-generator 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +14 -0
- package/dist/type.d.ts +19 -0
- package/dist/utils.d.ts +6 -0
- package/package.json +41 -0
package/README.md
ADDED
|
File without changes
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Page } from './type';
|
|
2
|
+
export type { Page } from './type';
|
|
3
|
+
type PackageConfig = {
|
|
4
|
+
/** 包名 */
|
|
5
|
+
name: string;
|
|
6
|
+
/** 包页面根路径 */
|
|
7
|
+
pagePath: string;
|
|
8
|
+
};
|
|
9
|
+
type GeneratorOptions = {
|
|
10
|
+
/** 排除的文件 */
|
|
11
|
+
ignore: string[];
|
|
12
|
+
/** 包配置 */
|
|
13
|
+
packages: [PackageConfig & {
|
|
14
|
+
isMainPackage: true;
|
|
15
|
+
}, ...(PackageConfig & {
|
|
16
|
+
isMainPackage?: false;
|
|
17
|
+
})[]];
|
|
18
|
+
};
|
|
19
|
+
export declare class Generator {
|
|
20
|
+
private pages;
|
|
21
|
+
private mainPackageName;
|
|
22
|
+
private tsProject;
|
|
23
|
+
constructor({ ignore, packages }: GeneratorOptions);
|
|
24
|
+
/** 生成路由方法 */
|
|
25
|
+
private generateRouterNavigateMethod;
|
|
26
|
+
/** 生成页面对象的集合 */
|
|
27
|
+
private generatePagesSet;
|
|
28
|
+
private createRouterSourceFile;
|
|
29
|
+
private overrideRouter;
|
|
30
|
+
generateRouter(): void;
|
|
31
|
+
getPages(): Page[];
|
|
32
|
+
getMainPackageName(): string;
|
|
33
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";var _=Object.create;var y=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var B=Object.getPrototypeOf,U=Object.prototype.hasOwnProperty;var V=(n,t)=>{for(var a in t)y(n,a,{get:t[a],enumerable:!0})},F=(n,t,a,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of K(t))!U.call(n,e)&&e!==a&&y(n,e,{get:()=>t[e],enumerable:!(r=I(t,e))||r.enumerable});return n};var P=(n,t,a)=>(a=n!=null?_(B(n)):{},F(t||!n||!n.__esModule?y(a,"default",{value:n,enumerable:!0}):a,n)),q=n=>F(y({},"__esModule",{value:!0}),n);var H={};V(H,{Generator:()=>R});module.exports=q(H);var u=P(require("fs-extra")),C=P(require("ignore")),S=P(require("normalize-path")),$=P(require("ora")),s=P(require("path")),E=require("ts-morph");var D=P(require("path")),w=require("ts-morph");function O(n){let{name:t,declaration:a}=n;if(!w.VariableDeclaration.is(a.getKind()))throw Error(`${t} \u5E94\u8BE5\u5BFC\u51FA\u53D8\u91CF\u7C7B\u578B`);return a.getFullText().split("=",2)[1].trim()}function v(n){return n.replace(new RegExp(`(\\-|\\${D.default.sep})`,"g"),"_").replace(/\_(\w)/g,(t,a)=>a.toUpperCase()).replace(/^\S/,t=>t.toUpperCase())}var f=s.default.resolve("node_modules","@heathenjs/taro-router"),M=["index.js","index.jsx","index.jsx","index.tsx"],L=process.cwd(),Q=s.default.resolve(L,"./src"),R=class{constructor({ignore:t,packages:a}){this.pages=[];this.tsProject=new E.Project({tsConfigFilePath:s.default.resolve(f,"tsconfig.json")});var l;let r=a.filter(m=>m.isMainPackage);if(r.length)r.length>1&&console.warn("[@heathenjs/taro-router]: \u5B58\u5728\u591A\u4E2A\u914D\u7F6E\u7684\u4E3B\u5305\uFF0C\u5C06\u4F7F\u7528\u9996\u4E2A\u4E3B\u5305");else throw console.warn("[@heathenjs/taro-router]: \u6CA1\u6709\u68C0\u6D4B\u5230\u4E3B\u5305\uFF0C\u8BF7\u786E\u8BA4\u914D\u7F6E"),new Error("[@heathenjs/taro-router]: \u6CA1\u6709\u68C0\u6D4B\u5230\u4E3B\u5305\uFF0C\u8BF7\u786E\u8BA4\u914D\u7F6E");this.mainPackageName=(l=r[0])==null?void 0:l.name;let e=(0,C.default)().add(t).createFilter(),o=(0,$.default)("\u5F00\u59CB\u89E3\u6790\u9875\u9762...").start();for(let m of a){let i=s.default.resolve(L,m.pagePath),x=this.tsProject.addSourceFilesAtPaths(s.default.join(i,"/**/route.config.ts")),T=u.default.readdirSync(i,{recursive:!0,encoding:"utf-8"}).filter(c=>u.default.statSync(s.default.resolve(i,c)).isDirectory()&&M.some(d=>u.default.existsSync(s.default.resolve(i,c,d)))).filter(e);for(let c of T){let d=u.default.readdirSync(s.default.resolve(i,c),{encoding:"utf8"}).filter(p=>M.some(k=>p===k))[0],N=s.default.resolve(i,c,"route.config.ts"),g=x.find(p=>s.default.normalize(p.compilerNode.fileName)===N);g==null||g.refreshFromFileSystemSync();let h=s.default.resolve(i,c),j=(0,S.default)(c);this.pages.push({packageName:m.name,dirName:j,dirPath:h,path:(0,S.default)(s.default.join(i.replace(Q,""),c,"index")),pageFileName:d,routeConfig:g?Array.from(g.getExportedDeclarations().entries()).reduce((p,[k,b])=>{if(b.length>1)return p;let A=b[0];switch(k){case"Params":p.params=`import('${s.default.resolve(h,"route.config").replace(/\\/g,"/")}').Params`;break;case"BackData":p.backData=`import('${s.default.resolve(h,"route.config").replace(/\\/g,"/")}').BackData`;break;case"Ext":p.ext=O({name:k,declaration:A});break}return p},{}):void 0}),o.text=`Router.${m.name===this.mainPackageName?"":`${m.name}.`}to${v(j)}`}}o.succeed("\u9875\u9762\u89E3\u6790\u6210\u529F")}generateRouterNavigateMethod(){let t=this.pages.reduce((r,e)=>{var d,N,g,h;let o=[e.packageName,...e.dirName.split("/")],l="to"+v(e.dirName),m=`/** [View page component](${e.dirPath}/${e.pageFileName}) */`,i=((d=e.routeConfig)==null?void 0:d.backData)??"any",x=(N=e.routeConfig)!=null&&N.params?`<TBackData = ${i}, TParams = ${((g=e.routeConfig)==null?void 0:g.params)??"unknown"}>(...options: RequiredKeys<NavigateOptions & Params<NoInfer<TParams>>> extends never ? [options?: NavigateOptions & Params<NoInfer<TParams>>] : [options: NavigateOptions & Params<NoInfer<TParams>>]) => Promise<TBackData>`:`<TBackData = ${i}, TParams = unknown>(options?: NavigateOptions & Params<NoInfer<TParams>>) => Promise<TBackData>`,T=`function (options) {return Router.navigate({ url: "${e.path}"${(h=e.routeConfig)!=null&&h.ext?", ext: "+e.routeConfig.ext:""} }, options)}`,c=r.get(e.packageName);return c||(c=[],r.set(e.packageName,c)),c.push({path:o,name:l,comment:m,type:x,body:T}),r},new Map),a="";for(let r of t.keys()){let e=t.get(r);r===this.mainPackageName?a+=e==null?void 0:e.map(o=>`${o.comment}
|
|
2
|
+
static ${o.name}: ${o.type} = ${o.body}`).join(`
|
|
3
|
+
|
|
4
|
+
`):a+=`
|
|
5
|
+
static ${r}: {
|
|
6
|
+
${e==null?void 0:e.map(o=>`${o.comment}
|
|
7
|
+
${o.name}: ${o.type}`).join(`;
|
|
8
|
+
`)}
|
|
9
|
+
} = {
|
|
10
|
+
${e==null?void 0:e.map(o=>`${o.name}: ${o.body}`).join(`,
|
|
11
|
+
`)}
|
|
12
|
+
}
|
|
13
|
+
`}return a}generatePagesSet(){let t={},a={};for(let r=0;r<this.pages.length;++r){let e=this.pages[r];t[e.path]=e.packageName;let l=v(e.dirName).replace(/^(\w)/g,(m,i)=>i.toLowerCase());e.packageName===this.mainPackageName?a[l]={path:e.path}:(a[e.packageName]||(a[e.packageName]={}),a[e.packageName][l]={path:e.path})}return[`private static _methodLikePathObj = ${JSON.stringify(a)}`,`private static _pathToPagePackageNameObj = ${JSON.stringify(t)}`,"static getPages = () => { return Router._methodLikePathObj }"].join(`
|
|
14
|
+
`)}createRouterSourceFile(){return this.tsProject.createSourceFile("temp.ts",t=>{t.writeLine("type NoInfer<T> = T extends infer U ? U : never;"),t.writeLine("type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T]"),t.writeLine("type Data<Q> = RequiredKeys<Q> extends never ? { data?: Q } : { data: Q }"),t.writeLine("type Params<P> = RequiredKeys<P> extends never ? { params?: P } : { params: P }"),t.writeLine("class Router {"),t.write(this.generateRouterNavigateMethod()),t.write(this.generatePagesSet()),t.writeLine("}")})}overrideRouter(t){u.default.rmSync(s.default.resolve(f,"./dist/core/index.js"),{recursive:!0,force:!0}),u.default.rmSync(s.default.resolve(f,"./dist/core/index.js.map"),{recursive:!0,force:!0}),u.default.rmSync(s.default.resolve(f,"./dist/core/index.d.ts"),{recursive:!0,force:!0});let a=this.tsProject.addSourceFileAtPath(s.default.resolve(f,"./src/core/index.ts"));a.refreshFromFileSystemSync();let r=a.getClass("Router"),e=t.getClass("Router").getStaticMembers();a.addTypeAliases(t.getTypeAliases().map(o=>o.getStructure())),r.addMembers(e.map(o=>o.getStructure())),a.emitSync()}generateRouter(){let t=(0,$.default)("\u5F00\u59CB\u751F\u6210\u8DEF\u7531...").start(),a=this.createRouterSourceFile();this.overrideRouter(a),a.delete(),t.succeed(`\u5DF2\u751F\u6210 ${this.pages.length} \u4E2A\u9875\u9762\u7684\u8DEF\u7531`)}getPages(){return this.pages}getMainPackageName(){return this.mainPackageName}};0&&(module.exports={Generator});
|
package/dist/type.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type Page = {
|
|
2
|
+
dirName: string;
|
|
3
|
+
dirPath: string;
|
|
4
|
+
path: string;
|
|
5
|
+
pageFileName: string;
|
|
6
|
+
packageName: string;
|
|
7
|
+
routeConfig?: {
|
|
8
|
+
params?: string;
|
|
9
|
+
backData?: string;
|
|
10
|
+
ext?: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export type RouterNavigateMethodConfig = {
|
|
14
|
+
path: string[];
|
|
15
|
+
name: string;
|
|
16
|
+
comment: string;
|
|
17
|
+
type: string;
|
|
18
|
+
body: string;
|
|
19
|
+
};
|
package/dist/utils.d.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@heathenjs/taro-router-generator",
|
|
3
|
+
"version": "1.1.5",
|
|
4
|
+
"description": "core generator for @heathenjs/taro-router",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"package.json",
|
|
10
|
+
"README.md"
|
|
11
|
+
],
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public",
|
|
14
|
+
"registry": "https://registry.npmjs.org/"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [],
|
|
17
|
+
"author": "heathen1998",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"@tarojs/service": "^3.6.35",
|
|
21
|
+
"@tarojs/taro": "^3.6.35"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"fs-extra": "^11.3.3",
|
|
25
|
+
"ignore": "^6.0.2",
|
|
26
|
+
"normalize-path": "^3.0.0",
|
|
27
|
+
"ora": "^8.2.0",
|
|
28
|
+
"ts-morph": "^21.0.1"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/normalize-path": "^3.0.0"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"clean": "rimraf dist",
|
|
35
|
+
"build:script": "tsx build.ts",
|
|
36
|
+
"build:type": "tsc",
|
|
37
|
+
"build": "npm run clean && npm run build:script && npm run build:type",
|
|
38
|
+
"tsc": "tsc --noEmit",
|
|
39
|
+
"lint": "eslint --ext .ts --max-warnings 0 \"./src\" "
|
|
40
|
+
}
|
|
41
|
+
}
|