@openpresentation/opf 0.26.2 → 0.26.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/browser.js +13 -13
- package/dist/{chunk-XFK4KPKK.js → chunk-2ZQBMZTZ.js} +2 -2
- package/dist/{chunk-5VJCLUUA.js → chunk-34LIUOT7.js} +6 -6
- package/dist/{chunk-L65YNP4J.js → chunk-54OV2WQC.js} +1 -1
- package/dist/{chunk-CRCOQ4K2.js → chunk-7RY7QWWJ.js} +1 -1
- package/dist/{chunk-6JAFSZVL.js → chunk-DEI2M2H6.js} +1 -1
- package/dist/{chunk-JI3PHXPJ.js → chunk-EQ6S5SEZ.js} +1 -1
- package/dist/{chunk-N6CNJCIF.js → chunk-F4HFDP6I.js} +0 -18
- package/dist/{chunk-NWO6HT4F.js → chunk-FXNUM2PN.js} +4 -4
- package/dist/{chunk-OFWBICDO.js → chunk-GLLR3AQ5.js} +1 -1
- package/dist/{chunk-LUQYSUXS.js → chunk-NJWI6MPT.js} +42 -4
- package/dist/{chunk-7YZ72FRP.js → chunk-PB5X2VSV.js} +5 -5
- package/dist/{chunk-O2ST5ZKL.js → chunk-PXOXTJTN.js} +1 -1
- package/dist/{chunk-Q6KMKTEH.js → chunk-WASENX2R.js} +4 -4
- package/dist/{chunk-LN2ASLMF.js → chunk-YVNFACTC.js} +1 -1
- package/dist/{conversion-CX_I6Vna.d.ts → conversion-BjsKgxBZ.d.ts} +2 -2
- package/dist/conversion-F4UCOGR7.js +18 -0
- package/dist/convert.js +6 -6
- package/dist/deck.js +9 -9
- package/dist/diff.js +3 -3
- package/dist/docs.js +1 -1
- package/dist/format.js +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +17 -17
- package/dist/markdown.js +6 -6
- package/dist/node-engine.d.ts +2 -2
- package/dist/node-engine.js +17 -17
- package/dist/pagination.js +3 -3
- package/dist/patch.js +2 -2
- package/dist/schema.d.ts +18 -4
- package/dist/schema.js +2 -2
- package/dist/schemas.js +1 -1
- package/dist/source.js +3 -3
- package/dist/spec/schemas/opf.schema.json +0 -16
- package/dist/spec/schemas/theme.schema.json +0 -2
- package/dist/validator.js +2 -2
- package/dist/yaml.js +6 -6
- package/package.json +5 -5
- package/dist/conversion-BKCKBECG.js +0 -18
package/README.md
CHANGED
|
@@ -99,7 +99,7 @@ The layout engine's names are not on the root. `composeSlide`, `fitText`, `layou
|
|
|
99
99
|
|
|
100
100
|
### Source editing: schema field queries, text addressing and syntax recovery
|
|
101
101
|
|
|
102
|
-
Two browser-safe subpaths for source editors, the CLI and agents. `@openpresentation/opf/schema` reads the field model of a document from the JSON Schemas: `describeField(path, document?)` returns the types, description, enum values, default, examples, whether the parent requires it, the `oneOf` variants (and `primary`, the form a template should use), the ranked `children` of an object (required first, then the curated `COMMON_KEYS` order, then alphabetical; promoted regions, `extensions` and `$schema` are `advanced`), the item schema of an array (`itemInfo`) or map (`entryInfo`), `requiredChildren` and `freeText`, and `{ known: false }` for a path the schema does not describe; `catalogKindAt(path, document?)` names the catalog a reference field points into (`layouts`, `themes`, `colorSchemes`, `fontSchemes`, `narratives`, `audiences`, `purposes`, `tones`) from
|
|
102
|
+
Two browser-safe subpaths for source editors, the CLI and agents. `@openpresentation/opf/schema` reads the field model of a document from the JSON Schemas: `describeField(path, document?)` returns the types, description, enum values, default, examples, whether the parent requires it, the `oneOf` variants (and `primary`, the form a template should use), the ranked `children` of an object (required first, then the curated `COMMON_KEYS` order, then alphabetical; promoted regions, `extensions` and `$schema` are `advanced`), the item schema of an array (`itemInfo`) or map (`entryInfo`), `requiredChildren` and `freeText`, and `{ known: false }` for a path the schema does not describe; `catalogKindAt(path, document?)` names the catalog a reference field points into (`layouts`, `themes`, `colorSchemes`, `fontSchemes`, `narratives`, `audiences`, `purposes`, `tones`) from `schemaCatalogKinds` (also exported), core-side metadata keyed by schema name and JSON Pointer; the published schemas carry no vendor keyword and compile under strict Ajv, so a new reference field is one entry there and needs no editor change. The navigation helpers it is built on are exported too (`resolveSchema`, `schemaVariants`, `activeSchema`, `schemaAtPath`, `createSchemaValue`, `listSchemaFields`, `splitOpfPath`). `@openpresentation/opf/source` turns text into positions and back: `locate(text, "json", pointer, { part })` is the range of a JSON Pointer (`value`, `key`, `entry`, `open` or `colon`; the nearest ancestor with `exact: false` when the node is missing), `pathAt(text, "json", offset)` the path under a caret, and `analyzeJsonSyntax(text, { limit })` the root cause of each JSON syntax error, once, in position order (at most five), with a range, a message, a hint and the fixes that repair it (`Insert comma`, `Add { }`, `Remove "design"`, `Insert }`, `Use double quotes`, ...); `validate(text)` reports the same causes as `opf/json-syntax` findings. YAML and Markdown addressing is not there yet and returns `undefined`. See [validate](../../docs/validate.md).
|
|
103
103
|
|
|
104
104
|
### Validate (0.14.0)
|
|
105
105
|
|
package/dist/browser.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { OPFApiError } from './chunk-
|
|
2
|
-
export { OPFApiError, OPFExportError, OPFImportError, OPFMoveToCustomError, copySlides, edit, embed, fill, fillRecords, localAssetSources, moveToCustom, parseSlideSelection, sameRecord, stats, updateFromCatalog } from './chunk-
|
|
1
|
+
import { OPFApiError } from './chunk-GLLR3AQ5.js';
|
|
2
|
+
export { OPFApiError, OPFExportError, OPFImportError, OPFMoveToCustomError, copySlides, edit, embed, fill, fillRecords, localAssetSources, moveToCustom, parseSlideSelection, sameRecord, stats, updateFromCatalog } from './chunk-GLLR3AQ5.js';
|
|
3
3
|
export { specFileEntries, specFileKinds, specFilePaths } from './chunk-UJSAR6GF.js';
|
|
4
4
|
export { FONT_POLICY, applyFontPolicyDecisions, fontAvailabilityDiagnostics, fontPolicyFor } from './chunk-PJSPHHRK.js';
|
|
5
5
|
export { OPFDataImportError, ingest, parseTabularData } from './chunk-TKQ2VFV5.js';
|
|
6
|
-
export { OPFPaginationError, paginate, paginateSlide } from './chunk-
|
|
7
|
-
export { DECK_FORMATS, deckFormatOf, parse, stringify } from './chunk-
|
|
8
|
-
export { fromMarkdown, toMarkdown } from './chunk-
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
11
|
-
export { OPFMarkdownError } from './chunk-
|
|
12
|
-
import './chunk-
|
|
13
|
-
export { diff, merge } from './chunk-
|
|
14
|
-
export { CATALOG_SCHEMA, DEFAULT_VALIDATION_THRESHOLDS, OPFPatchError, OPFPatchValidationError, OPFValidationError, applyPatch, assertValid, assertValidCatalogRecord, catalogDisplayKinds, catalogSchemaNames, findValidationRule, resolveSlideContext, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-
|
|
6
|
+
export { OPFPaginationError, paginate, paginateSlide } from './chunk-54OV2WQC.js';
|
|
7
|
+
export { DECK_FORMATS, deckFormatOf, parse, stringify } from './chunk-FXNUM2PN.js';
|
|
8
|
+
export { fromMarkdown, toMarkdown } from './chunk-WASENX2R.js';
|
|
9
|
+
import './chunk-7RY7QWWJ.js';
|
|
10
|
+
import './chunk-PB5X2VSV.js';
|
|
11
|
+
export { OPFMarkdownError } from './chunk-DEI2M2H6.js';
|
|
12
|
+
import './chunk-PXOXTJTN.js';
|
|
13
|
+
export { diff, merge } from './chunk-YVNFACTC.js';
|
|
14
|
+
export { CATALOG_SCHEMA, DEFAULT_VALIDATION_THRESHOLDS, OPFPatchError, OPFPatchValidationError, OPFValidationError, applyPatch, assertValid, assertValidCatalogRecord, catalogDisplayKinds, catalogSchemaNames, findValidationRule, resolveSlideContext, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-NJWI6MPT.js';
|
|
15
15
|
export { CATALOG_GROUP_PATTERN, CATALOG_REFERENCE_PATTERN, CHART_TYPES, DEFAULT_VARIABLE_DATE_FORMAT, ENGINE_DEFAULT_CHART_TYPES, ENGINE_DEFAULT_COLOR_SCHEME, ENGINE_DEFAULT_FONT_SCHEME, ENGINE_DEFAULT_THEME, LANGUAGES, LOGO_SHAPES, OPFCatalogsOptionError, OPFUnresolvedReferenceError, OPFVariableError, SLIDE_SCOPED_BUILTINS, SOCIAL_PLATFORMS, VARIABLE_KINDS, catalogGroupSource, catalogKinds, catalogRecords, catalogReferenceSites, chartNumber, coerceVariableValue, datasetDiagnostics, formatDataNumber, formatVariableNumber, fromExcelNumberFormat, hasContentVariables, inlineChartData, inlineDatasets, inlineTableData, isDatasetRef, isTemplate, isXYChartType, listBuiltinVariables, listVariables, normalizeLanguageFamily, numberFormatError, parseReference, resolveChartData, resolveDesignRecords, resolveFontScheme, resolveReference, resolveSlideVariables, resolveTableData, resolveVariables, suggestChartNumberFix, tableCellDisplayValue, toExcelNumberFormat, unresolvedReference, unusedDatasets, variableDeclarations } from './chunk-XRMV2GMB.js';
|
|
16
|
-
export { OPFFormatError, format } from './chunk-
|
|
17
|
-
export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-
|
|
16
|
+
export { OPFFormatError, format } from './chunk-EQ6S5SEZ.js';
|
|
17
|
+
export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-F4HFDP6I.js';
|
|
18
18
|
|
|
19
19
|
// src/browser.ts
|
|
20
20
|
var nodeOnly = (name, message) => new OPFApiError(`\`${name}\` ${message}`, "node-only", { details: { function: name, build: "browser" } });
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { OPFApiError } from './chunk-
|
|
2
|
-
import { CATALOG_SCHEMA } from './chunk-
|
|
1
|
+
import { OPFApiError } from './chunk-GLLR3AQ5.js';
|
|
2
|
+
import { CATALOG_SCHEMA } from './chunk-NJWI6MPT.js';
|
|
3
3
|
import { CATALOG_SCHEMA as CATALOG_SCHEMA$1, gallery } from '@openpresentation/gallery';
|
|
4
4
|
|
|
5
5
|
function galleryMismatch(declared, reads = CATALOG_SCHEMA) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { defaultCatalogs } from './chunk-
|
|
2
|
-
import { localAssetSources, OPFApiError, parseSlideSelection, OPFExportError, asApiError, OPFImportError } from './chunk-
|
|
3
|
-
import { paginate } from './chunk-
|
|
4
|
-
import { deckFormatOf, readDeckReport, stringify } from './chunk-
|
|
5
|
-
import { validate, OPFValidationError } from './chunk-
|
|
1
|
+
import { defaultCatalogs } from './chunk-2ZQBMZTZ.js';
|
|
2
|
+
import { localAssetSources, OPFApiError, parseSlideSelection, OPFExportError, asApiError, OPFImportError } from './chunk-GLLR3AQ5.js';
|
|
3
|
+
import { paginate } from './chunk-54OV2WQC.js';
|
|
4
|
+
import { deckFormatOf, readDeckReport, stringify } from './chunk-FXNUM2PN.js';
|
|
5
|
+
import { validate, OPFValidationError } from './chunk-NJWI6MPT.js';
|
|
6
6
|
import { link, stat, readdir, lstat, readFile, open, unlink, mkdir, rename } from 'fs/promises';
|
|
7
7
|
import path6 from 'path';
|
|
8
8
|
import { readFileSync, statSync, realpathSync } from 'fs';
|
|
@@ -117,7 +117,7 @@ function localAssetProblems(deck, root) {
|
|
|
117
117
|
}
|
|
118
118
|
var RENDER_PACKAGE = "@openpresentation/opf-render";
|
|
119
119
|
var PPTX_PACKAGE = "@openpresentation/opf-pptx";
|
|
120
|
-
var PEER_RANGES = { [RENDER_PACKAGE]: "^0.26.
|
|
120
|
+
var PEER_RANGES = { [RENDER_PACKAGE]: "^0.26.3", [PPTX_PACKAGE]: "^0.26.3" };
|
|
121
121
|
var PPTX_TEXT_OPTIONS_FROM = "0.22.0";
|
|
122
122
|
var numbers = (version) => version.replace(/[-+].*$/, "").split(".").map((part) => Number.parseInt(part, 10) || 0);
|
|
123
123
|
function atLeast(version, minimum) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assertValid, resolveSlideScriptMeasurement, resolveSlideContext } from './chunk-
|
|
1
|
+
import { assertValid, resolveSlideScriptMeasurement, resolveSlideContext } from './chunk-NJWI6MPT.js';
|
|
2
2
|
import { resolveSlideVariables, checkCatalogsOption, usesSlideBuiltin, composeSlide, codeHighlightSlice, tableRowBoundaries, visitContentPayloads, regionAccepts, slideTokenSpans, sliceNumberedItems } from './chunk-XRMV2GMB.js';
|
|
3
3
|
|
|
4
4
|
// src/pagination.ts
|
|
@@ -92,7 +92,6 @@ var presentation = {
|
|
|
92
92
|
]
|
|
93
93
|
},
|
|
94
94
|
"audience": {
|
|
95
|
-
"x-opf-catalog": "audiences",
|
|
96
95
|
"oneOf": [
|
|
97
96
|
{
|
|
98
97
|
"type": "string"
|
|
@@ -103,7 +102,6 @@ var presentation = {
|
|
|
103
102
|
{
|
|
104
103
|
"type": "array",
|
|
105
104
|
"items": {
|
|
106
|
-
"x-opf-catalog": "audiences",
|
|
107
105
|
"oneOf": [
|
|
108
106
|
{
|
|
109
107
|
"type": "string"
|
|
@@ -150,7 +148,6 @@ var presentation = {
|
|
|
150
148
|
]
|
|
151
149
|
},
|
|
152
150
|
"purpose": {
|
|
153
|
-
"x-opf-catalog": "purposes",
|
|
154
151
|
"oneOf": [
|
|
155
152
|
{
|
|
156
153
|
"type": "string"
|
|
@@ -205,7 +202,6 @@ var presentation = {
|
|
|
205
202
|
]
|
|
206
203
|
},
|
|
207
204
|
"tone": {
|
|
208
|
-
"x-opf-catalog": "tones",
|
|
209
205
|
"oneOf": [
|
|
210
206
|
{
|
|
211
207
|
"$ref": "#/$defs/CatalogReference"
|
|
@@ -298,7 +294,6 @@ var presentation = {
|
|
|
298
294
|
"default": false
|
|
299
295
|
},
|
|
300
296
|
"narrative": {
|
|
301
|
-
"x-opf-catalog": "narratives",
|
|
302
297
|
"$ref": "#/$defs/CatalogReference",
|
|
303
298
|
"description": "The deck's narrative plan, by reference: a bare narratives id ('classic-story') or 'name:id' for a record of a named catalogs group ('acme:founder-pitch'). The deck holds only this pointer; the plan (the arc, its beats and what each beat must do) lives in the record, which has the fields of https://openpresentation.org/schema/opf-narrative/v1. A narrative the document defines itself is a record in catalogs.custom.narratives, referenced here by its key.\n\nSlides link themselves to beats with slides[].beat. Core validate warns about a slides[].beat id the resolved narrative does not define and about a root 'duration' outside its 'duration' range, and reports a beat that no slide references. The preview and the PPTX export draw nothing from the narrative; opf-pptx stores the reference for round-trip.\n\nThe reference resolves like every content reference (see catalogs); one that resolves nowhere is the warning opf/unresolved-reference, never an error.\n\nDeck-level concerns that are not part of the storyline (audience, tone, takeaway, duration) live as siblings on the presentation root.",
|
|
304
299
|
"examples": [
|
|
@@ -447,7 +442,6 @@ var presentation = {
|
|
|
447
442
|
],
|
|
448
443
|
"properties": {
|
|
449
444
|
"id": {
|
|
450
|
-
"x-opf-catalog": "audiences",
|
|
451
445
|
"$ref": "#/$defs/CatalogReference",
|
|
452
446
|
"description": "Optional audiences reference (a bare id or 'name:id') resolved before applying the inline overrides.",
|
|
453
447
|
"examples": [
|
|
@@ -544,7 +538,6 @@ var presentation = {
|
|
|
544
538
|
],
|
|
545
539
|
"properties": {
|
|
546
540
|
"id": {
|
|
547
|
-
"x-opf-catalog": "purposes",
|
|
548
541
|
"$ref": "#/$defs/CatalogReference",
|
|
549
542
|
"description": "Optional purposes reference (a bare id or 'name:id') resolved before applying the inline overrides.",
|
|
550
543
|
"examples": [
|
|
@@ -681,12 +674,10 @@ var presentation = {
|
|
|
681
674
|
]
|
|
682
675
|
},
|
|
683
676
|
"fontScheme": {
|
|
684
|
-
"x-opf-catalog": "fontSchemes",
|
|
685
677
|
"$ref": "#/$defs/CatalogReference",
|
|
686
678
|
"description": "Font-scheme reference (a bare id or 'name:id') for this language's script slot when targeting PowerPoint output. Its major/minor families fill the language's script slot (eastAsian or complexScript, chosen by 'script') unless the effective design font scheme sets that slot itself; the latin slot always follows the design font scheme. Without it, engines use the default script fonts of their language vocabulary."
|
|
687
679
|
},
|
|
688
680
|
"googleFontScheme": {
|
|
689
|
-
"x-opf-catalog": "fontSchemes",
|
|
690
681
|
"$ref": "#/$defs/CatalogReference",
|
|
691
682
|
"description": "Font-scheme reference (a bare id or 'name:id') used in place of 'fontScheme' when resolving script fonts for Google Slides output."
|
|
692
683
|
},
|
|
@@ -724,7 +715,6 @@ var presentation = {
|
|
|
724
715
|
],
|
|
725
716
|
"properties": {
|
|
726
717
|
"id": {
|
|
727
|
-
"x-opf-catalog": "tones",
|
|
728
718
|
"$ref": "#/$defs/CatalogReference",
|
|
729
719
|
"description": "Optional tones reference (a bare id or 'name:id') resolved before applying the inline overrides.",
|
|
730
720
|
"examples": [
|
|
@@ -1024,7 +1014,6 @@ var presentation = {
|
|
|
1024
1014
|
"description": "Visual design system applied to the presentation; individual slides may override fields via Slide.design.",
|
|
1025
1015
|
"properties": {
|
|
1026
1016
|
"theme": {
|
|
1027
|
-
"x-opf-catalog": "themes",
|
|
1028
1017
|
"$ref": "#/$defs/CatalogReference",
|
|
1029
1018
|
"description": "Theme for the deck: a themes reference, a bare id ('minimal') or 'name:id' ('acme:brand'). The theme supplies the default colour scheme, font scheme, background and dimensions; design.colorScheme, design.fontScheme, design.background and design.dimensions override it field by field. A reference that resolves nowhere is the warning opf/unresolved-reference and engines use the engine default theme.",
|
|
1030
1019
|
"examples": [
|
|
@@ -1035,7 +1024,6 @@ var presentation = {
|
|
|
1035
1024
|
]
|
|
1036
1025
|
},
|
|
1037
1026
|
"colorScheme": {
|
|
1038
|
-
"x-opf-catalog": "colorSchemes",
|
|
1039
1027
|
"oneOf": [
|
|
1040
1028
|
{
|
|
1041
1029
|
"type": "string"
|
|
@@ -1056,7 +1044,6 @@ var presentation = {
|
|
|
1056
1044
|
]
|
|
1057
1045
|
},
|
|
1058
1046
|
"fontScheme": {
|
|
1059
|
-
"x-opf-catalog": "fontSchemes",
|
|
1060
1047
|
"oneOf": [
|
|
1061
1048
|
{
|
|
1062
1049
|
"type": "string"
|
|
@@ -1300,7 +1287,6 @@ var presentation = {
|
|
|
1300
1287
|
"description": "Color palette used by the design system. Every slot and role is a hex color ('#RGB', '#RRGGBB' or '#RRGGBBAA'); a color-scheme name or a 'var:<id>' reference is not valid here, because those resolve through the scheme. The slot fields (accent1-accent6, dark1, dark2, light1, light2, hyperlink, followedHyperlink) mirror color-scheme.schema.json (https://openpresentation.org/schema/opf-color-scheme/v1) so library records and inline OPF overrides are interchangeable on those fields.\n\nTwo parallel models are supported and may be mixed:\n- OOXML slots - the 12-slot PowerPoint theme model that round-trips directly to OOXML. Use these for full control over the palette as PowerPoint sees it.\n- Abstract roles (primary, secondary, accent, background, surface, text, textSecondary) - OPF-specific semantic aliases the engine maps onto the OOXML slots. Convenient for inline overrides without thinking in slot numbers; not part of the catalog record schema.\n\nIn design.colorScheme, 'id' resolves a colorSchemes record as the base; slot and role overrides on the same object take precedence over the resolved scheme. The string form of design.colorScheme is equivalent to setting only 'id'.",
|
|
1301
1288
|
"properties": {
|
|
1302
1289
|
"id": {
|
|
1303
|
-
"x-opf-catalog": "colorSchemes",
|
|
1304
1290
|
"$ref": "#/$defs/CatalogReference",
|
|
1305
1291
|
"description": "Colour-scheme reference (a bare id or 'name:id') resolved as the base; slot and role overrides on the surrounding ColorScheme object take precedence over the resolved scheme.",
|
|
1306
1292
|
"examples": [
|
|
@@ -1474,7 +1460,6 @@ var presentation = {
|
|
|
1474
1460
|
"description": "Typography selections used by the design system. The pair fields (major, minor) and refinement fields (type, app, languageFamily) mirror font-scheme.schema.json (https://openpresentation.org/schema/opf-font-scheme/v1) so library records and inline OPF overrides are interchangeable on those fields.\n\nTwo parallel models are supported and may be mixed:\n- OOXML pairs (major, minor) - heading and body family names that round-trip directly to PowerPoint majorFont/minorFont entries.\n- Abstract roles (heading, body, accent, code) - OPF-specific font family names the engine maps onto the OOXML pair when serializing. Convenient for inline overrides and for adding accent/code roles that don't have a direct OOXML slot. Catalog records may also carry 'code' (for example the consolas and courier-new records); heading, body and accent are not part of the catalog record schema. A role is a family name only: weight, style and tracking come from the text styles, and PowerPoint has no numeric weight.\n\nIn design.fontScheme, 'id' resolves a fontSchemes record as the base; pair and role overrides on the same object take precedence over the resolved scheme. The string form of design.fontScheme is equivalent to setting only 'id'.",
|
|
1475
1461
|
"properties": {
|
|
1476
1462
|
"id": {
|
|
1477
|
-
"x-opf-catalog": "fontSchemes",
|
|
1478
1463
|
"$ref": "#/$defs/CatalogReference",
|
|
1479
1464
|
"description": "Font-scheme reference (a bare id or 'name:id') resolved as the base; field overrides on the surrounding FontScheme object take precedence over the resolved scheme.",
|
|
1480
1465
|
"examples": [
|
|
@@ -2870,7 +2855,6 @@ var presentation = {
|
|
|
2870
2855
|
"description": "Optional reference to one or more beats of the deck's narrative (each value is the id of a beat in the narrative record that the root 'narrative' resolves to). A single string declares the slide's primary beat; an array declares that one slide covers multiple beats. Declares the slide's role in the story arc; does not constrain ordering or structure. Core validate warns about a beat id the resolved narrative does not define, and reports a beat that no slide references. Slides without a beat are valid; multiple slides may share a beat."
|
|
2871
2856
|
},
|
|
2872
2857
|
"layout": {
|
|
2873
|
-
"x-opf-catalog": "layouts",
|
|
2874
2858
|
"$ref": "#/$defs/CatalogReference",
|
|
2875
2859
|
"description": "Optional layout: a layouts reference, a bare id ('pillars') or 'name:id' ('acme:hero'), or 'auto'. When omitted or 'auto', the slide is composed with no layout record: engines arrange title, subtitle, tag and content automatically, a slide with no body payload is a cover (vertically centered), and design hints apply; there is no finding. 'auto' is reserved, so no catalog may define a layout of that id, and opf format drops it. A layout is a grid template (layout.schema.json): the slide's content stays flat and binds to the layout's regions by reading order, role and kind, a block may pin itself to a region with 'region', and an empty region collapses. A reference that resolves nowhere is the warning opf/unresolved-reference (and the 'unresolved-reference' diagnostic of resolveSlideContext), the slide composes automatically, and a strict export fails. A layout id of the 0.18 default catalog that 0.19 no longer has is such a reference: 0.19 has no migration path for layouts. A layout never changes what a slide contains, and engines never substitute a different layout.",
|
|
2876
2860
|
"examples": [
|
|
@@ -6466,7 +6450,6 @@ var theme = {
|
|
|
6466
6450
|
]
|
|
6467
6451
|
},
|
|
6468
6452
|
"colorScheme": {
|
|
6469
|
-
"x-opf-catalog": "colorSchemes",
|
|
6470
6453
|
"type": "string",
|
|
6471
6454
|
"pattern": "^(?:[a-z][a-z0-9-]*:)?[a-z][a-z0-9-]*$",
|
|
6472
6455
|
"description": "The theme's default colour scheme: a reference (a bare id or 'name:id') resolved like design.colorScheme, but in the theme's own catalogs group first.",
|
|
@@ -6477,7 +6460,6 @@ var theme = {
|
|
|
6477
6460
|
]
|
|
6478
6461
|
},
|
|
6479
6462
|
"fontScheme": {
|
|
6480
|
-
"x-opf-catalog": "fontSchemes",
|
|
6481
6463
|
"type": "string",
|
|
6482
6464
|
"pattern": "^(?:[a-z][a-z0-9-]*:)?[a-z][a-z0-9-]*$",
|
|
6483
6465
|
"description": "The theme's default font scheme: a reference (a bare id or 'name:id') resolved like design.fontScheme, but in the theme's own catalogs group first.",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { fromMarkdown, toMarkdown } from './chunk-
|
|
2
|
-
import { fromYaml, toYaml } from './chunk-
|
|
3
|
-
import { NOT_CHECKED } from './chunk-
|
|
4
|
-
import { parseSource, validate, OPFValidationError } from './chunk-
|
|
1
|
+
import { fromMarkdown, toMarkdown } from './chunk-WASENX2R.js';
|
|
2
|
+
import { fromYaml, toYaml } from './chunk-PB5X2VSV.js';
|
|
3
|
+
import { NOT_CHECKED } from './chunk-DEI2M2H6.js';
|
|
4
|
+
import { parseSource, validate, OPFValidationError } from './chunk-NJWI6MPT.js';
|
|
5
5
|
import { checkCatalogsOption } from './chunk-XRMV2GMB.js';
|
|
6
6
|
|
|
7
7
|
// src/deck-report.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OPFDataImportError, parseTabularData } from './chunk-TKQ2VFV5.js';
|
|
2
|
-
import { applyPatchWithInverse, validate, OPFValidationError } from './chunk-
|
|
2
|
+
import { applyPatchWithInverse, validate, OPFValidationError } from './chunk-NJWI6MPT.js';
|
|
3
3
|
import { embeddedCopy, checkCatalogsOption, catalogReferenceSites, parseReference, catalogGroupDeclared, resolveReference, dottedPath, unresolvedReference, recordReferenceSites, catalogGroupSource, registeredCatalog, catalogKinds, CATALOG_GROUP_PATTERN, isRecord, visitContentPayloads, annotationText, listVariables, resolveVariables, LOGO_SHAPES, resolveDesignRecords, resolveFontFamilies, resolveCanvasDimensions, imageBackground } from './chunk-XRMV2GMB.js';
|
|
4
4
|
|
|
5
5
|
// src/api-errors.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { promotedRegionKeys, VARIABLE_KINDS, resolveChartData, chartPaletteForFill, chartSeriesPalette, normalizeHexColor, resolveChartColors, colorContrast, imageBackground, tableGrid, timelineTextColor, LOGO_SHAPES, visitContentPayloads, readingRows, visualReadingOrder, intrinsicImageSize, resolveReference, textWidthMeasurer, resolveColorRef, resolveDesignRecords, resolveFontFamilies, checkCatalogsOption, provenanceOf, unresolvedReference, OPFUnresolvedReferenceError, resolveColorRoles, resolveCanvasDimensions, resolveSlideVariables, normalizeColorVariant, isRecord, hasContentVariables, isTemplate, instantiateForValidation, layoutTemplateIssues, resolveScriptFonts, defaultSlideBackground, catalogReferenceSites, parseReference, catalogGroupDeclared, pointerPath, unusedDatasets, MAX_COMPOSITION_DEPTH, datasetDiagnostics, pathFor, catalogRecords, collectCitations, numberingFindings, walkCitationRuns, resolveTableData, resolveChartOptions, chartOptionTarget, codeHighlightLines, chartNumberFixesByCell, catalogKinds, catalogGroupSource, registeredCatalog, OPFCompositionError, composeSlide } from './chunk-XRMV2GMB.js';
|
|
2
|
-
import { schemas, schemaEntries } from './chunk-
|
|
2
|
+
import { schemas, schemaEntries } from './chunk-F4HFDP6I.js';
|
|
3
3
|
import Ajv2020 from 'ajv/dist/2020.js';
|
|
4
4
|
import addFormats from 'ajv-formats';
|
|
5
5
|
import { parseTree, printParseErrorCode, getNodePath } from 'jsonc-parser';
|
|
@@ -3755,10 +3755,35 @@ function invertPatch(document, patch) {
|
|
|
3755
3755
|
return applyPatchWithInverse(document, patch).inverse;
|
|
3756
3756
|
}
|
|
3757
3757
|
|
|
3758
|
+
// src/schema-catalog-kinds.ts
|
|
3759
|
+
var schemaCatalogKinds = {
|
|
3760
|
+
"presentation#/properties/audience": "audiences",
|
|
3761
|
+
"presentation#/properties/audience/oneOf/2/items": "audiences",
|
|
3762
|
+
"presentation#/properties/purpose": "purposes",
|
|
3763
|
+
"presentation#/properties/tone": "tones",
|
|
3764
|
+
"presentation#/properties/narrative": "narratives",
|
|
3765
|
+
"presentation#/$defs/Audience/properties/id": "audiences",
|
|
3766
|
+
"presentation#/$defs/Purpose/properties/id": "purposes",
|
|
3767
|
+
"presentation#/$defs/Language/properties/fontScheme": "fontSchemes",
|
|
3768
|
+
"presentation#/$defs/Language/properties/googleFontScheme": "fontSchemes",
|
|
3769
|
+
"presentation#/$defs/Tone/properties/id": "tones",
|
|
3770
|
+
"presentation#/$defs/Design/properties/theme": "themes",
|
|
3771
|
+
"presentation#/$defs/Design/properties/colorScheme": "colorSchemes",
|
|
3772
|
+
"presentation#/$defs/Design/properties/fontScheme": "fontSchemes",
|
|
3773
|
+
"presentation#/$defs/ColorScheme/properties/id": "colorSchemes",
|
|
3774
|
+
"presentation#/$defs/FontScheme/properties/id": "fontSchemes",
|
|
3775
|
+
"presentation#/$defs/Slide/properties/layout": "layouts",
|
|
3776
|
+
"theme#/properties/colorScheme": "colorSchemes",
|
|
3777
|
+
"theme#/properties/fontScheme": "fontSchemes"
|
|
3778
|
+
};
|
|
3779
|
+
|
|
3758
3780
|
// src/schema-navigation.ts
|
|
3759
3781
|
var own3 = (object2, key2) => object2 !== null && typeof object2 === "object" && Object.hasOwn(object2, key2);
|
|
3760
3782
|
var documents = new Map(Object.values(schemas).map((schema) => [schema.$id, schema]));
|
|
3761
3783
|
var presentationSchema = schemas.presentation;
|
|
3784
|
+
var CATALOG_KIND = /* @__PURE__ */ Symbol.for("@openpresentation/opf:catalog-kind");
|
|
3785
|
+
var catalogKindOfNode = /* @__PURE__ */ new WeakMap();
|
|
3786
|
+
var kindOfNode = (node) => catalogKindOfNode.get(node) ?? node[CATALOG_KIND];
|
|
3762
3787
|
function splitOpfPath(path) {
|
|
3763
3788
|
if (Array.isArray(path)) return path.map((segment) => String(segment));
|
|
3764
3789
|
if (typeof path !== "string") throw new TypeError("An OPF path must be a string or an array of segments.");
|
|
@@ -3774,10 +3799,18 @@ function readSchemaPointer(target, pointer4) {
|
|
|
3774
3799
|
}
|
|
3775
3800
|
return current;
|
|
3776
3801
|
}
|
|
3802
|
+
for (const [key2, kind] of Object.entries(schemaCatalogKinds)) {
|
|
3803
|
+
const [name = "", pointer4 = ""] = key2.split("#");
|
|
3804
|
+
const node = readSchemaPointer(schemas[name], pointer4);
|
|
3805
|
+
if (node === void 0 || node === null || typeof node !== "object") throw new Error(`schemaCatalogKinds: ${key2} is not a schema node.`);
|
|
3806
|
+
catalogKindOfNode.set(node, kind);
|
|
3807
|
+
}
|
|
3777
3808
|
function absolutize(schema, id) {
|
|
3778
3809
|
if (Array.isArray(schema)) return schema.map((item) => absolutize(item, id));
|
|
3779
3810
|
if (schema === null || typeof schema !== "object") return schema;
|
|
3780
3811
|
const copy = {};
|
|
3812
|
+
const kind = kindOfNode(schema);
|
|
3813
|
+
if (kind !== void 0) copy[CATALOG_KIND] = kind;
|
|
3781
3814
|
for (const [key2, value] of Object.entries(schema)) copy[key2] = key2 === "$ref" && typeof value === "string" && value.startsWith("#") ? `${id}${value}` : absolutize(value, id);
|
|
3782
3815
|
return copy;
|
|
3783
3816
|
}
|
|
@@ -3797,6 +3830,11 @@ function mergeAllOf(schema, root, seen) {
|
|
|
3797
3830
|
return merged;
|
|
3798
3831
|
}
|
|
3799
3832
|
function resolveSchema(schema, root = presentationSchema, seen = /* @__PURE__ */ new Set()) {
|
|
3833
|
+
const resolved = resolveNode(schema, root, seen);
|
|
3834
|
+
const kind = schema && typeof schema === "object" ? kindOfNode(schema) : void 0;
|
|
3835
|
+
return kind === void 0 ? resolved : { ...resolved, [CATALOG_KIND]: kind };
|
|
3836
|
+
}
|
|
3837
|
+
function resolveNode(schema, root, seen) {
|
|
3800
3838
|
if (!schema || typeof schema !== "object") return {};
|
|
3801
3839
|
if (!schema.$ref) return mergeAllOf(schema, root, seen);
|
|
3802
3840
|
const ref = schema.$ref;
|
|
@@ -3998,8 +4036,8 @@ function enumValues(variants, inherited) {
|
|
|
3998
4036
|
}
|
|
3999
4037
|
function catalogKindOf(schema, variants = []) {
|
|
4000
4038
|
for (const candidate of [schema, ...variants]) {
|
|
4001
|
-
const kind = candidate
|
|
4002
|
-
if (
|
|
4039
|
+
const kind = kindOfNode(candidate);
|
|
4040
|
+
if (kind !== void 0 && own3(catalogSchemaNames, kind)) return kind;
|
|
4003
4041
|
}
|
|
4004
4042
|
return void 0;
|
|
4005
4043
|
}
|
|
@@ -5767,4 +5805,4 @@ function assertValidCatalogRecord(kind, value) {
|
|
|
5767
5805
|
if (!report2.valid) throw new OPFValidationError(report2);
|
|
5768
5806
|
}
|
|
5769
5807
|
|
|
5770
|
-
export { CATALOG_SCHEMA, COMMON_KEYS, DEFAULT_VALIDATION_THRESHOLDS, OPFPatchError, OPFPatchValidationError, OPFValidationError, UNRANKED_PRIORITY, activeSchema, analyzeJsonSyntax, applyPatch, applyPatchWithInverse, applyTextEdits, assertValid, assertValidCatalogRecord, catalogDisplayKinds, catalogKindAt, catalogSchemaNames, createLocator, createSchemaValue, describeField, escapePointerToken, findValidationRule, formatPointer, getAtPointer, hasPointer, invertPatch, isPromotedRegionKey, jsonEqual, listSchemaFields, normalizePatch, parsePointer, parseSource, pointerFromPath, readPointer, resolveSchema, resolveSlideContext, resolveSlideScriptMeasurement, schemaAtPath, schemaLabel, schemaType, schemaVariants, splitOpfPath, splitPointer2 as splitPointer, unescapePointerToken, validate, validateCatalogRecord, validationCategories, validationRules };
|
|
5808
|
+
export { CATALOG_SCHEMA, COMMON_KEYS, DEFAULT_VALIDATION_THRESHOLDS, OPFPatchError, OPFPatchValidationError, OPFValidationError, UNRANKED_PRIORITY, activeSchema, analyzeJsonSyntax, applyPatch, applyPatchWithInverse, applyTextEdits, assertValid, assertValidCatalogRecord, catalogDisplayKinds, catalogKindAt, catalogSchemaNames, createLocator, createSchemaValue, describeField, escapePointerToken, findValidationRule, formatPointer, getAtPointer, hasPointer, invertPatch, isPromotedRegionKey, jsonEqual, listSchemaFields, normalizePatch, parsePointer, parseSource, pointerFromPath, readPointer, resolveSchema, resolveSlideContext, resolveSlideScriptMeasurement, schemaAtPath, schemaCatalogKinds, schemaLabel, schemaType, schemaVariants, splitOpfPath, splitPointer2 as splitPointer, unescapePointerToken, validate, validateCatalogRecord, validationCategories, validationRules };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { NOT_CHECKED, Ctx } from './chunk-
|
|
2
|
-
import { same } from './chunk-
|
|
3
|
-
import { validate } from './chunk-
|
|
1
|
+
import { NOT_CHECKED, Ctx } from './chunk-DEI2M2H6.js';
|
|
2
|
+
import { same } from './chunk-PXOXTJTN.js';
|
|
3
|
+
import { validate } from './chunk-NJWI6MPT.js';
|
|
4
4
|
import { checkCatalogsOption } from './chunk-XRMV2GMB.js';
|
|
5
|
-
import { sortPresentationKeys } from './chunk-
|
|
6
|
-
import { presentation } from './chunk-
|
|
5
|
+
import { sortPresentationKeys } from './chunk-EQ6S5SEZ.js';
|
|
6
|
+
import { presentation } from './chunk-F4HFDP6I.js';
|
|
7
7
|
import { Parser, parseDocument, isMap, Document, visit, isScalar, isAlias, isSeq } from 'yaml';
|
|
8
8
|
|
|
9
9
|
var MAX_ALIAS_COUNT = 100;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { parseQuoteLines, levelsFromIndents, parseCodeFence, splitWhen, fenceCode } from './chunk-
|
|
2
|
-
import { Ctx, splitLines, lineRange, readYamlMapping, NOT_CHECKED, OPFMarkdownError, writeYaml, readCsv, DECIMAL, csvField, scalarText } from './chunk-
|
|
3
|
-
import { same, isRecord, runText, isPlainRun, FORMATTING } from './chunk-
|
|
4
|
-
import { validate } from './chunk-
|
|
1
|
+
import { parseQuoteLines, levelsFromIndents, parseCodeFence, splitWhen, fenceCode } from './chunk-7RY7QWWJ.js';
|
|
2
|
+
import { Ctx, splitLines, lineRange, readYamlMapping, NOT_CHECKED, OPFMarkdownError, writeYaml, readCsv, DECIMAL, csvField, scalarText } from './chunk-DEI2M2H6.js';
|
|
3
|
+
import { same, isRecord, runText, isPlainRun, FORMATTING } from './chunk-PXOXTJTN.js';
|
|
4
|
+
import { validate } from './chunk-NJWI6MPT.js';
|
|
5
5
|
import { checkCatalogsOption, PROMOTED_REGION_KEY } from './chunk-XRMV2GMB.js';
|
|
6
6
|
|
|
7
7
|
// src/markdown/canon.ts
|
|
@@ -43,8 +43,8 @@ declare const RENDER_PACKAGE = "@openpresentation/opf-render";
|
|
|
43
43
|
declare const PPTX_PACKAGE = "@openpresentation/opf-pptx";
|
|
44
44
|
/** Peer ranges. The CLI checks the features it calls rather than the version, so a newer release in range keeps working. */
|
|
45
45
|
declare const PEER_RANGES: {
|
|
46
|
-
readonly "@openpresentation/opf-render": "^0.26.
|
|
47
|
-
readonly "@openpresentation/opf-pptx": "^0.26.
|
|
46
|
+
readonly "@openpresentation/opf-render": "^0.26.3";
|
|
47
|
+
readonly "@openpresentation/opf-pptx": "^0.26.3";
|
|
48
48
|
};
|
|
49
49
|
interface Diagnostic {
|
|
50
50
|
code: string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { convertFiles, deckFileFormat, exportFormatOf, openDeck, planConversion, readInput, saveDeck, writePlanned } from './chunk-34LIUOT7.js';
|
|
2
|
+
import './chunk-2ZQBMZTZ.js';
|
|
3
|
+
import './chunk-GLLR3AQ5.js';
|
|
4
|
+
import './chunk-UJSAR6GF.js';
|
|
5
|
+
import './chunk-PJSPHHRK.js';
|
|
6
|
+
import './chunk-TKQ2VFV5.js';
|
|
7
|
+
import './chunk-54OV2WQC.js';
|
|
8
|
+
import './chunk-FXNUM2PN.js';
|
|
9
|
+
import './chunk-WASENX2R.js';
|
|
10
|
+
import './chunk-7RY7QWWJ.js';
|
|
11
|
+
import './chunk-PB5X2VSV.js';
|
|
12
|
+
import './chunk-DEI2M2H6.js';
|
|
13
|
+
import './chunk-PXOXTJTN.js';
|
|
14
|
+
import './chunk-YVNFACTC.js';
|
|
15
|
+
import './chunk-NJWI6MPT.js';
|
|
16
|
+
import './chunk-XRMV2GMB.js';
|
|
17
|
+
import './chunk-EQ6S5SEZ.js';
|
|
18
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/convert.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { paginate, OPFPaginationError } from './chunk-
|
|
2
|
-
import { parseQuoteLines, parseCodeFence, splitWhen, parseListLine, levelsFromIndents, fenceCode } from './chunk-
|
|
3
|
-
import { CONTENT_KEYS, isRecord, contentKeysOf, refuse, clone, Loss, isSlideLike, assertValidOwner, report, OPFConversionError, plainOf, assertValidOutput, same, splitRuns, runsOf, lineIsPlain, linePlain, concatText, lineValue, joinLines, hasFormatting } from './chunk-
|
|
4
|
-
export { OPFConversionError } from './chunk-
|
|
5
|
-
import './chunk-
|
|
1
|
+
import { paginate, OPFPaginationError } from './chunk-54OV2WQC.js';
|
|
2
|
+
import { parseQuoteLines, parseCodeFence, splitWhen, parseListLine, levelsFromIndents, fenceCode } from './chunk-7RY7QWWJ.js';
|
|
3
|
+
import { CONTENT_KEYS, isRecord, contentKeysOf, refuse, clone, Loss, isSlideLike, assertValidOwner, report, OPFConversionError, plainOf, assertValidOutput, same, splitRuns, runsOf, lineIsPlain, linePlain, concatText, lineValue, joinLines, hasFormatting } from './chunk-PXOXTJTN.js';
|
|
4
|
+
export { OPFConversionError } from './chunk-PXOXTJTN.js';
|
|
5
|
+
import './chunk-NJWI6MPT.js';
|
|
6
6
|
import { promotedRegionKeys, isDatasetRef, inlineTableData, visitContentPayloads, chartNumber } from './chunk-XRMV2GMB.js';
|
|
7
|
-
import './chunk-
|
|
7
|
+
import './chunk-F4HFDP6I.js';
|
|
8
8
|
|
|
9
9
|
// src/convert/tables.ts
|
|
10
10
|
function cellOf(raw) {
|
package/dist/deck.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { DECK_FORMATS, deckFormatOf, parse, stringify } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
1
|
+
export { DECK_FORMATS, deckFormatOf, parse, stringify } from './chunk-FXNUM2PN.js';
|
|
2
|
+
import './chunk-WASENX2R.js';
|
|
3
|
+
import './chunk-7RY7QWWJ.js';
|
|
4
|
+
import './chunk-PB5X2VSV.js';
|
|
5
|
+
import './chunk-DEI2M2H6.js';
|
|
6
|
+
import './chunk-PXOXTJTN.js';
|
|
7
|
+
import './chunk-NJWI6MPT.js';
|
|
8
8
|
import './chunk-XRMV2GMB.js';
|
|
9
|
-
import './chunk-
|
|
10
|
-
import './chunk-
|
|
9
|
+
import './chunk-EQ6S5SEZ.js';
|
|
10
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/diff.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { categoryOf, describeValue, diff, formatDiffReport, matchArrays, merge, similarity } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { categoryOf, describeValue, diff, formatDiffReport, matchArrays, merge, similarity } from './chunk-YVNFACTC.js';
|
|
2
|
+
import './chunk-NJWI6MPT.js';
|
|
3
3
|
import './chunk-XRMV2GMB.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/docs.js
CHANGED
|
@@ -286,7 +286,7 @@ var docsData = Object.freeze([
|
|
|
286
286
|
"slug": "release-process",
|
|
287
287
|
"file": "docs/release-process.md",
|
|
288
288
|
"title": "OPF Release Process",
|
|
289
|
-
"markdown": "# OPF Release Process\n\nUse Node 24 (`24.x`) for all future source, candidate and registry verification.\nThe packages declare the open-ended `engines.node` `>=22` (RR-20, tested on Node 22, 24 and 26 by the `node-range`\nCI legs, which run in the nightly workflow, before every release and on pull requests labelled `full-ci`); a closed range such as `24.x` makes npm on any other Node silently install an older release, and\n`pnpm check:engines-range` fails on one, including in a lockfile that pins a release made after the fix.\nThe next releases must document the [Node 24 migration](migrations/node24.md)\nand use new versions. Historical dual-runtime release records remain unchanged.\n\nThis document is the release runbook for the six published packages of this repository:\n[`@openpresentation/opf`](https://www.npmjs.com/package/@openpresentation/opf) (core, `packages/javascript`),\n`@openpresentation/cli`, `@openpresentation/opf-render`, `@openpresentation/opf-pptx`, `@openpresentation/opf-editor` and\n`@openpresentation/gallery`. They are released together, at one version, with one tag.\n\n## Release: one click\n\n> Status: the workflows and `scripts/release.mjs` are in place and rehearsed with dry runs. The first real release through them\n> is the canary `0.26.0-rc.0` (MR-41), then 0.26.0 (MR-44). Releases up to 0.25.x were made from the four old repositories with\n> a per-package train; that process is retired and not described here.\n\n**One version, one tag, one workflow.** All six packages carry the same version (`pnpm check:versions`); a release is the tag\n`vX.Y.Z` on a commit of `main`, published by `.github/workflows/npm-publish.yml` in dependency order: gallery, core, render,\nPPTX, editor, CLI. In 0.x a breaking change is a minor release and everything else a patch. Prereleases (`0.26.0-rc.0`) go to\nthe dist-tag `next`, releases to `latest`; both are passed explicitly to `npm publish --tag` for every package.\n\n### Run a release\n\nActions, **Release**, **Run workflow** on `main`:\n\n| Input | Meaning |\n| --- | --- |\n| `version` | `X.Y.Z`, `X.Y.Z-rc.N`, or `patch` / `minor` of the shared line (the highest `latest` of core, CLI, render, PPTX and editor) |\n| `dry-run` | Default **true**: rehearse everything up to `npm publish --dry-run`; nothing is committed, tagged or published. Set false for the real release |\n| `skip-gate` | A dry run only: skip the slow gate |\n\nRun it with `dry-run` true first when the change touches the release machinery; a real release of ordinary changes needs no\nrehearsal. The jobs:\n\n1. **plan**: a real release runs on `main`, and the check `verify` is green for its head (one API call, no waiting).\n2. **gate** (parallel with prepare): `nightly.yml` called on that commit: Windows, macOS, Node 22 and 26, the packed-install and\n registry consumers. A red leg stops the release before anything is committed or tagged.\n3. **prepare** (parallel with gate): `node scripts/release.mjs prepare <version>` in the runner: sets the six versions, core's\n peer ranges and `PEER_RANGES` (`packages/javascript/src/node/peers.ts`), assembles every `changes/` fragment into its package\n changelog (a package without a fragment gets \"No package changes; released with the set.\"), applies the gallery stability gate\n and the version rules below, refreshes the lockfile, and uploads the result as a patch. A **prerelease** (`X.Y.Z-rc.N`) only sets the versions: it leaves every changelog and `changes/` alone, and its GitHub release notes are assembled from the fragments (`release.mjs notes`), so the stable release that follows carries every note. A refused version fails here, in two\n minutes.\n4. **commit and tag** (real release, after gate and prepare): with the GitHub App's token (a bypass actor on the `main` ruleset)\n applies the patch as one commit `release vX.Y.Z` on exactly the commit the gate tested, pushes it to `main`, then pushes the\n tag `vX.Y.Z`. If `main` moved during the run, or the tag exists, it stops. A tag pushed with the App's token starts\n `npm-publish.yml` (a tag pushed with `GITHUB_TOKEN` would not).\n5. **npm-publish.yml** on the tag: `plan` (the tag is on `main`), `build` (one install and build, `pnpm pack` of the six,\n `scripts/stamp-githead.mjs` adds `gitHead` to each tarball because `pnpm pack` omits it, a smoke test installs the six\n tarballs together, renders the quickstart deck and runs the CLI), `publish` (the only job with `id-token: write`; the\n pre-publish gate, then `npm publish <tarball> --access public --provenance --tag <tag>` six times, printing npm's own output, then polling until the registry serves each version (it lags the upload by up to several minutes); a version already on npm is\n skipped), `verify` (below), `release` (the GitHub release, notes grouped by package) and `report` (a failure opens the issue\n \"Release vX.Y.Z failed\", labeled `release-failed`).\n6. **follow the publish run** (the Release run waits for it, so it is green only when the whole release is).\n\nTime target: about 20 minutes from the click to six verified packages (measured in MR-44).\n\n### Version rules\n\n- `prepare` refuses a version that is not above the shared line's previous release, and one already on npm for any package\n (a published version is never reused; fix forward).\n- **The gallery stability rule** (`scripts/gallery-stability.mjs`, `pnpm check:stability`; see\n [default-catalog.md](default-catalog.md)): a declared drawing change (a `drawing` entry in a gallery fragment), a removed record\n id or a `CATALOG_SCHEMA` change needs a **minor** release; `prepare` refuses a patch. New records and unchanged drawings go in\n any release. The baseline is the gallery's `latest` dist-tag, never its highest version.\n- **The publish gate** (`release.mjs check-publish`, run by `publish`): each package's version is above its own registry\n `latest`, except the gallery, which is compared with the shared line, because its `latest` was 5.0.0 before it joined the\n shared 0.x line (D16). A stable version needs `latest`, a prerelease must not take it. 5.0.0 and the older gallery versions\n stay published and are never deprecated; because they are above the shared line, every gallery publish names its tag explicitly.\n- The shared line cannot use 1.0.0 to 5.0.0 (taken by the gallery): the first stable major for all six is 6.0.0.\n\n### Trusted publishing\n\nAll six packages have the trusted publisher: GitHub Actions, organization `OpenPresentation`, repository `opf`, workflow filename\n`npm-publish.yml`, no environment (owner steps O1 in `docs/programs/monorepo/owner-steps.md`). npm checks the entry against\nthe **top-level** workflow of the run, not against a reusable workflow that contains `npm publish`, so `npm-publish.yml` is the\nworkflow that starts on the tag and `release.yml` only pushes the tag. `publish` refuses to publish from any other top-level\nworkflow. A publish fails with `E404` or `E403 ... not a trusted publisher` when an entry is wrong: fix the entry and re-run\nthe workflow on the tag. There is no `NPM_TOKEN`, and no local publish: the provenance gate applies to every release.\n\n### Retry and failure\n\nA failed `npm-publish.yml` run is fixed and run again on the same tag: Actions, **Publish OPF npm packages**, **Run workflow**,\nref `vX.Y.Z`, `dry-run` false (or re-run the failed run). Versions already on npm are skipped, so it continues where it stopped.\nA partial publish is safe: the `^X.Y.Z` floors point at packages that exist, because the order is dependency order. A real\ndefect in a published version is fixed forward with the next patch and a new tag; tags are never moved. If `prepare` or the gate\nfails, nothing was committed: fix the cause and run the release again.\n\n### Fallback: a release pull request\n\nIf no App token is available, or a person prefers review: on a branch run `pnpm release:prepare X.Y.Z`\n(`node scripts/release.mjs prepare X.Y.Z`; it needs `pnpm build` first for the stability gate), open the pull request, merge it\non green, then on `main` run `git tag vX.Y.Z && git push origin vX.Y.Z`. The publish workflow is the same.\n\n### Verify\n\nThe `verify` job runs `node scripts/release.mjs verify X.Y.Z --tag <dist-tag> --commit <release commit> --wait 10` and then the\nsmoke test against the registry (`release.mjs smoke X.Y.Z --registry`). For all six packages it checks the registry manifest,\n`gitHead` and the provenance source commit equal to the release commit, the provenance workflow `npm-publish.yml` on\n`refs/tags/vX.Y.Z`, the subject digest, the dist-tag, that no manifest carries a `workspace:` range and every sibling range is\n`^X.Y.Z`, `npm audit signatures`, and that each package changelog has the version's section. By hand:\n\n```sh\nnode scripts/release.mjs verify X.Y.Z --tag latest # exit 0 when all six verify\nnpm view @openpresentation/opf@X.Y.Z gitHead dist.attestations.url\nnpm view @openpresentation/gallery dist-tags --json # latest is X.Y.Z; 5.0.0 stays published\n```\n\n### `scripts/release.mjs`\n\n| Command | Does |\n| --- | --- |\n| `prepare <version> [--dry-run] [--no-stability] [--previous V]` | the prepare step above (`--dry-run` writes nothing) |\n| `pack <version> --commit <sha> --out <dir>` | `pnpm pack` of the six, `gitHead` stamped, `release-manifest.json` with digests |\n| `smoke <version> (--dir <dir> \\| --registry)` | install the six together, render, resolve, run the CLI |\n| `check-publish <version> [--tag t]` | the pre-publish gate |\n| `publish <version> --dir <dir> [--tag t] [--dry-run] [--wait minutes] [--poll seconds] [--expect-staged]` | the gate, then `npm publish` in dependency order: npm's output is printed, the version must be served within `--wait` (default 15 min, after all six uploads), a staged result fails unless `--expect-staged` |\n| `verify <version> [--tag t] [--commit sha] [--wait minutes]` | the registry and provenance check (a prerelease has no changelog section to check) |\n| `notes <version> [--out file]` | the GitHub release body |\n| `order` | the publish order |\n\n### After a release: the sites\n\nAfter a **stable** release, `release.yml` calls `.github/workflows/bump-sites.yml` (a prerelease never does). For each of the\nthree sites (`Data-Advantage/openpresentation-site` and `Data-Advantage/pptx-gallery` on `main`, `Data-Advantage/pptx-dev` on\n`master`) it opens one pull request, \"bump to vX.Y.Z\", from the branch `bot/opf-vX.Y.Z`, that sets every `@openpresentation/*`\npin the site declares to the released version and refreshes the site's lockfile (`scripts/bump-site.mjs`). A patch bump is labeled\n`auto-merge`; a minor or major bump (a breaking change in 0.x) is labeled `needs-review` and stays open. The workflow only opens\nand labels the pull request and never merges it: the site's own CI merges an `auto-merge` pull request after its\n`build-and-smoke` job passes, using the GitHub App's token so that the merge starts the site's deploy workflows (D19; the sites\nare private repositories in a Free-plan organization and have no rulesets or required checks). A bump that cannot be made opens\nan issue in this repository (`bump-sites-failed`) and never fails the release. To run it again, or for a release made by the pull-request\nfallback or from a tag, use Actions, **Bump sites**, **Run workflow** with the version. The App, its secrets and the site-side\nworkflows are owner steps O4 and O8 (`docs/programs/monorepo/owner-steps.md`); the workflow files for the sites are in\n`docs/programs/monorepo/site-workflows/`.\n\n### Who may release\n\nThe owner authorized agents to prepare and publish npm releases on 2026-09-29 (`AGENTS.md`). A release is made only through\n`release.yml` (or the pull-request fallback) and `npm-publish.yml`, only when one is required and only with every gate green;\nagents never publish from a laptop, never skip the gate and never pass a different `--tag` to make a check pass. Dry runs are\nfree at any time.\n\n## Geometry-moving core releases\n\nCore composition changes that move geometry make the preview and the PPTX export drift when the renderer and the exporter resolve\ndifferent core versions. This cannot happen between the packages of this repository: all six are released at one version, and\ntheir runtime dependencies and peers on each other are `workspace:^`, published as `^X.Y.Z`, so the floor of every sibling is the\nrelease itself. Do not hand-edit those ranges, and do not release one package alone.\n\n## Renderer font-count gate (RR-90)\n\nThe installed-consumer check (`scripts/test-packed-ecosystem.mjs`) and `test:gallery-lazy-fonts` compare the number of vendored faces a renderer lists as lazy fonts with `scripts/lazy-font-counts.mjs`. A renderer release whose fonts did not change needs no new entry. The gate hashes the renderer package's font set, which is 143 files: `dist/font-manifest.js` and every file under `fonts/` (faces, licenses, `PROVENANCE.json`, `NOTICE.md`). An unlisted version, stable or a prerelease (`X.Y.Z-rc.N`), passes when that hash is in `REVIEWED_FONT_SETS` and its measured count equals the count recorded there.\n\nIt fails closed, with a message that says what changed, when:\n\n- the font files differ from every reviewed set (the message prints the new hashes): review what changed, then add the set to `REVIEWED_FONT_SETS` and the version's count to `LAZY_FONT_COUNTS`;\n- the font files are a reviewed set but the count differs: find out why the count moved, then add an entry;\n\nA prerelease is held to the same rule as the stable version: its label neither admits nor refuses it, its font files and count do.\n\nTo review a set, pack the release (`npm pack @openpresentation/opf-render@<version>`), run `hashFontSet` from `scripts/lazy-font-counts.mjs` over the unpacked `package/` folder, and record the result with the versions you checked. Every existing `LAZY_FONT_COUNTS` entry stays and keeps its own rule.\n\n## Troubleshooting\n\n- **The tag or version check fails** (`npm-publish.yml`, job `plan`): the tag does not point at a commit of `main`, or the version\n is not well formed. Inspect the exact tag. Never move or re-push a release tag; fix a real error on `main` and release the\n next version. A transient failure is retried on the same unchanged tag.\n- **`E404`, `E403` or `ENEEDAUTH` from `npm publish`**: the trusted publisher of that package is missing or wrong. It must be\n organization `OpenPresentation`, repository `opf`, workflow filename `npm-publish.yml`, no environment, and the `publish` job\n needs `id-token: write`. Fix the entry in npm (owner step O1) and re-run the workflow on the tag.\n- **`publish` fails with \"npm accepted X (exit 0) but the registry still does not serve it\"** or \"npm staged X\": npm returned success\n (or staged the upload) but the version is not installable. Open the package on npmjs.com, Staged Packages tab, or run\n `npm stage list <name>` as a maintainer: a staged version must be approved with 2FA (`npm stage approve <stage-id>`;\n trusted-publishing OIDC tokens cannot approve). Otherwise wait for propagation and re-run the workflow on the same tag; the\n packages already served are skipped.\n- **A version is already on npm**: `publish` skips it; do not try to publish it again. Verify the package and continue.\n- **The gate is red**: the failing leg of `nightly.yml` is in the Release run. Fix it on `main` and release again; nothing was\n committed. A flaky leg is quarantined (`pnpm check:quarantine`), never skipped for a release.\n- **`release.yml` stopped with \"main moved\"**: a commit landed on `main` after the run started, and the gate had tested the\n earlier one. Run the release again.\n- **A nightly failure**: the `nightly-red` issue lists the failing legs and the run; it never blocks a pull request, and the\n release gate refuses to publish on the same failure.\n"
|
|
289
|
+
"markdown": "# OPF Release Process\n\nUse Node 24 (`24.x`) for all future source, candidate and registry verification.\nThe packages declare the open-ended `engines.node` `>=22` (RR-20, tested on Node 22, 24 and 26 by the `node-range`\nCI legs, which run in the nightly workflow, before every release and on pull requests labelled `full-ci`); a closed range such as `24.x` makes npm on any other Node silently install an older release, and\n`pnpm check:engines-range` fails on one, including in a lockfile that pins a release made after the fix.\nThe next releases must document the [Node 24 migration](migrations/node24.md)\nand use new versions. Historical dual-runtime release records remain unchanged.\n\nThis document is the release runbook for the six published packages of this repository:\n[`@openpresentation/opf`](https://www.npmjs.com/package/@openpresentation/opf) (core, `packages/javascript`),\n`@openpresentation/cli`, `@openpresentation/opf-render`, `@openpresentation/opf-pptx`, `@openpresentation/opf-editor` and\n`@openpresentation/gallery`. They are released together, at one version, with one tag.\n\n## Release: one click\n\n> Status: the workflows and `scripts/release.mjs` are in place and rehearsed with dry runs. The first real release through them\n> is the canary `0.26.0-rc.0` (MR-41), then 0.26.0 (MR-44). Releases up to 0.25.x were made from the four old repositories with\n> a per-package train; that process is retired and not described here.\n\n**One version, one tag, one workflow.** All six packages carry the same version (`pnpm check:versions`); a release is the tag\n`vX.Y.Z` on a commit of `main`, published by `.github/workflows/npm-publish.yml` in dependency order: gallery, core, render,\nPPTX, editor, CLI. In 0.x a breaking change is a minor release and everything else a patch. Prereleases (`0.26.0-rc.0`) go to\nthe dist-tag `next`, releases to `latest`; both are passed explicitly to `npm publish --tag` for every package.\n\n### Run a release\n\nActions, **Release**, **Run workflow** on `main`:\n\n| Input | Meaning |\n| --- | --- |\n| `version` | `X.Y.Z`, `X.Y.Z-rc.N`, or `patch` / `minor` of the shared line (the highest `latest` of core, CLI, render, PPTX and editor) |\n| `dry-run` | Default **true**: rehearse everything up to `npm publish --dry-run`; nothing is committed, tagged or published. Set false for the real release |\n| `skip-gate` | A dry run only: skip the slow gate |\n\nRun it with `dry-run` true first when the change touches the release machinery; a real release of ordinary changes needs no\nrehearsal. The jobs:\n\n1. **plan**: a real release runs on `main`, and the check `verify` is green for its head (one API call, no waiting).\n2. **gate** (parallel with prepare): `nightly.yml` called on that commit: Windows, macOS, Node 22 and 26, the packed-install and\n registry consumers. A red leg stops the release before anything is committed or tagged.\n3. **prepare** (parallel with gate): `node scripts/release.mjs prepare <version>` in the runner: sets the six versions, core's\n peer ranges and `PEER_RANGES` (`packages/javascript/src/node/peers.ts`), assembles every `changes/` fragment into its package\n changelog (a package without a fragment gets \"No package changes; released with the set.\"), applies the gallery stability gate\n and the version rules below, refreshes the lockfile, and uploads the result as a patch. A **prerelease** (`X.Y.Z-rc.N`) only sets the versions: it leaves every changelog and `changes/` alone, and its GitHub release notes are assembled from the fragments (`release.mjs notes`), so the stable release that follows carries every note. A refused version fails here, in two\n minutes.\n4. **commit and tag** (real release, after gate and prepare): with the GitHub App's token (a bypass actor on the `main` ruleset)\n applies the patch as one commit `release vX.Y.Z` on exactly the commit the gate tested, pushes it to `main`, then pushes the\n tag `vX.Y.Z`. If `main` moved during the run, or the tag exists, it stops. A tag pushed with the App's token starts\n `npm-publish.yml` (a tag pushed with `GITHUB_TOKEN` would not).\n5. **npm-publish.yml** on the tag: `plan` (the tag is on `main`), `build` (one install and build, `pnpm pack` of the six,\n `scripts/stamp-githead.mjs` adds `gitHead` to each tarball because `pnpm pack` omits it, a smoke test installs the six\n tarballs together, renders the quickstart deck and runs the CLI), `publish` (the only job with `id-token: write`; the\n pre-publish gate, then `npm publish <tarball> --access public --provenance --tag <tag>` six times, printing npm's own output, then polling until the registry serves each version (it lags the upload by up to several minutes); a version already on npm is\n skipped), `verify` (below), `release` (the GitHub release, notes grouped by package) and `report` (a failure opens the issue\n \"Release vX.Y.Z failed\", labeled `release-failed`).\n6. **follow the publish run** (the Release run waits for it, so it is green only when the whole release is).\n\nTime target: about 20 minutes from the click to six verified packages (measured in MR-44).\n\n### Version rules\n\n- `prepare` refuses a version that is not above the shared line's previous release, and one already on npm for any package\n (a published version is never reused; fix forward).\n- **The gallery stability rule** (`scripts/gallery-stability.mjs`, `pnpm check:stability`; see\n [default-catalog.md](default-catalog.md)): a declared drawing change (a `drawing` entry in a gallery fragment), a removed record\n id or a `CATALOG_SCHEMA` change needs a **minor** release; `prepare` refuses a patch. New records and unchanged drawings go in\n any release. The baseline is the gallery's `latest` dist-tag, never its highest version.\n- **The publish gate** (`release.mjs check-publish`, run by `publish`): each package's version is above its own registry\n `latest`, except the gallery, which is compared with the shared line, because its `latest` was 5.0.0 before it joined the\n shared 0.x line (D16). A stable version needs `latest`, a prerelease must not take it. 5.0.0 and the older gallery versions\n stay published and are never deprecated; because they are above the shared line, every gallery publish names its tag explicitly.\n- The shared line cannot use 1.0.0 to 5.0.0 (taken by the gallery): the first stable major for all six is 6.0.0.\n\n### Trusted publishing\n\nAll six packages have the trusted publisher: GitHub Actions, organization `OpenPresentation`, repository `opf`, workflow filename\n`npm-publish.yml`, no environment (owner steps O1 in `docs/programs/monorepo/owner-steps.md`). npm checks the entry against\nthe **top-level** workflow of the run, not against a reusable workflow that contains `npm publish`, so `npm-publish.yml` is the\nworkflow that starts on the tag and `release.yml` only pushes the tag. `publish` refuses to publish from any other top-level\nworkflow. A publish fails with `E404` or `E403 ... not a trusted publisher` when an entry is wrong: fix the entry and re-run\nthe workflow on the tag. There is no `NPM_TOKEN`, and no local publish: the provenance gate applies to every release.\n\n### Retry and failure\n\nA failed `npm-publish.yml` run is fixed and run again on the same tag: Actions, **Publish OPF npm packages**, **Run workflow**,\nref `vX.Y.Z`, `dry-run` false (or re-run the failed run). Versions already on npm are skipped, so it continues where it stopped.\nA partial publish is safe: the `^X.Y.Z` floors point at packages that exist, because the order is dependency order. A real\ndefect in a published version is fixed forward with the next patch and a new tag; tags are never moved. If `prepare` or the gate\nfails, nothing was committed: fix the cause and run the release again.\n\n### Fallback: a release pull request\n\nIf no App token is available, or a person prefers review: on a branch run `pnpm release:prepare X.Y.Z`\n(`node scripts/release.mjs prepare X.Y.Z`; it needs `pnpm build` first for the stability gate), open the pull request, merge it\non green, then on `main` run `git tag vX.Y.Z && git push origin vX.Y.Z`. The publish workflow is the same.\n\n### Verify\n\nThe `verify` job runs `node scripts/release.mjs verify X.Y.Z --tag <dist-tag> --commit <release commit> --wait 10` and then the\nsmoke test against the registry (`release.mjs smoke X.Y.Z --registry`). For all six packages it checks the registry manifest,\n`gitHead` and the provenance source commit equal to the release commit, the provenance workflow `npm-publish.yml` on\n`refs/tags/vX.Y.Z`, the subject digest, the dist-tag, that no manifest carries a `workspace:` range and every sibling range is\n`^X.Y.Z`, `npm audit signatures`, and that each package changelog has the version's section. By hand:\n\n```sh\nnode scripts/release.mjs verify X.Y.Z --tag latest # exit 0 when all six verify\nnpm view @openpresentation/opf@X.Y.Z gitHead dist.attestations.url\nnpm view @openpresentation/gallery dist-tags --json # latest is X.Y.Z; 5.0.0 stays published\n```\n\n### `scripts/release.mjs`\n\n| Command | Does |\n| --- | --- |\n| `prepare <version> [--dry-run] [--no-stability] [--previous V]` | the prepare step above (`--dry-run` writes nothing) |\n| `pack <version> --commit <sha> --out <dir>` | `pnpm pack` of the six, `gitHead` stamped, `release-manifest.json` with digests |\n| `smoke <version> (--dir <dir> \\| --registry)` | install the six together, render, resolve, run the CLI |\n| `check-publish <version> [--tag t]` | the pre-publish gate |\n| `publish <version> --dir <dir> [--tag t] [--dry-run] [--wait minutes] [--poll seconds] [--expect-staged]` | the gate, then `npm publish` in dependency order: npm's output is printed, the version must be served within `--wait` (default 15 min, after all six uploads), a staged result fails unless `--expect-staged` |\n| `verify <version> [--tag t] [--commit sha] [--wait minutes]` | the registry and provenance check (a prerelease has no changelog section to check) |\n| `notes <version> [--out file]` | the GitHub release body |\n| `order` | the publish order |\n\n### After a release: the sites\n\nAfter a **stable** release, `release.yml` calls `.github/workflows/bump-sites.yml` (a prerelease never does). For each of the\nthree sites (`Data-Advantage/openpresentation-site` and `Data-Advantage/pptx-gallery` on `main`, `Data-Advantage/pptx-dev` on\n`master`) it opens one pull request, \"bump to vX.Y.Z\", from the branch `bot/opf-vX.Y.Z`. What a bump touches is the site's own\nbusiness, so each site owns one script, `pnpm opf:bump <X.Y.Z> [--opf <checkout>]` (`scripts/opf-bump.mjs` of the site), that sets its\n`@openpresentation/*` pins, refreshes its lockfile, regenerates every file it derives from the release (a release history from the\nregistry and these release notes, a pin mirror, preview fonts, chart previews, the vendored editor bundle, a homepage manifest) and runs\nthe checks of its own CI that read them; `scripts/bump-site.mjs` decides the label and calls it (a site without one gets only the\ngeneric pins and lockfile). A bump needs no human edit to be green; one that does (a release that changes behavior or removes a\ndocument the site links) fails the site's CI and stays open. A patch bump is labeled\n`auto-merge`; a minor or major bump (a breaking change in 0.x) is labeled `needs-review` and stays open. The workflow only opens\nand labels the pull request and never merges it: the site's own CI merges an `auto-merge` pull request after its\n`build-and-smoke` job passes, using the GitHub App's token so that the merge starts the site's deploy workflows (D19; the sites\nare private repositories in a Free-plan organization and have no rulesets or required checks). A bump that cannot be made opens\nan issue in this repository (`bump-sites-failed`) and never fails the release. To run it again, or for a release made by the pull-request\nfallback or from a tag, use Actions, **Bump sites**, **Run workflow** with the version. The App, its secrets and the site-side\nworkflows are owner steps O4 and O8 (`docs/programs/monorepo/owner-steps.md`); the workflow files for the sites are in\n`docs/programs/monorepo/site-workflows/`.\n\n### Who may release\n\nThe owner authorized agents to prepare and publish npm releases on 2026-09-29 (`AGENTS.md`). A release is made only through\n`release.yml` (or the pull-request fallback) and `npm-publish.yml`, only when one is required and only with every gate green;\nagents never publish from a laptop, never skip the gate and never pass a different `--tag` to make a check pass. Dry runs are\nfree at any time.\n\n## Geometry-moving core releases\n\nCore composition changes that move geometry make the preview and the PPTX export drift when the renderer and the exporter resolve\ndifferent core versions. This cannot happen between the packages of this repository: all six are released at one version, and\ntheir runtime dependencies and peers on each other are `workspace:^`, published as `^X.Y.Z`, so the floor of every sibling is the\nrelease itself. Do not hand-edit those ranges, and do not release one package alone.\n\n## Renderer font-count gate (RR-90)\n\nThe installed-consumer check (`scripts/test-packed-ecosystem.mjs`) and `test:gallery-lazy-fonts` compare the number of vendored faces a renderer lists as lazy fonts with `scripts/lazy-font-counts.mjs`. A renderer release whose fonts did not change needs no new entry. The gate hashes the renderer package's font set, which is 143 files: `dist/font-manifest.js` and every file under `fonts/` (faces, licenses, `PROVENANCE.json`, `NOTICE.md`). An unlisted version, stable or a prerelease (`X.Y.Z-rc.N`), passes when that hash is in `REVIEWED_FONT_SETS` and its measured count equals the count recorded there.\n\nIt fails closed, with a message that says what changed, when:\n\n- the font files differ from every reviewed set (the message prints the new hashes): review what changed, then add the set to `REVIEWED_FONT_SETS` and the version's count to `LAZY_FONT_COUNTS`;\n- the font files are a reviewed set but the count differs: find out why the count moved, then add an entry;\n\nA prerelease is held to the same rule as the stable version: its label neither admits nor refuses it, its font files and count do.\n\nTo review a set, pack the release (`npm pack @openpresentation/opf-render@<version>`), run `hashFontSet` from `scripts/lazy-font-counts.mjs` over the unpacked `package/` folder, and record the result with the versions you checked. Every existing `LAZY_FONT_COUNTS` entry stays and keeps its own rule.\n\n## Troubleshooting\n\n- **The tag or version check fails** (`npm-publish.yml`, job `plan`): the tag does not point at a commit of `main`, or the version\n is not well formed. Inspect the exact tag. Never move or re-push a release tag; fix a real error on `main` and release the\n next version. A transient failure is retried on the same unchanged tag.\n- **`E404`, `E403` or `ENEEDAUTH` from `npm publish`**: the trusted publisher of that package is missing or wrong. It must be\n organization `OpenPresentation`, repository `opf`, workflow filename `npm-publish.yml`, no environment, and the `publish` job\n needs `id-token: write`. Fix the entry in npm (owner step O1) and re-run the workflow on the tag.\n- **`publish` fails with \"npm accepted X (exit 0) but the registry still does not serve it\"** or \"npm staged X\": npm returned success\n (or staged the upload) but the version is not installable. Open the package on npmjs.com, Staged Packages tab, or run\n `npm stage list <name>` as a maintainer: a staged version must be approved with 2FA (`npm stage approve <stage-id>`;\n trusted-publishing OIDC tokens cannot approve). Otherwise wait for propagation and re-run the workflow on the same tag; the\n packages already served are skipped.\n- **A version is already on npm**: `publish` skips it; do not try to publish it again. Verify the package and continue.\n- **The gate is red**: the failing leg of `nightly.yml` is in the Release run. Fix it on `main` and release again; nothing was\n committed. A flaky leg is quarantined (`pnpm check:quarantine`), never skipped for a release.\n- **`release.yml` stopped with \"main moved\"**: a commit landed on `main` after the run started, and the gate had tested the\n earlier one. Run the release again.\n- **A nightly failure**: the `nightly-red` issue lists the failing legs and the run; it never blocks a pull request, and the\n release gate refuses to publish on the same failure.\n"
|
|
290
290
|
},
|
|
291
291
|
{
|
|
292
292
|
"slug": "rich-text",
|
package/dist/format.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { OPFFormatError, format, isFormatted, sortPresentationKeys } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { OPFFormatError, format, isFormatted, sortPresentationKeys } from './chunk-EQ6S5SEZ.js';
|
|
2
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { SchemaEntry, SchemaName, audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './schemas.js';
|
|
2
|
-
import { C as ConvertInput, a as ConvertOptions, b as ConvertResult, c as ConvertFormat, O as OpenOptions, S as SaveOptions, d as SaveResult } from './conversion-
|
|
3
|
-
export { e as ConvertedFile, E as ExportFormat, F as FontsHandle, f as OPFApiError, g as OPFExportError, h as OPFImportError, i as SlideSelection, p as parseSlideSelection } from './conversion-
|
|
2
|
+
import { C as ConvertInput, a as ConvertOptions, b as ConvertResult, c as ConvertFormat, O as OpenOptions, S as SaveOptions, d as SaveResult } from './conversion-BjsKgxBZ.js';
|
|
3
|
+
export { e as ConvertedFile, E as ExportFormat, F as FontsHandle, f as OPFApiError, g as OPFExportError, h as OPFImportError, i as SlideSelection, p as parseSlideSelection } from './conversion-BjsKgxBZ.js';
|
|
4
4
|
import { validate as validate$1 } from './validator.js';
|
|
5
5
|
export { DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, findValidationRule, validateCatalogRecord, validationRules } from './validator.js';
|
|
6
6
|
import { R as ResolveVariablesOptions, h as VariableDiagnostic } from './validation-types-3ARvTsB0.js';
|
package/dist/index.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { defaultCatalogs } from './chunk-
|
|
2
|
-
import { stats, embed, edit, OPFApiError, asApiError } from './chunk-
|
|
3
|
-
export { OPFApiError, OPFExportError, OPFImportError, OPFMoveToCustomError, copySlides, fill, fillRecords, localAssetSources, moveToCustom, parseSlideSelection, sameRecord, updateFromCatalog } from './chunk-
|
|
1
|
+
import { defaultCatalogs } from './chunk-2ZQBMZTZ.js';
|
|
2
|
+
import { stats, embed, edit, OPFApiError, asApiError } from './chunk-GLLR3AQ5.js';
|
|
3
|
+
export { OPFApiError, OPFExportError, OPFImportError, OPFMoveToCustomError, copySlides, fill, fillRecords, localAssetSources, moveToCustom, parseSlideSelection, sameRecord, updateFromCatalog } from './chunk-GLLR3AQ5.js';
|
|
4
4
|
export { specFileEntries, specFileKinds, specFilePaths } from './chunk-UJSAR6GF.js';
|
|
5
5
|
export { FONT_POLICY, applyFontPolicyDecisions, fontAvailabilityDiagnostics, fontPolicyFor } from './chunk-PJSPHHRK.js';
|
|
6
6
|
export { OPFDataImportError, ingest, parseTabularData } from './chunk-TKQ2VFV5.js';
|
|
7
|
-
import { paginate } from './chunk-
|
|
8
|
-
export { OPFPaginationError, paginateSlide } from './chunk-
|
|
9
|
-
export { DECK_FORMATS, deckFormatOf, parse, stringify } from './chunk-
|
|
10
|
-
export { fromMarkdown, toMarkdown } from './chunk-
|
|
11
|
-
import './chunk-
|
|
12
|
-
import './chunk-
|
|
13
|
-
export { OPFMarkdownError } from './chunk-
|
|
14
|
-
import './chunk-
|
|
15
|
-
export { diff, merge } from './chunk-
|
|
16
|
-
import { validate, OPFValidationError } from './chunk-
|
|
17
|
-
export { CATALOG_SCHEMA, DEFAULT_VALIDATION_THRESHOLDS, OPFPatchError, OPFPatchValidationError, OPFValidationError, applyPatch, assertValid, assertValidCatalogRecord, catalogDisplayKinds, catalogSchemaNames, findValidationRule, resolveSlideContext, validateCatalogRecord, validationCategories, validationRules } from './chunk-
|
|
7
|
+
import { paginate } from './chunk-54OV2WQC.js';
|
|
8
|
+
export { OPFPaginationError, paginateSlide } from './chunk-54OV2WQC.js';
|
|
9
|
+
export { DECK_FORMATS, deckFormatOf, parse, stringify } from './chunk-FXNUM2PN.js';
|
|
10
|
+
export { fromMarkdown, toMarkdown } from './chunk-WASENX2R.js';
|
|
11
|
+
import './chunk-7RY7QWWJ.js';
|
|
12
|
+
import './chunk-PB5X2VSV.js';
|
|
13
|
+
export { OPFMarkdownError } from './chunk-DEI2M2H6.js';
|
|
14
|
+
import './chunk-PXOXTJTN.js';
|
|
15
|
+
export { diff, merge } from './chunk-YVNFACTC.js';
|
|
16
|
+
import { validate, OPFValidationError } from './chunk-NJWI6MPT.js';
|
|
17
|
+
export { CATALOG_SCHEMA, DEFAULT_VALIDATION_THRESHOLDS, OPFPatchError, OPFPatchValidationError, OPFValidationError, applyPatch, assertValid, assertValidCatalogRecord, catalogDisplayKinds, catalogSchemaNames, findValidationRule, resolveSlideContext, validateCatalogRecord, validationCategories, validationRules } from './chunk-NJWI6MPT.js';
|
|
18
18
|
export { CATALOG_GROUP_PATTERN, CATALOG_REFERENCE_PATTERN, CHART_TYPES, DEFAULT_VARIABLE_DATE_FORMAT, ENGINE_DEFAULT_CHART_TYPES, ENGINE_DEFAULT_COLOR_SCHEME, ENGINE_DEFAULT_FONT_SCHEME, ENGINE_DEFAULT_THEME, LANGUAGES, LOGO_SHAPES, OPFCatalogsOptionError, OPFUnresolvedReferenceError, OPFVariableError, SLIDE_SCOPED_BUILTINS, SOCIAL_PLATFORMS, VARIABLE_KINDS, catalogGroupSource, catalogKinds, catalogRecords, catalogReferenceSites, chartNumber, coerceVariableValue, datasetDiagnostics, formatDataNumber, formatVariableNumber, fromExcelNumberFormat, hasContentVariables, inlineChartData, inlineDatasets, inlineTableData, isDatasetRef, isTemplate, isXYChartType, listBuiltinVariables, listVariables, normalizeLanguageFamily, numberFormatError, parseReference, resolveChartData, resolveDesignRecords, resolveFontScheme, resolveReference, resolveSlideVariables, resolveTableData, resolveVariables, suggestChartNumberFix, tableCellDisplayValue, toExcelNumberFormat, unresolvedReference, unusedDatasets, variableDeclarations } from './chunk-XRMV2GMB.js';
|
|
19
|
-
export { OPFFormatError, format } from './chunk-
|
|
20
|
-
export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-
|
|
19
|
+
export { OPFFormatError, format } from './chunk-EQ6S5SEZ.js';
|
|
20
|
+
export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-F4HFDP6I.js';
|
|
21
21
|
|
|
22
22
|
// src/index.ts
|
|
23
23
|
var withDefaultCatalog = (options) => {
|
|
@@ -30,7 +30,7 @@ var stats2 = (presentation2, options) => stats(presentation2, withDefaultCatalog
|
|
|
30
30
|
var paginate2 = (input, options) => paginate(input, withDefaultCatalog(options));
|
|
31
31
|
var embed2 = (document, options) => embed(document, withDefaultCatalog(options));
|
|
32
32
|
var edit2 = (deck, patch, options) => edit(deck, patch, withDefaultCatalog(options));
|
|
33
|
-
var engine = () => import('./conversion-
|
|
33
|
+
var engine = () => import('./conversion-F4UCOGR7.js');
|
|
34
34
|
var rethrow = (error, fallback) => {
|
|
35
35
|
if (error instanceof OPFValidationError) throw error;
|
|
36
36
|
throw asApiError(OPFApiError, error, fallback);
|
package/dist/markdown.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { fromMarkdown, toMarkdown } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
export { OPFMarkdownError } from './chunk-
|
|
4
|
-
import './chunk-
|
|
5
|
-
import './chunk-
|
|
1
|
+
export { fromMarkdown, toMarkdown } from './chunk-WASENX2R.js';
|
|
2
|
+
import './chunk-7RY7QWWJ.js';
|
|
3
|
+
export { OPFMarkdownError } from './chunk-DEI2M2H6.js';
|
|
4
|
+
import './chunk-PXOXTJTN.js';
|
|
5
|
+
import './chunk-NJWI6MPT.js';
|
|
6
6
|
import './chunk-XRMV2GMB.js';
|
|
7
|
-
import './chunk-
|
|
7
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/node-engine.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { b as DeckReport, c as DeckReportOptions, r as readDeckReport } from './deck-report-5vwMGcQz.js';
|
|
2
|
-
import { F as FontsHandle, j as EmbeddedFace, R as Renderer, k as Reporter, P as Peer, l as PptxModule, f as OPFApiError } from './conversion-
|
|
3
|
-
export { m as ConversionPlan, D as Diagnostic, n as EXPORT_FORMATS, o as EXPORT_TEXT, q as ExportContext, r as ExportFile, s as ExportFontSummary, E as ExportFormat, t as ExportOptions, u as ExportResult, v as ExportRun, w as ExportText, I as ImportOptions, x as ImportResult, g as OPFExportError, h as OPFImportError, y as PEER_RANGES, z as PPTX_PACKAGE, A as PreparedExport, B as RENDER_EXTRAS, G as RENDER_PACKAGE, H as ReportFinding, J as ResolvedExportOptions, i as SlideSelection, K as Source, V as VERSIONS, L as asApiError, M as assetRoot, N as checkDate, Q as checkOptions, T as checkRenamedOptions, U as checkScale, W as deckFileFormat, X as exportFormatOf, Y as finishReport, Z as importPresentation, _ as loadPptx, $ as loadRenderer, a0 as locatePackage, a1 as missingPeerFrom, p as parseSlideSelection, a2 as planConversion, a3 as prepareExport, a4 as reaches, a5 as readInput, a6 as reportThrown, a7 as resolveExportOptions, a8 as runExport, a9 as runPreparedExport, aa as writePlanned } from './conversion-
|
|
2
|
+
import { F as FontsHandle, j as EmbeddedFace, R as Renderer, k as Reporter, P as Peer, l as PptxModule, f as OPFApiError } from './conversion-BjsKgxBZ.js';
|
|
3
|
+
export { m as ConversionPlan, D as Diagnostic, n as EXPORT_FORMATS, o as EXPORT_TEXT, q as ExportContext, r as ExportFile, s as ExportFontSummary, E as ExportFormat, t as ExportOptions, u as ExportResult, v as ExportRun, w as ExportText, I as ImportOptions, x as ImportResult, g as OPFExportError, h as OPFImportError, y as PEER_RANGES, z as PPTX_PACKAGE, A as PreparedExport, B as RENDER_EXTRAS, G as RENDER_PACKAGE, H as ReportFinding, J as ResolvedExportOptions, i as SlideSelection, K as Source, V as VERSIONS, L as asApiError, M as assetRoot, N as checkDate, Q as checkOptions, T as checkRenamedOptions, U as checkScale, W as deckFileFormat, X as exportFormatOf, Y as finishReport, Z as importPresentation, _ as loadPptx, $ as loadRenderer, a0 as locatePackage, a1 as missingPeerFrom, p as parseSlideSelection, a2 as planConversion, a3 as prepareExport, a4 as reaches, a5 as readInput, a6 as reportThrown, a7 as resolveExportOptions, a8 as runExport, a9 as runPreparedExport, aa as writePlanned } from './conversion-BjsKgxBZ.js';
|
|
4
4
|
import { a as Catalog } from './catalog-refs-BSfGELpt.js';
|
|
5
5
|
import { e as PresentationPaginationResult } from './pagination-D_kJe4jH.js';
|
|
6
6
|
import './presentation-Bwo8Ko6D.js';
|
package/dist/node-engine.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { loadRenderer, listFontDirectories, leaseSharedFonts, prepareFonts } from './chunk-
|
|
2
|
-
export { EXPORT_FORMATS, EXPORT_TEXT, PEER_RANGES, PPTX_PACKAGE, RENDER_EXTRAS, RENDER_PACKAGE, Reporter, VERSIONS, assetRoot, checkDate, checkDestinations, checkOptions, checkOutputPattern, checkRenamedOptions, checkScale, createZip, deckFileFormat, deckStem, embeddedFor, exportFormatOf, finishReport, importPresentation, leaseSharedFonts, listFontDirectories, loadPptx, loadRenderer, localAssetProblems, locatePackage, missingPeerFrom, padNumber, planConversion, pointerOf, prepareExport, prepareFonts, publishNew, reaches, readInput, reportThrown, resolveExportOptions, runExport, runImport, runPreparedExport, stemOf, writeFiles, writePlanned } from './chunk-
|
|
3
|
-
import { defaultCatalogs } from './chunk-
|
|
4
|
-
export { defaultCatalogs, galleryMismatch } from './chunk-
|
|
5
|
-
import { OPFApiError } from './chunk-
|
|
6
|
-
export { OPFApiError, OPFExportError, OPFImportError, asApiError, parseSlideSelection } from './chunk-
|
|
1
|
+
import { loadRenderer, listFontDirectories, leaseSharedFonts, prepareFonts } from './chunk-34LIUOT7.js';
|
|
2
|
+
export { EXPORT_FORMATS, EXPORT_TEXT, PEER_RANGES, PPTX_PACKAGE, RENDER_EXTRAS, RENDER_PACKAGE, Reporter, VERSIONS, assetRoot, checkDate, checkDestinations, checkOptions, checkOutputPattern, checkRenamedOptions, checkScale, createZip, deckFileFormat, deckStem, embeddedFor, exportFormatOf, finishReport, importPresentation, leaseSharedFonts, listFontDirectories, loadPptx, loadRenderer, localAssetProblems, locatePackage, missingPeerFrom, padNumber, planConversion, pointerOf, prepareExport, prepareFonts, publishNew, reaches, readInput, reportThrown, resolveExportOptions, runExport, runImport, runPreparedExport, stemOf, writeFiles, writePlanned } from './chunk-34LIUOT7.js';
|
|
3
|
+
import { defaultCatalogs } from './chunk-2ZQBMZTZ.js';
|
|
4
|
+
export { defaultCatalogs, galleryMismatch } from './chunk-2ZQBMZTZ.js';
|
|
5
|
+
import { OPFApiError } from './chunk-GLLR3AQ5.js';
|
|
6
|
+
export { OPFApiError, OPFExportError, OPFImportError, asApiError, parseSlideSelection } from './chunk-GLLR3AQ5.js';
|
|
7
7
|
import './chunk-UJSAR6GF.js';
|
|
8
8
|
import './chunk-PJSPHHRK.js';
|
|
9
9
|
import './chunk-TKQ2VFV5.js';
|
|
10
|
-
import { paginate } from './chunk-
|
|
11
|
-
export { readDeckReport } from './chunk-
|
|
12
|
-
import './chunk-
|
|
13
|
-
import './chunk-
|
|
14
|
-
import './chunk-
|
|
15
|
-
import './chunk-
|
|
16
|
-
import './chunk-
|
|
17
|
-
import './chunk-
|
|
18
|
-
import './chunk-
|
|
10
|
+
import { paginate } from './chunk-54OV2WQC.js';
|
|
11
|
+
export { readDeckReport } from './chunk-FXNUM2PN.js';
|
|
12
|
+
import './chunk-WASENX2R.js';
|
|
13
|
+
import './chunk-7RY7QWWJ.js';
|
|
14
|
+
import './chunk-PB5X2VSV.js';
|
|
15
|
+
import './chunk-DEI2M2H6.js';
|
|
16
|
+
import './chunk-PXOXTJTN.js';
|
|
17
|
+
import './chunk-YVNFACTC.js';
|
|
18
|
+
import './chunk-NJWI6MPT.js';
|
|
19
19
|
import './chunk-XRMV2GMB.js';
|
|
20
|
-
import './chunk-
|
|
21
|
-
import './chunk-
|
|
20
|
+
import './chunk-EQ6S5SEZ.js';
|
|
21
|
+
import './chunk-F4HFDP6I.js';
|
|
22
22
|
|
|
23
23
|
// src/node/paginate.ts
|
|
24
24
|
async function paginateDeck(deck, options) {
|
package/dist/pagination.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { OPFPaginationError, paginate, paginateSlide } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { OPFPaginationError, paginate, paginateSlide } from './chunk-54OV2WQC.js';
|
|
2
|
+
import './chunk-NJWI6MPT.js';
|
|
3
3
|
import './chunk-XRMV2GMB.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/patch.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { OPFPatchError, OPFPatchValidationError, applyPatch, applyPatchWithInverse, escapePointerToken, formatPointer, getAtPointer, hasPointer, invertPatch, jsonEqual, normalizePatch, parsePointer, pointerFromPath, readPointer, splitPointer, unescapePointerToken } from './chunk-
|
|
1
|
+
export { OPFPatchError, OPFPatchValidationError, applyPatch, applyPatchWithInverse, escapePointerToken, formatPointer, getAtPointer, hasPointer, invertPatch, jsonEqual, normalizePatch, parsePointer, pointerFromPath, readPointer, splitPointer, unescapePointerToken } from './chunk-NJWI6MPT.js';
|
|
2
2
|
import './chunk-XRMV2GMB.js';
|
|
3
|
-
import './chunk-
|
|
3
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
import { C as CatalogRecordKind } from './catalog-schemas-DoxA2BgY.js';
|
|
2
|
+
import { SchemaName } from './schemas.js';
|
|
2
3
|
import './catalog-refs-BSfGELpt.js';
|
|
3
|
-
import './schemas.js';
|
|
4
4
|
import './json-BFSdESOE.js';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Which catalog a reference field points into, kept beside the schemas rather than in them: the published schemas
|
|
8
|
+
* (spec/schemas, openpresentation.org/schema/...) carry no vendor keyword, so any Ajv in strict mode (the default) compiles
|
|
9
|
+
* them without `addKeyword`. `check:schema-strict` keeps it that way.
|
|
10
|
+
*
|
|
11
|
+
* Keys are `<schema name>#<JSON Pointer of the node in that schema document>` (the schema names of `@openpresentation/opf/schemas`);
|
|
12
|
+
* the node is the one at the pointer as written, a `$ref` and its siblings included. Values are the catalog record kind the
|
|
13
|
+
* field references. The annotation never changes validation: `describeField` and `catalogKindAt` read it, nothing else.
|
|
14
|
+
* A test fails when a pointer leaves its schema or a schema reference field is missing here.
|
|
15
|
+
*/
|
|
16
|
+
type SchemaNodeKey = `${SchemaName}#/${string}`;
|
|
17
|
+
declare const schemaCatalogKinds: Readonly<Record<SchemaNodeKey, CatalogRecordKind>>;
|
|
18
|
+
|
|
6
19
|
/**
|
|
7
20
|
* `@openpresentation/opf/schema`: the field model of an OPF document, read from the JSON Schemas.
|
|
8
21
|
*
|
|
@@ -10,7 +23,8 @@ import './json-BFSdESOE.js';
|
|
|
10
23
|
* `listSchemaFields`, ...) move here from the editor so that the CLI, agents and every editor read the schemas one way. On top of
|
|
11
24
|
* them, `describeField(path, document?)` answers what a source editor needs at any position (the types, enum values,
|
|
12
25
|
* description, required members and ranked children of the node) and `catalogKindAt(path, document?)` names the catalog a
|
|
13
|
-
* reference field points into, from
|
|
26
|
+
* reference field points into, from `schemaCatalogKinds`, core-side metadata kept beside the schemas (the published schemas carry
|
|
27
|
+
* no vendor keyword, so they compile under strict Ajv; the metadata never changes validation).
|
|
14
28
|
*
|
|
15
29
|
* Browser-safe: no `node:` imports. Types are deliberately loose (`JsonSchema`), the schemas being plain JSON.
|
|
16
30
|
*/
|
|
@@ -143,9 +157,9 @@ interface FieldInfo {
|
|
|
143
157
|
declare function describeField(path: OpfPath, document?: unknown): FieldInfo;
|
|
144
158
|
/**
|
|
145
159
|
* The catalog kind a field references (`layouts`, `themes`, `colorSchemes`, `fontSchemes`, `narratives`, `audiences`,
|
|
146
|
-
* `purposes`, `tones`), read from
|
|
160
|
+
* `purposes`, `tones`), read from `schemaCatalogKinds` for the schema node at `path`; undefined for every other field.
|
|
147
161
|
* Languages are an engine vocabulary, not a catalog: `language` is not a reference.
|
|
148
162
|
*/
|
|
149
163
|
declare function catalogKindAt(path: OpfPath, document?: unknown): CatalogRecordKind | undefined;
|
|
150
164
|
|
|
151
|
-
export { COMMON_KEYS, CatalogRecordKind, type EnumValue, type FieldChild, type FieldInfo, type JsonSchema, type OpfPath, type SchemaField, type SchemaRoot, UNRANKED_PRIORITY, type VariantInfo, activeSchema, catalogKindAt, createSchemaValue, describeField, isPromotedRegionKey, listSchemaFields, resolveSchema, schemaAtPath, schemaLabel, schemaType, schemaVariants, splitOpfPath };
|
|
165
|
+
export { COMMON_KEYS, CatalogRecordKind, type EnumValue, type FieldChild, type FieldInfo, type JsonSchema, type OpfPath, type SchemaField, type SchemaNodeKey, type SchemaRoot, UNRANKED_PRIORITY, type VariantInfo, activeSchema, catalogKindAt, createSchemaValue, describeField, isPromotedRegionKey, listSchemaFields, resolveSchema, schemaAtPath, schemaCatalogKinds, schemaLabel, schemaType, schemaVariants, splitOpfPath };
|
package/dist/schema.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { COMMON_KEYS, UNRANKED_PRIORITY, activeSchema, catalogKindAt, createSchemaValue, describeField, isPromotedRegionKey, listSchemaFields, resolveSchema, schemaAtPath, schemaLabel, schemaType, schemaVariants, splitOpfPath } from './chunk-
|
|
1
|
+
export { COMMON_KEYS, UNRANKED_PRIORITY, activeSchema, catalogKindAt, createSchemaValue, describeField, isPromotedRegionKey, listSchemaFields, resolveSchema, schemaAtPath, schemaCatalogKinds, schemaLabel, schemaType, schemaVariants, splitOpfPath } from './chunk-NJWI6MPT.js';
|
|
2
2
|
import './chunk-XRMV2GMB.js';
|
|
3
|
-
import './chunk-
|
|
3
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/schemas.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-
|
|
1
|
+
export { audience, chartType, colorScheme, fontScheme, language, layout, narrative, presentation, purpose, schemaEntries, schemaNames, schemas, socialPlatform, theme, tone } from './chunk-F4HFDP6I.js';
|
package/dist/source.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { createLocator, parsePointer } from './chunk-
|
|
2
|
-
export { analyzeJsonSyntax, applyTextEdits } from './chunk-
|
|
1
|
+
import { createLocator, parsePointer } from './chunk-NJWI6MPT.js';
|
|
2
|
+
export { analyzeJsonSyntax, applyTextEdits } from './chunk-NJWI6MPT.js';
|
|
3
3
|
import './chunk-XRMV2GMB.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-F4HFDP6I.js';
|
|
5
5
|
import { findNodeAtOffset, getNodePath, parseTree } from 'jsonc-parser';
|
|
6
6
|
|
|
7
7
|
var isJson = (format) => format === "json";
|
|
@@ -62,14 +62,12 @@
|
|
|
62
62
|
"examples": ["Bob Lee", ["Bob Lee", "Carla Diaz"]]
|
|
63
63
|
},
|
|
64
64
|
"audience": {
|
|
65
|
-
"x-opf-catalog": "audiences",
|
|
66
65
|
"oneOf": [
|
|
67
66
|
{ "type": "string" },
|
|
68
67
|
{ "$ref": "#/$defs/Audience" },
|
|
69
68
|
{
|
|
70
69
|
"type": "array",
|
|
71
70
|
"items": {
|
|
72
|
-
"x-opf-catalog": "audiences",
|
|
73
71
|
"oneOf": [
|
|
74
72
|
{ "type": "string" },
|
|
75
73
|
{ "$ref": "#/$defs/Audience" }
|
|
@@ -98,7 +96,6 @@
|
|
|
98
96
|
]
|
|
99
97
|
},
|
|
100
98
|
"purpose": {
|
|
101
|
-
"x-opf-catalog": "purposes",
|
|
102
99
|
"oneOf": [
|
|
103
100
|
{ "type": "string" },
|
|
104
101
|
{ "$ref": "#/$defs/Purpose" }
|
|
@@ -127,7 +124,6 @@
|
|
|
127
124
|
]
|
|
128
125
|
},
|
|
129
126
|
"tone": {
|
|
130
|
-
"x-opf-catalog": "tones",
|
|
131
127
|
"oneOf": [{ "$ref": "#/$defs/CatalogReference" }, { "$ref": "#/$defs/Tone" }],
|
|
132
128
|
"description": "Desired tone for the presentation. Accepts either:\n- A tones reference: a bare id ('formal') or 'name:id' for a record of a named catalogs group.\n- An inline Tone object for custom tone metadata or overrides on a referenced record. Object form has the fields of https://openpresentation.org/schema/opf-tone/v1.\n\nA reference resolves like every content reference (see catalogs); one that resolves nowhere is the warning opf/unresolved-reference. Nothing is drawn from the tone.",
|
|
133
129
|
"examples": [
|
|
@@ -185,7 +181,6 @@
|
|
|
185
181
|
"default": false
|
|
186
182
|
},
|
|
187
183
|
"narrative": {
|
|
188
|
-
"x-opf-catalog": "narratives",
|
|
189
184
|
"$ref": "#/$defs/CatalogReference",
|
|
190
185
|
"description": "The deck's narrative plan, by reference: a bare narratives id ('classic-story') or 'name:id' for a record of a named catalogs group ('acme:founder-pitch'). The deck holds only this pointer; the plan (the arc, its beats and what each beat must do) lives in the record, which has the fields of https://openpresentation.org/schema/opf-narrative/v1. A narrative the document defines itself is a record in catalogs.custom.narratives, referenced here by its key.\n\nSlides link themselves to beats with slides[].beat. Core validate warns about a slides[].beat id the resolved narrative does not define and about a root 'duration' outside its 'duration' range, and reports a beat that no slide references. The preview and the PPTX export draw nothing from the narrative; opf-pptx stores the reference for round-trip.\n\nThe reference resolves like every content reference (see catalogs); one that resolves nowhere is the warning opf/unresolved-reference, never an error.\n\nDeck-level concerns that are not part of the storyline (audience, tone, takeaway, duration) live as siblings on the presentation root.",
|
|
191
186
|
"examples": ["classic-story", "problem-solution", "scqa", "pitch-deck", "acme:founder-pitch"]
|
|
@@ -282,7 +277,6 @@
|
|
|
282
277
|
],
|
|
283
278
|
"properties": {
|
|
284
279
|
"id": {
|
|
285
|
-
"x-opf-catalog": "audiences",
|
|
286
280
|
"$ref": "#/$defs/CatalogReference",
|
|
287
281
|
"description": "Optional audiences reference (a bare id or 'name:id') resolved before applying the inline overrides.",
|
|
288
282
|
"examples": ["executive", "board", "engineering-team"]
|
|
@@ -345,7 +339,6 @@
|
|
|
345
339
|
],
|
|
346
340
|
"properties": {
|
|
347
341
|
"id": {
|
|
348
|
-
"x-opf-catalog": "purposes",
|
|
349
342
|
"$ref": "#/$defs/CatalogReference",
|
|
350
343
|
"description": "Optional purposes reference (a bare id or 'name:id') resolved before applying the inline overrides.",
|
|
351
344
|
"examples": ["inform", "decide", "align", "persuade", "educate"]
|
|
@@ -425,12 +418,10 @@
|
|
|
425
418
|
"examples": ["Latn", "Cyrl", "Grek", "Arab", "Hebr", "Jpan", "Kore", "Hans", "Hant", "Deva", "Thai"]
|
|
426
419
|
},
|
|
427
420
|
"fontScheme": {
|
|
428
|
-
"x-opf-catalog": "fontSchemes",
|
|
429
421
|
"$ref": "#/$defs/CatalogReference",
|
|
430
422
|
"description": "Font-scheme reference (a bare id or 'name:id') for this language's script slot when targeting PowerPoint output. Its major/minor families fill the language's script slot (eastAsian or complexScript, chosen by 'script') unless the effective design font scheme sets that slot itself; the latin slot always follows the design font scheme. Without it, engines use the default script fonts of their language vocabulary."
|
|
431
423
|
},
|
|
432
424
|
"googleFontScheme": {
|
|
433
|
-
"x-opf-catalog": "fontSchemes",
|
|
434
425
|
"$ref": "#/$defs/CatalogReference",
|
|
435
426
|
"description": "Font-scheme reference (a bare id or 'name:id') used in place of 'fontScheme' when resolving script fonts for Google Slides output."
|
|
436
427
|
},
|
|
@@ -458,7 +449,6 @@
|
|
|
458
449
|
],
|
|
459
450
|
"properties": {
|
|
460
451
|
"id": {
|
|
461
|
-
"x-opf-catalog": "tones",
|
|
462
452
|
"$ref": "#/$defs/CatalogReference",
|
|
463
453
|
"description": "Optional tones reference (a bare id or 'name:id') resolved before applying the inline overrides.",
|
|
464
454
|
"examples": ["formal", "casual", "technical", "persuasive"]
|
|
@@ -658,13 +648,11 @@
|
|
|
658
648
|
"description": "Visual design system applied to the presentation; individual slides may override fields via Slide.design.",
|
|
659
649
|
"properties": {
|
|
660
650
|
"theme": {
|
|
661
|
-
"x-opf-catalog": "themes",
|
|
662
651
|
"$ref": "#/$defs/CatalogReference",
|
|
663
652
|
"description": "Theme for the deck: a themes reference, a bare id ('minimal') or 'name:id' ('acme:brand'). The theme supplies the default colour scheme, font scheme, background and dimensions; design.colorScheme, design.fontScheme, design.background and design.dimensions override it field by field. A reference that resolves nowhere is the warning opf/unresolved-reference and engines use the engine default theme.",
|
|
664
653
|
"examples": ["minimal", "classic", "bold", "acme:brand"]
|
|
665
654
|
},
|
|
666
655
|
"colorScheme": {
|
|
667
|
-
"x-opf-catalog": "colorSchemes",
|
|
668
656
|
"oneOf": [
|
|
669
657
|
{ "type": "string" },
|
|
670
658
|
{ "$ref": "#/$defs/ColorScheme" }
|
|
@@ -678,7 +666,6 @@
|
|
|
678
666
|
]
|
|
679
667
|
},
|
|
680
668
|
"fontScheme": {
|
|
681
|
-
"x-opf-catalog": "fontSchemes",
|
|
682
669
|
"oneOf": [
|
|
683
670
|
{ "type": "string" },
|
|
684
671
|
{ "$ref": "#/$defs/FontScheme" }
|
|
@@ -798,7 +785,6 @@
|
|
|
798
785
|
"description": "Color palette used by the design system. Every slot and role is a hex color ('#RGB', '#RRGGBB' or '#RRGGBBAA'); a color-scheme name or a 'var:<id>' reference is not valid here, because those resolve through the scheme. The slot fields (accent1-accent6, dark1, dark2, light1, light2, hyperlink, followedHyperlink) mirror color-scheme.schema.json (https://openpresentation.org/schema/opf-color-scheme/v1) so library records and inline OPF overrides are interchangeable on those fields.\n\nTwo parallel models are supported and may be mixed:\n- OOXML slots - the 12-slot PowerPoint theme model that round-trips directly to OOXML. Use these for full control over the palette as PowerPoint sees it.\n- Abstract roles (primary, secondary, accent, background, surface, text, textSecondary) - OPF-specific semantic aliases the engine maps onto the OOXML slots. Convenient for inline overrides without thinking in slot numbers; not part of the catalog record schema.\n\nIn design.colorScheme, 'id' resolves a colorSchemes record as the base; slot and role overrides on the same object take precedence over the resolved scheme. The string form of design.colorScheme is equivalent to setting only 'id'.",
|
|
799
786
|
"properties": {
|
|
800
787
|
"id": {
|
|
801
|
-
"x-opf-catalog": "colorSchemes",
|
|
802
788
|
"$ref": "#/$defs/CatalogReference",
|
|
803
789
|
"description": "Colour-scheme reference (a bare id or 'name:id') resolved as the base; slot and role overrides on the surrounding ColorScheme object take precedence over the resolved scheme.",
|
|
804
790
|
"examples": ["cool-horizon", "boost", "burnt-orange", "ocean-depth", "corporate-blue"]
|
|
@@ -905,7 +891,6 @@
|
|
|
905
891
|
"description": "Typography selections used by the design system. The pair fields (major, minor) and refinement fields (type, app, languageFamily) mirror font-scheme.schema.json (https://openpresentation.org/schema/opf-font-scheme/v1) so library records and inline OPF overrides are interchangeable on those fields.\n\nTwo parallel models are supported and may be mixed:\n- OOXML pairs (major, minor) - heading and body family names that round-trip directly to PowerPoint majorFont/minorFont entries.\n- Abstract roles (heading, body, accent, code) - OPF-specific font family names the engine maps onto the OOXML pair when serializing. Convenient for inline overrides and for adding accent/code roles that don't have a direct OOXML slot. Catalog records may also carry 'code' (for example the consolas and courier-new records); heading, body and accent are not part of the catalog record schema. A role is a family name only: weight, style and tracking come from the text styles, and PowerPoint has no numeric weight.\n\nIn design.fontScheme, 'id' resolves a fontSchemes record as the base; pair and role overrides on the same object take precedence over the resolved scheme. The string form of design.fontScheme is equivalent to setting only 'id'.",
|
|
906
892
|
"properties": {
|
|
907
893
|
"id": {
|
|
908
|
-
"x-opf-catalog": "fontSchemes",
|
|
909
894
|
"$ref": "#/$defs/CatalogReference",
|
|
910
895
|
"description": "Font-scheme reference (a bare id or 'name:id') resolved as the base; field overrides on the surrounding FontScheme object take precedence over the resolved scheme.",
|
|
911
896
|
"examples": ["aptos", "tenorite", "seaford", "noto-sans", "modern-sans", "classic-serif"]
|
|
@@ -1952,7 +1937,6 @@
|
|
|
1952
1937
|
"description": "Optional reference to one or more beats of the deck's narrative (each value is the id of a beat in the narrative record that the root 'narrative' resolves to). A single string declares the slide's primary beat; an array declares that one slide covers multiple beats. Declares the slide's role in the story arc; does not constrain ordering or structure. Core validate warns about a beat id the resolved narrative does not define, and reports a beat that no slide references. Slides without a beat are valid; multiple slides may share a beat."
|
|
1953
1938
|
},
|
|
1954
1939
|
"layout": {
|
|
1955
|
-
"x-opf-catalog": "layouts",
|
|
1956
1940
|
"$ref": "#/$defs/CatalogReference",
|
|
1957
1941
|
"description": "Optional layout: a layouts reference, a bare id ('pillars') or 'name:id' ('acme:hero'), or 'auto'. When omitted or 'auto', the slide is composed with no layout record: engines arrange title, subtitle, tag and content automatically, a slide with no body payload is a cover (vertically centered), and design hints apply; there is no finding. 'auto' is reserved, so no catalog may define a layout of that id, and opf format drops it. A layout is a grid template (layout.schema.json): the slide's content stays flat and binds to the layout's regions by reading order, role and kind, a block may pin itself to a region with 'region', and an empty region collapses. A reference that resolves nowhere is the warning opf/unresolved-reference (and the 'unresolved-reference' diagnostic of resolveSlideContext), the slide composes automatically, and a strict export fails. A layout id of the 0.18 default catalog that 0.19 no longer has is such a reference: 0.19 has no migration path for layouts. A layout never changes what a slide contains, and engines never substitute a different layout.",
|
|
1958
1942
|
"examples": ["cover", "pillars", "chart-beside", "auto", "acme:hero"]
|
|
@@ -50,14 +50,12 @@
|
|
|
50
50
|
]
|
|
51
51
|
},
|
|
52
52
|
"colorScheme": {
|
|
53
|
-
"x-opf-catalog": "colorSchemes",
|
|
54
53
|
"type": "string",
|
|
55
54
|
"pattern": "^(?:[a-z][a-z0-9-]*:)?[a-z][a-z0-9-]*$",
|
|
56
55
|
"description": "The theme's default colour scheme: a reference (a bare id or 'name:id') resolved like design.colorScheme, but in the theme's own catalogs group first.",
|
|
57
56
|
"examples": ["cool-horizon", "boost", "burnt-orange"]
|
|
58
57
|
},
|
|
59
58
|
"fontScheme": {
|
|
60
|
-
"x-opf-catalog": "fontSchemes",
|
|
61
59
|
"type": "string",
|
|
62
60
|
"pattern": "^(?:[a-z][a-z0-9-]*:)?[a-z][a-z0-9-]*$",
|
|
63
61
|
"description": "The theme's default font scheme: a reference (a bare id or 'name:id') resolved like design.fontScheme, but in the theme's own catalogs group first.",
|
package/dist/validator.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, findValidationRule, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-
|
|
1
|
+
export { DEFAULT_VALIDATION_THRESHOLDS, OPFValidationError, assertValid, assertValidCatalogRecord, findValidationRule, validate, validateCatalogRecord, validationCategories, validationRules } from './chunk-NJWI6MPT.js';
|
|
2
2
|
export { promotedRegionKeys } from './chunk-XRMV2GMB.js';
|
|
3
|
-
import './chunk-
|
|
3
|
+
import './chunk-F4HFDP6I.js';
|
package/dist/yaml.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { OPFYamlError, YAML_SCHEMA_URL, fromYaml, parseYamlData, scanYamlComments, toYaml } from './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-
|
|
1
|
+
export { OPFYamlError, YAML_SCHEMA_URL, fromYaml, parseYamlData, scanYamlComments, toYaml } from './chunk-PB5X2VSV.js';
|
|
2
|
+
import './chunk-DEI2M2H6.js';
|
|
3
|
+
import './chunk-PXOXTJTN.js';
|
|
4
|
+
import './chunk-NJWI6MPT.js';
|
|
5
5
|
import './chunk-XRMV2GMB.js';
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
6
|
+
import './chunk-EQ6S5SEZ.js';
|
|
7
|
+
import './chunk-F4HFDP6I.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openpresentation/opf",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.3",
|
|
4
4
|
"description": "Canonical Open Presentation Format schemas, TypeScript types, local validation and composition; in Node, the file API and the CLI defaults register the pptx.gallery catalog of @openpresentation/gallery.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Open Presentation",
|
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
"ajv-formats": "^3.0.1",
|
|
146
146
|
"jsonc-parser": "3.3.1",
|
|
147
147
|
"yaml": "^2.9.1",
|
|
148
|
-
"@openpresentation/gallery": "^0.26.
|
|
148
|
+
"@openpresentation/gallery": "^0.26.3"
|
|
149
149
|
},
|
|
150
150
|
"devDependencies": {
|
|
151
151
|
"@expo-google-fonts/arimo": "0.4.3",
|
|
@@ -165,8 +165,8 @@
|
|
|
165
165
|
"typescript": "~5.9.3"
|
|
166
166
|
},
|
|
167
167
|
"peerDependencies": {
|
|
168
|
-
"@openpresentation/opf-pptx": "^0.26.
|
|
169
|
-
"@openpresentation/opf-render": "^0.26.
|
|
168
|
+
"@openpresentation/opf-pptx": "^0.26.3",
|
|
169
|
+
"@openpresentation/opf-render": "^0.26.3"
|
|
170
170
|
},
|
|
171
171
|
"peerDependenciesMeta": {
|
|
172
172
|
"@openpresentation/opf-pptx": {
|
|
@@ -186,5 +186,5 @@
|
|
|
186
186
|
"test:packed": "node test/packed-install-smoke.mjs",
|
|
187
187
|
"pack:dry-run": "pnpm run build:deps && pnpm run build && npm pack --dry-run --cache /tmp/opf-npm-cache"
|
|
188
188
|
},
|
|
189
|
-
"gitHead": "
|
|
189
|
+
"gitHead": "570ebe0c803e9613f6b9f9fcca8160b38b16a826"
|
|
190
190
|
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export { convertFiles, deckFileFormat, exportFormatOf, openDeck, planConversion, readInput, saveDeck, writePlanned } from './chunk-5VJCLUUA.js';
|
|
2
|
-
import './chunk-XFK4KPKK.js';
|
|
3
|
-
import './chunk-OFWBICDO.js';
|
|
4
|
-
import './chunk-UJSAR6GF.js';
|
|
5
|
-
import './chunk-PJSPHHRK.js';
|
|
6
|
-
import './chunk-TKQ2VFV5.js';
|
|
7
|
-
import './chunk-L65YNP4J.js';
|
|
8
|
-
import './chunk-NWO6HT4F.js';
|
|
9
|
-
import './chunk-Q6KMKTEH.js';
|
|
10
|
-
import './chunk-CRCOQ4K2.js';
|
|
11
|
-
import './chunk-7YZ72FRP.js';
|
|
12
|
-
import './chunk-6JAFSZVL.js';
|
|
13
|
-
import './chunk-O2ST5ZKL.js';
|
|
14
|
-
import './chunk-LN2ASLMF.js';
|
|
15
|
-
import './chunk-LUQYSUXS.js';
|
|
16
|
-
import './chunk-XRMV2GMB.js';
|
|
17
|
-
import './chunk-JI3PHXPJ.js';
|
|
18
|
-
import './chunk-N6CNJCIF.js';
|