@openpresentation/opf-pptx 0.5.0 → 0.5.2
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/DEPENDENCY-NOTES.md +23 -0
- package/README.md +3 -1
- package/dist/index.js +67 -58
- package/package.json +12 -6
- package/vendor/pptxgenjs/LICENSE +21 -0
- package/vendor/pptxgenjs/UPSTREAM.json +19 -0
- package/vendor/pptxgenjs/package.json +8 -0
- package/vendor/pptxgenjs/pptxgen.es.js +7368 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# PptxGenJS runtime provenance
|
|
2
|
+
|
|
3
|
+
OPF PPTX 0.5.1 ships the exact, unmodified PptxGenJS 4.0.1 ESM distribution in `vendor/pptxgenjs`, with its MIT license, upstream archive integrity and per-file SHA-256 hashes. Its actual JSZip dependency is declared directly. Ordinary npm installations therefore omit the unused image-size parser without requiring consumer overrides. This removes the affected dependency; it does not patch the parser. Published OPF PPTX 0.5.0 retains the older graph.
|
|
4
|
+
|
|
5
|
+
The inspected PptxGenJS 4.0.1 ESM/CommonJS distributions do not import `image-size`. The only sizing-module reference is in a commented, unused helper. OPF supplies image geometry itself. The image-fit follow-up reads bounded PNG/JPEG/GIF/WebP dimension headers and inline JPEG EXIF orientation; it does not load image-size or decode pixels.
|
|
6
|
+
|
|
7
|
+
`npm test` requires image-size to be absent, then blocks both ESM and CommonJS loading before running the full model suite and checking image-byte preservation for data URIs, local paths and host-resolved bytes. Browser bundling retains upstream's Node built-in exclusions through the vendor directory's package metadata. This is not a guarantee about every upstream PptxGenJS API or future version.
|
|
8
|
+
|
|
9
|
+
Every build checks the vendored code and license against `UPSTREAM.json`. `node scripts/vendor-pptxgenjs.mjs` is an explicit maintainer command that fetches the pinned official npm archive, verifies its SHA-512 integrity and reads only the named distribution/license entries. It is never run by builds or installations. Review the upstream source, actual imports, license and audit before changing versions; retain tests and reassess [GHSA-w3rx-r6r6-pgpr](https://github.com/advisories/GHSA-w3rx-r6r6-pgpr) and [GHSA-5p2g-fcmc-qvqq](https://github.com/advisories/GHSA-5p2g-fcmc-qvqq). Do not accept npm's incompatible PptxGenJS downgrade suggestion.
|
|
10
|
+
|
|
11
|
+
## Compatible raster decoding
|
|
12
|
+
|
|
13
|
+
Sharp 0.35.4 (Apache-2.0) is pinned for Node-only WebP-to-PNG conversion and loads lazily only when conversion is needed. Its platform packages include libvips and codec licenses; retain the upstream license files distributed by npm. Node 20.9+ and normal optional-platform dependency installation are required. Browser builds use the browser's decoder/canvas and a conditional package import; a bundling check rejects Sharp or the Node adapter in browser output. Ordinary/preserved image exports are tested with Sharp loading blocked.
|
|
14
|
+
|
|
15
|
+
The candidate's complete npm audit reports no known vulnerabilities in the installed graph. npm does not audit vendored source as an installed PptxGenJS package: maintainers must also review upstream PptxGenJS advisories and releases when updating or auditing the vendor directory. The browser bundler esbuild 0.28.2 and Playwright are development-only. No hosted service, paid API or telemetry was added.
|
|
16
|
+
|
|
17
|
+
## Repeatable patch comparison
|
|
18
|
+
|
|
19
|
+
After `npm ci`, run `npm test` and `npm run test:packed`. The packed check installs the actual tarball into a fresh temporary consumer, audits its complete graph, checks shipped upstream hashes/license and exercises editable table export/reimport. It does not use consumer overrides.
|
|
20
|
+
|
|
21
|
+
Run `npm run test:browser` for real browser WebP pixel preservation and rich, conditional and merged/styled table import/preview/export/reimport checks. Local Windows runs use installed Microsoft Edge; other environments first run `npx playwright install --with-deps chromium`. CI and release jobs run the Chromium checks on their built candidate. These assertions cover the named fixtures, not arbitrary Office files.
|
|
22
|
+
|
|
23
|
+
For a comparison against the preceding release, create a separate empty directory, run `npm init -y` there, then `npm install --ignore-scripts --no-audit --no-fund @openpresentation/opf-pptx@0.5.0`. From this repository run `npm run test:compare-published -- <absolute-consumer-directory> <report.json>`. The script verifies the reference version and registry lockfile integrity, then compares every installed core example's PPTX bytes. The older reference deliberately contains the dependency being removed; it is only a comparison input. Explicit replacement images and fallback fonts make the comparison reproducible. Matching bytes do not establish original-asset fidelity or native viewer equivalence.
|
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@ Pure local PowerPoint conversion tooling for Open Presentation Format documents.
|
|
|
4
4
|
|
|
5
5
|
## Scope
|
|
6
6
|
|
|
7
|
+
Version 0.5.2 improves native metrics, quotes, code panels, timelines and chart-label contrast, with renderer 0.5.1 compatibility and fitted quote footer separation. See [native content evidence and limitations](docs/native-content-candidate.md). Native chart geometry and general scalar-text wrapping remain different from preview; editability and valid reimport do not establish raster equivalence.
|
|
8
|
+
|
|
7
9
|
- Package: `@openpresentation/opf-pptx`
|
|
8
10
|
- Repository: `OpenPresentation/opf-pptx`
|
|
9
11
|
- License: MIT
|
|
@@ -121,7 +123,7 @@ For crowded drafts, run `paginatePresentation` from `@openpresentation/opf/pagin
|
|
|
121
123
|
|
|
122
124
|
Pass the same `textMeasurement` provider used by preview and pagination to `toPptx`. Plain text and headings retain the measured line breaks and resolved font family in editable PowerPoint shapes. Font binaries are not yet embedded in PPTX; native viewers still need the resolved font installed.
|
|
123
125
|
|
|
124
|
-
|
|
126
|
+
Since 0.5.1, the exact PptxGenJS 4.0.1 ESM distribution is shipped with its MIT license and verified upstream hashes. Its unused `image-size` dependency is not installed; JSZip is declared directly. See [dependency provenance and regression coverage](DEPENDENCY-NOTES.md). The published 0.5.0 package retains the older dependency graph.
|
|
125
127
|
|
|
126
128
|
### Native table fitting
|
|
127
129
|
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import {importBackground} from './background-import.js';
|
|
|
5
5
|
import { webpToPng } from '#image-fallback';
|
|
6
6
|
import { rasterMetadata, pictureTransform, normalizeImageOrientation } from './image-geometry.js';
|
|
7
7
|
import { layoutTable, composeSlide, fitText, fitRichText, textWidthMeasurer, resolveCanvasDimensions, resolveFontFamilies, resolveTextStyle } from "@openpresentation/opf/composition";
|
|
8
|
-
import PptxGenJS from "pptxgenjs";
|
|
8
|
+
import PptxGenJS from "../vendor/pptxgenjs/pptxgen.es.js";
|
|
9
9
|
import { unzipSync, zipSync } from "fflate";
|
|
10
10
|
import { XMLParser } from "fast-xml-parser";
|
|
11
11
|
import {
|
|
@@ -950,16 +950,16 @@ async function addPayload(slide, presentation, payload, region, path, context, o
|
|
|
950
950
|
addTablePayload(slide, payload.table, region, context, options, path);
|
|
951
951
|
break;
|
|
952
952
|
case "code":
|
|
953
|
-
addCodePayload(slide, payload.code, region, context);
|
|
953
|
+
addCodePayload(slide, payload.code, region, context, options, path);
|
|
954
954
|
break;
|
|
955
955
|
case "metric":
|
|
956
|
-
addMetricPayload(slide, payload.metric, region, context);
|
|
956
|
+
addMetricPayload(slide, payload.metric, region, context, options, path);
|
|
957
957
|
break;
|
|
958
958
|
case "quote":
|
|
959
|
-
addQuotePayload(slide, payload.quote, region, context);
|
|
959
|
+
addQuotePayload(slide, payload.quote, region, context, options, path);
|
|
960
960
|
break;
|
|
961
961
|
case "timeline":
|
|
962
|
-
addTimelinePayload(slide, payload.timeline, region, context);
|
|
962
|
+
addTimelinePayload(slide, payload.timeline, region, context, options, path);
|
|
963
963
|
break;
|
|
964
964
|
default:
|
|
965
965
|
addPlaceholderPayload(slide, "Unsupported OPF payload", payload, region, context);
|
|
@@ -1088,8 +1088,11 @@ function addChartPayload(slide, chart, region, context) {
|
|
|
1088
1088
|
chartColors: CHART_COLORS,
|
|
1089
1089
|
catAxisLabelFontFace: context.fonts.body,
|
|
1090
1090
|
catAxisLabelFontSize: 9,
|
|
1091
|
+
catAxisLabelColor: context.colors.text,
|
|
1091
1092
|
valAxisLabelFontFace: context.fonts.body,
|
|
1092
1093
|
valAxisLabelFontSize: 9,
|
|
1094
|
+
valAxisLabelColor: context.colors.text,
|
|
1095
|
+
legendColor: context.colors.text,
|
|
1093
1096
|
showValue: false,
|
|
1094
1097
|
valGridLine: { color: context.colors.border, transparency: 30, size: 1 },
|
|
1095
1098
|
barDir: chartData.barDir,
|
|
@@ -1184,67 +1187,73 @@ function addTablePayload(slide, table, region, context, options, path) {
|
|
|
1184
1187
|
});
|
|
1185
1188
|
}
|
|
1186
1189
|
|
|
1187
|
-
function
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1190
|
+
function pixelBox(region) {
|
|
1191
|
+
return {x: region.x * 96, y: region.y * 96, width: region.w * 96, height: region.h * 96};
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
// Match the published renderer's payload geometry and shared core text fitting.
|
|
1195
|
+
// Each fitted line remains native editable text, without PowerPoint rewrapping it.
|
|
1196
|
+
function addMeasuredPayloadText(slide, text, box, context, options, config) {
|
|
1197
|
+
const scale = Math.min(context.dimensions.widthInches, context.dimensions.heightInches) * 96 / 720;
|
|
1198
|
+
const style = resolveTextStyle({fontFamily: config.fontFamily ?? context.fonts.body, fontWeight: config.fontWeight ?? 400, path: config.path}, options.textMeasurement);
|
|
1199
|
+
const fit = fitText(String(text ?? ''), box, config.fontSize * scale, (context.composition?.minFontSize ?? 16) * scale, textWidthMeasurer(style, options.textMeasurement));
|
|
1200
|
+
if (fit.overflow) {
|
|
1201
|
+
const diagnostic = {code: 'text-overflow', path: config.path, message: 'Text exceeds its cell at the minimum font size; shorten it, increase its space, or split the slide.'};
|
|
1202
|
+
options.onDiagnostic?.(diagnostic);
|
|
1203
|
+
if (context.composition?.overflow === 'error') throw new OPFPptxError('layout-overflow', diagnostic.message, {path: config.path, issues: [diagnostic]});
|
|
1204
|
+
}
|
|
1205
|
+
for (const [index, line] of fit.lines.entries()) {
|
|
1206
|
+
if (!line) continue;
|
|
1207
|
+
slide.addText(line, {
|
|
1208
|
+
...textBoxOptions({x: box.x / 96, y: (box.y + index * fit.lineHeight) / 96, w: box.width / 96, h: fit.lineHeight / 96}, context, fit.fontSize * .75),
|
|
1209
|
+
fontFace: style.fontFamily, bold: style.fontWeight >= 600, italic: style.italic,
|
|
1210
|
+
color: normalizeHex(config.color ?? context.colors.text), align: config.align ?? context.contentAlignment ?? 'left',
|
|
1211
|
+
fit: 'none', wrap: false, lineSpacingMultiple: 1,
|
|
1212
|
+
});
|
|
1213
|
+
}
|
|
1199
1214
|
}
|
|
1200
1215
|
|
|
1201
|
-
function
|
|
1202
|
-
const
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
fontFace: context.fonts.heading,
|
|
1210
|
-
fontSize: 30,
|
|
1211
|
-
bold: true,
|
|
1212
|
-
color: context.colors.accent,
|
|
1213
|
-
fit: "shrink"
|
|
1214
|
-
});
|
|
1215
|
-
slide.addText([metric.label, metric.description, metric.delta].filter(Boolean).join("\n"), {
|
|
1216
|
-
x: region.x,
|
|
1217
|
-
y: region.y + 0.76,
|
|
1218
|
-
w: region.w,
|
|
1219
|
-
h: Math.max(0.3, region.h - 0.78),
|
|
1220
|
-
margin: 0,
|
|
1221
|
-
fontFace: context.fonts.body,
|
|
1222
|
-
fontSize: 12,
|
|
1223
|
-
color: context.colors.text,
|
|
1224
|
-
fit: "shrink"
|
|
1216
|
+
function addCodePayload(slide, value, region, context, options, path) {
|
|
1217
|
+
const box = pixelBox(region), code = typeof value === 'string' ? value : value?.source ?? JSON.stringify(value);
|
|
1218
|
+
const label = typeof value === 'object' && value?.language ? String(value.language) : 'code';
|
|
1219
|
+
slide.addShape('rect', {...region, fill: {color: '111827'}, line: {color: '334155', pt: .75}});
|
|
1220
|
+
// The label has a fixed baseline in the SVG renderer; it does not participate in fitting.
|
|
1221
|
+
slide.addText(label.toUpperCase(), {
|
|
1222
|
+
...textBoxOptions({x: (box.x + 18) / 96, y: (box.y + 14) / 96, w: Math.max(1, box.width - 36) / 96, h: 20 / 96}, context, 14 * .75),
|
|
1223
|
+
fontFace: context.fonts.code, bold: true, color: '93C5FD', fit: 'none', wrap: false,
|
|
1225
1224
|
});
|
|
1225
|
+
addMeasuredPayloadText(slide, code, {x: box.x + 18, y: box.y + 46, width: box.width - 36, height: box.height - 64}, context, options, {path, fontSize: 18, fontFamily: context.fonts.code, color: 'E5E7EB'});
|
|
1226
1226
|
}
|
|
1227
1227
|
|
|
1228
|
-
function
|
|
1229
|
-
const
|
|
1230
|
-
|
|
1231
|
-
slide.
|
|
1232
|
-
...textBoxOptions(region, context, 17),
|
|
1233
|
-
italic: true,
|
|
1234
|
-
color: context.colors.text,
|
|
1235
|
-
fit: "shrink"
|
|
1236
|
-
});
|
|
1228
|
+
function addMetricPayload(slide, value, region, context, options, path) {
|
|
1229
|
+
const metric = isPlainObject(value) ? value : {value}, box = pixelBox(region);
|
|
1230
|
+
addMeasuredPayloadText(slide, metric.value, {...box, height: box.height * .45}, context, options, {path: path + '.value', fontSize: Math.min(76, box.height * .28), fontFamily: context.fonts.heading, fontWeight: 800, color: context.colors.accent});
|
|
1231
|
+
addMeasuredPayloadText(slide, [metric.label, metric.description, metric.delta].filter(Boolean).join('\n'), {x: box.x, y: box.y + box.height * .45, width: box.width, height: box.height * .55}, context, options, {path, fontSize: 23, fontWeight: 500});
|
|
1237
1232
|
}
|
|
1238
1233
|
|
|
1239
|
-
function
|
|
1240
|
-
const
|
|
1234
|
+
function addQuotePayload(slide, value, region, context, options, path) {
|
|
1235
|
+
const quote = isPlainObject(value) ? value : {text: value}, box = pixelBox(region);
|
|
1236
|
+
const attribution = [quote.attribution, quote.source].filter(Boolean).join(' - ');
|
|
1237
|
+
// Keep the footer and an 18px gap outside the body's text fitting area.
|
|
1238
|
+
addMeasuredPayloadText(slide, `"${quote.text ?? ''}"`, {x: box.x + 18, y: box.y + 18, width: Math.max(1, box.width - 36), height: Math.max(1, box.height - (attribution ? 94 : 36))}, context, options, {path: path + '.text', fontSize: 28, fontFamily: context.fonts.heading, fontWeight: 600});
|
|
1239
|
+
addMeasuredPayloadText(slide, attribution, {x: box.x + 18, y: box.y + box.height - 58, width: box.width - 36, height: 40}, context, options, {path, fontSize: 17, fontWeight: 500, color: context.colors.mutedText});
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
function addTimelinePayload(slide, value, region, context, options, path) {
|
|
1243
|
+
const timeline = Array.isArray(value) ? {events: value} : value;
|
|
1241
1244
|
const events = Array.isArray(timeline?.events) ? timeline.events : [];
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1245
|
+
if (!events.length) return;
|
|
1246
|
+
const box = pixelBox(region), labelWidth = box.width / Math.max(2, events.length);
|
|
1247
|
+
const gap = (box.width - labelWidth) / Math.max(1, events.length - 1);
|
|
1248
|
+
const start = events.length === 1 ? box.x + box.width / 2 : box.x + labelWidth / 2;
|
|
1249
|
+
const end = events.length === 1 ? start : box.x + box.width - labelWidth / 2;
|
|
1250
|
+
const y = box.y + box.height * .46, radius = Math.min(9, labelWidth / 5, box.height * .04);
|
|
1251
|
+
slide.addShape('line', {x: start / 96, y: y / 96, w: (end - start) / 96, h: 0, line: {color: context.colors.border, pt: 3 * .75}});
|
|
1252
|
+
for (const [index, event] of events.entries()) {
|
|
1253
|
+
const x = start + index * gap;
|
|
1254
|
+
slide.addShape('ellipse', {x: (x - radius) / 96, y: (y - radius) / 96, w: radius * 2 / 96, h: radius * 2 / 96, fill: {color: context.colors.accent}, line: {transparency: 100}});
|
|
1255
|
+
addMeasuredPayloadText(slide, [event.when, event.what, event.description].filter(Boolean).join('\n'), {x: x - labelWidth / 2, y: index % 2 === 0 ? box.y : y + 24, width: labelWidth, height: box.height * .38}, context, options, {path: `${path}.events.${index}`, fontSize: 16, fontWeight: 500, align: 'center'});
|
|
1256
|
+
}
|
|
1248
1257
|
}
|
|
1249
1258
|
|
|
1250
1259
|
function addPlaceholderPayload(slide, label, value, region, context) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openpresentation/opf-pptx",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Pure local OPF to PPTX export and PPTX to OPF import tooling.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -21,6 +21,8 @@
|
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
23
|
"dist",
|
|
24
|
+
"vendor",
|
|
25
|
+
"DEPENDENCY-NOTES.md",
|
|
24
26
|
"README.md",
|
|
25
27
|
"LICENSE"
|
|
26
28
|
],
|
|
@@ -36,8 +38,11 @@
|
|
|
36
38
|
"scripts": {
|
|
37
39
|
"build": "node scripts/build.mjs",
|
|
38
40
|
"typecheck": "node --check src/index.js && node --check scripts/build.mjs && node --check scripts/validate-package.mjs && node --check test/smoke.mjs && node --check src/image-geometry.js && node --check test/image-fit.mjs && node --check test/image-orientation.mjs && node --check test/table-layout.mjs && node --check test/table-import.mjs && node --check test/object-ids.mjs && node --check test/export-corpus.mjs && node --check test/image-media-type.mjs && node --check src/image-fallback-node.js && node --check src/image-fallback-browser.js && node --check test/webp-fallback.mjs && node --check scripts/build-browser-check.mjs && node --check test/webp-fallback-browser.js && node --check test/image-fallback-boundary.mjs && node --check src/background.js && node --check test/background.mjs && node --check src/image-import.js && node --check test/image-import.mjs && node --check test/native-background.mjs && node --check src/background-import.js && node --check test/background-inheritance.mjs && node --check test/rich-table.mjs && node --check src/table-import.js && node --check test/rich-table-import.mjs && node --check test/rich-table-import-browser.js && node --check test/table-row-sizing.mjs && node --check test/table-styles.mjs && node --check test/table-styles-browser.js && node --check test/styled-table.mjs && node --check src/table-cell-import.js && node --check test/styled-table-import.mjs && node --check test/styled-table-import-browser.js && node --check src/table-border-import.js && node --check test/table-border-styles.mjs",
|
|
39
|
-
"test": "npm run build && node test/dependency-boundary.mjs && npm run build:browser-check && npm run test:styled-table",
|
|
41
|
+
"test": "npm run build && node test/dependency-boundary.mjs && npm run build:browser-check && npm run test:styled-table && node test/content-layout.mjs",
|
|
40
42
|
"validate": "node scripts/validate-package.mjs",
|
|
43
|
+
"test:packed": "node test/packed-install.mjs",
|
|
44
|
+
"test:compare-published": "node test/compare-published.mjs",
|
|
45
|
+
"test:browser": "npm run build:browser-check && node test/browser-check.mjs",
|
|
41
46
|
"prepack": "npm run build",
|
|
42
47
|
"build:browser-check": "node scripts/build-browser-check.mjs",
|
|
43
48
|
"test:styled-table": "node test/styled-table.mjs && node test/styled-table-import.mjs"
|
|
@@ -46,11 +51,11 @@
|
|
|
46
51
|
"@openpresentation/opf": "^0.7.0",
|
|
47
52
|
"fast-xml-parser": "^5.8.0",
|
|
48
53
|
"fflate": "^0.8.3",
|
|
49
|
-
"
|
|
54
|
+
"jszip": "3.10.1",
|
|
50
55
|
"sharp": "0.35.4"
|
|
51
56
|
},
|
|
52
57
|
"peerDependencies": {
|
|
53
|
-
"@openpresentation/opf-render": "^0.5.
|
|
58
|
+
"@openpresentation/opf-render": "^0.5.1"
|
|
54
59
|
},
|
|
55
60
|
"peerDependenciesMeta": {
|
|
56
61
|
"@openpresentation/opf-render": {
|
|
@@ -58,8 +63,9 @@
|
|
|
58
63
|
}
|
|
59
64
|
},
|
|
60
65
|
"devDependencies": {
|
|
61
|
-
"@openpresentation/opf-render": "0.5.
|
|
62
|
-
"esbuild": "0.28.2"
|
|
66
|
+
"@openpresentation/opf-render": "0.5.1",
|
|
67
|
+
"esbuild": "0.28.2",
|
|
68
|
+
"playwright": "1.63.0"
|
|
63
69
|
},
|
|
64
70
|
"imports": {
|
|
65
71
|
"#image-fallback": {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2015-2022 Brent Ely
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pptxgenjs",
|
|
3
|
+
"version": "4.0.1",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"tarball": "https://registry.npmjs.org/pptxgenjs/-/pptxgenjs-4.0.1.tgz",
|
|
6
|
+
"integrity": "sha512-TeJISr8wouAuXw4C1F/mC33xbZs/FuEG6nH9FG1Zj+nuPcGMP5YRHl6X+j3HSUnS1f3at6k75ZZXPMZlA5Lj9A==",
|
|
7
|
+
"files": {
|
|
8
|
+
"pptxgen.es.js": {
|
|
9
|
+
"source": "package/dist/pptxgen.es.js",
|
|
10
|
+
"bytes": 516931,
|
|
11
|
+
"sha256": "05844c5625e2cda3b449eb967c2246dd57ca57341886a7c28eeebca263b29bd4"
|
|
12
|
+
},
|
|
13
|
+
"LICENSE": {
|
|
14
|
+
"source": "package/LICENSE",
|
|
15
|
+
"bytes": 1081,
|
|
16
|
+
"sha256": "7a2bfe96150786ed1908b8e63f98ebab88875c1e79e28faff6649e0f11f77e52"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|