@json-to-office/core-docx 0.22.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -634,10 +634,277 @@ var init_modern_docx_theme = __esm({
634
634
  }
635
635
  });
636
636
 
637
+ // src/templates/themes/apex.docx.theme.json
638
+ var apex_docx_theme_default;
639
+ var init_apex_docx_theme = __esm({
640
+ "src/templates/themes/apex.docx.theme.json"() {
641
+ apex_docx_theme_default = {
642
+ name: "apex",
643
+ displayName: "Apex Consulting",
644
+ description: "A premium consulting theme with deep navy, warm amber accents, and authoritative typography",
645
+ version: "2.0.0",
646
+ colors: {
647
+ primary: "#0C2340",
648
+ secondary: "#1B3A5C",
649
+ accent: "#D4A843",
650
+ text: "#1A1A2E",
651
+ background: "#FFFFFF",
652
+ border: "#D6DAE0",
653
+ textPrimary: "#1A1A2E",
654
+ textSecondary: "#4A5066",
655
+ textMuted: "#8B91A0",
656
+ borderPrimary: "#B8BCC6",
657
+ borderSecondary: "#E8EAF0",
658
+ backgroundPrimary: "#FFFFFF",
659
+ backgroundSecondary: "#F4F5F8"
660
+ },
661
+ fonts: {
662
+ heading: { family: "Georgia", size: 26 },
663
+ body: { family: "Calibri", size: 11 },
664
+ mono: { family: "Consolas", size: 10 },
665
+ light: { family: "Georgia", size: 26 }
666
+ },
667
+ page: {
668
+ size: "A4",
669
+ margins: {
670
+ top: 1440,
671
+ bottom: 1440,
672
+ left: 1200,
673
+ right: 1200,
674
+ header: 720,
675
+ footer: 720,
676
+ gutter: 0
677
+ }
678
+ },
679
+ styles: {
680
+ normal: {
681
+ font: "body",
682
+ color: "textPrimary",
683
+ lineSpacing: { type: "multiple", value: 1.4 },
684
+ alignment: "justify",
685
+ spacing: { after: 8 }
686
+ },
687
+ heading1: {
688
+ font: "heading",
689
+ size: 26,
690
+ bold: false,
691
+ color: "primary",
692
+ spacing: { before: 24, after: 12 },
693
+ keepNext: true,
694
+ alignment: "left",
695
+ borders: {
696
+ bottom: {
697
+ style: "single",
698
+ size: 2,
699
+ color: "accent",
700
+ space: 6
701
+ }
702
+ }
703
+ },
704
+ heading2: {
705
+ font: "heading",
706
+ size: 18,
707
+ bold: false,
708
+ color: "secondary",
709
+ spacing: { before: 18, after: 8 },
710
+ keepNext: true,
711
+ alignment: "left"
712
+ },
713
+ heading3: {
714
+ font: "body",
715
+ size: 13,
716
+ bold: true,
717
+ color: "accent",
718
+ spacing: { before: 12, after: 6 },
719
+ keepNext: true,
720
+ alignment: "left"
721
+ },
722
+ title: {
723
+ font: "light",
724
+ size: 36,
725
+ bold: false,
726
+ color: "primary",
727
+ alignment: "left",
728
+ spacing: { before: 0, after: 18 }
729
+ },
730
+ subtitle: {
731
+ font: "body",
732
+ size: 16,
733
+ italic: false,
734
+ color: "textSecondary",
735
+ alignment: "left",
736
+ spacing: { before: 0, after: 24 }
737
+ }
738
+ },
739
+ componentDefaults: {
740
+ table: {
741
+ borderColor: "#D6DAE0"
742
+ },
743
+ list: {
744
+ format: "bullet",
745
+ bullet: "\u2022",
746
+ indent: 3
747
+ },
748
+ image: {
749
+ alignment: "center"
750
+ },
751
+ statistic: {
752
+ alignment: "center"
753
+ },
754
+ section: {
755
+ pageBreak: false
756
+ },
757
+ heading: {
758
+ numbering: false
759
+ }
760
+ }
761
+ };
762
+ }
763
+ });
764
+
765
+ // src/templates/themes/devportal.docx.theme.json
766
+ var devportal_docx_theme_default;
767
+ var init_devportal_docx_theme = __esm({
768
+ "src/templates/themes/devportal.docx.theme.json"() {
769
+ devportal_docx_theme_default = {
770
+ name: "devportal",
771
+ displayName: "Developer Portal",
772
+ description: "A modern developer-focused theme with cool grays, teal accents, and monospace code styling",
773
+ version: "2.0.0",
774
+ colors: {
775
+ primary: "#0F172A",
776
+ secondary: "#334155",
777
+ accent: "#0D9488",
778
+ text: "#0F172A",
779
+ background: "#FFFFFF",
780
+ border: "#E2E8F0",
781
+ textPrimary: "#0F172A",
782
+ textSecondary: "#475569",
783
+ textMuted: "#94A3B8",
784
+ borderPrimary: "#CBD5E1",
785
+ borderSecondary: "#F1F5F9",
786
+ backgroundPrimary: "#FFFFFF",
787
+ backgroundSecondary: "#F8FAFC"
788
+ },
789
+ fonts: {
790
+ heading: { family: "Helvetica", size: 24 },
791
+ body: { family: "Calibri", size: 11 },
792
+ mono: { family: "Consolas", size: 10 },
793
+ light: { family: "Helvetica", size: 24 }
794
+ },
795
+ page: {
796
+ size: "A4",
797
+ margins: {
798
+ top: 1440,
799
+ bottom: 1440,
800
+ left: 1080,
801
+ right: 1080,
802
+ header: 720,
803
+ footer: 720,
804
+ gutter: 0
805
+ }
806
+ },
807
+ styles: {
808
+ normal: {
809
+ font: "body",
810
+ color: "textPrimary",
811
+ lineSpacing: { type: "multiple", value: 1.5 },
812
+ alignment: "left",
813
+ spacing: { after: 8 }
814
+ },
815
+ heading1: {
816
+ font: "heading",
817
+ size: 24,
818
+ bold: true,
819
+ color: "primary",
820
+ spacing: { before: 24, after: 12 },
821
+ keepNext: true,
822
+ alignment: "left",
823
+ borders: {
824
+ bottom: {
825
+ style: "single",
826
+ size: 1,
827
+ color: "accent",
828
+ space: 6
829
+ }
830
+ }
831
+ },
832
+ heading2: {
833
+ font: "heading",
834
+ size: 18,
835
+ bold: true,
836
+ color: "secondary",
837
+ spacing: { before: 18, after: 8 },
838
+ keepNext: true,
839
+ alignment: "left"
840
+ },
841
+ heading3: {
842
+ font: "body",
843
+ size: 13,
844
+ bold: true,
845
+ color: "accent",
846
+ spacing: { before: 12, after: 6 },
847
+ keepNext: true,
848
+ alignment: "left"
849
+ },
850
+ heading4: {
851
+ font: "body",
852
+ size: 12,
853
+ bold: true,
854
+ color: "textSecondary",
855
+ spacing: { before: 8, after: 4 },
856
+ keepNext: true
857
+ },
858
+ title: {
859
+ font: "heading",
860
+ size: 32,
861
+ bold: true,
862
+ color: "primary",
863
+ alignment: "left",
864
+ spacing: { before: 0, after: 12 }
865
+ },
866
+ subtitle: {
867
+ font: "light",
868
+ size: 16,
869
+ italic: false,
870
+ color: "textSecondary",
871
+ alignment: "left",
872
+ spacing: { before: 0, after: 24 }
873
+ }
874
+ },
875
+ componentDefaults: {
876
+ table: {
877
+ borderColor: "#E2E8F0"
878
+ },
879
+ list: {
880
+ format: "bullet",
881
+ bullet: "\u2013",
882
+ indent: 3
883
+ },
884
+ image: {
885
+ alignment: "center"
886
+ },
887
+ statistic: {
888
+ alignment: "center"
889
+ },
890
+ section: {
891
+ pageBreak: false
892
+ },
893
+ heading: {
894
+ numbering: false
895
+ }
896
+ }
897
+ };
898
+ }
899
+ });
900
+
637
901
  // src/templates/themes/index.ts
638
902
  import fs from "fs";
639
903
  import path from "path";
640
904
  import { fileURLToPath } from "url";
905
+ import {
906
+ isValidThemeConfig
907
+ } from "@json-to-office/shared-docx";
641
908
  function loadThemesFromJson() {
642
909
  if (_themesCache) {
643
910
  return _themesCache;
@@ -645,7 +912,9 @@ function loadThemesFromJson() {
645
912
  const themes2 = {
646
913
  minimal: ensureThemeDefaults(minimal_docx_theme_default),
647
914
  corporate: ensureThemeDefaults(corporate_docx_theme_default),
648
- modern: ensureThemeDefaults(modern_docx_theme_default)
915
+ modern: ensureThemeDefaults(modern_docx_theme_default),
916
+ apex: ensureThemeDefaults(apex_docx_theme_default),
917
+ devportal: ensureThemeDefaults(devportal_docx_theme_default)
649
918
  };
650
919
  try {
651
920
  const __filename = fileURLToPath(import.meta.url);
@@ -656,9 +925,18 @@ function loadThemesFromJson() {
656
925
  for (const themeName of themeFiles) {
657
926
  if (!themes2[themeName]) {
658
927
  try {
659
- const filePath = path.join(themesDir, `${themeName}.docx.theme.json`);
928
+ const filePath = path.join(
929
+ themesDir,
930
+ `${themeName}.docx.theme.json`
931
+ );
660
932
  const content = fs.readFileSync(filePath, "utf8");
661
933
  const parsedTheme = JSON.parse(content);
934
+ if (!isValidThemeConfig(parsedTheme)) {
935
+ console.warn(
936
+ `Skipping theme ${themeName}: does not match the theme schema.`
937
+ );
938
+ continue;
939
+ }
662
940
  themes2[themeName] = ensureThemeDefaults(parsedTheme);
663
941
  } catch (error) {
664
942
  console.warn(
@@ -674,7 +952,7 @@ function loadThemesFromJson() {
674
952
  _themesCache = themes2;
675
953
  return themes2;
676
954
  }
677
- var _themesCache, themes, getTheme, getThemeWithFallback, minimalTheme, corporateTheme, modernTheme;
955
+ var _themesCache, themes, getTheme, getThemeWithFallback, hasTheme, getThemeNames, minimalTheme, corporateTheme, modernTheme;
678
956
  var init_themes = __esm({
679
957
  "src/templates/themes/index.ts"() {
680
958
  "use strict";
@@ -682,6 +960,8 @@ var init_themes = __esm({
682
960
  init_minimal_docx_theme();
683
961
  init_corporate_docx_theme();
684
962
  init_modern_docx_theme();
963
+ init_apex_docx_theme();
964
+ init_devportal_docx_theme();
685
965
  _themesCache = null;
686
966
  themes = loadThemesFromJson();
687
967
  getTheme = (themeName) => {
@@ -696,6 +976,12 @@ var init_themes = __esm({
696
976
  }
697
977
  return theme;
698
978
  };
979
+ hasTheme = (themeName) => {
980
+ return themeName in themes;
981
+ };
982
+ getThemeNames = () => {
983
+ return Object.keys(themes);
984
+ };
699
985
  minimalTheme = themes["minimal"];
700
986
  corporateTheme = themes["corporate"];
701
987
  modernTheme = themes["modern"];
@@ -1307,7 +1593,8 @@ var init_loader = __esm({
1307
1593
  // src/themes/json/index.ts
1308
1594
  import {
1309
1595
  ThemeConfigSchema,
1310
- isValidThemeConfig
1596
+ isValidThemeConfig as isValidThemeConfig2,
1597
+ createMinimalTheme
1311
1598
  } from "@json-to-office/shared-docx";
1312
1599
  async function loadThemeFromJson(jsonString) {
1313
1600
  return themeParser.parse(jsonString);
@@ -1331,57 +1618,6 @@ function exportThemeToJson(theme, pretty = true) {
1331
1618
  function validateThemeJsonString(jsonString) {
1332
1619
  return themeParser.validate(jsonString);
1333
1620
  }
1334
- function createMinimalTheme() {
1335
- return {
1336
- name: "minimal-theme",
1337
- displayName: "Minimal Theme",
1338
- description: "A minimal theme with basic styling",
1339
- version: "1.0.0",
1340
- colors: {
1341
- primary: "2563EB",
1342
- secondary: "64748B",
1343
- accent: "F8FAFC",
1344
- text: "334155",
1345
- background: "FFFFFF",
1346
- border: "334155",
1347
- textPrimary: "334155",
1348
- textSecondary: "64748B",
1349
- textMuted: "94A3B8",
1350
- borderPrimary: "334155",
1351
- borderSecondary: "64748B",
1352
- backgroundPrimary: "FFFFFF",
1353
- backgroundSecondary: "F8FAFC"
1354
- },
1355
- fonts: {
1356
- heading: { family: "Arial", size: 14 },
1357
- body: { family: "Arial", size: 11 },
1358
- mono: { family: "Courier New", size: 10 },
1359
- light: { family: "Arial", size: 10 }
1360
- },
1361
- page: {
1362
- size: "A4",
1363
- margins: {
1364
- top: 1440,
1365
- bottom: 1440,
1366
- left: 1440,
1367
- right: 1440,
1368
- header: 720,
1369
- footer: 720,
1370
- gutter: 0
1371
- }
1372
- },
1373
- styles: {
1374
- normal: {
1375
- font: "body",
1376
- size: 11,
1377
- color: "334155",
1378
- alignment: "left",
1379
- lineSpacing: { type: "multiple", value: 1.15 },
1380
- spacing: { after: 8 }
1381
- }
1382
- }
1383
- };
1384
- }
1385
1621
  var themeParser, themeLoader;
1386
1622
  var init_json = __esm({
1387
1623
  "src/themes/json/index.ts"() {
@@ -1705,8 +1941,23 @@ import {
1705
1941
  isVisualComponent
1706
1942
  } from "@json-to-office/shared-docx";
1707
1943
 
1708
- // src/core/generator.ts
1709
- init_styles();
1944
+ // src/styles/theme-resolver.ts
1945
+ init_themes();
1946
+ function resolveBuiltInTheme(themeName, options = {}) {
1947
+ if (!hasTheme(themeName)) {
1948
+ const available = [
1949
+ ...getThemeNames(),
1950
+ ...Object.keys(options.customThemes ?? {})
1951
+ ].sort();
1952
+ options.warnings?.push({
1953
+ component: "theme",
1954
+ message: `Theme "${themeName}" not found; falling back to "minimal". Available themes: ${available.join(", ")}.`,
1955
+ severity: "warning",
1956
+ context: { code: "theme_not_found", requested: themeName, available }
1957
+ });
1958
+ }
1959
+ return getThemeWithFallback(themeName);
1960
+ }
1710
1961
 
1711
1962
  // src/utils/formatters.ts
1712
1963
  import { format } from "date-fns";
@@ -7524,11 +7775,11 @@ async function generateDocumentWithCustomThemes(documentIn, customThemes, servic
7524
7775
  if (matchingThemeKey) {
7525
7776
  theme = customThemes[matchingThemeKey];
7526
7777
  } else {
7527
- theme = getThemeWithFallback(themeName);
7778
+ theme = resolveBuiltInTheme(themeName, { customThemes, warnings });
7528
7779
  }
7529
7780
  }
7530
7781
  } else {
7531
- theme = getThemeWithFallback(themeName);
7782
+ theme = resolveBuiltInTheme(themeName, { warnings });
7532
7783
  }
7533
7784
  const mode = applyExportMode({ doc: document, theme, fonts });
7534
7785
  document = mode.doc;
@@ -7962,7 +8213,6 @@ async function runExample(example, options = {}) {
7962
8213
  }
7963
8214
 
7964
8215
  // src/plugin/createDocumentGenerator.ts
7965
- init_styles();
7966
8216
  import { applyExportMode as applyExportMode2, scopedThemeName as scopedThemeName2 } from "@json-to-office/shared";
7967
8217
 
7968
8218
  // src/plugin/version-resolver.ts
@@ -8207,7 +8457,7 @@ function mergeSchemas(customComponents, standardSchemas) {
8207
8457
  // src/plugin/createDocumentGenerator.ts
8208
8458
  function createBuilderImpl(state) {
8209
8459
  const componentMap = new Map(state.components.map((c) => [c.name, c]));
8210
- function resolveDocumentTheme(themeName) {
8460
+ function resolveDocumentTheme(themeName, warnings) {
8211
8461
  if (state.customThemes) {
8212
8462
  if (state.customThemes[themeName]) {
8213
8463
  return state.customThemes[themeName];
@@ -8222,7 +8472,10 @@ function createBuilderImpl(state) {
8222
8472
  if (state.theme) {
8223
8473
  return state.theme;
8224
8474
  }
8225
- return getThemeWithFallback(themeName);
8475
+ return resolveBuiltInTheme(themeName, {
8476
+ customThemes: state.customThemes,
8477
+ warnings
8478
+ });
8226
8479
  }
8227
8480
  async function processDocumentComponents(components, preserveSet, warningsCollector, resolvedTheme, validateEmitted, depth = 0) {
8228
8481
  if (depth > 20) {
@@ -8424,9 +8677,9 @@ function createBuilderImpl(state) {
8424
8677
  );
8425
8678
  }
8426
8679
  };
8427
- const baseThemeName = internalDocument.props.theme || "minimal";
8428
- const docTheme = resolveDocumentTheme(baseThemeName);
8429
8680
  const warnings = [];
8681
+ const baseThemeName = internalDocument.props.theme || "minimal";
8682
+ const docTheme = resolveDocumentTheme(baseThemeName, warnings);
8430
8683
  const mode = applyExportMode2({
8431
8684
  doc: internalDocument,
8432
8685
  theme: docTheme,