This commit is contained in:
taoqf 2018-02-22 20:38:31 +08:00
parent 425ca63a9e
commit dfee6fc675
17 changed files with 416 additions and 64 deletions

View File

@ -5,92 +5,104 @@
// TypeScript Version: 2.3
/// <reference types="node" />
import { Buffer } from 'buffer';
import { Readable } from 'stream';
declare namespace JsReport {
type helpers = string | { [fun: string]: (...args: any[]) => any };
type Helpers = string | { [fun: string]: (...args: any[]) => any };
interface RenderOptions {
template: {
content: string;
engine: 'jsrender' | 'handlebars' | 'ejs' | 'jade' | string;
helpers?: helpers;
recipe: 'phantom-pdf' | 'electron-pdf' | 'text' | 'xlsx' | 'html-to-xlsx' | 'phantom-image' | 'html-to-text' | 'fop-pdf' | 'client-html' | 'wrapped-html' | 'wkhtmltopdf' | string;
};
data?: any;
type Engine = "none";
type Recipe = "html";
interface Template {
content: string;
engine: Engine | string;
helpers: Helpers;
recipe: Recipe | string;
}
interface Report {
interface Request {
template: Partial<Template>;
options: object;
data: any;
}
interface Response {
content: Buffer;
stream: Readable;
stream: NodeJS.ReadableStream;
headers: {
[header: string]: string | number | boolean;
};
}
interface Request {
template: {
content: string;
};
}
// interface Response {
// // todo
// }
type Response = any;
interface Listener {
add(type: string, callback: (req: Request, res: Response, err: any) => void): void;
}
interface Logger {
add(logger: any, options?: {
level: 'debug' | 'info' | 'log' | 'warn' | 'error';
}): void;
interface ListenerCollection {
add(
type: string,
callback: (req: Request, res: Response, err?: any) => Promise<any> | void
): void;
}
interface Collection {
find(query: {
[field: string]: any;
}): Promise<any>;
find(query: { [field: string]: any }): Promise<object[]>;
update(query: { [field: string]: any }, update: object, options?: object): Promise<any>;
remove(query: { [field: string]: any }): Promise<any>;
insert(obj: object): Promise<object>;
}
interface DocumentStore {
collection(options: string): Collection;
collection(name: string): Collection;
}
interface JsReporter {
afterRenderListeners: Listener;
afterTemplatingEnginesExecutedListeners: Listener;
beforeRenderListeners: Listener;
type Extension = (reporter: Reporter, definition: object) => void;
interface ExtensionDefinition {
options: any;
main: any;
directory: string;
}
interface Reporter {
use(extension: Extension | ExtensionDefinition): Reporter;
}
interface Reporter {
afterRenderListeners: ListenerCollection;
afterTemplatingEnginesExecutedListeners: ListenerCollection;
beforeRenderListeners: ListenerCollection;
documentStore: DocumentStore;
initializeListeners: Listener;
logger: Logger;
validateRenderListeners: Listener;
init(): Promise<void>;
render(options: RenderOptions): Promise<Report>;
use(extension: any): any;
initializeListeners: ListenerCollection;
// it would be nice to add winston.LoggerInstance here
// however adding import winston = require('winston') breaks exported enums
logger: any;
validateRenderListeners: ListenerCollection;
version: string;
init(): Promise<Reporter>;
render(options: Partial<Request>): Promise<Response>;
discover(): Reporter;
createListenerCollection(): ListenerCollection;
}
interface Configuration {
autoTempCleanup: boolean;
dataDirectory: string;
extensionsLocationCache: boolean;
loadConfig: boolean;
logger: {
silent: boolean;
};
rootDirectory: string;
scripts: {
allowedModules: string[];
};
tasks: Partial<{
allowedModules: string[] | string;
strategy: "dedicated-process" | "http-server" | "in-process" | string;
}>;
tempDirectory: string;
}
}
declare function JsReport(options?: Partial<{
autoTempCleanup: boolean;
dataDirectory: string;
extensionsLocationCache: boolean;
loadConfig: boolean;
logger: {
silent: boolean;
};
rootDirectory: string;
scripts: {
allowedModules: string[];
};
tasks: {
[task: string]: any;
};
tempDirectory: string;
}>): JsReport.JsReporter;
declare function JsReport(
config?: Partial<JsReport.Configuration>
): JsReport.Reporter;
export = JsReport;

24
types/jsreport-html-to-xlsx/index.d.ts vendored Normal file
View File

@ -0,0 +1,24 @@
// Type definitions for jsreport-html-to-xlsx 1.4
// Project: https://github.com/jsreport/jsreport-html-to-xlsx
// Definitions by: My Self <https://github.com/me>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
import { ExtensionDefinition } from 'jsreport-core';
import { Options as BaseOptions } from 'jsreport-xlsx';
declare module 'jsreport-core' {
interface Template {
recipe: 'html-to-xlsx' | string;
}
}
declare namespace JsReportHtml2Xlsx {
interface Options extends BaseOptions {
strategy: string;
}
}
declare function JsReportHtml2Xlsx(options?: Partial<JsReportHtml2Xlsx.Options>): ExtensionDefinition;
export = JsReportHtml2Xlsx;

View File

@ -0,0 +1,19 @@
import JsReport = require('jsreport-core');
import JsreportHtml2Xlsx = require('jsreport-html-to-xlsx');
import JsreportXlsx = require('jsreport-xlsx');
const jsreport = JsReport();
jsreport.use(JsreportXlsx());
jsreport.use(JsreportHtml2Xlsx());
(async () => {
const content = `<table><tr><td>test</td></tr></table>`;
await jsreport.init();
const resp = await jsreport.render({
template: {
content,
engine: 'none',
recipe: 'xlsx'
}
});
})();

View File

@ -0,0 +1,23 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"esnext"
],
"strictFunctionTypes": true,
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"jsreport-html-to-xlsx-tests.ts"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }

17
types/jsreport-jsrender/index.d.ts vendored Normal file
View File

@ -0,0 +1,17 @@
// Type definitions for jsreport-jsrender 1.0
// Project: https://github.com/jsreport/jsreport-jsrender
// Definitions by: taoqf <https://github.com/taoqf>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
import { ExtensionDefinition } from 'jsreport-core';
declare module 'jsreport-core' {
interface Template {
engine: 'jsrender' | string;
}
}
declare function JsReportJsrender(): ExtensionDefinition;
export = JsReportJsrender;

View File

@ -0,0 +1,37 @@
import JsReport = require("jsreport-core");
import JsReportPhantomPdf = require("jsreport-phantom-pdf");
import JsRender = require("jsreport-jsrender");
import fs = require('fs');
const jsreport = JsReport({
tasks: {
strategy: "http-server"
}
});
jsreport.beforeRenderListeners.add('test', (req, res) => {
console.log('input', req.template.content);
});
jsreport.use(JsReportPhantomPdf());
jsreport.use(JsRender());
(async () => {
await jsreport.init();
await jsreport.documentStore.collection('settings').update({}, { $set: { foo: 1 } });
const res = await jsreport.render({
template: {
content: "<h1>{{:foo}}</h1>",
engine: 'jsrender',
recipe: 'phantom-pdf',
phantom: {
header: 'header',
headerHeight: '5cm',
orientation: 'landscape'
}
},
data: { foo: "hello2" }
});
fs.writeFileSync('./types/test/test.pdf', res.content);
process.exit(0);
})();

View File

@ -0,0 +1,23 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"esnext"
],
"strictFunctionTypes": true,
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"jsreport-jsrender-tests.ts"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }

62
types/jsreport-phantom-pdf/index.d.ts vendored Normal file
View File

@ -0,0 +1,62 @@
// Type definitions for jsreport-phantom-pdf 1.4
// Project: https://github.com/jsreport/jsreport-phantom-pdf
// Definitions by: taoqf <https://github.com/taoqf>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
import { ExtensionDefinition } from 'jsreport-core';
declare module 'jsreport-core' {
interface Template {
phantom?: Partial<JsReportPhantomPdf.Phantom>;
recipe: 'phantom-pdf' | string;
}
}
declare namespace JsReportPhantomPdf {
interface Margin {
left: number | string;
right: number | string;
top: number | string;
bottom: number | string;
}
interface Phantom {
margin: string | Margin;
header: string;
footer: string;
width: string;
height: string;
headerHeight: string;
footerHeight: string;
format: string;
orientation: 'portrait' | 'landscape';
blockJavaScript: boolean;
resourceTimeout: number;
waitForJS: boolean;
fitToPage: boolean;
customPhantomJS: boolean;
phantomjsVersion: string;
}
// const enum PhantomStrategy {
// dedicatedProcess = 'dedicated-process',
// phantomServer = 'phantom-server'
// }
interface Options {
allowLocalFilesAccess: boolean;
// appDirectory: string;
defaultPhantomjsVersion: string;
strategy: 'dedicated-process' | 'phantom-server';
timeout: number;
}
// without exporting enum, it doesn't include the require('jsreport-core') in the test.js for some reason
// help welcome
// export enum Foo { }
}
declare function JsReportPhantomPdf(options?: Partial<JsReportPhantomPdf.Options>): ExtensionDefinition;
export = JsReportPhantomPdf;

View File

@ -0,0 +1,37 @@
import JsReport = require("jsreport-core");
import JsReportPhantomPdf = require("jsreport-phantom-pdf");
import JsRender = require("jsreport-jsrender");
import fs = require('fs');
const jsreport = JsReport({
tasks: {
strategy: "http-server"
}
});
jsreport.beforeRenderListeners.add('test', (req, res) => {
console.log('input', req.template.content);
});
jsreport.use(JsReportPhantomPdf());
jsreport.use(JsRender());
(async () => {
await jsreport.init();
await jsreport.documentStore.collection('settings').update({}, { $set: { foo: 1 } });
const res = await jsreport.render({
template: {
content: "<h1>{{:foo}}</h1>",
engine: 'jsrender',
recipe: 'phantom-pdf',
phantom: {
header: 'header',
headerHeight: '5cm',
orientation: 'landscape'
}
},
data: { foo: "hello2" }
});
fs.writeFileSync('./types/test/test.pdf', res.content);
process.exit(0);
})();

View File

@ -0,0 +1,23 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"esnext"
],
"strictFunctionTypes": true,
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"jsreport-phantom-pdf-tests.ts"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }

29
types/jsreport-xlsx/index.d.ts vendored Normal file
View File

@ -0,0 +1,29 @@
// Type definitions for jsreport-xlsx 1.4
// Project: https://github.com/jsreport/jsreport-xlsx
// Definitions by: taoqf <https://github.com/taoqf>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3
import { ExtensionDefinition } from 'jsreport-core';
declare module 'jsreport-core' {
interface Template {
recipe: 'xlsx' | string;
}
}
declare namespace JsReportXlsx {
interface Xlsx {
shortid: string;
}
interface Options {
addBufferSize: number;
escapeAmp: boolean;
numberOfParsedAddIterations: number;
}
}
declare function JsReportXlsx(options?: Partial<JsReportXlsx.Options>): ExtensionDefinition;
export = JsReportXlsx;

View File

@ -0,0 +1,19 @@
import JsReport = require('jsreport-core');
import JsreportHtml2Xlsx = require('jsreport-html-to-xlsx');
import JsreportXlsx = require('jsreport-xlsx');
const jsreport = JsReport();
jsreport.use(JsreportXlsx());
jsreport.use(JsreportHtml2Xlsx());
(async () => {
const content = `<table><tr><td>test</td></tr></table>`;
await jsreport.init();
const resp = await jsreport.render({
template: {
content,
engine: 'none',
recipe: 'xlsx'
}
});
})();

View File

@ -0,0 +1,23 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"esnext"
],
"strictFunctionTypes": true,
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"jsreport-xlsx-tests.ts"
]
}

View File

@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }