page2pdf_server 1.0.2 → 1.1.0
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/.babelrc +3 -3
- package/.eslintrc +32 -32
- package/.github/ISSUE_TEMPLATE/bug_report.md +28 -28
- package/.github/ISSUE_TEMPLATE/feature_request.md +15 -15
- package/.github/ISSUE_TEMPLATE/refactoring.md +15 -15
- package/.github/PULL_REQUEST_TEMPLATE.md +18 -18
- package/.github/stale.yml +17 -17
- package/.github/workflows/cd.yml +75 -75
- package/.github/workflows/ci.yml +36 -36
- package/.husky/pre-commit +6 -6
- package/.husky/pre-push +4 -4
- package/.prettierrc +8 -8
- package/.vscode/settings.json +3 -3
- package/LICENSE +17 -17
- package/README.md +54 -23
- package/ecosystem.config.js +41 -41
- package/jest.config.js +35 -35
- package/nodemon.json +6 -6
- package/package.json +8 -10
- package/src/CSS/345/205/274/345/256/271/346/200/247.txt +69 -0
- package/src/app.ts +7 -2
- package/src/components/home/controller.ts +2 -2
- package/src/components/home/pdfController.ts +9 -5
- package/src/components/home/services.ts +3 -3
- package/src/components/home/splitController.ts +9 -5
- package/src/components/home/validators.ts +1 -1
- package/src/db/home.ts +3 -3
- package/src/helpers/apiResponse.ts +1 -1
- package/src/helpers/error/TimeOutError.ts +1 -1
- package/src/helpers/loggers.ts +1 -1
- package/src/index.ts +4 -1
- package/src/middlewares/errorHandler.ts +1 -1
- package/src/routes/index.ts +2 -2
- package/src/types/request/config.ts +10 -5
- package/src/types/request/home.ts +1 -1
- package/src/utils/pdfgen.ts +66 -16
- package/src//346/265/213/350/257/225.txt +26 -2
- package/test//346/211/223/345/215/260/346/234/215/345/212/241.http +17 -0
- package/tsconfig.json +41 -41
- package/tslint.json +22 -22
- package/.idea/codeStyles/Project.xml +0 -58
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/encodings.xml +0 -7
- package/.idea/inspectionProfiles/Project_Default.xml +0 -7
- package/.idea/modules.xml +0 -8
- package/.idea/page2pdf-server.iml +0 -12
- package/.idea/tenstack-starter-main.iml +0 -12
- package/.idea/vcs.xml +0 -6
package/src/utils/pdfgen.ts
CHANGED
|
@@ -5,9 +5,13 @@ import CDP from "chrome-remote-interface";
|
|
|
5
5
|
import _ from "lodash";
|
|
6
6
|
// @ts-ignore
|
|
7
7
|
import config from "config";
|
|
8
|
-
import CONFIG from "
|
|
9
|
-
import {
|
|
10
|
-
|
|
8
|
+
import CONFIG from "../configEnv";
|
|
9
|
+
import {
|
|
10
|
+
ConfigRoot,
|
|
11
|
+
FileTransform,
|
|
12
|
+
MyPaperSize,
|
|
13
|
+
} from "../types/request/config";
|
|
14
|
+
import { filePathToUrl } from "../utils/url";
|
|
11
15
|
|
|
12
16
|
//自定义纸张系列的:
|
|
13
17
|
const paperSZs = config.get("size") as MyPaperSize[];
|
|
@@ -78,6 +82,7 @@ interface IRenderPdfOptions {
|
|
|
78
82
|
landscape?: boolean;
|
|
79
83
|
includeBackground?: boolean;
|
|
80
84
|
windowSize?: boolean;
|
|
85
|
+
//纸张 英寸为单位的。 限制打印输出的用
|
|
81
86
|
paperWidth?: number;
|
|
82
87
|
paperHeight?: number;
|
|
83
88
|
pageRanges?: string;
|
|
@@ -92,6 +97,7 @@ interface IRenderPdfOptions {
|
|
|
92
97
|
marginBottom?: number;
|
|
93
98
|
marginLeft?: number;
|
|
94
99
|
marginRight?: number;
|
|
100
|
+
//有些 要打印 背景图片的需要?
|
|
95
101
|
printBackground?: boolean;
|
|
96
102
|
}
|
|
97
103
|
|
|
@@ -124,6 +130,7 @@ export class RenderPDF {
|
|
|
124
130
|
* 奇数页还是偶数页的,双面打印对页码位置可能会调整位置的,而单独一个URL生成pdf时刻有可能没法就一定能够正确打印页码文字的是定位位置啊。抛弃支持:纯静态html横竖方向混合的场景,独立转换抽取部分纸张到过渡的pdf或拆解组合来做。
|
|
125
131
|
* 还是考虑:保留第一阶段页眉页脚的打印能力,但是仅仅针对:特殊url:file[url:{ 只能是独立的页码编码和页码合计数独自计数,不涉及到其它的URL的 }],双面打印:页码只能放在中间位置为好,页码必须从第一页开始编码的,而且这种情况目标是不采用叠加页眉页脚两次pdf方案(一次性,不提取出CSS纸张方向)。
|
|
126
132
|
* 最终采用引入reverseRanges参数设置部分纸张反转纸张方向,需要配置某某页并和CSS打印第一阶段生成的pdf能够吻合纸张方向的话,就能确保页眉页脚叠加正常位置。这里步骤就免于处理页眉页脚的生成了。
|
|
133
|
+
* CDP【Target】才是开启URL的。浏览器初始化; Page是打印输出的。
|
|
127
134
|
* */
|
|
128
135
|
async renderPdf(task: ConfigRoot<FileTransform>, tsobj: FileTransform) {
|
|
129
136
|
let options = {} as IRenderPdfOptions;
|
|
@@ -139,6 +146,7 @@ export class RenderPDF {
|
|
|
139
146
|
const { CDPclient, targetId } = await this.newTabOrPage(
|
|
140
147
|
this.getCDPhostPort(),
|
|
141
148
|
url,
|
|
149
|
+
tsobj.brwidth,
|
|
142
150
|
);
|
|
143
151
|
// await RenderPDF.newTabOrPage(this.getCDPhostPort(), url);
|
|
144
152
|
// const client = await CDP({ host: this.host, port: this.port });
|
|
@@ -343,7 +351,9 @@ export class RenderPDF {
|
|
|
343
351
|
// renderer.killChrome();
|
|
344
352
|
}
|
|
345
353
|
|
|
346
|
-
/**关键的: 某一个url的转换步骤
|
|
354
|
+
/**关键的: 某一个url的转换步骤
|
|
355
|
+
* @param tsobj 每一个独立URL生成 FileTransform 配置的
|
|
356
|
+
* */
|
|
347
357
|
async generateSinglePdf(
|
|
348
358
|
tsobj: FileTransform,
|
|
349
359
|
task: ConfigRoot<FileTransform>,
|
|
@@ -512,7 +522,9 @@ export class RenderPDF {
|
|
|
512
522
|
return ret;
|
|
513
523
|
}
|
|
514
524
|
|
|
515
|
-
/**汇总步骤入口: 前提 :前面已经生成独立的多个pdf
|
|
525
|
+
/**汇总步骤入口: 前提 :前面已经生成独立的多个pdf
|
|
526
|
+
* 另外 还有await renderer.newTabOrPage(/ renderer.yemeiyejiaoPageGen( 是用于生成页眉页脚的每一页都有独立临时pdf。
|
|
527
|
+
* */
|
|
516
528
|
static async MergeAllPdfs(
|
|
517
529
|
task: ConfigRoot<FileTransform>,
|
|
518
530
|
options: IRenderPdfOptions,
|
|
@@ -737,12 +749,12 @@ export class RenderPDF {
|
|
|
737
749
|
headerTemplate0 = headerTemplate0?.replace("-NOT_DISPLAY-", "");
|
|
738
750
|
headerTemplate0 = headerTemplate0
|
|
739
751
|
?.replace(
|
|
740
|
-
"
|
|
752
|
+
"~pageNumber~",
|
|
741
753
|
tsobj.roman && pageNumber > 0 && pageNumber < 13
|
|
742
754
|
? ROMA_NUMS[pageNumber]
|
|
743
755
|
: "" + pageNumber,
|
|
744
756
|
)
|
|
745
|
-
.replace("
|
|
757
|
+
.replace("~totalPages~", "" + totalPages);
|
|
746
758
|
}
|
|
747
759
|
options.headerTemplate = headerTemplate0;
|
|
748
760
|
let footerTemplate0;
|
|
@@ -769,12 +781,12 @@ export class RenderPDF {
|
|
|
769
781
|
footerTemplate0 = footerTemplate0?.replace("-NOT_DISPLAY-", "");
|
|
770
782
|
footerTemplate0 = footerTemplate0
|
|
771
783
|
?.replace(
|
|
772
|
-
"
|
|
784
|
+
"~pageNumber~",
|
|
773
785
|
tsobj.roman && pageNumber > 0 && pageNumber < 13
|
|
774
786
|
? ROMA_NUMS[pageNumber]
|
|
775
787
|
: "" + pageNumber,
|
|
776
788
|
)
|
|
777
|
-
.replace("
|
|
789
|
+
.replace("~totalPages~", "" + totalPages);
|
|
778
790
|
}
|
|
779
791
|
options.footerTemplate = footerTemplate0;
|
|
780
792
|
|
|
@@ -792,16 +804,17 @@ export class RenderPDF {
|
|
|
792
804
|
return null;
|
|
793
805
|
}
|
|
794
806
|
|
|
795
|
-
|
|
796
|
-
* 问题:刚用createTarget立刻获取targetId(frameId)没法正常工作,
|
|
797
|
-
* 这里await CDP(options)必须做两次!!:没法避免,否则干扰用户窗口,要么新Tab没有实际准备好的。
|
|
798
|
-
* */
|
|
799
|
-
async newTabOrPage(options: CDPbeginParam, url: string) {
|
|
807
|
+
async newTabPageInner(options: CDPbeginParam, url: string, brwidth?: number) {
|
|
800
808
|
const client1 = await CDP(options); // await CDP({ host: options.host, port: options.port });
|
|
801
|
-
const { Target } = client1;
|
|
809
|
+
const { Target, Browser } = client1;
|
|
810
|
+
//页眉页脚也会开动新的Tab; 没尝试出来:用这个入口就可控制浏览器窗口的宽度的办法。
|
|
802
811
|
await Target.createTarget({
|
|
803
812
|
url: url,
|
|
804
813
|
background: true,
|
|
814
|
+
width: 719, //无效:(headless chrome only)不算无头模式的,有展示交互式窗口啊。
|
|
815
|
+
newWindow: true,
|
|
816
|
+
// enableBeginFrameControl: true,
|
|
817
|
+
forTab: true,
|
|
805
818
|
});
|
|
806
819
|
//前端编码之escape、encodeURI对的, 和 encodeURIComponent
|
|
807
820
|
const { targetInfos } = await Target.getTargets();
|
|
@@ -809,12 +822,49 @@ export class RenderPDF {
|
|
|
809
822
|
//"type": "webview", iframe, background_page, ...
|
|
810
823
|
return tab.type === "page" && tab.url === url;
|
|
811
824
|
});
|
|
812
|
-
|
|
825
|
+
//targetId就是目标窗口的实例。
|
|
813
826
|
if (!target.targetId) throw new Error("没开启窗口:" + url);
|
|
827
|
+
if (brwidth) {
|
|
828
|
+
//需要约束浏览器 来避免打印页数不正常的,web页面的动态布局导致的,打印结果太少太多页数。
|
|
829
|
+
const { windowId, bounds } = await Browser.getWindowForTarget({
|
|
830
|
+
targetId: target.targetId,
|
|
831
|
+
});
|
|
832
|
+
const objectWidth = brwidth;
|
|
833
|
+
const newbounds = {
|
|
834
|
+
...bounds,
|
|
835
|
+
width: objectWidth,
|
|
836
|
+
windowState: "normal",
|
|
837
|
+
};
|
|
838
|
+
await Browser.setWindowBounds({ windowId, bounds: newbounds });
|
|
839
|
+
const { bounds: realBound } = await Browser.getWindowBounds({ windowId });
|
|
840
|
+
const newRealWidth = realBound?.width;
|
|
841
|
+
if (objectWidth !== newRealWidth)
|
|
842
|
+
throw new Error("开窗口宽度不适当:" + newRealWidth);
|
|
843
|
+
}
|
|
844
|
+
client1.close(); //原先每次关闭的:
|
|
814
845
|
const client = await CDP(options);
|
|
846
|
+
|
|
815
847
|
//这些用例简易网页:frameId实际等同targetId;因没有嵌套<iframe />标签的。
|
|
816
848
|
return { CDPclient: client, targetId: target.targetId };
|
|
817
849
|
}
|
|
850
|
+
/**直接嵌入用户打开的浏览器的模式下,独立的开启新的浏览器窗口需要:
|
|
851
|
+
* 问题:刚用createTarget立刻获取targetId(frameId)没法正常工作,
|
|
852
|
+
* 这里await CDP(options)必须做两次!!:没法避免,否则干扰用户窗口,要么新Tab没有实际准备好的。
|
|
853
|
+
* 另外入口是:页眉页脚是使用纯粹 静态的 yemeiyejiaoHtml 来生成的每一页的独立页眉页脚pdf再合并的,不需要考虑浏览器宽度大小会影响到(不是动态布局的内容)。
|
|
854
|
+
* */
|
|
855
|
+
async newTabOrPage(options: CDPbeginParam, url: string, brwidth?: number) {
|
|
856
|
+
//多尝试一次, 浏览器宽度设置可能不能一次性成功的。
|
|
857
|
+
for (let i = 0; i < 2; i++) {
|
|
858
|
+
try {
|
|
859
|
+
const result = await this.newTabPageInner(options, url, brwidth);
|
|
860
|
+
return result;
|
|
861
|
+
} catch (e) {
|
|
862
|
+
// @ts-ignore
|
|
863
|
+
if (!e.message.startsWith("开窗口宽度不适当:")) console.error(e);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
throw new Error("开启窗口尝试2次失败:" + url);
|
|
867
|
+
}
|
|
818
868
|
/**假如不是当前刚刚操作的Tab的话?:
|
|
819
869
|
* */
|
|
820
870
|
async closeTabOrPage(client: any, target: string) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
工具包需要发布,工程目录:page2pdf-server/执行 npm publish 发布到npm
|
|
2
2
|
后端没有单步调试模式太不好了,原本直接start就能单步调试,后来不行了,jest来解决:
|
|
3
3
|
__test__/./generatePdf.test.ts问题:jest用Run模式正常,可是若Debug模式单步调试的,.post(`/api/pdf`).send就会提前中止!原因xxxController容不下多个接口函数?
|
|
4
4
|
/?有断点运行卡着的并且xxxController类里有两个函数的?提前中止啊;非得拆分两个文件。
|
|
@@ -171,6 +171,8 @@ headerTemplate = `<div style="position: relative; width:100%; text-align:center;
|
|
|
171
171
|
<div style="position: absolute; width:100%; text-align: center; bottom: 5px;"><span class=title></div>
|
|
172
172
|
<div style="position: absolute; text-align: right; bottom: 5px;right: 20px;">version: 1.0</div>
|
|
173
173
|
</div>`;
|
|
174
|
+
|
|
175
|
+
默认标题 '<div style=\\"position: absolute; width:100%; text-align: center; bottom: 5px;\\"><span id=\\"titlespan\\" class=title></div>',
|
|
174
176
|
使用chrome, 不能以root账号直接使用 https://www.cnblogs.com/kk1893/p/14985512.html
|
|
175
177
|
let browserOptions = { args: ['--no-sandbox', '--disable-setuid-sandbox'] };
|
|
176
178
|
物理打印机系统对话框设置:可能能配置装订线宽度和页码输出的{套中套}可分拆却就不能文件合并。
|
|
@@ -241,4 +243,26 @@ package.json:: start 又能使用单步调试模式运行了,奇怪,为何
|
|
|
241
243
|
}
|
|
242
244
|
BD1CE5AD1D724197A177AC4E50DDB4A6
|
|
243
245
|
|
|
244
|
-
去掉bcrypt包 @mapbox/node-pre-gyp node-gyp 依賴python啊
|
|
246
|
+
去掉bcrypt包 @mapbox/node-pre-gyp node-gyp 依賴python啊
|
|
247
|
+
useMeasure(dynctRef0)?.height 所获得尺寸实际针对屏幕的,在打印机场景该取值还是来自屏幕的,并非纸张打印语义的尺寸;没法测量打印时刻的div高度?。
|
|
248
|
+
|
|
249
|
+
新电脑,不是管理员账户跑的开发环境,POST http://localhost:9389/api/pdf 出现error: Error: connect ECONNREFUSED 127.0.0.1:9872
|
|
250
|
+
只好另外管理员用户启动浏览器窗口。当前打印服务器的为何却要调用管理员账户启动的浏览器?不能直接用当前用户启动浏览器,非要windows管理员窗口的。
|
|
251
|
+
奇怪浏览器手动去打印必须勾选页眉页脚才正常,没选的表格最右边会不见了,但是打印服务器不受此困扰,两者看似能确保页数一致性的。
|
|
252
|
+
去掉了: 没法在生产版本中用,没包报错
|
|
253
|
+
"devDependencies": {
|
|
254
|
+
"@types/module-alias": "^2.0.1",
|
|
255
|
+
"module-alias": "^2.2.3",
|
|
256
|
+
}
|
|
257
|
+
不是module-alias的问题,而是node_modules在生产目录底下也不能缺少啊!直接拷贝也行! https://blog.csdn.net/qq_35624642/article/details/128960311
|
|
258
|
+
windows用户若非管理员账户的:桌面上的Chrome快捷方式右键点属性在“兼容性”设置中:必须勾选“管理员身份运行”!否则端口remote-debugging-port没开启。
|
|
259
|
+
【浏览器有BUG】
|
|
260
|
+
预览打印的,若没有勾选页眉页脚的话可能导致表格输出的右边边框被裁剪看不见表格右边线了,就只能勾选页眉页脚,但是我这个打印转换服务器没有这个毛病。
|
|
261
|
+
但问题是:勾不勾选页眉页脚会不会影响到了实际打印输出的页数啊?目前还未发现这个影响存在的。
|
|
262
|
+
如何限制打印时刻浏览器宽的:
|
|
263
|
+
入口代码:src/utils/pdfgen.ts 的 async renderPdf(task: ConfigRoot<FileTransform>, tsobj: FileTransform) 浏览器打印主入口:
|
|
264
|
+
【CDP文档】 https://chromedevtools.github.io/devtools-protocol/tot/Target/
|
|
265
|
+
首先必须手动开启chrome浏览器;而且这个浏览器窗体宽度直接影响打印输出!可能会漏打,动态div测量调整布局问题。影响到浏览器其它用途体验。
|
|
266
|
+
yarn又失败: 无法访问上 https://registry.npmjs.org/
|
|
267
|
+
问题:有些URL网页,一直在等待加载好,死等打印命令没结果,估计CDP依据页面的网络消息决定加载结束与否的。
|
|
268
|
+
端口已经被占用,启动不能访问预定端口的:查进程 netstat -ano | findstr :9872 #找出 LISTENING 10972 =进程ID;杀掉
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
POST http://localhost:9389/api/pdf
|
|
2
|
+
Accept: application/json
|
|
3
|
+
Content-Type: application/json; charset=utf-8
|
|
4
|
+
|
|
5
|
+
{
|
|
6
|
+
"merge": true,
|
|
7
|
+
"name": "asjsak啊实打实2",
|
|
8
|
+
"lay": {
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
{
|
|
12
|
+
"url": "http://192.168.1.102:3765/originalView/CR-JJ/ver/1/-3kfCWcBRx66P8YA7EOkXFJlcG9ydA/printAll",
|
|
13
|
+
"out": "横页脚的VS2"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
###
|
package/tsconfig.json
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
/* Basic Options */
|
|
4
|
-
"incremental": true,
|
|
5
|
-
"target": "ESNext",
|
|
6
|
-
"module": "commonjs",
|
|
7
|
-
"outDir": "dist",
|
|
8
|
-
"pretty": true,
|
|
9
|
-
"removeComments": true,
|
|
10
|
-
|
|
11
|
-
/* Strict Type-Checking Options */
|
|
12
|
-
"strict": true,
|
|
13
|
-
"noImplicitAny": true,
|
|
14
|
-
"strictNullChecks": true,
|
|
15
|
-
"strictFunctionTypes": true,
|
|
16
|
-
"strictBindCallApply": true,
|
|
17
|
-
"strictPropertyInitialization": true,
|
|
18
|
-
"noImplicitThis": false,
|
|
19
|
-
"alwaysStrict": true,
|
|
20
|
-
|
|
21
|
-
/* Additional Checks */
|
|
22
|
-
"noUnusedLocals": true,
|
|
23
|
-
"noUnusedParameters": true,
|
|
24
|
-
"noImplicitReturns": true,
|
|
25
|
-
"noFallthroughCasesInSwitch": true,
|
|
26
|
-
|
|
27
|
-
/* Module Resolution Options */
|
|
28
|
-
"moduleResolution": "node",
|
|
29
|
-
"esModuleInterop": true,
|
|
30
|
-
"resolveJsonModule": true,
|
|
31
|
-
"sourceMap": true,
|
|
32
|
-
"forceConsistentCasingInFileNames": true,
|
|
33
|
-
"types": ["jest", "node"],
|
|
34
|
-
"baseUrl": "src",
|
|
35
|
-
"paths": {
|
|
36
|
-
"@/*": ["./*"]
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
"include": ["src/**/*", "**/__tests__/**/*"],
|
|
40
|
-
"exclude": ["node_modules"]
|
|
41
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
/* Basic Options */
|
|
4
|
+
"incremental": true,
|
|
5
|
+
"target": "ESNext",
|
|
6
|
+
"module": "commonjs",
|
|
7
|
+
"outDir": "dist",
|
|
8
|
+
"pretty": true,
|
|
9
|
+
"removeComments": true,
|
|
10
|
+
|
|
11
|
+
/* Strict Type-Checking Options */
|
|
12
|
+
"strict": true,
|
|
13
|
+
"noImplicitAny": true,
|
|
14
|
+
"strictNullChecks": true,
|
|
15
|
+
"strictFunctionTypes": true,
|
|
16
|
+
"strictBindCallApply": true,
|
|
17
|
+
"strictPropertyInitialization": true,
|
|
18
|
+
"noImplicitThis": false,
|
|
19
|
+
"alwaysStrict": true,
|
|
20
|
+
|
|
21
|
+
/* Additional Checks */
|
|
22
|
+
"noUnusedLocals": true,
|
|
23
|
+
"noUnusedParameters": true,
|
|
24
|
+
"noImplicitReturns": true,
|
|
25
|
+
"noFallthroughCasesInSwitch": true,
|
|
26
|
+
|
|
27
|
+
/* Module Resolution Options */
|
|
28
|
+
"moduleResolution": "node",
|
|
29
|
+
"esModuleInterop": true,
|
|
30
|
+
"resolveJsonModule": true,
|
|
31
|
+
"sourceMap": true,
|
|
32
|
+
"forceConsistentCasingInFileNames": true,
|
|
33
|
+
"types": ["jest", "node"],
|
|
34
|
+
"baseUrl": "src",
|
|
35
|
+
"paths": {
|
|
36
|
+
"@/*": ["./*"]
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
"include": ["src/**/*", "**/__tests__/**/*"],
|
|
40
|
+
"exclude": ["node_modules"]
|
|
41
|
+
}
|
package/tslint.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
{
|
|
2
|
-
"defaultSeverity": "error",
|
|
3
|
-
"extends": ["tslint:recommended"],
|
|
4
|
-
"jsRules": {
|
|
5
|
-
"object-literal-sort-keys": false
|
|
6
|
-
},
|
|
7
|
-
"rules": {
|
|
8
|
-
"ordered-imports": false,
|
|
9
|
-
"object-literal-sort-keys": false,
|
|
10
|
-
"quotemark": [true, "single"],
|
|
11
|
-
"trailing-comma": [
|
|
12
|
-
true,
|
|
13
|
-
{
|
|
14
|
-
"multiline": "never",
|
|
15
|
-
"singleline": "never"
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"arrow-parens": [true, "ban-single-arg-parens"],
|
|
19
|
-
"interface-name": [true, "never-prefix"]
|
|
20
|
-
},
|
|
21
|
-
"rulesDirectory": []
|
|
22
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"defaultSeverity": "error",
|
|
3
|
+
"extends": ["tslint:recommended"],
|
|
4
|
+
"jsRules": {
|
|
5
|
+
"object-literal-sort-keys": false
|
|
6
|
+
},
|
|
7
|
+
"rules": {
|
|
8
|
+
"ordered-imports": false,
|
|
9
|
+
"object-literal-sort-keys": false,
|
|
10
|
+
"quotemark": [true, "single"],
|
|
11
|
+
"trailing-comma": [
|
|
12
|
+
true,
|
|
13
|
+
{
|
|
14
|
+
"multiline": "never",
|
|
15
|
+
"singleline": "never"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"arrow-parens": [true, "ban-single-arg-parens"],
|
|
19
|
+
"interface-name": [true, "never-prefix"]
|
|
20
|
+
},
|
|
21
|
+
"rulesDirectory": []
|
|
22
|
+
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<component name="ProjectCodeStyleConfiguration">
|
|
2
|
-
<code_scheme name="Project" version="173">
|
|
3
|
-
<HTMLCodeStyleSettings>
|
|
4
|
-
<option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
|
|
5
|
-
<option name="HTML_ENFORCE_QUOTES" value="true" />
|
|
6
|
-
</HTMLCodeStyleSettings>
|
|
7
|
-
<JSCodeStyleSettings version="0">
|
|
8
|
-
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
|
9
|
-
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
|
|
10
|
-
<option name="FORCE_QUOTE_STYlE" value="true" />
|
|
11
|
-
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
|
|
12
|
-
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
|
|
13
|
-
<option name="SPACES_WITHIN_IMPORTS" value="true" />
|
|
14
|
-
</JSCodeStyleSettings>
|
|
15
|
-
<TypeScriptCodeStyleSettings version="0">
|
|
16
|
-
<option name="FORCE_SEMICOLON_STYLE" value="true" />
|
|
17
|
-
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
|
|
18
|
-
<option name="FORCE_QUOTE_STYlE" value="true" />
|
|
19
|
-
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
|
|
20
|
-
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
|
|
21
|
-
<option name="SPACES_WITHIN_IMPORTS" value="true" />
|
|
22
|
-
</TypeScriptCodeStyleSettings>
|
|
23
|
-
<VueCodeStyleSettings>
|
|
24
|
-
<option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
|
|
25
|
-
<option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
|
|
26
|
-
</VueCodeStyleSettings>
|
|
27
|
-
<codeStyleSettings language="HTML">
|
|
28
|
-
<option name="SOFT_MARGINS" value="80" />
|
|
29
|
-
<indentOptions>
|
|
30
|
-
<option name="INDENT_SIZE" value="2" />
|
|
31
|
-
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
|
32
|
-
<option name="TAB_SIZE" value="2" />
|
|
33
|
-
</indentOptions>
|
|
34
|
-
</codeStyleSettings>
|
|
35
|
-
<codeStyleSettings language="JavaScript">
|
|
36
|
-
<option name="SOFT_MARGINS" value="80" />
|
|
37
|
-
<indentOptions>
|
|
38
|
-
<option name="INDENT_SIZE" value="2" />
|
|
39
|
-
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
|
40
|
-
<option name="TAB_SIZE" value="2" />
|
|
41
|
-
</indentOptions>
|
|
42
|
-
</codeStyleSettings>
|
|
43
|
-
<codeStyleSettings language="TypeScript">
|
|
44
|
-
<option name="SOFT_MARGINS" value="80" />
|
|
45
|
-
<indentOptions>
|
|
46
|
-
<option name="INDENT_SIZE" value="2" />
|
|
47
|
-
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
|
48
|
-
<option name="TAB_SIZE" value="2" />
|
|
49
|
-
</indentOptions>
|
|
50
|
-
</codeStyleSettings>
|
|
51
|
-
<codeStyleSettings language="Vue">
|
|
52
|
-
<option name="SOFT_MARGINS" value="80" />
|
|
53
|
-
<indentOptions>
|
|
54
|
-
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
|
55
|
-
</indentOptions>
|
|
56
|
-
</codeStyleSettings>
|
|
57
|
-
</code_scheme>
|
|
58
|
-
</component>
|
package/.idea/encodings.xml
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
<component name="InspectionProjectProfileManager">
|
|
2
|
-
<profile version="1.0">
|
|
3
|
-
<option name="myName" value="Project Default" />
|
|
4
|
-
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
|
5
|
-
<inspection_tool class="TsLint" enabled="true" level="WARNING" enabled_by_default="true" />
|
|
6
|
-
</profile>
|
|
7
|
-
</component>
|
package/.idea/modules.xml
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<project version="4">
|
|
3
|
-
<component name="ProjectModuleManager">
|
|
4
|
-
<modules>
|
|
5
|
-
<module fileurl="file://$PROJECT_DIR$/.idea/tenstack-starter-main.iml" filepath="$PROJECT_DIR$/.idea/tenstack-starter-main.iml" />
|
|
6
|
-
</modules>
|
|
7
|
-
</component>
|
|
8
|
-
</project>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<module type="WEB_MODULE" version="4">
|
|
3
|
-
<component name="NewModuleRootManager">
|
|
4
|
-
<content url="file://$MODULE_DIR$">
|
|
5
|
-
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
|
6
|
-
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
|
7
|
-
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
|
8
|
-
</content>
|
|
9
|
-
<orderEntry type="inheritedJdk" />
|
|
10
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
|
11
|
-
</component>
|
|
12
|
-
</module>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<module type="WEB_MODULE" version="4">
|
|
3
|
-
<component name="NewModuleRootManager">
|
|
4
|
-
<content url="file://$MODULE_DIR$">
|
|
5
|
-
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
|
6
|
-
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
|
7
|
-
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
|
8
|
-
</content>
|
|
9
|
-
<orderEntry type="inheritedJdk" />
|
|
10
|
-
<orderEntry type="sourceFolder" forTests="false" />
|
|
11
|
-
</component>
|
|
12
|
-
</module>
|