Merge pull request #1662 from dolanmiu/feat/tslint-to-eslint
TSLint to ESLint
This commit is contained in:
270
.eslintrc.js
Normal file
270
.eslintrc.js
Normal file
@ -0,0 +1,270 @@
|
||||
/*
|
||||
👋 Hi! This file was autogenerated by tslint-to-eslint-config.
|
||||
https://github.com/typescript-eslint/tslint-to-eslint-config
|
||||
|
||||
It represents the closest reasonable ESLint configuration to this
|
||||
project's original TSLint configuration.
|
||||
|
||||
We recommend eventually switching this configuration to extend from
|
||||
the recommended rulesets in typescript-eslint.
|
||||
https://github.com/typescript-eslint/tslint-to-eslint-config/blob/master/docs/FAQs.md
|
||||
|
||||
Happy linting! 💖
|
||||
*/
|
||||
module.exports = {
|
||||
extends: "eslint:recommended",
|
||||
env: {
|
||||
browser: true,
|
||||
es6: true,
|
||||
node: true,
|
||||
},
|
||||
parser: "@typescript-eslint/parser",
|
||||
parserOptions: {
|
||||
project: "tsconfig.json",
|
||||
sourceType: "module",
|
||||
},
|
||||
plugins: [
|
||||
"eslint-plugin-import",
|
||||
"eslint-plugin-no-null",
|
||||
"eslint-plugin-unicorn",
|
||||
"eslint-plugin-jsdoc",
|
||||
"eslint-plugin-prefer-arrow",
|
||||
"@typescript-eslint",
|
||||
"functional",
|
||||
],
|
||||
root: true,
|
||||
rules: {
|
||||
"no-undef": "off",
|
||||
"no-extra-boolean-cast": "off",
|
||||
"no-alert": "error",
|
||||
"no-self-compare": "error",
|
||||
"no-unreachable-loop": "error",
|
||||
"no-template-curly-in-string": "error",
|
||||
"no-unused-private-class-members": "error",
|
||||
"no-extend-native": "error",
|
||||
"no-floating-decimal": "error",
|
||||
"no-implied-eval": "error",
|
||||
"no-iterator": "error",
|
||||
"no-lone-blocks": "error",
|
||||
"no-loop-func": "error",
|
||||
"no-new-object": "error",
|
||||
"no-proto": "error",
|
||||
"no-useless-catch": "error",
|
||||
"one-var-declaration-per-line": "error",
|
||||
"prefer-arrow-callback": "error",
|
||||
"prefer-destructuring": "error",
|
||||
"prefer-exponentiation-operator": "error",
|
||||
"prefer-promise-reject-errors": "error",
|
||||
"prefer-regex-literals": "error",
|
||||
"prefer-spread": "error",
|
||||
"prefer-template": "error",
|
||||
"require-await": "error",
|
||||
"@typescript-eslint/adjacent-overload-signatures": "error",
|
||||
"@typescript-eslint/array-type": [
|
||||
"error",
|
||||
{
|
||||
default: "array",
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/ban-types": [
|
||||
"error",
|
||||
{
|
||||
types: {
|
||||
Object: {
|
||||
message: "Avoid using the `Object` type. Did you mean `object`?",
|
||||
},
|
||||
Function: {
|
||||
message: "Avoid using the `Function` type. Prefer a specific function type, like `() => void`.",
|
||||
},
|
||||
Boolean: {
|
||||
message: "Avoid using the `Boolean` type. Did you mean `boolean`?",
|
||||
},
|
||||
Number: {
|
||||
message: "Avoid using the `Number` type. Did you mean `number`?",
|
||||
},
|
||||
String: {
|
||||
message: "Avoid using the `String` type. Did you mean `string`?",
|
||||
},
|
||||
Symbol: {
|
||||
message: "Avoid using the `Symbol` type. Did you mean `symbol`?",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/consistent-type-assertions": "error",
|
||||
"@typescript-eslint/dot-notation": "error",
|
||||
"@typescript-eslint/explicit-function-return-type": [
|
||||
"error",
|
||||
{
|
||||
allowExpressions: false,
|
||||
allowTypedFunctionExpressions: false,
|
||||
allowHigherOrderFunctions: false,
|
||||
allowDirectConstAssertionInArrowFunctions: true,
|
||||
allowConciseArrowFunctionExpressionsStartingWithVoid: true,
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/explicit-member-accessibility": [
|
||||
"error",
|
||||
{
|
||||
accessibility: "explicit",
|
||||
overrides: {
|
||||
accessors: "explicit",
|
||||
},
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/explicit-module-boundary-types": [
|
||||
"error",
|
||||
{
|
||||
allowArgumentsExplicitlyTypedAsAny: true,
|
||||
allowDirectConstAssertionInArrowFunctions: true,
|
||||
allowHigherOrderFunctions: false,
|
||||
allowTypedFunctionExpressions: false,
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/naming-convention": [
|
||||
"error",
|
||||
{
|
||||
selector: ["objectLiteralProperty"],
|
||||
leadingUnderscore: "allow",
|
||||
format: ["camelCase", "PascalCase"],
|
||||
filter: {
|
||||
regex: "(^[a-z]+:.+)|_attr|[0-9]",
|
||||
match: false,
|
||||
},
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/no-empty-function": "error",
|
||||
"@typescript-eslint/no-empty-interface": "error",
|
||||
"@typescript-eslint/no-explicit-any": "error",
|
||||
"@typescript-eslint/no-misused-new": "error",
|
||||
"@typescript-eslint/no-namespace": "error",
|
||||
"@typescript-eslint/no-parameter-properties": "off",
|
||||
"@typescript-eslint/no-require-imports": "error",
|
||||
"@typescript-eslint/no-shadow": [
|
||||
"error",
|
||||
{
|
||||
hoist: "all",
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/no-this-alias": "error",
|
||||
"@typescript-eslint/no-unused-expressions": "error",
|
||||
"@typescript-eslint/no-use-before-define": "off",
|
||||
"@typescript-eslint/no-var-requires": "error",
|
||||
"@typescript-eslint/prefer-for-of": "error",
|
||||
"@typescript-eslint/prefer-function-type": "error",
|
||||
"@typescript-eslint/prefer-namespace-keyword": "error",
|
||||
"@typescript-eslint/prefer-readonly": "error",
|
||||
"@typescript-eslint/triple-slash-reference": [
|
||||
"error",
|
||||
{
|
||||
path: "always",
|
||||
types: "prefer-import",
|
||||
lib: "always",
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/typedef": [
|
||||
"error",
|
||||
{
|
||||
parameter: true,
|
||||
propertyDeclaration: true,
|
||||
},
|
||||
],
|
||||
"@typescript-eslint/unified-signatures": "error",
|
||||
"arrow-body-style": "error",
|
||||
complexity: "off",
|
||||
"consistent-return": "error",
|
||||
"constructor-super": "error",
|
||||
curly: "error",
|
||||
"dot-notation": "off",
|
||||
eqeqeq: ["error", "smart"],
|
||||
"guard-for-in": "error",
|
||||
"id-denylist": ["error", "any", "Number", "number", "String", "string", "Boolean", "boolean", "Undefined", "undefined"],
|
||||
"id-match": "error",
|
||||
"import/no-default-export": "error",
|
||||
"import/no-extraneous-dependencies": "off",
|
||||
"import/no-internal-modules": "off",
|
||||
"import/order": "error",
|
||||
indent: "off",
|
||||
"jsdoc/check-alignment": "error",
|
||||
"jsdoc/check-indentation": "off",
|
||||
"jsdoc/newline-after-description": "error",
|
||||
"max-classes-per-file": "off",
|
||||
"max-len": "off",
|
||||
"new-parens": "error",
|
||||
"no-bitwise": "error",
|
||||
"no-caller": "error",
|
||||
"no-cond-assign": "error",
|
||||
"no-console": "error",
|
||||
"no-debugger": "error",
|
||||
"no-duplicate-case": "error",
|
||||
"no-duplicate-imports": "error",
|
||||
"no-empty": "error",
|
||||
"no-empty-function": "off",
|
||||
"no-eval": "error",
|
||||
"no-extra-bind": "error",
|
||||
"no-fallthrough": "off",
|
||||
"no-invalid-this": "off",
|
||||
"no-multiple-empty-lines": "error",
|
||||
"no-new-func": "error",
|
||||
"no-new-wrappers": "error",
|
||||
"no-null/no-null": "error",
|
||||
"no-param-reassign": "error",
|
||||
"no-redeclare": "error",
|
||||
"no-return-await": "error",
|
||||
"no-sequences": "error",
|
||||
"no-shadow": "off",
|
||||
"no-sparse-arrays": "error",
|
||||
"no-template-curly-in-string": "error",
|
||||
"no-throw-literal": "error",
|
||||
"no-trailing-spaces": "error",
|
||||
"no-undef-init": "error",
|
||||
"no-underscore-dangle": ["error", { allow: ["_attr"] }],
|
||||
"no-unsafe-finally": "error",
|
||||
"no-unused-expressions": "off",
|
||||
"no-unused-labels": "error",
|
||||
"no-use-before-define": "off",
|
||||
"no-useless-constructor": "error",
|
||||
"no-var": "error",
|
||||
"object-shorthand": "off",
|
||||
"one-var": ["error", "never"],
|
||||
"prefer-arrow/prefer-arrow-functions": "error",
|
||||
"prefer-const": "error",
|
||||
"prefer-object-spread": "error",
|
||||
radix: "error",
|
||||
"space-in-parens": ["error", "never"],
|
||||
"spaced-comment": [
|
||||
"error",
|
||||
"always",
|
||||
{
|
||||
markers: ["/"],
|
||||
},
|
||||
],
|
||||
"unicorn/filename-case": "error",
|
||||
"unicorn/prefer-ternary": "error",
|
||||
"use-isnan": "error",
|
||||
"valid-typeof": "off",
|
||||
"@typescript-eslint/explicit-function-return-type": "off",
|
||||
"functional/immutable-data": [
|
||||
"error",
|
||||
{
|
||||
assumeTypes: true,
|
||||
ignoreImmediateMutation: true,
|
||||
ignoreAccessorPattern: ["**.root*", "**.numberingReferences*", "**.sections*", "**.properties*"],
|
||||
},
|
||||
],
|
||||
"functional/no-method-signature": "error",
|
||||
"functional/no-mixed-type": "error",
|
||||
"functional/prefer-readonly-type": "error",
|
||||
"no-unused-vars": ["error", { argsIgnorePattern: "^[_]+$" }],
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
files: ["*.spec.ts"],
|
||||
rules: {
|
||||
"@typescript-eslint/no-unused-expressions": "off",
|
||||
"@typescript-eslint/dot-notation": "off",
|
||||
"prefer-destructuring": "off",
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
6
.nycrc
6
.nycrc
@ -1,9 +1,9 @@
|
||||
{
|
||||
"check-coverage": true,
|
||||
"statements": 99.62,
|
||||
"branches": 96.81,
|
||||
"statements": 99.72,
|
||||
"branches": 97.95,
|
||||
"functions": 99.82,
|
||||
"lines": 99.62,
|
||||
"lines": 99.71,
|
||||
"include": [
|
||||
"src/**/*.ts"
|
||||
],
|
||||
|
4
.vscode/extensions.json
vendored
4
.vscode/extensions.json
vendored
@ -1,5 +1,3 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"streetsidesoftware.code-spell-checker"
|
||||
]
|
||||
"recommendations": ["streetsidesoftware.code-spell-checker", "dbaeumer.vscode-eslint"]
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Simple example to add text to a document
|
||||
// Exporting the document as a stream
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
||||
@ -26,6 +26,5 @@ const doc = new Document({
|
||||
],
|
||||
});
|
||||
|
||||
Packer.toStream(doc).then((stream) => {
|
||||
const stream = Packer.toStream(doc);
|
||||
stream.pipe(fs.createWriteStream("My Document.docx"));
|
||||
});
|
||||
|
@ -8,11 +8,11 @@
|
||||
|
||||
- Follow Prettier standards, and consider using the [Prettier VSCode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) plugin.
|
||||
|
||||
- Follow the `TSLint` rules
|
||||
- Follow the `ESLint` rules
|
||||
|
||||
## Always think about the user
|
||||
|
||||
Put yourself in their position, and imagine how they would feel about your feature you wrote.
|
||||
Put yourself in their position, and imagine how they would feel about the feature you wrote.
|
||||
|
||||
1. Is it easy to use?
|
||||
2. Has it been documented well?
|
||||
|
4402
package-lock.json
generated
4402
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
13
package.json
13
package.json
@ -9,7 +9,7 @@
|
||||
"test.coverage": "nyc npm test",
|
||||
"test.watch": "npm test -- --watch",
|
||||
"prepublishOnly": "npm run build --production",
|
||||
"lint": "tslint --project .",
|
||||
"lint": "eslint -c .eslintrc.js --ext .ts src",
|
||||
"build": "npm run webpack && npm run fix-types",
|
||||
"webpack": "rimraf ./build && webpack --config ./webpack.config.ts",
|
||||
"demo": "npm run build && npm run ts-node --skip-project ./demo",
|
||||
@ -72,10 +72,19 @@
|
||||
"@types/sinon": "^10.0.0",
|
||||
"@types/unzipper": "^0.10.4",
|
||||
"@types/webpack": "^5.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.36.1",
|
||||
"@typescript-eslint/parser": "^5.36.1",
|
||||
"buffer": "^6.0.3",
|
||||
"chai": "^3.5.0",
|
||||
"cspell": "^6.2.2",
|
||||
"docsify-cli": "^4.3.0",
|
||||
"eslint": "^8.23.0",
|
||||
"eslint-plugin-functional": "^4.3.1",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jsdoc": "^39.3.6",
|
||||
"eslint-plugin-no-null": "^1.0.2",
|
||||
"eslint-plugin-prefer-arrow": "^1.2.3",
|
||||
"eslint-plugin-unicorn": "^43.0.2",
|
||||
"glob": "^8.0.1",
|
||||
"jszip": "^3.1.5",
|
||||
"mocha": "^10.0.0",
|
||||
@ -95,8 +104,6 @@
|
||||
"ts-node": "^10.2.1",
|
||||
"tsconfig-paths": "^4.0.0",
|
||||
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
||||
"tslint": "^6.1.3",
|
||||
"tslint-immutable": "^6.0.1",
|
||||
"typedoc": "^0.23.2",
|
||||
"typescript": "4.7.4",
|
||||
"unzipper": "^0.10.11",
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { IMediaData, Media } from "@file/media";
|
||||
|
||||
export class ImageReplacer {
|
||||
public replace(xmlData: string, mediaData: IMediaData[], offset: number): string {
|
||||
public replace(xmlData: string, mediaData: readonly IMediaData[], offset: number): string {
|
||||
let currentXmlData = xmlData;
|
||||
|
||||
mediaData.forEach((image, i) => {
|
||||
@ -11,7 +11,7 @@ export class ImageReplacer {
|
||||
return currentXmlData;
|
||||
}
|
||||
|
||||
public getMediaData(xmlData: string, media: Media): IMediaData[] {
|
||||
public getMediaData(xmlData: string, media: Media): readonly IMediaData[] {
|
||||
return media.Array.filter((image) => xmlData.search(`{${image.fileName}}`) > 0);
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ describe("Compiler", () => {
|
||||
});
|
||||
|
||||
describe("#compile()", () => {
|
||||
it("should pack all the content", async function () {
|
||||
it("should pack all the content", function () {
|
||||
this.timeout(99999999);
|
||||
const file = new File({
|
||||
sections: [],
|
||||
@ -53,7 +53,7 @@ describe("Compiler", () => {
|
||||
expect(fileNames).to.include("_rels/.rels");
|
||||
});
|
||||
|
||||
it("should pack all additional headers and footers", async function () {
|
||||
it("should pack all additional headers and footers", function () {
|
||||
const file = new File({
|
||||
sections: [
|
||||
{
|
||||
|
@ -20,10 +20,10 @@ interface IXmlifyedFileMapping {
|
||||
readonly Numbering: IXmlifyedFile;
|
||||
readonly Relationships: IXmlifyedFile;
|
||||
readonly FileRelationships: IXmlifyedFile;
|
||||
readonly Headers: IXmlifyedFile[];
|
||||
readonly Footers: IXmlifyedFile[];
|
||||
readonly HeaderRelationships: IXmlifyedFile[];
|
||||
readonly FooterRelationships: IXmlifyedFile[];
|
||||
readonly Headers: readonly IXmlifyedFile[];
|
||||
readonly Footers: readonly IXmlifyedFile[];
|
||||
readonly HeaderRelationships: readonly IXmlifyedFile[];
|
||||
readonly FooterRelationships: readonly IXmlifyedFile[];
|
||||
readonly ContentTypes: IXmlifyedFile;
|
||||
readonly CustomProperties: IXmlifyedFile;
|
||||
readonly AppProperties: IXmlifyedFile;
|
||||
@ -38,7 +38,7 @@ export class Compiler {
|
||||
private readonly imageReplacer: ImageReplacer;
|
||||
private readonly numberingReplacer: NumberingReplacer;
|
||||
|
||||
constructor() {
|
||||
public constructor() {
|
||||
this.formatter = new Formatter();
|
||||
this.imageReplacer = new ImageReplacer();
|
||||
this.numberingReplacer = new NumberingReplacer();
|
||||
@ -47,15 +47,15 @@ export class Compiler {
|
||||
public compile(file: File, prettifyXml?: boolean | PrettifyType): JSZip {
|
||||
const zip = new JSZip();
|
||||
const xmlifiedFileMapping = this.xmlifyFile(file, prettifyXml);
|
||||
const map = new Map<string, IXmlifyedFile | IXmlifyedFile[]>(Object.entries(xmlifiedFileMapping));
|
||||
const map = new Map<string, IXmlifyedFile | readonly IXmlifyedFile[]>(Object.entries(xmlifiedFileMapping));
|
||||
|
||||
for (const [, obj] of map) {
|
||||
if (Array.isArray(obj)) {
|
||||
for (const subFile of obj) {
|
||||
for (const subFile of obj as readonly IXmlifyedFile[]) {
|
||||
zip.file(subFile.path, subFile.data);
|
||||
}
|
||||
} else {
|
||||
zip.file(obj.path, obj.data);
|
||||
zip.file((obj as IXmlifyedFile).path, (obj as IXmlifyedFile).data);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { ConcreteNumbering } from "@file/numbering";
|
||||
|
||||
export class NumberingReplacer {
|
||||
public replace(xmlData: string, concreteNumberings: ConcreteNumbering[]): string {
|
||||
public replace(xmlData: string, concreteNumberings: readonly ConcreteNumbering[]): string {
|
||||
let currentXmlData = xmlData;
|
||||
|
||||
for (const concreteNumbering of concreteNumberings) {
|
||||
|
@ -55,7 +55,7 @@ describe("Packer", () => {
|
||||
});
|
||||
|
||||
it("should handle exception if it throws any", () => {
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const compiler = stub((Packer as any).compiler, "compile");
|
||||
|
||||
compiler.throwsException();
|
||||
@ -65,7 +65,7 @@ describe("Packer", () => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(Packer as any).compiler.compile.restore();
|
||||
});
|
||||
});
|
||||
@ -80,7 +80,7 @@ describe("Packer", () => {
|
||||
});
|
||||
|
||||
it("should handle exception if it throws any", () => {
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const compiler = stub((Packer as any).compiler, "compile");
|
||||
|
||||
compiler.throwsException();
|
||||
@ -90,14 +90,14 @@ describe("Packer", () => {
|
||||
});
|
||||
|
||||
after(() => {
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(Packer as any).compiler.compile.restore();
|
||||
});
|
||||
});
|
||||
|
||||
describe("#toBlob()", () => {
|
||||
it("should create a standard docx file", async () => {
|
||||
// tslint:disable-next-line: no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
stub((Packer as any).compiler, "compile").callsFake(() => ({
|
||||
// tslint:disable-next-line: no-empty
|
||||
generateAsync: () => mock({}),
|
||||
@ -108,7 +108,7 @@ describe("Packer", () => {
|
||||
});
|
||||
|
||||
it("should handle exception if it throws any", () => {
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const compiler = stub((Packer as any).compiler, "compile");
|
||||
|
||||
compiler.throwsException();
|
||||
@ -118,14 +118,14 @@ describe("Packer", () => {
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(Packer as any).compiler.compile.restore();
|
||||
});
|
||||
});
|
||||
|
||||
describe("#toStream()", () => {
|
||||
it("should create a standard docx file", async () => {
|
||||
// tslint:disable-next-line: no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
stub((Packer as any).compiler, "compile").callsFake(() => ({
|
||||
// tslint:disable-next-line: no-empty
|
||||
generateNodeStream: () => ({
|
||||
@ -139,7 +139,7 @@ describe("Packer", () => {
|
||||
const stream = await Packer.toStream(file);
|
||||
return new Promise((resolve, reject) => {
|
||||
stream.on("error", () => {
|
||||
reject();
|
||||
reject(new Error());
|
||||
});
|
||||
|
||||
stream.on("end", () => {
|
||||
@ -148,8 +148,8 @@ describe("Packer", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("should handle exception if it throws any", async () => {
|
||||
// tslint:disable-next-line:no-any
|
||||
it("should handle exception if it throws any", () => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const compiler = stub((Packer as any).compiler, "compile").callsFake(() => ({
|
||||
// tslint:disable-next-line: no-empty
|
||||
on: (event: string, cb: () => void) => {
|
||||
@ -160,13 +160,15 @@ describe("Packer", () => {
|
||||
}));
|
||||
|
||||
compiler.throwsException();
|
||||
return Packer.toStream(file).catch((error) => {
|
||||
try {
|
||||
Packer.toStream(file);
|
||||
} catch (error) {
|
||||
assert.isDefined(error);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(Packer as any).compiler.compile.restore();
|
||||
});
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { File } from "@file/file";
|
||||
import { Stream } from "stream";
|
||||
import { File } from "@file/file";
|
||||
|
||||
import { Compiler } from "./next-compiler";
|
||||
|
||||
@ -58,7 +58,7 @@ export class Packer {
|
||||
return zipData;
|
||||
}
|
||||
|
||||
public static async toStream(file: File, prettify?: boolean | PrettifyType): Promise<Stream> {
|
||||
public static toStream(file: File, prettify?: boolean | PrettifyType): Stream {
|
||||
const zip = this.compiler.compile(file, prettify);
|
||||
const zipData = zip.generateNodeStream({
|
||||
type: "nodebuffer",
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { AppPropertiesAttributes } from "./app-properties-attributes";
|
||||
|
||||
export class AppProperties extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("Properties");
|
||||
|
||||
this.root.push(
|
||||
|
@ -33,7 +33,7 @@ export interface IBorderOptions {
|
||||
}
|
||||
|
||||
export class BorderElement extends XmlComponent {
|
||||
constructor(elementName: string, { color, size, space, style }: IBorderOptions) {
|
||||
public constructor(elementName: string, { color, size, space, style }: IBorderOptions) {
|
||||
super(elementName);
|
||||
this.root.push(
|
||||
new BordersAttributes({
|
||||
|
@ -4,7 +4,7 @@ import { Default } from "./default/default";
|
||||
import { Override } from "./override/override";
|
||||
|
||||
export class ContentTypes extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("Types");
|
||||
|
||||
this.root.push(
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { DefaultAttributes } from "./default-attributes";
|
||||
|
||||
export class Default extends XmlComponent {
|
||||
constructor(contentType: string, extension?: string) {
|
||||
public constructor(contentType: string, extension?: string) {
|
||||
super("Default");
|
||||
|
||||
this.root.push(
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { OverrideAttributes } from "./override-attributes";
|
||||
|
||||
export class Override extends XmlComponent {
|
||||
constructor(contentType: string, partName?: string) {
|
||||
public constructor(contentType: string, partName?: string) {
|
||||
super("Override");
|
||||
|
||||
this.root.push(
|
||||
|
@ -12,7 +12,7 @@ import { Paragraph } from "../paragraph";
|
||||
import { IStylesOptions } from "../styles";
|
||||
|
||||
export interface IPropertiesOptions {
|
||||
readonly sections: ISectionOptions[];
|
||||
readonly sections: readonly ISectionOptions[];
|
||||
readonly title?: string;
|
||||
readonly subject?: string;
|
||||
readonly creator?: string;
|
||||
@ -26,7 +26,7 @@ export interface IPropertiesOptions {
|
||||
readonly comments?: ICommentsOptions;
|
||||
readonly footnotes?: {
|
||||
readonly [key: string]: {
|
||||
readonly children: Paragraph[];
|
||||
readonly children: readonly Paragraph[];
|
||||
};
|
||||
};
|
||||
readonly background?: IDocumentBackgroundOptions;
|
||||
@ -35,7 +35,7 @@ export interface IPropertiesOptions {
|
||||
readonly updateFields?: boolean;
|
||||
};
|
||||
readonly compatabilityModeVersion?: number;
|
||||
readonly customProperties?: ICustomPropertyOptions[];
|
||||
readonly customProperties?: readonly ICustomPropertyOptions[];
|
||||
readonly evenAndOddHeaderAndFooters?: boolean;
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ export interface IPropertiesOptions {
|
||||
/* cSpell:enable */
|
||||
|
||||
export class CoreProperties extends XmlComponent {
|
||||
constructor(options: Omit<IPropertiesOptions, "sections">) {
|
||||
public constructor(options: Omit<IPropertiesOptions, "sections">) {
|
||||
super("cp:coreProperties");
|
||||
this.root.push(
|
||||
new DocumentAttributes({
|
||||
@ -102,7 +102,7 @@ export class CoreProperties extends XmlComponent {
|
||||
}
|
||||
|
||||
class TimestampElement extends XmlComponent {
|
||||
constructor(name: string) {
|
||||
public constructor(name: string) {
|
||||
super(name);
|
||||
this.root.push(
|
||||
new DocumentAttributes({
|
||||
|
@ -3,11 +3,12 @@ import { CustomPropertiesAttributes } from "./custom-properties-attributes";
|
||||
import { CustomProperty, ICustomPropertyOptions } from "./custom-property";
|
||||
|
||||
export class CustomProperties extends XmlComponent {
|
||||
// tslint:disable-next-line:readonly-keyword
|
||||
// eslint-disable-next-line functional/prefer-readonly-type
|
||||
private nextId: number;
|
||||
// eslint-disable-next-line functional/prefer-readonly-type
|
||||
private readonly properties: CustomProperty[] = [];
|
||||
|
||||
constructor(properties: ICustomPropertyOptions[]) {
|
||||
public constructor(properties: readonly ICustomPropertyOptions[]) {
|
||||
super("Properties");
|
||||
|
||||
this.root.push(
|
||||
@ -32,6 +33,7 @@ export class CustomProperties extends XmlComponent {
|
||||
}
|
||||
|
||||
public addCustomProperty(property: ICustomPropertyOptions): void {
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
this.properties.push(new CustomProperty(this.nextId++, property));
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ export interface ICustomPropertyOptions {
|
||||
}
|
||||
|
||||
export class CustomProperty extends XmlComponent {
|
||||
constructor(id: number, properties: ICustomPropertyOptions) {
|
||||
public constructor(id: number, properties: ICustomPropertyOptions) {
|
||||
super("property");
|
||||
this.root.push(
|
||||
new CustomPropertyAttributes({
|
||||
@ -21,7 +21,7 @@ export class CustomProperty extends XmlComponent {
|
||||
}
|
||||
|
||||
export class CustomPropertyValue extends XmlComponent {
|
||||
constructor(value: string) {
|
||||
public constructor(value: string) {
|
||||
super("vt:lpwstr");
|
||||
this.root.push(value);
|
||||
}
|
||||
|
@ -7,9 +7,7 @@ describe("DocumentWrapper", () => {
|
||||
it("should create", () => {
|
||||
const file = new DocumentWrapper({ background: {} });
|
||||
|
||||
// tslint:disable-next-line: no-unused-expression
|
||||
expect(file.View).to.be.ok;
|
||||
// tslint:disable-next-line: no-unused-expression
|
||||
expect(file.Relationships).to.be.ok;
|
||||
});
|
||||
});
|
||||
|
@ -13,7 +13,7 @@ export class DocumentWrapper implements IViewWrapper {
|
||||
private readonly document: Document;
|
||||
private readonly relationships: Relationships;
|
||||
|
||||
constructor(options: IDocumentOptions) {
|
||||
public constructor(options: IDocumentOptions) {
|
||||
this.document = new Document(options);
|
||||
this.relationships = new Relationships();
|
||||
}
|
||||
|
@ -4,9 +4,10 @@ import { IContext, IXmlableObject, XmlComponent } from "@file/xml-components";
|
||||
import { ISectionPropertiesOptions, SectionProperties } from "./section-properties/section-properties";
|
||||
|
||||
export class Body extends XmlComponent {
|
||||
// eslint-disable-next-line functional/prefer-readonly-type
|
||||
private readonly sections: SectionProperties[] = [];
|
||||
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("w:body");
|
||||
}
|
||||
|
||||
@ -16,6 +17,7 @@ export class Body extends XmlComponent {
|
||||
* The spec says:
|
||||
* - section element should be in the last paragraph of the section
|
||||
* - last section should be direct child of body
|
||||
*
|
||||
* @param options new section options
|
||||
*/
|
||||
public addSection(options: ISectionPropertiesOptions): void {
|
||||
|
@ -14,7 +14,7 @@ export class ColumnAttributes extends XmlAttributeComponent<IColumnAttributes> {
|
||||
}
|
||||
|
||||
export class Column extends XmlComponent {
|
||||
constructor({ width, space }: IColumnAttributes) {
|
||||
public constructor({ width, space }: IColumnAttributes) {
|
||||
super("w:col");
|
||||
this.root.push(
|
||||
new ColumnAttributes({
|
||||
|
@ -13,6 +13,13 @@ describe("Columns", () => {
|
||||
expect(tree["w:cols"]).to.deep.equal({ _attr: { "w:num": 3, "w:space": 720 } });
|
||||
});
|
||||
|
||||
it("should create set space and count to undefined if they are undefined", () => {
|
||||
const columns = new Columns({});
|
||||
const tree = new Formatter().format(columns);
|
||||
|
||||
expect(tree["w:cols"]).to.deep.equal({ _attr: {} });
|
||||
});
|
||||
|
||||
it("should ignore individual column attributes if equalWidth is true", () => {
|
||||
const unequalColumns = [new Column({ width: 1000, space: 400 }), new Column({ width: 2000 })];
|
||||
const columns = new Columns({ count: 3, space: 720, equalWidth: true, children: unequalColumns });
|
||||
|
@ -17,7 +17,7 @@ export interface IColumnsAttributes {
|
||||
readonly count?: number;
|
||||
readonly separate?: boolean;
|
||||
readonly equalWidth?: boolean;
|
||||
readonly children?: Column[];
|
||||
readonly children?: readonly Column[];
|
||||
}
|
||||
|
||||
export class ColumnsAttributes extends XmlAttributeComponent<IColumnsAttributes> {
|
||||
@ -30,7 +30,7 @@ export class ColumnsAttributes extends XmlAttributeComponent<IColumnsAttributes>
|
||||
}
|
||||
|
||||
export class Columns extends XmlComponent {
|
||||
constructor({ space, count, separate, equalWidth, children }: IColumnsAttributes) {
|
||||
public constructor({ space, count, separate, equalWidth, children }: IColumnsAttributes) {
|
||||
super("w:cols");
|
||||
this.root.push(
|
||||
new ColumnsAttributes({
|
||||
|
@ -38,7 +38,7 @@ export class DocGridAttributes extends XmlAttributeComponent<IDocGridAttributesP
|
||||
}
|
||||
|
||||
export class DocumentGrid extends XmlComponent {
|
||||
constructor(linePitch: number, charSpace?: number, type?: DocumentGridType) {
|
||||
public constructor(linePitch: number, charSpace?: number, type?: DocumentGridType) {
|
||||
super("w:docGrid");
|
||||
|
||||
this.root.push(
|
||||
|
@ -52,7 +52,7 @@ export enum HeaderFooterType {
|
||||
FOOTER = "w:footerReference",
|
||||
}
|
||||
export class HeaderFooterReference extends XmlComponent {
|
||||
constructor(type: HeaderFooterType, options: IHeaderFooterOptions) {
|
||||
public constructor(type: HeaderFooterType, options: IHeaderFooterOptions) {
|
||||
super(type);
|
||||
|
||||
this.root.push(
|
||||
|
@ -39,7 +39,7 @@ export class LineNumberAttributes extends XmlAttributeComponent<ILineNumberAttri
|
||||
}
|
||||
|
||||
export class LineNumberType extends XmlComponent {
|
||||
constructor({ countBy, start, restart, distance }: ILineNumberAttributes) {
|
||||
public constructor({ countBy, start, restart, distance }: ILineNumberAttributes) {
|
||||
super("w:lnNumType");
|
||||
this.root.push(
|
||||
new LineNumberAttributes({
|
||||
|
@ -71,7 +71,7 @@ class PageBordersAttributes extends XmlAttributeComponent<IPageBorderAttributes>
|
||||
// <xsd:attribute name="offsetFrom" type="ST_PageBorderOffset" use="optional" default="text"/>
|
||||
// </xsd:complexType>
|
||||
export class PageBorders extends IgnoreIfEmptyXmlComponent {
|
||||
constructor(options?: IPageBordersOptions) {
|
||||
public constructor(options?: IPageBordersOptions) {
|
||||
super("w:pgBorders");
|
||||
|
||||
if (!options) {
|
||||
|
@ -33,7 +33,7 @@ export class PageMarginAttributes extends XmlAttributeComponent<IPageMarginAttri
|
||||
}
|
||||
|
||||
export class PageMargin extends XmlComponent {
|
||||
constructor(
|
||||
public constructor(
|
||||
top: number | string,
|
||||
right: number | string,
|
||||
bottom: number | string,
|
||||
|
@ -41,7 +41,7 @@ export class PageNumberTypeAttributes extends XmlAttributeComponent<IPageNumberT
|
||||
};
|
||||
}
|
||||
export class PageNumberType extends XmlComponent {
|
||||
constructor({ start, formatType, separator }: IPageNumberTypeAttributes) {
|
||||
public constructor({ start, formatType, separator }: IPageNumberTypeAttributes) {
|
||||
super("w:pgNumType");
|
||||
this.root.push(
|
||||
new PageNumberTypeAttributes({
|
||||
|
@ -33,7 +33,7 @@ export class PageSizeAttributes extends XmlAttributeComponent<IPageSizeAttribute
|
||||
}
|
||||
|
||||
export class PageSize extends XmlComponent {
|
||||
constructor(width: number | string, height: number | string, orientation: PageOrientation) {
|
||||
public constructor(width: number | string, height: number | string, orientation: PageOrientation) {
|
||||
super("w:pgSz");
|
||||
|
||||
const flip = orientation === PageOrientation.LANDSCAPE;
|
||||
|
@ -10,7 +10,7 @@ class PageTextDirectionAttributes extends XmlAttributeComponent<{ readonly val:
|
||||
}
|
||||
|
||||
export class PageTextDirection extends XmlComponent {
|
||||
constructor(value: PageTextDirectionType) {
|
||||
public constructor(value: PageTextDirectionType) {
|
||||
super("w:textDirection");
|
||||
|
||||
this.root.push(
|
||||
|
@ -30,7 +30,7 @@ export class SectionTypeAttributes extends XmlAttributeComponent<{
|
||||
}
|
||||
|
||||
export class Type extends XmlComponent {
|
||||
constructor(value: SectionType) {
|
||||
public constructor(value: SectionType) {
|
||||
super("w:type");
|
||||
this.root.push(new SectionTypeAttributes({ val: value }));
|
||||
}
|
||||
|
@ -92,7 +92,7 @@ export const sectionPageSizeDefaults = {
|
||||
};
|
||||
|
||||
export class SectionProperties extends XmlComponent {
|
||||
constructor({
|
||||
public constructor({
|
||||
page: {
|
||||
size: {
|
||||
width = sectionPageSizeDefaults.WIDTH,
|
||||
|
@ -63,7 +63,7 @@ export interface IDocumentBackgroundOptions {
|
||||
// </xsd:complexType>
|
||||
|
||||
export class DocumentBackground extends XmlComponent {
|
||||
constructor(options: IDocumentBackgroundOptions) {
|
||||
public constructor(options: IDocumentBackgroundOptions) {
|
||||
super("w:background");
|
||||
|
||||
this.root.push(
|
||||
|
@ -33,7 +33,7 @@ export interface IDocumentOptions {
|
||||
export class Document extends XmlComponent {
|
||||
private readonly body: Body;
|
||||
|
||||
constructor(options: IDocumentOptions) {
|
||||
public constructor(options: IDocumentOptions) {
|
||||
super("w:document");
|
||||
this.root.push(
|
||||
new DocumentAttributes({
|
||||
|
@ -6,8 +6,8 @@ import { IDrawingOptions } from "../drawing";
|
||||
import { TextWrappingType } from "../text-wrap";
|
||||
import { Anchor } from "./anchor";
|
||||
|
||||
function createAnchor(drawingOptions: IDrawingOptions): Anchor {
|
||||
return new Anchor(
|
||||
const createAnchor = (drawingOptions: IDrawingOptions): Anchor =>
|
||||
new Anchor(
|
||||
{
|
||||
fileName: "test.png",
|
||||
stream: new Buffer(""),
|
||||
@ -34,7 +34,6 @@ function createAnchor(drawingOptions: IDrawingOptions): Anchor {
|
||||
},
|
||||
drawingOptions,
|
||||
);
|
||||
}
|
||||
|
||||
describe("Anchor", () => {
|
||||
let anchor: Anchor;
|
||||
|
@ -37,7 +37,7 @@ import { AnchorAttributes } from "./anchor-attributes";
|
||||
// <xsd:attribute name="allowOverlap" type="xsd:boolean" use="required"/>
|
||||
// </xsd:complexType>
|
||||
export class Anchor extends XmlComponent {
|
||||
constructor(mediaData: IMediaData, transform: IMediaDataTransformation, drawingOptions: IDrawingOptions) {
|
||||
public constructor(mediaData: IMediaData, transform: IMediaDataTransformation, drawingOptions: IDrawingOptions) {
|
||||
super("wp:anchor");
|
||||
|
||||
const floating: IFloating = {
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { DocPropertiesAttributes } from "./doc-properties-attributes";
|
||||
|
||||
export class DocProperties extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("wp:docPr");
|
||||
|
||||
this.root.push(
|
||||
|
@ -6,8 +6,8 @@ import { Drawing, IDrawingOptions } from "./drawing";
|
||||
|
||||
const imageBase64Data = `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`;
|
||||
|
||||
function createDrawing(drawingOptions?: IDrawingOptions): Drawing {
|
||||
return new Drawing(
|
||||
const createDrawing = (drawingOptions?: IDrawingOptions): Drawing =>
|
||||
new Drawing(
|
||||
{
|
||||
fileName: "test.jpg",
|
||||
stream: Buffer.from(imageBase64Data, "base64"),
|
||||
@ -24,7 +24,6 @@ function createDrawing(drawingOptions?: IDrawingOptions): Drawing {
|
||||
},
|
||||
drawingOptions,
|
||||
);
|
||||
}
|
||||
|
||||
describe("Drawing", () => {
|
||||
let currentBreak: Drawing;
|
||||
|
@ -25,7 +25,7 @@ export interface IDrawingOptions {
|
||||
export class Drawing extends XmlComponent {
|
||||
private readonly inline: Inline;
|
||||
|
||||
constructor(imageData: IMediaData, drawingOptions: IDrawingOptions = {}) {
|
||||
public constructor(imageData: IMediaData, drawingOptions: IDrawingOptions = {}) {
|
||||
super("w:drawing");
|
||||
|
||||
if (!drawingOptions.floating) {
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { EffectExtentAttributes } from "./effect-extent-attributes";
|
||||
|
||||
export class EffectExtent extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("wp:effectExtent");
|
||||
|
||||
this.root.push(
|
||||
|
@ -5,7 +5,7 @@ import { ExtentAttributes } from "./extent-attributes";
|
||||
export class Extent extends XmlComponent {
|
||||
private readonly attributes: ExtentAttributes;
|
||||
|
||||
constructor(x: number, y: number) {
|
||||
public constructor(x: number, y: number) {
|
||||
super("wp:extent");
|
||||
|
||||
this.attributes = new ExtentAttributes({
|
||||
|
@ -3,7 +3,7 @@ import { HorizontalPositionAlign, VerticalPositionAlign } from "@file/shared/ali
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class Align extends XmlComponent {
|
||||
constructor(value: HorizontalPositionAlign | VerticalPositionAlign) {
|
||||
public constructor(value: HorizontalPositionAlign | VerticalPositionAlign) {
|
||||
super("wp:align");
|
||||
this.root.push(value);
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ class HorizontalPositionAttributes extends XmlAttributeComponent<{
|
||||
}
|
||||
|
||||
export class HorizontalPosition extends XmlComponent {
|
||||
constructor(horizontalPosition: IHorizontalPositionOptions) {
|
||||
public constructor(horizontalPosition: IHorizontalPositionOptions) {
|
||||
super("wp:positionH");
|
||||
|
||||
this.root.push(
|
||||
|
@ -2,7 +2,7 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class PositionOffset extends XmlComponent {
|
||||
constructor(offsetValue: number) {
|
||||
public constructor(offsetValue: number) {
|
||||
super("wp:posOffset");
|
||||
this.root.push(offsetValue.toString());
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ class SimplePosAttributes extends XmlAttributeComponent<{
|
||||
}
|
||||
|
||||
export class SimplePos extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("wp:simplePos");
|
||||
|
||||
// NOTE: It's not fully supported in Microsoft Word, but this element is needed anyway
|
||||
|
@ -13,7 +13,7 @@ class VerticalPositionAttributes extends XmlAttributeComponent<{
|
||||
}
|
||||
|
||||
export class VerticalPosition extends XmlComponent {
|
||||
constructor(verticalPosition: IVerticalPositionOptions) {
|
||||
public constructor(verticalPosition: IVerticalPositionOptions) {
|
||||
super("wp:positionV");
|
||||
|
||||
this.root.push(
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { GraphicFrameLockAttributes } from "./graphic-frame-lock-attributes";
|
||||
|
||||
export class GraphicFrameLocks extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:graphicFrameLocks");
|
||||
|
||||
this.root.push(
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { GraphicFrameLocks } from "./graphic-frame-locks/graphic-frame-locks";
|
||||
|
||||
export class GraphicFrameProperties extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("wp:cNvGraphicFramePr");
|
||||
|
||||
this.root.push(new GraphicFrameLocks());
|
||||
|
@ -7,7 +7,7 @@ import { Pic } from "./pic";
|
||||
export class GraphicData extends XmlComponent {
|
||||
private readonly pic: Pic;
|
||||
|
||||
constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
public constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
super("a:graphicData");
|
||||
|
||||
this.root.push(
|
||||
|
@ -6,7 +6,7 @@ import { SourceRectangle } from "./source-rectangle";
|
||||
import { Stretch } from "./stretch";
|
||||
|
||||
export class BlipFill extends XmlComponent {
|
||||
constructor(mediaData: IMediaData) {
|
||||
public constructor(mediaData: IMediaData) {
|
||||
super("pic:blipFill");
|
||||
|
||||
this.root.push(new Blip(mediaData));
|
||||
|
@ -12,7 +12,7 @@ class BlipAttributes extends XmlAttributeComponent<{
|
||||
}
|
||||
|
||||
export class Blip extends XmlComponent {
|
||||
constructor(mediaData: IMediaData) {
|
||||
public constructor(mediaData: IMediaData) {
|
||||
super("a:blip");
|
||||
this.root.push(
|
||||
new BlipAttributes({
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class SourceRectangle extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:srcRect");
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,13 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
class FillRectangle extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:fillRect");
|
||||
}
|
||||
}
|
||||
|
||||
export class Stretch extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:stretch");
|
||||
this.root.push(new FillRectangle());
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { PicLocks } from "./pic-locks/pic-locks";
|
||||
|
||||
export class ChildNonVisualProperties extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("pic:cNvPicPr");
|
||||
|
||||
this.root.push(new PicLocks());
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { PicLocksAttributes } from "./pic-locks-attributes";
|
||||
|
||||
export class PicLocks extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:picLocks");
|
||||
this.root.push(
|
||||
new PicLocksAttributes({
|
||||
|
@ -3,7 +3,7 @@ import { ChildNonVisualProperties } from "./child-non-visual-pic-properties/chil
|
||||
import { NonVisualProperties } from "./non-visual-properties/non-visual-properties";
|
||||
|
||||
export class NonVisualPicProperties extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("pic:nvPicPr");
|
||||
|
||||
this.root.push(new NonVisualProperties());
|
||||
|
@ -2,7 +2,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { NonVisualPropertiesAttributes } from "./non-visual-properties-attributes";
|
||||
|
||||
export class NonVisualProperties extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("pic:cNvPr");
|
||||
|
||||
this.root.push(
|
||||
|
@ -8,7 +8,7 @@ import { PicAttributes } from "./pic-attributes";
|
||||
import { ShapeProperties } from "./shape-properties/shape-properties";
|
||||
|
||||
export class Pic extends XmlComponent {
|
||||
constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
public constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
super("pic:pic");
|
||||
|
||||
this.root.push(
|
||||
|
@ -5,7 +5,7 @@ import { ExtentsAttributes } from "./extents-attributes";
|
||||
export class Extents extends XmlComponent {
|
||||
private readonly attributes: ExtentsAttributes;
|
||||
|
||||
constructor(x: number, y: number) {
|
||||
public constructor(x: number, y: number) {
|
||||
super("a:ext");
|
||||
|
||||
this.attributes = new ExtentsAttributes({
|
||||
|
@ -21,7 +21,7 @@ export class FormAttributes extends XmlAttributeComponent<{
|
||||
export class Form extends XmlComponent {
|
||||
private readonly extents: Extents;
|
||||
|
||||
constructor(options: IMediaDataTransformation) {
|
||||
public constructor(options: IMediaDataTransformation) {
|
||||
super("a:xfrm");
|
||||
|
||||
this.root.push(
|
||||
|
@ -3,7 +3,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { OffsetAttributes } from "./off-attributes";
|
||||
|
||||
export class Offset extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:off");
|
||||
|
||||
this.root.push(
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class NoFill extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:noFill");
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ import { XmlComponent } from "@file/xml-components";
|
||||
import { NoFill } from "./no-fill";
|
||||
|
||||
export class Outline extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:ln");
|
||||
|
||||
this.root.push(new NoFill());
|
||||
|
@ -2,7 +2,7 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class AdjustmentValues extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:avLst");
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ import { AdjustmentValues } from "./adjustment-values/adjustment-values";
|
||||
import { PresetGeometryAttributes } from "./preset-geometry-attributes";
|
||||
|
||||
export class PresetGeometry extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("a:prstGeom");
|
||||
|
||||
this.root.push(
|
||||
|
@ -10,7 +10,7 @@ import { ShapePropertiesAttributes } from "./shape-properties-attributes";
|
||||
export class ShapeProperties extends XmlComponent {
|
||||
private readonly form: Form;
|
||||
|
||||
constructor(transform: IMediaDataTransformation) {
|
||||
public constructor(transform: IMediaDataTransformation) {
|
||||
super("pic:spPr");
|
||||
|
||||
this.root.push(
|
||||
|
@ -14,7 +14,7 @@ class GraphicAttributes extends XmlAttributeComponent<{
|
||||
export class Graphic extends XmlComponent {
|
||||
private readonly data: GraphicData;
|
||||
|
||||
constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
public constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
super("a:graphic");
|
||||
this.root.push(
|
||||
new GraphicAttributes({
|
||||
|
@ -26,7 +26,7 @@ export class Inline extends XmlComponent {
|
||||
private readonly extent: Extent;
|
||||
private readonly graphic: Graphic;
|
||||
|
||||
constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
public constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
super("wp:inline");
|
||||
|
||||
this.root.push(
|
||||
|
@ -2,7 +2,7 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class WrapNone extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("wp:wrapNone");
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,9 @@
|
||||
// http://officeopenxml.com/drwPicFloating-textWrap.php
|
||||
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
import { ITextWrapping, TextWrappingSide } from ".";
|
||||
|
||||
import { IDistance } from "../drawing";
|
||||
import { IMargins } from "../floating";
|
||||
import { ITextWrapping, TextWrappingSide } from "./text-wrapping";
|
||||
|
||||
interface IWrapSquareAttributes extends IDistance {
|
||||
readonly wrapText?: TextWrappingSide;
|
||||
@ -19,7 +20,7 @@ class WrapSquareAttributes extends XmlAttributeComponent<IWrapSquareAttributes>
|
||||
}
|
||||
|
||||
export class WrapSquare extends XmlComponent {
|
||||
constructor(
|
||||
public constructor(
|
||||
textWrapping: ITextWrapping,
|
||||
margins: IMargins = {
|
||||
top: 0,
|
||||
|
@ -14,7 +14,7 @@ class WrapTightAttributes extends XmlAttributeComponent<{
|
||||
}
|
||||
|
||||
export class WrapTight extends XmlComponent {
|
||||
constructor(
|
||||
public constructor(
|
||||
margins: IMargins = {
|
||||
top: 0,
|
||||
bottom: 0,
|
||||
|
@ -14,7 +14,7 @@ class WrapTopAndBottomAttributes extends XmlAttributeComponent<{
|
||||
}
|
||||
|
||||
export class WrapTopAndBottom extends XmlComponent {
|
||||
constructor(
|
||||
public constructor(
|
||||
margins: IMargins = {
|
||||
top: 0,
|
||||
bottom: 0,
|
||||
|
@ -6,6 +6,7 @@ import { sectionMarginDefaults, sectionPageSizeDefaults } from "./document";
|
||||
import { File } from "./file";
|
||||
import { Footer, Header } from "./header";
|
||||
import { Paragraph } from "./paragraph";
|
||||
import { Media } from "./media";
|
||||
|
||||
const PAGE_SIZE_DEFAULTS = {
|
||||
"w:h": sectionPageSizeDefaults.HEIGHT,
|
||||
@ -397,7 +398,6 @@ describe("File", () => {
|
||||
sections: [],
|
||||
});
|
||||
|
||||
// tslint:disable-next-line: no-unused-expression
|
||||
expect(doc.Comments).to.not.be.undefined;
|
||||
});
|
||||
});
|
||||
@ -409,8 +409,61 @@ describe("File", () => {
|
||||
sections: [],
|
||||
});
|
||||
|
||||
// tslint:disable-next-line: no-unused-expression
|
||||
expect(doc.Numbering).to.not.be.undefined;
|
||||
});
|
||||
});
|
||||
|
||||
describe("#getters", () => {
|
||||
it("should have defined getters", () => {
|
||||
const doc = new File({
|
||||
sections: [],
|
||||
});
|
||||
|
||||
expect(doc.CoreProperties).to.not.be.undefined;
|
||||
expect(doc.Media).to.not.be.undefined;
|
||||
expect(doc.FileRelationships).to.not.be.undefined;
|
||||
expect(doc.Headers).to.not.be.undefined;
|
||||
expect(doc.Footers).to.not.be.undefined;
|
||||
expect(doc.ContentTypes).to.not.be.undefined;
|
||||
expect(doc.CustomProperties).to.not.be.undefined;
|
||||
expect(doc.AppProperties).to.not.be.undefined;
|
||||
expect(doc.FootNotes).to.not.be.undefined;
|
||||
expect(doc.Settings).to.not.be.undefined;
|
||||
expect(doc.Comments).to.not.be.undefined;
|
||||
});
|
||||
});
|
||||
|
||||
describe("#templates", () => {
|
||||
// Test will be deprecated when import-dotx and templates are deprecated
|
||||
it("should work with template", () => {
|
||||
const doc = new File(
|
||||
{
|
||||
sections: [],
|
||||
},
|
||||
{
|
||||
template: {
|
||||
currentRelationshipId: 1,
|
||||
headers: [],
|
||||
footers: [],
|
||||
styles: "",
|
||||
titlePageIsDefined: true,
|
||||
media: new Media(),
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
expect(doc).to.not.be.undefined;
|
||||
});
|
||||
});
|
||||
|
||||
describe("#externalStyles", () => {
|
||||
it("should work with external styles", () => {
|
||||
const doc = new File({
|
||||
sections: [],
|
||||
externalStyles: "",
|
||||
});
|
||||
|
||||
expect(doc.Styles).to.not.be.undefined;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -33,15 +33,17 @@ export interface ISectionOptions {
|
||||
readonly even?: Footer;
|
||||
};
|
||||
readonly properties?: ISectionPropertiesOptions;
|
||||
readonly children: (Paragraph | Table | TableOfContents)[];
|
||||
readonly children: readonly (Paragraph | Table | TableOfContents)[];
|
||||
}
|
||||
|
||||
export class File {
|
||||
// tslint:disable-next-line:readonly-keyword
|
||||
// eslint-disable-next-line functional/prefer-readonly-type
|
||||
private currentRelationshipId: number = 1;
|
||||
|
||||
private readonly documentWrapper: DocumentWrapper;
|
||||
// eslint-disable-next-line functional/prefer-readonly-type
|
||||
private readonly headers: IDocumentHeader[] = [];
|
||||
// eslint-disable-next-line functional/prefer-readonly-type
|
||||
private readonly footers: IDocumentFooter[] = [];
|
||||
private readonly coreProperties: CoreProperties;
|
||||
private readonly numbering: Numbering;
|
||||
@ -55,7 +57,7 @@ export class File {
|
||||
private readonly styles: Styles;
|
||||
private readonly comments: Comments;
|
||||
|
||||
constructor(options: IPropertiesOptions, fileProperties: IFileProperties = {}) {
|
||||
public constructor(options: IPropertiesOptions, fileProperties: IFileProperties = {}) {
|
||||
this.coreProperties = new CoreProperties({
|
||||
...options,
|
||||
creator: options.creator ?? "Un-named",
|
||||
@ -63,13 +65,7 @@ export class File {
|
||||
lastModifiedBy: options.lastModifiedBy ?? "Un-named",
|
||||
});
|
||||
|
||||
this.numbering = new Numbering(
|
||||
options.numbering
|
||||
? options.numbering
|
||||
: {
|
||||
config: [],
|
||||
},
|
||||
);
|
||||
this.numbering = new Numbering(options.numbering ? options.numbering : { config: [] });
|
||||
|
||||
this.comments = new Comments(options.comments ?? { children: [] });
|
||||
this.fileRelationships = new Relationships();
|
||||
@ -132,7 +128,7 @@ export class File {
|
||||
}
|
||||
|
||||
if (options.footnotes) {
|
||||
// tslint:disable-next-line: forin
|
||||
// eslint-disable-next-line guard-for-in
|
||||
for (const key in options.footnotes) {
|
||||
this.footnotesWrapper.View.createFootNote(parseFloat(key), options.footnotes[key].children);
|
||||
}
|
||||
@ -160,6 +156,7 @@ export class File {
|
||||
}
|
||||
|
||||
private createHeader(header: Header): HeaderWrapper {
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
const wrapper = new HeaderWrapper(this.media, this.currentRelationshipId++);
|
||||
|
||||
for (const child of header.options.children) {
|
||||
@ -171,6 +168,7 @@ export class File {
|
||||
}
|
||||
|
||||
private createFooter(footer: Footer): FooterWrapper {
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
const wrapper = new FooterWrapper(this.media, this.currentRelationshipId++);
|
||||
|
||||
for (const child of footer.options.children) {
|
||||
@ -182,6 +180,7 @@ export class File {
|
||||
}
|
||||
|
||||
private addHeaderToDocument(header: HeaderWrapper, type: HeaderFooterReferenceType = HeaderFooterReferenceType.DEFAULT): void {
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
this.headers.push({ header, type });
|
||||
this.documentWrapper.Relationships.createRelationship(
|
||||
header.View.ReferenceId,
|
||||
@ -192,6 +191,7 @@ export class File {
|
||||
}
|
||||
|
||||
private addFooterToDocument(footer: FooterWrapper, type: HeaderFooterReferenceType = HeaderFooterReferenceType.DEFAULT): void {
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
this.footers.push({ footer, type });
|
||||
this.documentWrapper.Relationships.createRelationship(
|
||||
footer.View.ReferenceId,
|
||||
@ -224,26 +224,31 @@ export class File {
|
||||
);
|
||||
|
||||
this.documentWrapper.Relationships.createRelationship(
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
this.currentRelationshipId++,
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles",
|
||||
"styles.xml",
|
||||
);
|
||||
this.documentWrapper.Relationships.createRelationship(
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
this.currentRelationshipId++,
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering",
|
||||
"numbering.xml",
|
||||
);
|
||||
this.documentWrapper.Relationships.createRelationship(
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
this.currentRelationshipId++,
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes",
|
||||
"footnotes.xml",
|
||||
);
|
||||
this.documentWrapper.Relationships.createRelationship(
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
this.currentRelationshipId++,
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings",
|
||||
"settings.xml",
|
||||
);
|
||||
this.documentWrapper.Relationships.createRelationship(
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
this.currentRelationshipId++,
|
||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
|
||||
"comments.xml",
|
||||
@ -274,11 +279,11 @@ export class File {
|
||||
return this.fileRelationships;
|
||||
}
|
||||
|
||||
public get Headers(): HeaderWrapper[] {
|
||||
public get Headers(): readonly HeaderWrapper[] {
|
||||
return this.headers.map((item) => item.header);
|
||||
}
|
||||
|
||||
public get Footers(): FooterWrapper[] {
|
||||
public get Footers(): readonly FooterWrapper[] {
|
||||
return this.footers.map((item) => item.footer);
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,7 @@ describe("FooterWrapper", () => {
|
||||
it("should call the underlying footer's addChildElement", () => {
|
||||
const file = new FooterWrapper(new Media(), 1);
|
||||
const spy = sinon.spy(file.View, "addChildElement");
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
file.addChildElement({} as any);
|
||||
|
||||
expect(spy.called).to.equal(true);
|
||||
|
@ -17,7 +17,7 @@ export class FooterWrapper implements IViewWrapper {
|
||||
private readonly footer: Footer;
|
||||
private readonly relationships: Relationships;
|
||||
|
||||
constructor(private readonly media: Media, referenceId: number, initContent?: XmlComponent) {
|
||||
public constructor(private readonly media: Media, referenceId: number, initContent?: XmlComponent) {
|
||||
this.footer = new Footer(referenceId, initContent);
|
||||
this.relationships = new Relationships();
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import { FooterAttributes } from "./footer-attributes";
|
||||
export class Footer extends InitializableXmlComponent {
|
||||
private readonly refId: number;
|
||||
|
||||
constructor(referenceNumber: number, initContent?: XmlComponent) {
|
||||
public constructor(referenceNumber: number, initContent?: XmlComponent) {
|
||||
super("w:ftr", initContent);
|
||||
this.refId = referenceNumber;
|
||||
if (!initContent) {
|
||||
|
@ -7,9 +7,7 @@ describe("FootnotesWrapper", () => {
|
||||
it("should create", () => {
|
||||
const file = new FootnotesWrapper();
|
||||
|
||||
// tslint:disable-next-line: no-unused-expression
|
||||
expect(file.View).to.be.ok;
|
||||
// tslint:disable-next-line: no-unused-expression
|
||||
expect(file.Relationships).to.be.ok;
|
||||
});
|
||||
});
|
||||
|
@ -6,7 +6,7 @@ export class FootnotesWrapper implements IViewWrapper {
|
||||
private readonly footnotess: FootNotes;
|
||||
private readonly relationships: Relationships;
|
||||
|
||||
constructor() {
|
||||
public constructor() {
|
||||
this.footnotess = new FootNotes();
|
||||
this.relationships = new Relationships();
|
||||
}
|
||||
|
@ -12,11 +12,11 @@ export enum FootnoteType {
|
||||
export interface IFootnoteOptions {
|
||||
readonly id: number;
|
||||
readonly type?: FootnoteType;
|
||||
readonly children: Paragraph[];
|
||||
readonly children: readonly Paragraph[];
|
||||
}
|
||||
|
||||
export class Footnote extends XmlComponent {
|
||||
constructor(options: IFootnoteOptions) {
|
||||
public constructor(options: IFootnoteOptions) {
|
||||
super("w:footnote");
|
||||
this.root.push(
|
||||
new FootnoteAttributes({
|
||||
|
@ -2,7 +2,7 @@ import { Run } from "@file/paragraph";
|
||||
import { ContinuationSeperator } from "./continuation-seperator";
|
||||
|
||||
export class ContinuationSeperatorRun extends Run {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super({});
|
||||
|
||||
this.root.push(new ContinuationSeperator());
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class ContinuationSeperator extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("w:continuationSeparator");
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ import { Run } from "@file/paragraph";
|
||||
import { FootnoteRef } from "./footnote-ref";
|
||||
|
||||
export class FootnoteRefRun extends Run {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super({
|
||||
style: "FootnoteReference",
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class FootnoteRef extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("w:footnoteRef");
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ export class FootNoteReferenceRunAttributes extends XmlAttributeComponent<{
|
||||
}
|
||||
|
||||
export class FootnoteReference extends XmlComponent {
|
||||
constructor(id: number) {
|
||||
public constructor(id: number) {
|
||||
super("w:footnoteReference");
|
||||
|
||||
this.root.push(
|
||||
@ -22,7 +22,7 @@ export class FootnoteReference extends XmlComponent {
|
||||
}
|
||||
|
||||
export class FootnoteReferenceRun extends Run {
|
||||
constructor(id: number) {
|
||||
public constructor(id: number) {
|
||||
super({ style: "FootnoteReference" });
|
||||
|
||||
this.root.push(new FootnoteReference(id));
|
||||
|
@ -2,7 +2,7 @@ import { Run } from "@file/paragraph";
|
||||
import { Seperator } from "./seperator";
|
||||
|
||||
export class SeperatorRun extends Run {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super({});
|
||||
|
||||
this.root.push(new Seperator());
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class Seperator extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("w:separator");
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import { SeperatorRun } from "./footnote/run/seperator-run";
|
||||
import { FootnotesAttributes } from "./footnotes-attributes";
|
||||
|
||||
export class FootNotes extends XmlComponent {
|
||||
constructor() {
|
||||
public constructor() {
|
||||
super("w:footnotes");
|
||||
|
||||
this.root.push(
|
||||
@ -67,7 +67,7 @@ export class FootNotes extends XmlComponent {
|
||||
this.root.push(spacing);
|
||||
}
|
||||
|
||||
public createFootNote(id: number, paragraph: Paragraph[]): void {
|
||||
public createFootNote(id: number, paragraph: readonly Paragraph[]): void {
|
||||
const footnote = new Footnote({
|
||||
id: id,
|
||||
children: paragraph,
|
||||
|
@ -41,7 +41,7 @@ describe("HeaderWrapper", () => {
|
||||
it("should call the underlying header's addChildElement", () => {
|
||||
const file = new HeaderWrapper(new Media(), 1);
|
||||
const spy = sinon.spy(file.View, "addChildElement");
|
||||
// tslint:disable-next-line:no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
file.addChildElement({} as any);
|
||||
|
||||
expect(spy.called).to.equal(true);
|
||||
|
@ -17,7 +17,7 @@ export class HeaderWrapper implements IViewWrapper {
|
||||
private readonly header: Header;
|
||||
private readonly relationships: Relationships;
|
||||
|
||||
constructor(private readonly media: Media, referenceId: number, initContent?: XmlComponent) {
|
||||
public constructor(private readonly media: Media, referenceId: number, initContent?: XmlComponent) {
|
||||
this.header = new Header(referenceId, initContent);
|
||||
this.relationships = new Relationships();
|
||||
}
|
||||
|
@ -2,13 +2,21 @@ import { Paragraph } from "./paragraph";
|
||||
import { Table } from "./table";
|
||||
|
||||
export interface IHeaderOptions {
|
||||
readonly children: (Paragraph | Table)[];
|
||||
readonly children: readonly (Paragraph | Table)[];
|
||||
}
|
||||
|
||||
export class Header {
|
||||
constructor(public readonly options: IHeaderOptions = { children: [] }) {}
|
||||
public readonly options: IHeaderOptions;
|
||||
|
||||
public constructor(options: IHeaderOptions = { children: [] }) {
|
||||
this.options = options;
|
||||
}
|
||||
}
|
||||
|
||||
export class Footer {
|
||||
constructor(public readonly options: IHeaderOptions = { children: [] }) {}
|
||||
public readonly options: IHeaderOptions;
|
||||
|
||||
public constructor(options: IHeaderOptions = { children: [] }) {
|
||||
this.options = options;
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import { HeaderAttributes } from "./header-attributes";
|
||||
export class Header extends InitializableXmlComponent {
|
||||
private readonly refId: number;
|
||||
|
||||
constructor(referenceNumber: number, initContent?: XmlComponent) {
|
||||
public constructor(referenceNumber: number, initContent?: XmlComponent) {
|
||||
super("w:hdr", initContent);
|
||||
|
||||
this.refId = referenceNumber;
|
||||
|
@ -37,6 +37,7 @@ describe("Media", () => {
|
||||
});
|
||||
|
||||
it("should return UInt8Array if atob is present", () => {
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
global.atob = () => "atob result";
|
||||
|
||||
const image = new Media().addMedia("", {
|
||||
@ -45,11 +46,12 @@ describe("Media", () => {
|
||||
});
|
||||
expect(image.stream).to.be.an.instanceof(Uint8Array);
|
||||
|
||||
// tslint:disable-next-line: no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any, functional/immutable-data
|
||||
(global as any).atob = undefined;
|
||||
});
|
||||
|
||||
it("should use data as is if its not a string", () => {
|
||||
// eslint-disable-next-line functional/immutable-data
|
||||
global.atob = () => "atob result";
|
||||
|
||||
const image = new Media().addMedia(Buffer.from(""), {
|
||||
@ -58,7 +60,7 @@ describe("Media", () => {
|
||||
});
|
||||
expect(image.stream).to.be.an.instanceof(Uint8Array);
|
||||
|
||||
// tslint:disable-next-line: no-any
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any, functional/immutable-data
|
||||
(global as any).atob = undefined;
|
||||
});
|
||||
});
|
||||
|
@ -13,9 +13,10 @@ export interface IMediaTransformation {
|
||||
}
|
||||
|
||||
export class Media {
|
||||
// eslint-disable-next-line functional/prefer-readonly-type
|
||||
private readonly map: Map<string, IMediaData>;
|
||||
|
||||
constructor() {
|
||||
public constructor() {
|
||||
this.map = new Map<string, IMediaData>();
|
||||
}
|
||||
|
||||
@ -68,6 +69,7 @@ export class Media {
|
||||
.map((c) => c.charCodeAt(0)),
|
||||
);
|
||||
} else {
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
|
||||
const b = require("buf" + "fer");
|
||||
return new b.Buffer(dataURI, "base64");
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ class AbstractNumberingAttributes extends XmlAttributeComponent<{
|
||||
export class AbstractNumbering extends XmlComponent {
|
||||
public readonly id: number;
|
||||
|
||||
constructor(id: number, levelOptions: ILevelsOptions[]) {
|
||||
public constructor(id: number, levelOptions: readonly ILevelsOptions[]) {
|
||||
super("w:abstractNum");
|
||||
this.root.push(
|
||||
new AbstractNumberingAttributes({
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user