types-nora-api 0.0.249 → 0.0.252

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/dist/classes.d.ts CHANGED
@@ -802,6 +802,11 @@ interface IUsuario {
802
802
  listaCargos: CargosUsuario;
803
803
  }
804
804
  type UsuarioDto = IUsuario;
805
+ type LayoutContextualizadoInicial = {
806
+ readonly titulo?: string;
807
+ readonly escondeFundo?: boolean;
808
+ readonly proporcaoConteudo?: number;
809
+ };
805
810
  type SalaDeJogo_Codigo = `${number}_${string}`;
806
811
  type SalaDeJogoParams = {
807
812
  tipo: "sessao";
@@ -875,19 +880,55 @@ type MenuNode = MenuItemNode | MenuGrupoNode;
875
880
  declare function menuItem(titulo: string, destino: PaginaDestino): MenuItemNode;
876
881
  declare function menuGrupo(titulo: string, itens: readonly MenuNode[]): MenuGrupoNode;
877
882
  type PaginaLike = {
878
- readonly template: unknown;
883
+ readonly template: object;
879
884
  readonly hrefTemplate: string;
885
+ readonly href: string;
886
+ readonly label: string;
880
887
  };
881
- type MenuInternoTree<P> = P extends PaginaLike ? readonly MenuNode[] : P extends Record<string, unknown> ? {
888
+ type MenuInternoTree<P> = P extends PaginaLike ? readonly MenuNode[] : P extends Record<string, object | string | number | boolean | null | undefined> ? {
882
889
  readonly [K in keyof P]?: MenuInternoTree<P[K]>;
883
890
  } : never;
884
891
  type MenusInternos<P> = {
885
892
  readonly PAGINAS: MenuInternoTree<P>;
886
893
  };
894
+ type PaginaComLayout = PaginaLike & {
895
+ readonly layoutContextualizadoInicial: object;
896
+ };
897
+ type HasLayout<T> = T extends PaginaComLayout ? true : T extends object ? (true extends {
898
+ [K in keyof T]-?: HasLayout<T[K]>;
899
+ }[keyof T] ? true : false) : false;
900
+ type ChildKeysByHasLayout<T> = {
901
+ [K in keyof T]-?: HasLayout<T[K]> extends true ? K : never;
902
+ }[keyof T];
903
+ type TemFilhos<T> = ChildKeysByHasLayout<T> extends never ? false : true;
904
+ type FilhosDePagina<T> = Pick<T, ChildKeysByHasLayout<T>>;
905
+ type MenuLayoutLeaf = readonly MenuNode[] | {
906
+ readonly tipo: 'vazio';
907
+ } | {
908
+ readonly tipo: 'dinamico';
909
+ };
910
+ declare function menuVazio(): {
911
+ readonly tipo: 'vazio';
912
+ };
913
+ declare function menuDinamico(): {
914
+ readonly tipo: 'dinamico';
915
+ };
916
+ type MenuLayoutChildren<T> = {
917
+ readonly [K in keyof T]: MenuLayoutNode<T[K]>;
918
+ };
919
+ type MenuLayoutNode<T> = T extends PaginaComLayout ? (TemFilhos<T> extends true ? {
920
+ readonly menu: MenuLayoutLeaf;
921
+ } & MenuLayoutChildren<FilhosDePagina<T>> : MenuLayoutLeaf) : T extends object ? (HasLayout<T> extends true ? MenuLayoutChildren<Pick<T, ChildKeysByHasLayout<T>>> : never) : never;
922
+ type RootMenuLayout<P> = HasLayout<P> extends true ? MenuLayoutNode<P> : {};
923
+ type MenusInternosLayoutContexto<P> = {
924
+ readonly PAGINAS: RootMenuLayout<P>;
925
+ };
887
926
  type Brand<T, B extends string> = T & {
888
927
  readonly __brand: B;
889
928
  };
890
- type ExtrairParamsDoTemplate<S extends string, Acc extends Record<string, unknown> = {}> = S extends `${infer _A}[[...${infer P}]]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
929
+ type ParamValue = string | string[] | undefined;
930
+ type ParamsRecord = Record<string, ParamValue>;
931
+ type ExtrairParamsDoTemplate<S extends string, Acc extends ParamsRecord = {}> = S extends `${infer _A}[[...${infer P}]]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
891
932
  [K in P]?: string[];
892
933
  }> : S extends `${infer _A}[...${infer P}]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
893
934
  [K in P]: string[];
@@ -895,14 +936,18 @@ type ExtrairParamsDoTemplate<S extends string, Acc extends Record<string, unknow
895
936
  [K in P]: string;
896
937
  }> : Acc;
897
938
  type PaginaParamsDoTemplate<T extends string> = ExtrairParamsDoTemplate<T>;
898
- type PaginaInfo = {
939
+ type PaginaInfoBase = {
899
940
  readonly label: string;
900
941
  readonly comCabecalho?: true;
901
942
  readonly acesso?: AcessoPagina;
902
943
  readonly acessoPorMenuInterno?: true;
903
944
  };
945
+ type PaginaInfoComLayoutContextualizado = PaginaInfoBase & {
946
+ readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
947
+ };
948
+ type PaginaInfo = PaginaInfoBase | PaginaInfoComLayoutContextualizado;
904
949
  type PaginaTemplate<T extends string = string> = Brand<T, 'PaginaTemplate'>;
905
- type PaginaDef<T extends string> = PaginaInfo & {
950
+ type PaginaDef<T extends string, I extends PaginaInfo = PaginaInfo> = I & {
906
951
  readonly template: PaginaTemplate<T>;
907
952
  readonly hrefTemplate: T;
908
953
  readonly href: T;
@@ -910,8 +955,12 @@ type PaginaDef<T extends string> = PaginaInfo & {
910
955
  type PaginaParams<P extends {
911
956
  hrefTemplate: string;
912
957
  }> = PaginaParamsDoTemplate<P['hrefTemplate']>;
913
- declare function montarHref(template: string, params: Record<string, unknown>): string;
914
- declare function pagina<const T extends string>(hrefTemplate: T, info: PaginaInfo): PaginaDef<T>;
958
+ declare function montarHref(template: string, params: ParamsRecord): string;
959
+ type LimparUndefinedValue = string | number | boolean | object | null | undefined;
960
+ type LimparUndefinedRecord = Record<string, LimparUndefinedValue>;
961
+ declare function limparUndefined<T extends LimparUndefinedRecord>(obj: T): T;
962
+ declare function pagina<const T extends string>(hrefTemplate: T, info: PaginaInfoBase): PaginaDef<T, PaginaInfoBase>;
963
+ declare function paginaComLayoutContextualizado<const T extends string>(hrefTemplate: T, info: PaginaInfoBase, layoutContextualizadoInicial: LayoutContextualizadoInicial): PaginaDef<T, PaginaInfoComLayoutContextualizado>;
915
964
  type RequiredKeys<T> = {
916
965
  [K in keyof T]-?: {} extends Pick<T, K> ? never : K;
917
966
  }[keyof T];
@@ -1540,97 +1589,102 @@ type Opts = {
1540
1589
  declare function decidirAcessoPagina(pagina: PaginaFolha, ctx: CtxAcesso, opts: Opts): DecisaoAcessoPagina;
1541
1590
  declare function decidirAcessoPagina_Rec(pagina: PaginaFolha, ctx: CtxAcesso, opts: Opts, visitados: Set<string>): DecisaoAcessoPagina;
1542
1591
  declare const PAGINAS: {
1543
- readonly home: PaginaDef<"/">;
1544
- readonly acessar: PaginaDef<"/acessar">;
1545
- readonly cadastrar: PaginaDef<"/cadastrar">;
1546
- readonly aventura: PaginaDef<"/aventura/[id]">;
1547
- readonly aventuras: PaginaDef<"/aventuras">;
1548
- readonly definicoes: PaginaDef<"/definicoes/[[...slug]]">;
1549
- readonly dicas: PaginaDef<"/dicas/[[...slug]]">;
1592
+ readonly home: PaginaDef<"/", PaginaInfoBase>;
1593
+ readonly acessar: PaginaDef<"/acessar", PaginaInfoBase>;
1594
+ readonly cadastrar: PaginaDef<"/cadastrar", PaginaInfoBase>;
1595
+ readonly aventura: PaginaDef<"/aventura/[id]", PaginaInfoComLayoutContextualizado>;
1596
+ readonly aventuras: PaginaDef<"/aventuras", PaginaInfoComLayoutContextualizado>;
1597
+ readonly definicoes: PaginaDef<"/definicoes/[[...slug]]", PaginaInfoBase>;
1598
+ readonly dicas: PaginaDef<"/dicas/[[...slug]]", PaginaInfoBase>;
1550
1599
  readonly jogo: {
1551
- readonly jogador: PaginaDef<"/jogo/jogador">;
1552
- readonly mestre: {
1553
- readonly sessoesMestre: PaginaDef<"/jogo/mestre/sessoes-mestre">;
1554
- };
1555
1600
  readonly admin: {
1556
- readonly gerenciarSalas: PaginaDef<"/jogo/admin/gerenciar-salas">;
1601
+ readonly gerenciarSalas: PaginaDef<"/jogo/admin/gerenciar-salas", PaginaInfoComLayoutContextualizado>;
1557
1602
  };
1558
- readonly emJogo: PaginaDef<"/jogo/em-jogo">;
1603
+ readonly mestre: {
1604
+ readonly sessoesMestre: PaginaDef<"/jogo/mestre/sessoes-mestre", PaginaInfoComLayoutContextualizado>;
1605
+ };
1606
+ readonly jogador: PaginaDef<"/jogo/jogador", PaginaInfoComLayoutContextualizado>;
1607
+ readonly emJogo: PaginaDef<"/jogo/em-jogo", PaginaInfoBase>;
1559
1608
  readonly label: string;
1560
1609
  readonly comCabecalho?: true;
1561
1610
  readonly acesso?: AcessoPagina;
1562
1611
  readonly acessoPorMenuInterno?: true;
1612
+ readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
1563
1613
  readonly template: PaginaTemplate<"/jogo">;
1564
1614
  readonly hrefTemplate: "/jogo";
1565
1615
  readonly href: "/jogo";
1566
1616
  };
1567
- readonly linhaDoTempo: PaginaDef<"/linha-do-tempo">;
1568
- readonly minhaPagina: PaginaDef<"/minha-pagina">;
1617
+ readonly linhaDoTempo: PaginaDef<"/linha-do-tempo", PaginaInfoBase>;
1618
+ readonly minhaPagina: PaginaDef<"/minha-pagina", PaginaInfoBase>;
1569
1619
  readonly minhasPaginas: {
1570
1620
  readonly admin: {
1571
- readonly aventura: PaginaDef<"/minhas-paginas/admin/aventura/[id]">;
1572
- readonly aventuras: PaginaDef<"/minhas-paginas/admin/aventuras">;
1573
- readonly dashboardWs: PaginaDef<"/minhas-paginas/admin/dashboard-ws">;
1574
- readonly sessao: PaginaDef<"/minhas-paginas/admin/sessao/[id]">;
1575
- readonly uploads: PaginaDef<"/minhas-paginas/admin/uploads">;
1576
- readonly variaveisAmbiente: PaginaDef<"/minhas-paginas/admin/variaveis-ambiente">;
1577
- readonly dashboardPermissoes: PaginaDef<"/minhas-paginas/admin/permissoes">;
1578
- readonly dashboardPermissoesUsuarios: PaginaDef<"/minhas-paginas/admin/permissoes-usuarios">;
1621
+ readonly aventura: PaginaDef<"/minhas-paginas/admin/aventura/[id]", PaginaInfoComLayoutContextualizado>;
1622
+ readonly aventuras: PaginaDef<"/minhas-paginas/admin/aventuras", PaginaInfoComLayoutContextualizado>;
1623
+ readonly dashboardWs: PaginaDef<"/minhas-paginas/admin/dashboard-ws", PaginaInfoComLayoutContextualizado>;
1624
+ readonly sessao: PaginaDef<"/minhas-paginas/admin/sessao/[id]", PaginaInfoComLayoutContextualizado>;
1625
+ readonly uploadRecursosInternos: PaginaDef<"/minhas-paginas/admin/uploads", PaginaInfoComLayoutContextualizado>;
1626
+ readonly variaveisAmbiente: PaginaDef<"/minhas-paginas/admin/variaveis-ambiente", PaginaInfoComLayoutContextualizado>;
1627
+ readonly dashboardPermissoes: PaginaDef<"/minhas-paginas/admin/permissoes", PaginaInfoComLayoutContextualizado>;
1628
+ readonly dashboardPermissoesUsuarios: PaginaDef<"/minhas-paginas/admin/permissoes-usuarios", PaginaInfoComLayoutContextualizado>;
1579
1629
  readonly label: string;
1580
1630
  readonly comCabecalho?: true;
1581
1631
  readonly acesso?: AcessoPagina;
1582
1632
  readonly acessoPorMenuInterno?: true;
1633
+ readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
1583
1634
  readonly template: PaginaTemplate<"/minhas-paginas/admin">;
1584
1635
  readonly hrefTemplate: "/minhas-paginas/admin";
1585
1636
  readonly href: "/minhas-paginas/admin";
1586
1637
  };
1587
- readonly jogador: {
1588
- readonly meusPersonagens: PaginaDef<"/minhas-paginas/jogador/meus-personagens">;
1589
- readonly label: string;
1590
- readonly comCabecalho?: true;
1591
- readonly acesso?: AcessoPagina;
1592
- readonly acessoPorMenuInterno?: true;
1593
- readonly template: PaginaTemplate<"/minhas-paginas/jogador">;
1594
- readonly hrefTemplate: "/minhas-paginas/jogador";
1595
- readonly href: "/minhas-paginas/jogador";
1596
- };
1597
1638
  readonly mestre: {
1598
- readonly aventura: PaginaDef<"/minhas-paginas/mestre/aventura/[id]">;
1599
- readonly aventuras: PaginaDef<"/minhas-paginas/mestre/aventuras">;
1600
- readonly sessoesUnicas: PaginaDef<"/minhas-paginas/mestre/sessoes-unicas">;
1601
- readonly personagens: PaginaDef<"/minhas-paginas/mestre/personagens">;
1639
+ readonly aventura: PaginaDef<"/minhas-paginas/mestre/aventura/[id]", PaginaInfoComLayoutContextualizado>;
1640
+ readonly aventuras: PaginaDef<"/minhas-paginas/mestre/aventuras", PaginaInfoComLayoutContextualizado>;
1641
+ readonly sessoesUnicas: PaginaDef<"/minhas-paginas/mestre/sessoes-unicas", PaginaInfoComLayoutContextualizado>;
1642
+ readonly personagens: PaginaDef<"/minhas-paginas/mestre/personagens", PaginaInfoComLayoutContextualizado>;
1602
1643
  readonly rascunhos: {
1603
- readonly aventuras: PaginaDef<"/minhas-paginas/mestre/rascunhos/aventuras">;
1604
- readonly sessoesUnicas: PaginaDef<"/minhas-paginas/mestre/rascunhos/sessoes-unicas">;
1644
+ readonly aventuras: PaginaDef<"/minhas-paginas/mestre/rascunhos/aventuras", PaginaInfoComLayoutContextualizado>;
1645
+ readonly sessoesUnicas: PaginaDef<"/minhas-paginas/mestre/rascunhos/sessoes-unicas", PaginaInfoComLayoutContextualizado>;
1605
1646
  };
1606
- readonly sessao: PaginaDef<"/minhas-paginas/mestre/sessao/[id]">;
1647
+ readonly sessao: PaginaDef<"/minhas-paginas/mestre/sessao/[id]", PaginaInfoComLayoutContextualizado>;
1607
1648
  readonly label: string;
1608
1649
  readonly comCabecalho?: true;
1609
1650
  readonly acesso?: AcessoPagina;
1610
1651
  readonly acessoPorMenuInterno?: true;
1652
+ readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
1611
1653
  readonly template: PaginaTemplate<"/minhas-paginas/mestre">;
1612
1654
  readonly hrefTemplate: "/minhas-paginas/mestre";
1613
1655
  readonly href: "/minhas-paginas/mestre";
1614
1656
  };
1615
1657
  readonly artista: {
1616
- readonly minhasImagens: PaginaDef<"/minhas-paginas/artista/minhas-imagens">;
1617
- readonly adicionarImagem: PaginaDef<"/minhas-paginas/artista/adicionar-imagem">;
1658
+ readonly minhasImagens: PaginaDef<"/minhas-paginas/artista/minhas-imagens", PaginaInfoComLayoutContextualizado>;
1659
+ readonly adicionarImagem: PaginaDef<"/minhas-paginas/artista/adicionar-imagem", PaginaInfoComLayoutContextualizado>;
1618
1660
  readonly label: string;
1619
1661
  readonly comCabecalho?: true;
1620
1662
  readonly acesso?: AcessoPagina;
1621
1663
  readonly acessoPorMenuInterno?: true;
1664
+ readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
1622
1665
  readonly template: PaginaTemplate<"/minhas-paginas/artista">;
1623
1666
  readonly hrefTemplate: "/minhas-paginas/artista";
1624
1667
  readonly href: "/minhas-paginas/artista";
1625
1668
  };
1626
- readonly minhasDisponibilidades: PaginaDef<"/minhas-paginas/minhas-disponibilidades">;
1669
+ readonly jogador: {
1670
+ readonly meusPersonagens: PaginaDef<"/minhas-paginas/jogador/meus-personagens", PaginaInfoComLayoutContextualizado>;
1671
+ readonly label: string;
1672
+ readonly comCabecalho?: true;
1673
+ readonly acesso?: AcessoPagina;
1674
+ readonly acessoPorMenuInterno?: true;
1675
+ readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
1676
+ readonly template: PaginaTemplate<"/minhas-paginas/jogador">;
1677
+ readonly hrefTemplate: "/minhas-paginas/jogador";
1678
+ readonly href: "/minhas-paginas/jogador";
1679
+ };
1680
+ readonly minhasDisponibilidades: PaginaDef<"/minhas-paginas/minhas-disponibilidades", PaginaInfoComLayoutContextualizado>;
1627
1681
  };
1628
- readonly personagens: PaginaDef<"/personagens">;
1629
- readonly sessoes: PaginaDef<"/sessoes">;
1630
- readonly sessaoAovivo: PaginaDef<"/sessao-aovivo">;
1631
- readonly sessao: PaginaDef<"/sessao/[id]">;
1682
+ readonly personagens: PaginaDef<"/personagens", PaginaInfoComLayoutContextualizado>;
1683
+ readonly sessoes: PaginaDef<"/sessoes", PaginaInfoBase>;
1684
+ readonly sessaoAovivo: PaginaDef<"/sessao-aovivo", PaginaInfoBase>;
1685
+ readonly sessao: PaginaDef<"/sessao/[id]", PaginaInfoBase>;
1632
1686
  };
1633
- type Folhas<T> = T extends PaginaDef<any> ? T | Folhas<Omit<T, keyof PaginaDef<any>>> : T extends readonly (infer U)[] ? Folhas<U> : T extends object ? {
1687
+ type Folhas<T> = T extends PaginaDef<string> ? T | Folhas<Omit<T, keyof PaginaDef<string>>> : T extends readonly (infer U)[] ? Folhas<U> : T extends object ? {
1634
1688
  [K in keyof T]-?: Folhas<NonNullable<T[K]>>;
1635
1689
  }[keyof T] : never;
1636
1690
  type PaginaFolha = Folhas<typeof PAGINAS>;
@@ -1649,15 +1703,82 @@ declare function filtrarMenuPorAcesso(nodes: readonly MenuNode[], ctx: CtxAcesso
1649
1703
  declare const MENU_PRINCIPAL: readonly MenuNode[];
1650
1704
  declare const MENUS_INTERNOS: {
1651
1705
  readonly PAGINAS: {
1706
+ readonly jogo: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1652
1707
  readonly minhasPaginas: {
1653
1708
  readonly admin: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1654
1709
  readonly mestre: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1655
- readonly jogador: readonly [MenuGrupoNode];
1656
1710
  readonly artista: readonly [MenuItemNode, MenuItemNode];
1711
+ readonly jogador: readonly [MenuGrupoNode];
1712
+ };
1713
+ };
1714
+ };
1715
+ declare const MENUS_INTERNOS_LAYOUTCONTEXTO: {
1716
+ readonly PAGINAS: {
1717
+ readonly aventura: {
1718
+ readonly tipo: "dinamico";
1719
+ };
1720
+ readonly aventuras: {
1721
+ readonly tipo: "dinamico";
1722
+ };
1723
+ readonly jogo: {
1724
+ readonly menu: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1725
+ readonly admin: {
1726
+ readonly gerenciarSalas: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1727
+ };
1728
+ readonly mestre: {
1729
+ readonly sessoesMestre: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1730
+ };
1731
+ readonly jogador: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1732
+ };
1733
+ readonly minhasPaginas: {
1734
+ readonly admin: {
1735
+ readonly menu: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1736
+ readonly aventura: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1737
+ readonly aventuras: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1738
+ readonly dashboardWs: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1739
+ readonly sessao: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1740
+ readonly uploadRecursosInternos: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1741
+ readonly variaveisAmbiente: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1742
+ readonly dashboardPermissoes: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1743
+ readonly dashboardPermissoesUsuarios: readonly [MenuItemNode, MenuItemNode, MenuItemNode, MenuItemNode, MenuGrupoNode];
1744
+ };
1745
+ readonly jogador: {
1746
+ readonly menu: readonly [MenuGrupoNode];
1747
+ readonly meusPersonagens: readonly [MenuGrupoNode];
1748
+ };
1749
+ readonly mestre: {
1750
+ readonly menu: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1751
+ readonly aventura: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1752
+ readonly aventuras: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1753
+ readonly sessoesUnicas: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1754
+ readonly personagens: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1755
+ readonly rascunhos: {
1756
+ readonly aventuras: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1757
+ readonly sessoesUnicas: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1758
+ };
1759
+ readonly sessao: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1760
+ };
1761
+ readonly artista: {
1762
+ readonly menu: readonly [MenuItemNode, MenuItemNode];
1763
+ readonly minhasImagens: readonly [MenuItemNode, MenuItemNode];
1764
+ readonly adicionarImagem: readonly [MenuItemNode, MenuItemNode];
1765
+ };
1766
+ readonly minhasDisponibilidades: {
1767
+ readonly tipo: "vazio";
1768
+ };
1769
+ };
1770
+ readonly personagens: {
1771
+ readonly tipo: "dinamico";
1657
1772
  };
1658
- readonly jogo: readonly [MenuGrupoNode, MenuGrupoNode, MenuGrupoNode];
1659
1773
  };
1660
1774
  };
1775
+ type PaginasNodeValue = object | string | number | boolean | null | undefined;
1776
+ type PaginasNodeRecord = Record<string, PaginasNodeValue>;
1777
+ type MenusNodeRecord = Record<string, object | undefined>;
1778
+ declare function isPaginaComLayout(node: object): node is PaginaFolha;
1779
+ declare function isMenuLeaf(node: object): node is MenuLayoutLeaf;
1780
+ declare const MENUS_LAYOUTCONTEXTO_POR_PAGINA: ReadonlyMap<PaginaFolha, MenuLayoutLeaf>;
1781
+ declare function obterMenuInternoLayoutContexto(pagina: PaginaFolha): MenuLayoutLeaf | undefined;
1661
1782
  declare const MENUS_INTERNOS_POR_PAGINA: ReadonlyMap<PaginaFolha, readonly MenuNode[]>;
1662
1783
  declare function obterMenuInterno(pagina: PaginaFolha): readonly MenuNode[] | undefined;
1663
1784
  declare function resolverMenuInterno(pagina: PaginaFolha): readonly PaginaFolha[] | undefined;
@@ -1706,4 +1827,4 @@ declare function isRegrasUploadArquivoValidas(regras: RegrasUploadArquivo): regr
1706
1827
  declare function mimeFromFormato(formato: FormatoUploadArquivo): "image/png" | "image/jpeg" | "image/svg+xml";
1707
1828
  declare function acceptFromFormatos(formatos: FormatoUploadArquivo[]): string;
1708
1829
  declare function isFormatoImagemBitmap(formato: FormatoUploadArquivo): formato is "png" | "jpg";
1709
- export { CAPACIDADES, PERMISSOES_ESTADOS, TIPOS_IMAGEM, CtxAcesso, temSudoBurlarCapacidades, IPermissoesEstado, PermissoesEstadoDto, IPermissoesItem, PermissoesItemDto, ItemPermissaoDto, ArvoreItensPermissaoDto, IPermissoesUsuario, PermissoesUsuarioDto, IPermissoesUsuariosHistorico, PermissoesUsuariosHistoricoDto, IArcoAventura, ArcoAventuraDto, IAventura, AventuraDto, IConviteGrupoAventuraPersonagem, ConviteGrupoAventuraPersonagemDto, IGrupoAventura, GrupoAventuraDto, IGrupoAventuraPersonagem, GrupoAventuraPersonagemDto, IRespostaConvite, RespostaConviteDto, IVariavelAmbiente, VariavelAmbienteDto, IConquista, ConquistaDto, ITipoConquista, TipoConquistaDto, IDetalheSessaoAventura, DetalheSessaoAventuraDto, IDetalheSessaoCanonica, DetalheSessaoCanonicaDto, CapituloSessaoCanonica, IDetalheSessaoUnica, DetalheSessaoUnicaDto, IParticipanteSessaoUnica, ParticipanteSessaoUnicaDto, ICoeficienteGanhoEstatisticaClasse, CoeficienteGanhoEstatisticaClasseDto, IGanhoNivelClasse, GanhoNivelClasseDto, DadosDoTipoGanho, DadosGanho_Atributos, DadosGanho_Pericias, DadosGanho_Estatisticas, DadosGanho_Classes, DadosGanho_ValorMaximoAtributo, DadosGanho_PontosHabilidadesEspeciais, DadosGanho_PontosHabilidadesParanormais, DadosGanho_PontosHabilidadeElemental, IGanhoRelativoCoeficienteAtributo, GanhoRelativoCoeficienteAtributoDto, ITipoGanhoNivel, TipoGanhoNivelDto, IGeracao, GeracaoDto, IImagem, ImagemDto, ITipoImagem, TipoImagemDto, IAlcance, AlcanceDto, IAtributo, AtributoDto, ICategoriaRitual, CategoriaRitualDto, ICirculoRitual, CirculoRitualDto, IClasse, ClasseDto, IDuracao, DuracaoDto, IElemento, ElementoDto, IEstatisticaDanificavel, EstatisticaDanificavelDto, IExecucao, ExecucaoDto, IFormatoAlcance, FormatoAlcanceDto, ILinhaEfeito, LinhaEfeitoDto, INivel, NivelDto, INivelComponente, NivelComponenteDto, INivelProficiencia, NivelProficienciaDto, INivelRitual, NivelRitualDto, IPatentePericia, PatentePericiaDto, IPericia, PericiaDto, IProficiencia, ProficienciaDto, ITipoAlvo, TipoAlvoDto, ITipoCategoria, TipoCategoriaDto, ITipoDano, TipoDanoDto, ITipoEfeito, TipoEfeitoDto, ITipoItem, TipoItemDto, ITipoProficiencia, TipoProficienciaDto, ILink, LinkDto, ITipoLink, TipoLinkDto, IDificuldadeSessao, DificuldadeSessaoDto, IEstiloSessaoMestrada, EstiloSessaoMestradaDto, ITipoSessao, TipoSessaoDto, IPerfilAdmin, PerfilAdminDto, IPerfilJogador, PerfilJogadorDto, IPerfilMestre, PerfilMestreDto, IFichaPersonagem, FichaPersonagemDto, ObjetoFicha, DetalheEvolucao, DetalhesExtras, FichaDeJogo, AtributoFicha, PericiaFicha, EstatisticaDanificavelFicha, DetalheFicha, RegistroPericiaLivre, IInformacaoPersonagem, InformacaoPersonagemDto, IPersonagem, PersonagemDto, PersonagemSalaJogoDto, IResumoPersonagemAventura, ResumoPersonagemAventuraDto, ITipoPersonagem, TipoPersonagemDto, IDetalheRascunhoAventura, DetalheRascunhoAventuraDto, IDetalheRascunhoSessaoUnicaCanonica, DetalheRascunhoSessaoUnicaCanonicaDto, IDetalheRascunhoSessaoUnicaNaoCanonica, DetalheRascunhoSessaoUnicaNaoCanonicaDto, IRascunho, RascunhoDto, IEstudo, EstudoDto, IRegistroSessao, RegistroSessaoDto, ISessao, SessaoDto, SessaoDadosGerais, ParticipanteSessao, AuthSession, ICustomizacaoUsuario, CustomizacaoUsuarioDto, IDisponibilidadeUsuario, DisponibilidadeUsuarioDto, ListaDisponibilidadesUsuario, DisponibilidadesDDS, JanelaDisponibilidade, IUsuario, UsuarioDto, SalaDeJogo_Codigo, SalaDeJogoParams, SalaDeJogo_Tipo, SalaDeJogo_Estado, SalaDeJogo_TipoMestre, SalaDeJogo_Mestre, SalaDeJogo_Mestre_Mestrada, SalaDeJogo_Mestre_Inteligente, SalaDeJogo_TipoParticipante, SalaDeJogo_Participante, SalaDeJogo_Participante_Narrador, SalaDeJogo_Participante_Jogador, SalaDeJogo_FUNC_AtualizaParticipanteParams, SalaDeJogoDto, MenuItemNode, MenuGrupoNode, MenuNode, menuItem, menuGrupo, PaginaLike, MenuInternoTree, MenusInternos, Brand, ExtrairParamsDoTemplate, PaginaParamsDoTemplate, PaginaInfo, PaginaTemplate, PaginaDef, PaginaParams, montarHref, pagina, RequiredKeys, ParamsProps, FormatoUploadArquivo, DimensoesImagem, RequireAtLeastOne, RegraTamanhoArquivo, RegraDimensoesImagem, RegraProporcaoImagem, RegrasUploadBase, RegrasUploadImagem, RegrasUploadArquivo, TipoUpload, MensagemChatRecebida, SalaChat, SalaChatFront, MensagemChatPayload, SOCKET_AcessoUsuario, SOCKET_UsuarioExistente, TelemetryConnectionInfo, WsEventAudienceUnico, WsEventAudienceMultiplo, WsEventAudience, TelemetryEventLog, TelemetrySnapshot, WsErrorResponse, WsUnauthorizedErrorResponse, WsResult, isWsErrorResponse, isWsUnauthorizedErrorResponse, wsErro, wsUnauthorized, wsMap, wsChain, EventoTipo, EmitDelivery, EventoAuthDefault, EventoEnvia, EventoEmite, EventoEnviaERecebe, EventoSchema, GatewayDef, createGateway, EventosWebSocket, isRecord, getEmitDelivery, WsEmitTarget, WsEmitParams, EventosEmiteMap, EventoEmiteAny, PaletaCores, EstruturaPaginaDefinicao, ConteudoItem, DefinicaoElemento, ListaItem, AventuraEstado, EstadoPendenciaPersonagem, EstadoPendenciaAdministrativaPersonagem, EstadoOcupacaoPersonagem, EstadoSessao, DiaDaSemana, obtemDiaDaSemanaPorExtensoPorDDS, NumeroHora24, NumeroMomento, MomentoFormatado24, MomentoFormatado, CargoExibicaoUsuario, CargosUsuario, ObjetoAutenticacao, ObjetoCache, ObjetoPendeciaPersonagem, TipoVariavelAmbiente, ObjetoEvolucaoCompleto, ObjetoEvolucao, ObjetoGanhosEvolucao, GanhoEstatistica, FormatoMomento, DetalheUtilizacaoRascunho, EstiloSessao, PathTokenPadrao, TituloSessaoInteligente, Capacidade, LISTA_CAPACIDADES, PermissaoItemMinimo, ListaCapacidadesNecessarias, AcessoPagina, Gateways, EventoTipoLiteral, FiltraEventosPorTipo, criarEventosFiltrados, Eventos_Envia, Eventos_Emite, Eventos_EnviaERecebe, DecisaoAcessoPagina, ResolverMenuInterno, Opts, decidirAcessoPagina, decidirAcessoPagina_Rec, PAGINAS, Folhas, PaginaFolha, PaginaTemplateFolha, PaginaDestino, PaginaDestinoPagina, PaginaHrefTemplate, PaginaHref, PaginaDefAny, PaginaTemplateAny, filtrarMenuPorAcesso, MENU_PRINCIPAL, MENUS_INTERNOS, MENUS_INTERNOS_POR_PAGINA, obterMenuInterno, resolverMenuInterno, ResultadoValidacao, isNumeroInteiroPositivo, isNumeroPositivo, pushErro, validarFormatos, validarTamanho, validarDimensoesDim, validarDimensoesRegra, validarProporcao, validarMaxPixels, validarImagem, validarRegrasUploadArquivo, isRegrasUploadArquivoValidas, mimeFromFormato, acceptFromFormatos, isFormatoImagemBitmap };
1830
+ export { CAPACIDADES, PERMISSOES_ESTADOS, TIPOS_IMAGEM, CtxAcesso, temSudoBurlarCapacidades, IPermissoesEstado, PermissoesEstadoDto, IPermissoesItem, PermissoesItemDto, ItemPermissaoDto, ArvoreItensPermissaoDto, IPermissoesUsuario, PermissoesUsuarioDto, IPermissoesUsuariosHistorico, PermissoesUsuariosHistoricoDto, IArcoAventura, ArcoAventuraDto, IAventura, AventuraDto, IConviteGrupoAventuraPersonagem, ConviteGrupoAventuraPersonagemDto, IGrupoAventura, GrupoAventuraDto, IGrupoAventuraPersonagem, GrupoAventuraPersonagemDto, IRespostaConvite, RespostaConviteDto, IVariavelAmbiente, VariavelAmbienteDto, IConquista, ConquistaDto, ITipoConquista, TipoConquistaDto, IDetalheSessaoAventura, DetalheSessaoAventuraDto, IDetalheSessaoCanonica, DetalheSessaoCanonicaDto, CapituloSessaoCanonica, IDetalheSessaoUnica, DetalheSessaoUnicaDto, IParticipanteSessaoUnica, ParticipanteSessaoUnicaDto, ICoeficienteGanhoEstatisticaClasse, CoeficienteGanhoEstatisticaClasseDto, IGanhoNivelClasse, GanhoNivelClasseDto, DadosDoTipoGanho, DadosGanho_Atributos, DadosGanho_Pericias, DadosGanho_Estatisticas, DadosGanho_Classes, DadosGanho_ValorMaximoAtributo, DadosGanho_PontosHabilidadesEspeciais, DadosGanho_PontosHabilidadesParanormais, DadosGanho_PontosHabilidadeElemental, IGanhoRelativoCoeficienteAtributo, GanhoRelativoCoeficienteAtributoDto, ITipoGanhoNivel, TipoGanhoNivelDto, IGeracao, GeracaoDto, IImagem, ImagemDto, ITipoImagem, TipoImagemDto, IAlcance, AlcanceDto, IAtributo, AtributoDto, ICategoriaRitual, CategoriaRitualDto, ICirculoRitual, CirculoRitualDto, IClasse, ClasseDto, IDuracao, DuracaoDto, IElemento, ElementoDto, IEstatisticaDanificavel, EstatisticaDanificavelDto, IExecucao, ExecucaoDto, IFormatoAlcance, FormatoAlcanceDto, ILinhaEfeito, LinhaEfeitoDto, INivel, NivelDto, INivelComponente, NivelComponenteDto, INivelProficiencia, NivelProficienciaDto, INivelRitual, NivelRitualDto, IPatentePericia, PatentePericiaDto, IPericia, PericiaDto, IProficiencia, ProficienciaDto, ITipoAlvo, TipoAlvoDto, ITipoCategoria, TipoCategoriaDto, ITipoDano, TipoDanoDto, ITipoEfeito, TipoEfeitoDto, ITipoItem, TipoItemDto, ITipoProficiencia, TipoProficienciaDto, ILink, LinkDto, ITipoLink, TipoLinkDto, IDificuldadeSessao, DificuldadeSessaoDto, IEstiloSessaoMestrada, EstiloSessaoMestradaDto, ITipoSessao, TipoSessaoDto, IPerfilAdmin, PerfilAdminDto, IPerfilJogador, PerfilJogadorDto, IPerfilMestre, PerfilMestreDto, IFichaPersonagem, FichaPersonagemDto, ObjetoFicha, DetalheEvolucao, DetalhesExtras, FichaDeJogo, AtributoFicha, PericiaFicha, EstatisticaDanificavelFicha, DetalheFicha, RegistroPericiaLivre, IInformacaoPersonagem, InformacaoPersonagemDto, IPersonagem, PersonagemDto, PersonagemSalaJogoDto, IResumoPersonagemAventura, ResumoPersonagemAventuraDto, ITipoPersonagem, TipoPersonagemDto, IDetalheRascunhoAventura, DetalheRascunhoAventuraDto, IDetalheRascunhoSessaoUnicaCanonica, DetalheRascunhoSessaoUnicaCanonicaDto, IDetalheRascunhoSessaoUnicaNaoCanonica, DetalheRascunhoSessaoUnicaNaoCanonicaDto, IRascunho, RascunhoDto, IEstudo, EstudoDto, IRegistroSessao, RegistroSessaoDto, ISessao, SessaoDto, SessaoDadosGerais, ParticipanteSessao, AuthSession, ICustomizacaoUsuario, CustomizacaoUsuarioDto, IDisponibilidadeUsuario, DisponibilidadeUsuarioDto, ListaDisponibilidadesUsuario, DisponibilidadesDDS, JanelaDisponibilidade, IUsuario, UsuarioDto, LayoutContextualizadoInicial, SalaDeJogo_Codigo, SalaDeJogoParams, SalaDeJogo_Tipo, SalaDeJogo_Estado, SalaDeJogo_TipoMestre, SalaDeJogo_Mestre, SalaDeJogo_Mestre_Mestrada, SalaDeJogo_Mestre_Inteligente, SalaDeJogo_TipoParticipante, SalaDeJogo_Participante, SalaDeJogo_Participante_Narrador, SalaDeJogo_Participante_Jogador, SalaDeJogo_FUNC_AtualizaParticipanteParams, SalaDeJogoDto, MenuItemNode, MenuGrupoNode, MenuNode, menuItem, menuGrupo, PaginaLike, MenuInternoTree, MenusInternos, PaginaComLayout, HasLayout, ChildKeysByHasLayout, TemFilhos, FilhosDePagina, MenuLayoutLeaf, menuVazio, menuDinamico, MenuLayoutChildren, MenuLayoutNode, RootMenuLayout, MenusInternosLayoutContexto, Brand, ParamValue, ParamsRecord, ExtrairParamsDoTemplate, PaginaParamsDoTemplate, PaginaInfoBase, PaginaInfoComLayoutContextualizado, PaginaInfo, PaginaTemplate, PaginaDef, PaginaParams, montarHref, LimparUndefinedValue, LimparUndefinedRecord, limparUndefined, pagina, paginaComLayoutContextualizado, RequiredKeys, ParamsProps, FormatoUploadArquivo, DimensoesImagem, RequireAtLeastOne, RegraTamanhoArquivo, RegraDimensoesImagem, RegraProporcaoImagem, RegrasUploadBase, RegrasUploadImagem, RegrasUploadArquivo, TipoUpload, MensagemChatRecebida, SalaChat, SalaChatFront, MensagemChatPayload, SOCKET_AcessoUsuario, SOCKET_UsuarioExistente, TelemetryConnectionInfo, WsEventAudienceUnico, WsEventAudienceMultiplo, WsEventAudience, TelemetryEventLog, TelemetrySnapshot, WsErrorResponse, WsUnauthorizedErrorResponse, WsResult, isWsErrorResponse, isWsUnauthorizedErrorResponse, wsErro, wsUnauthorized, wsMap, wsChain, EventoTipo, EmitDelivery, EventoAuthDefault, EventoEnvia, EventoEmite, EventoEnviaERecebe, EventoSchema, GatewayDef, createGateway, EventosWebSocket, isRecord, getEmitDelivery, WsEmitTarget, WsEmitParams, EventosEmiteMap, EventoEmiteAny, PaletaCores, EstruturaPaginaDefinicao, ConteudoItem, DefinicaoElemento, ListaItem, AventuraEstado, EstadoPendenciaPersonagem, EstadoPendenciaAdministrativaPersonagem, EstadoOcupacaoPersonagem, EstadoSessao, DiaDaSemana, obtemDiaDaSemanaPorExtensoPorDDS, NumeroHora24, NumeroMomento, MomentoFormatado24, MomentoFormatado, CargoExibicaoUsuario, CargosUsuario, ObjetoAutenticacao, ObjetoCache, ObjetoPendeciaPersonagem, TipoVariavelAmbiente, ObjetoEvolucaoCompleto, ObjetoEvolucao, ObjetoGanhosEvolucao, GanhoEstatistica, FormatoMomento, DetalheUtilizacaoRascunho, EstiloSessao, PathTokenPadrao, TituloSessaoInteligente, Capacidade, LISTA_CAPACIDADES, PermissaoItemMinimo, ListaCapacidadesNecessarias, AcessoPagina, Gateways, EventoTipoLiteral, FiltraEventosPorTipo, criarEventosFiltrados, Eventos_Envia, Eventos_Emite, Eventos_EnviaERecebe, DecisaoAcessoPagina, ResolverMenuInterno, Opts, decidirAcessoPagina, decidirAcessoPagina_Rec, PAGINAS, Folhas, PaginaFolha, PaginaTemplateFolha, PaginaDestino, PaginaDestinoPagina, PaginaHrefTemplate, PaginaHref, PaginaDefAny, PaginaTemplateAny, filtrarMenuPorAcesso, MENU_PRINCIPAL, MENUS_INTERNOS, MENUS_INTERNOS_LAYOUTCONTEXTO, PaginasNodeValue, PaginasNodeRecord, MenusNodeRecord, isPaginaComLayout, isMenuLeaf, MENUS_LAYOUTCONTEXTO_POR_PAGINA, obterMenuInternoLayoutContexto, MENUS_INTERNOS_POR_PAGINA, obterMenuInterno, resolverMenuInterno, ResultadoValidacao, isNumeroInteiroPositivo, isNumeroPositivo, pushErro, validarFormatos, validarTamanho, validarDimensoesDim, validarDimensoesRegra, validarProporcao, validarMaxPixels, validarImagem, validarRegrasUploadArquivo, isRegrasUploadArquivoValidas, mimeFromFormato, acceptFromFormatos, isFormatoImagemBitmap };
package/dist/classes.js CHANGED
@@ -85,6 +85,8 @@ var SalaDeJogo_TipoParticipante;
85
85
  })(SalaDeJogo_TipoParticipante || (SalaDeJogo_TipoParticipante = {}));
86
86
  function menuItem(titulo, destino) { return { tipo: 'item', titulo, destino }; }
87
87
  function menuGrupo(titulo, itens) { return { tipo: 'grupo', titulo, itens }; }
88
+ function menuVazio() { return { tipo: 'vazio' }; }
89
+ function menuDinamico() { return { tipo: 'dinamico' }; }
88
90
  function montarHref(template, params) {
89
91
  const out = template.replace(/\[\[\.\.\.([^\]]+)\]\]|\[\.\.\.([^\]]+)\]|\[([^\]]+)\]/g, (_m, optCatchAll, catchAll, single) => {
90
92
  const key = (optCatchAll || catchAll || single);
@@ -103,29 +105,32 @@ function montarHref(template, params) {
103
105
  }
104
106
  if (value == null)
105
107
  throw new Error(`PAGINAS.montarHref: "${key}" é obrigatório`);
108
+ if (Array.isArray(value))
109
+ throw new Error(`PAGINAS.montarHref: "${key}" deve ser string (single param)`);
106
110
  return encodeURIComponent(String(value));
107
111
  });
108
112
  const cleaned = out.replace(/\/+/g, '/').replace(/\/$/, '');
109
113
  return cleaned === '' ? '/' : cleaned;
110
114
  }
115
+ function limparUndefined(obj) {
116
+ const out = {};
117
+ for (const k in obj) {
118
+ if (!Object.prototype.hasOwnProperty.call(obj, k))
119
+ continue;
120
+ const key = k;
121
+ const v = obj[key];
122
+ if (v !== undefined)
123
+ out[key] = v;
124
+ }
125
+ return out;
126
+ }
111
127
  function pagina(hrefTemplate, info) {
112
128
  const template = hrefTemplate;
113
- const { label, comCabecalho, acesso, acessoPorMenuInterno } = info;
114
- if (acesso == null && comCabecalho == null && acessoPorMenuInterno == null)
115
- return { template, hrefTemplate, href: hrefTemplate, label };
116
- if (acesso == null && comCabecalho == null)
117
- return { template, hrefTemplate, href: hrefTemplate, label, acessoPorMenuInterno };
118
- if (acesso == null && acessoPorMenuInterno == null)
119
- return { template, hrefTemplate, href: hrefTemplate, label, comCabecalho };
120
- if (comCabecalho == null && acessoPorMenuInterno == null)
121
- return { template, hrefTemplate, href: hrefTemplate, label, acesso };
122
- if (acesso == null)
123
- return { template, hrefTemplate, href: hrefTemplate, label, comCabecalho, acessoPorMenuInterno };
124
- if (comCabecalho == null)
125
- return { template, hrefTemplate, href: hrefTemplate, label, acesso, acessoPorMenuInterno };
126
- if (acessoPorMenuInterno == null)
127
- return { template, hrefTemplate, href: hrefTemplate, label, comCabecalho, acesso };
128
- return { template, hrefTemplate, href: hrefTemplate, label, comCabecalho, acesso, acessoPorMenuInterno };
129
+ return limparUndefined({ template, hrefTemplate, href: hrefTemplate, ...info });
130
+ }
131
+ function paginaComLayoutContextualizado(hrefTemplate, info, layoutContextualizadoInicial) {
132
+ const template = hrefTemplate;
133
+ return limparUndefined({ template, hrefTemplate, href: hrefTemplate, ...info, layoutContextualizadoInicial });
129
134
  }
130
135
  function isWsErrorResponse(payload) { return !!payload && typeof payload === "object" && payload._wsErro === true; }
131
136
  function isWsUnauthorizedErrorResponse(payload) { return isWsErrorResponse(payload) && payload.code === "UNAUTHORIZED"; }
@@ -381,55 +386,59 @@ const PAGINAS = {
381
386
  home: pagina('/', { label: 'Página Inicial', comCabecalho: true }),
382
387
  acessar: pagina('/acessar', { label: 'Acessar' }),
383
388
  cadastrar: pagina('/cadastrar', { label: 'Cadastrar' }),
384
- aventura: pagina('/aventura/[id]', { label: 'Aventura' }),
385
- aventuras: pagina('/aventuras', { label: 'Aventuras' }),
389
+ aventura: paginaComLayoutContextualizado('/aventura/[id]', { label: 'Aventura' }, { titulo: 'TROCAR', proporcaoConteudo: 87 }),
390
+ aventuras: paginaComLayoutContextualizado('/aventuras', { label: 'Aventuras' }, { titulo: 'Assistir Aventuras', proporcaoConteudo: 80 }),
386
391
  definicoes: pagina('/definicoes/[[...slug]]', { label: 'Definições', comCabecalho: true }),
387
392
  dicas: pagina('/dicas/[[...slug]]', { label: 'Dicas', comCabecalho: true }),
388
393
  jogo: {
389
- ...pagina('/jogo', { label: 'Jogo', acesso: { autenticado: true }, acessoPorMenuInterno: true }),
390
- jogador: pagina('/jogo/jogador', { label: 'Jogo - Jogador', acesso: { autenticado: true } }),
391
- mestre: { sessoesMestre: pagina('/jogo/mestre/sessoes-mestre', { label: 'Mestre - Sessões', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MESTRE__CRIACAO__SESSAO_DE_JOGO] } }) },
392
- admin: { gerenciarSalas: pagina('/jogo/admin/gerenciar-salas', { label: 'Admin - Gerenciar Salas', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__ACOMPANHAMENTO__SESSAO_DE_JOGO] } }) },
394
+ ...paginaComLayoutContextualizado('/jogo', { label: 'Jogo', acesso: { autenticado: true }, acessoPorMenuInterno: true }, { titulo: 'Página de Jogo', proporcaoConteudo: 84 }),
395
+ admin: {
396
+ gerenciarSalas: paginaComLayoutContextualizado('/jogo/admin/gerenciar-salas', { label: 'Admin - Gerenciar Salas', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__ACOMPANHAMENTO__SESSAO_DE_JOGO] } }, { titulo: 'Gerenciar Salas', proporcaoConteudo: 84 }),
397
+ },
398
+ mestre: {
399
+ sessoesMestre: paginaComLayoutContextualizado('/jogo/mestre/sessoes-mestre', { label: 'Mestre - Sessões', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MESTRE__CRIACAO__SESSAO_DE_JOGO] } }, { titulo: 'Criação de Sala', proporcaoConteudo: 84 }),
400
+ },
401
+ jogador: paginaComLayoutContextualizado('/jogo/jogador', { label: 'Jogo - Jogador', acesso: { autenticado: true } }, { titulo: 'Buscando Salas', proporcaoConteudo: 84 }),
393
402
  emJogo: pagina('/jogo/em-jogo', { label: 'Em Jogo', acesso: { autenticado: true } }),
394
403
  },
395
404
  linhaDoTempo: pagina('/linha-do-tempo', { label: 'Linha do Tempo' }),
396
405
  minhaPagina: pagina('/minha-pagina', { label: 'Minha Página', acesso: { autenticado: true } }),
397
406
  minhasPaginas: {
398
407
  admin: {
399
- ...pagina('/minhas-paginas/admin', { label: 'Administração', acesso: { autenticado: true }, acessoPorMenuInterno: true }),
400
- aventura: pagina('/minhas-paginas/admin/aventura/[id]', { label: 'Admin - Aventura', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__AVENTURAS_E_SESSOES] } }),
401
- aventuras: pagina('/minhas-paginas/admin/aventuras', { label: 'Admin - Aventuras', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__AVENTURAS_E_SESSOES] } }),
402
- dashboardWs: pagina('/minhas-paginas/admin/dashboard-ws', { label: 'Admin - Dashboard WS', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__ACOMPANHAMENTO__WEBSOCKET] } }),
403
- sessao: pagina('/minhas-paginas/admin/sessao/[id]', { label: 'Admin - Sessão', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__AVENTURAS_E_SESSOES] } }),
404
- uploads: pagina('/minhas-paginas/admin/uploads', { label: 'Admin - Uploads', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__UPLOAD_RECURSOS_INTERNOS] } }),
405
- variaveisAmbiente: pagina('/minhas-paginas/admin/variaveis-ambiente', { label: 'Admin - Variáveis de Ambiente', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__VARIAVEIS_DE_AMBIENTE] } }),
406
- dashboardPermissoes: pagina('/minhas-paginas/admin/permissoes', { label: 'Admin - Permissões', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__PERMISSOES__CRIACAO_CAPACIDADES] } }),
407
- dashboardPermissoesUsuarios: pagina('/minhas-paginas/admin/permissoes-usuarios', { label: 'Admin - Permissões de Usuários', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__PERMISSOES__ALTERACAO_CAPACIDADES_GERAIS_USUARIOS] } }),
408
- },
409
- jogador: {
410
- ...pagina('/minhas-paginas/jogador', { label: 'Área do Jogador', acesso: { autenticado: true }, acessoPorMenuInterno: true }),
411
- meusPersonagens: pagina('/minhas-paginas/jogador/meus-personagens', { label: 'Meus Personagens', acesso: { autenticado: true } }),
408
+ ...paginaComLayoutContextualizado('/minhas-paginas/admin', { label: 'Administração', acesso: { autenticado: true }, acessoPorMenuInterno: true }, { titulo: 'Página de Administrador', proporcaoConteudo: 84 }),
409
+ aventura: paginaComLayoutContextualizado('/minhas-paginas/admin/aventura/[id]', { label: 'Admin - Aventura', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__AVENTURAS_E_SESSOES] } }, { titulo: 'Gerenciamento de Aventura', proporcaoConteudo: 84 }),
410
+ aventuras: paginaComLayoutContextualizado('/minhas-paginas/admin/aventuras', { label: 'Admin - Aventuras', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__AVENTURAS_E_SESSOES] } }, { titulo: 'Gerenciamento de Aventuras', proporcaoConteudo: 84 }),
411
+ dashboardWs: paginaComLayoutContextualizado('/minhas-paginas/admin/dashboard-ws', { label: 'Admin - Dashboard WS', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__ACOMPANHAMENTO__WEBSOCKET] } }, { titulo: 'Dashboard: WebSocket', proporcaoConteudo: 84 }),
412
+ sessao: paginaComLayoutContextualizado('/minhas-paginas/admin/sessao/[id]', { label: 'Admin - Sessão', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__AVENTURAS_E_SESSOES] } }, { titulo: 'Gerenciamento de Sessão', proporcaoConteudo: 84 }),
413
+ uploadRecursosInternos: paginaComLayoutContextualizado('/minhas-paginas/admin/uploads', { label: 'Admin - Uploads', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__UPLOAD_RECURSOS_INTERNOS] } }, { titulo: 'Upload de Recursos Internos', proporcaoConteudo: 84 }),
414
+ variaveisAmbiente: paginaComLayoutContextualizado('/minhas-paginas/admin/variaveis-ambiente', { label: 'Admin - Variáveis de Ambiente', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__VARIAVEIS_DE_AMBIENTE] } }, { titulo: 'Variáveis de Ambiente', proporcaoConteudo: 84 }),
415
+ dashboardPermissoes: paginaComLayoutContextualizado('/minhas-paginas/admin/permissoes', { label: 'Admin - Permissões', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__PERMISSOES__CRIACAO_CAPACIDADES] } }, { titulo: 'Gerenciamento de Permissões', proporcaoConteudo: 84 }),
416
+ dashboardPermissoesUsuarios: paginaComLayoutContextualizado('/minhas-paginas/admin/permissoes-usuarios', { label: 'Admin - Permissões de Usuários', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__PERMISSOES__ALTERACAO_CAPACIDADES_GERAIS_USUARIOS] } }, { titulo: 'Permissões de Usuário', proporcaoConteudo: 84 }),
412
417
  },
413
418
  mestre: {
414
- ...pagina('/minhas-paginas/mestre', { label: 'Área do Mestre', acesso: { autenticado: true }, acessoPorMenuInterno: true }),
415
- aventura: pagina('/minhas-paginas/mestre/aventura/[id]', { label: 'Mestre - Aventura', acesso: { autenticado: true } }),
416
- aventuras: pagina('/minhas-paginas/mestre/aventuras', { label: 'Mestre - Aventuras', acesso: { autenticado: true } }),
417
- sessoesUnicas: pagina('/minhas-paginas/mestre/sessoes-unicas', { label: 'Mestre - Sessões Únicas', acesso: { autenticado: true } }),
418
- personagens: pagina('/minhas-paginas/mestre/personagens', { label: 'Mestre - Personagens', acesso: { autenticado: true } }),
419
+ ...paginaComLayoutContextualizado('/minhas-paginas/mestre', { label: 'Área do Mestre', acesso: { autenticado: true }, acessoPorMenuInterno: true }, { titulo: 'Página de Mestre', proporcaoConteudo: 84 }),
420
+ aventura: paginaComLayoutContextualizado('/minhas-paginas/mestre/aventura/[id]', { label: 'Mestre - Aventura', acesso: { autenticado: true } }, { titulo: 'TROCAR', proporcaoConteudo: 84 }),
421
+ aventuras: paginaComLayoutContextualizado('/minhas-paginas/mestre/aventuras', { label: 'Mestre - Aventuras', acesso: { autenticado: true } }, { titulo: 'Minhas Aventuras', proporcaoConteudo: 84 }),
422
+ sessoesUnicas: paginaComLayoutContextualizado('/minhas-paginas/mestre/sessoes-unicas', { label: 'Mestre - Sessões Únicas', acesso: { autenticado: true } }, { titulo: 'Minhas Sessões Únicas', proporcaoConteudo: 84 }),
423
+ personagens: paginaComLayoutContextualizado('/minhas-paginas/mestre/personagens', { label: 'Mestre - Personagens', acesso: { autenticado: true } }, { titulo: 'Meus Personagens de Mestre', proporcaoConteudo: 84 }),
419
424
  rascunhos: {
420
- aventuras: pagina('/minhas-paginas/mestre/rascunhos/aventuras', { label: 'Rascunhos - Aventuras', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MESTRE__CRIACAO__RASCUNHO_AVENTURA] } }),
421
- sessoesUnicas: pagina('/minhas-paginas/mestre/rascunhos/sessoes-unicas', { label: 'Rascunhos - Sessões Únicas', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MESTRE__CRIACAO__RASCUNHO_SESSAO_UNICA] } }),
425
+ aventuras: paginaComLayoutContextualizado('/minhas-paginas/mestre/rascunhos/aventuras', { label: 'Rascunhos - Aventuras', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MESTRE__CRIACAO__RASCUNHO_AVENTURA] } }, { titulo: 'Meus Rascunhos de Aventuras', proporcaoConteudo: 84 }),
426
+ sessoesUnicas: paginaComLayoutContextualizado('/minhas-paginas/mestre/rascunhos/sessoes-unicas', { label: 'Rascunhos - Sessões Únicas', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MESTRE__CRIACAO__RASCUNHO_SESSAO_UNICA] } }, { titulo: 'Meus Rascunhos de Sessões Únicas', proporcaoConteudo: 84 }),
422
427
  },
423
- sessao: pagina('/minhas-paginas/mestre/sessao/[id]', { label: 'Mestre - Sessão', acesso: { autenticado: true } }),
428
+ sessao: paginaComLayoutContextualizado('/minhas-paginas/mestre/sessao/[id]', { label: 'Mestre - Sessão', acesso: { autenticado: true } }, { titulo: 'TROCAR', proporcaoConteudo: 84 }),
424
429
  },
425
430
  artista: {
426
- ...pagina('/minhas-paginas/artista', { label: 'Área do Artista', acesso: { autenticado: true }, acessoPorMenuInterno: true }),
427
- minhasImagens: pagina('/minhas-paginas/artista/minhas-imagens', { label: 'Minhas Imagens', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ARTISTA__CRIACAO__UPLOAD_IMAGEM] } }),
428
- adicionarImagem: pagina('/minhas-paginas/artista/adicionar-imagem', { label: 'Adicionar Imagem', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ARTISTA__CRIACAO__UPLOAD_IMAGEM] } }),
431
+ ...paginaComLayoutContextualizado('/minhas-paginas/artista', { label: 'Área do Artista', acesso: { autenticado: true }, acessoPorMenuInterno: true }, { titulo: 'Página de Artista', proporcaoConteudo: 84 }),
432
+ minhasImagens: paginaComLayoutContextualizado('/minhas-paginas/artista/minhas-imagens', { label: 'Minhas Imagens', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ARTISTA__CRIACAO__UPLOAD_IMAGEM] } }, { titulo: 'Minhas Imagens', proporcaoConteudo: 84 }),
433
+ adicionarImagem: paginaComLayoutContextualizado('/minhas-paginas/artista/adicionar-imagem', { label: 'Adicionar Imagem', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ARTISTA__CRIACAO__UPLOAD_IMAGEM] } }, { titulo: 'Adicionar Nova Imagem', proporcaoConteudo: 84 }),
429
434
  },
430
- minhasDisponibilidades: pagina('/minhas-paginas/minhas-disponibilidades', { label: 'Minhas Disponibilidades', acesso: { autenticado: true } }),
435
+ jogador: {
436
+ ...paginaComLayoutContextualizado('/minhas-paginas/jogador', { label: 'Área do Jogador', acesso: { autenticado: true }, acessoPorMenuInterno: true }, { titulo: 'Página de Jogador', proporcaoConteudo: 84 }),
437
+ meusPersonagens: paginaComLayoutContextualizado('/minhas-paginas/jogador/meus-personagens', { label: 'Meus Personagens', acesso: { autenticado: true } }, { titulo: 'Meus Personagens', proporcaoConteudo: 84 }),
438
+ },
439
+ minhasDisponibilidades: paginaComLayoutContextualizado('/minhas-paginas/minhas-disponibilidades', { label: 'Minhas Disponibilidades', acesso: { autenticado: true } }, { titulo: 'Minhas Disponibilidades', proporcaoConteudo: 100 }),
431
440
  },
432
- personagens: pagina('/personagens', { label: 'Personagens', acesso: { autenticado: true } }),
441
+ personagens: paginaComLayoutContextualizado('/personagens', { label: 'Personagens', acesso: { autenticado: true } }, { titulo: 'Meus Personagens', proporcaoConteudo: 84 }),
433
442
  sessoes: pagina('/sessoes', { label: 'Sessões' }),
434
443
  sessaoAovivo: pagina('/sessao-aovivo', { label: 'Sessão Ao Vivo', acesso: { autenticado: true } }),
435
444
  sessao: pagina('/sessao/[id]', { label: 'Sessão' }),
@@ -449,9 +458,6 @@ function filtrarMenuPorAcesso(nodes, ctx) {
449
458
  }
450
459
  return out;
451
460
  }
452
- /*
453
- MENU_PRINCIPAL é o menu “final” (view-model) já pronto pra ser filtrado + renderizado.
454
- */
455
461
  const MENU_PRINCIPAL = [
456
462
  menuGrupo('Minhas Páginas', [
457
463
  menuItem('Administrador', { pagina: PAGINAS.minhasPaginas.admin }),
@@ -468,15 +474,22 @@ const MENU_PRINCIPAL = [
468
474
  menuItem('Definições', { pagina: PAGINAS.definicoes, params: { slug: [] } }),
469
475
  menuItem('Dicas', { pagina: PAGINAS.dicas, params: { slug: [] } }),
470
476
  ];
471
- /*
472
- MENUS_INTERNOS: árvore tipada e “descobrível” (DX).
473
- Note que isso NÃO é “páginas /admin/*”, e sim o menu interno “da página admin”.
474
- */
475
477
  const MENUS_INTERNOS = {
476
478
  PAGINAS: {
479
+ jogo: [
480
+ menuGrupo('Administrador', [
481
+ menuItem('Salas', { pagina: PAGINAS.jogo.admin.gerenciarSalas }),
482
+ ]),
483
+ menuGrupo('Mestre', [
484
+ menuItem('Sessões', { pagina: PAGINAS.jogo.mestre.sessoesMestre }),
485
+ ]),
486
+ menuGrupo('Jogador', [
487
+ menuItem('Início', { pagina: PAGINAS.jogo.jogador }),
488
+ ]),
489
+ ],
477
490
  minhasPaginas: {
478
491
  admin: [
479
- menuItem('Upload de Recursos Internos', { pagina: PAGINAS.minhasPaginas.admin.uploads }),
492
+ menuItem('Upload de Recursos Internos', { pagina: PAGINAS.minhasPaginas.admin.uploadRecursosInternos }),
480
493
  menuItem('Variáveis de Ambiente', { pagina: PAGINAS.minhasPaginas.admin.variaveisAmbiente }),
481
494
  menuItem('Aventuras', { pagina: PAGINAS.minhasPaginas.admin.aventuras }),
482
495
  menuItem('Dashboard WebSocket', { pagina: PAGINAS.minhasPaginas.admin.dashboardWs }),
@@ -503,59 +516,136 @@ const MENUS_INTERNOS = {
503
516
  ]),
504
517
  ]),
505
518
  ],
519
+ artista: [
520
+ menuItem('Minhas Imagens', { pagina: PAGINAS.minhasPaginas.artista.minhasImagens }),
521
+ menuItem('Adicionar Nova Imagem', { pagina: PAGINAS.minhasPaginas.artista.adicionarImagem }),
522
+ ],
506
523
  jogador: [
507
524
  menuGrupo('Jogador', [
508
525
  menuItem('Início', { pagina: PAGINAS.minhasPaginas.jogador }),
509
526
  menuItem('Meus Personagens', { pagina: PAGINAS.minhasPaginas.jogador.meusPersonagens }),
510
- ])
511
- ],
512
- artista: [
513
- menuItem('Minhas Imagens', { pagina: PAGINAS.minhasPaginas.artista.minhasImagens }),
514
- menuItem('Adicionar Nova Imagem', { pagina: PAGINAS.minhasPaginas.artista.adicionarImagem }),
527
+ ]),
515
528
  ],
516
529
  },
517
- jogo: [
518
- menuGrupo('Administrador', [
519
- menuItem('Salas', { pagina: PAGINAS.jogo.admin.gerenciarSalas }),
520
- ]),
521
- menuGrupo('Mestre', [
522
- menuItem('Sessões', { pagina: PAGINAS.jogo.mestre.sessoesMestre }),
523
- ]),
524
- menuGrupo('Jogador', [
525
- // aqui você aponta para páginas reais do Next que existam no PAGINAS
526
- menuItem('Início', { pagina: PAGINAS.jogo.jogador }),
527
- // se você realmente tem essas rotas, elas precisam existir em PAGINAS também:
528
- // menuItem('Minhas Sessões', { pagina: PAGINAS.jogo.jogador.sessoesJogador }),
529
- // menuItem('Modo Individual', { pagina: PAGINAS.jogo.jogador.individual }),
530
- // menuItem('Teste', { pagina: PAGINAS.jogo.jogador.teste }),
531
- ]),
532
- ],
533
530
  },
534
531
  };
535
- /*
536
- Map derivado automaticamente da árvore acima.
537
- Sem duplicar listas, sem string key, sem “ordem de execução” frágil.
538
- */
532
+ const MENUS_INTERNOS_LAYOUTCONTEXTO = {
533
+ PAGINAS: {
534
+ aventura: menuDinamico(),
535
+ aventuras: menuDinamico(),
536
+ jogo: {
537
+ menu: MENUS_INTERNOS.PAGINAS.jogo,
538
+ admin: {
539
+ gerenciarSalas: MENUS_INTERNOS.PAGINAS.jogo,
540
+ },
541
+ mestre: {
542
+ sessoesMestre: MENUS_INTERNOS.PAGINAS.jogo,
543
+ },
544
+ jogador: MENUS_INTERNOS.PAGINAS.jogo,
545
+ },
546
+ minhasPaginas: {
547
+ admin: {
548
+ menu: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
549
+ aventura: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
550
+ aventuras: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
551
+ dashboardWs: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
552
+ sessao: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
553
+ uploadRecursosInternos: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
554
+ variaveisAmbiente: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
555
+ dashboardPermissoes: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
556
+ dashboardPermissoesUsuarios: MENUS_INTERNOS.PAGINAS.minhasPaginas.admin,
557
+ },
558
+ jogador: {
559
+ menu: MENUS_INTERNOS.PAGINAS.minhasPaginas.jogador,
560
+ meusPersonagens: MENUS_INTERNOS.PAGINAS.minhasPaginas.jogador,
561
+ },
562
+ mestre: {
563
+ menu: MENUS_INTERNOS.PAGINAS.minhasPaginas.mestre,
564
+ aventura: MENUS_INTERNOS.PAGINAS.minhasPaginas.mestre,
565
+ aventuras: MENUS_INTERNOS.PAGINAS.minhasPaginas.mestre,
566
+ sessoesUnicas: MENUS_INTERNOS.PAGINAS.minhasPaginas.mestre,
567
+ personagens: MENUS_INTERNOS.PAGINAS.minhasPaginas.mestre,
568
+ rascunhos: {
569
+ aventuras: MENUS_INTERNOS.PAGINAS.minhasPaginas.mestre,
570
+ sessoesUnicas: MENUS_INTERNOS.PAGINAS.minhasPaginas.mestre,
571
+ },
572
+ sessao: MENUS_INTERNOS.PAGINAS.minhasPaginas.mestre,
573
+ },
574
+ artista: {
575
+ menu: MENUS_INTERNOS.PAGINAS.minhasPaginas.artista,
576
+ minhasImagens: MENUS_INTERNOS.PAGINAS.minhasPaginas.artista,
577
+ adicionarImagem: MENUS_INTERNOS.PAGINAS.minhasPaginas.artista,
578
+ },
579
+ minhasDisponibilidades: menuVazio(),
580
+ },
581
+ personagens: menuDinamico(),
582
+ },
583
+ };
584
+ function isPaginaComLayout(node) { return 'layoutContextualizadoInicial' in node && 'template' in node; }
585
+ function isMenuLeaf(node) {
586
+ if (Array.isArray(node))
587
+ return true;
588
+ if ('tipo' in node)
589
+ return true;
590
+ return false;
591
+ }
592
+ const MENUS_LAYOUTCONTEXTO_POR_PAGINA = (() => {
593
+ const out = new Map();
594
+ const rec = (paginasNode, menusNode) => {
595
+ if (isMenuLeaf(menusNode)) {
596
+ if (isPaginaComLayout(paginasNode))
597
+ out.set(paginasNode, menusNode);
598
+ return;
599
+ }
600
+ const menusObj = menusNode;
601
+ const paginasObj = paginasNode;
602
+ for (const k of Object.keys(menusObj)) {
603
+ if (k === 'menu')
604
+ continue;
605
+ const nextMenus = menusObj[k];
606
+ if (!nextMenus)
607
+ continue;
608
+ const nextPaginas = paginasObj[k];
609
+ if (!nextPaginas || typeof nextPaginas !== 'object')
610
+ continue;
611
+ rec(nextPaginas, nextMenus);
612
+ }
613
+ };
614
+ rec(PAGINAS, MENUS_INTERNOS_LAYOUTCONTEXTO.PAGINAS);
615
+ return out;
616
+ })();
617
+ function obterMenuInternoLayoutContexto(pagina) {
618
+ return MENUS_LAYOUTCONTEXTO_POR_PAGINA.get(pagina);
619
+ }
539
620
  const MENUS_INTERNOS_POR_PAGINA = (() => {
540
621
  const out = new Map();
622
+ function isObject(v) { return typeof v === 'object' && v !== null; }
623
+ function hasTemplate(v) { return isObject(v) && 'template' in v; }
624
+ function getKey(v, k) {
625
+ if (!isObject(v))
626
+ return undefined;
627
+ return v[k];
628
+ }
541
629
  const rec = (paginasNode, menusNode) => {
542
630
  if (Array.isArray(menusNode)) {
543
- if (paginasNode && typeof paginasNode === 'object' && 'template' in paginasNode)
631
+ if (hasTemplate(paginasNode))
544
632
  out.set(paginasNode, menusNode);
545
633
  return;
546
634
  }
547
- if (!menusNode || typeof menusNode !== 'object')
635
+ if (!isObject(menusNode))
548
636
  return;
549
637
  for (const k of Object.keys(menusNode)) {
550
- const nextPaginas = paginasNode && typeof paginasNode === 'object' ? paginasNode[k] : undefined;
551
- const nextMenus = menusNode[k];
552
- rec(nextPaginas, nextMenus);
638
+ const nextPaginas = getKey(paginasNode, k);
639
+ const nextMenus = getKey(menusNode, k);
640
+ rec(nextPaginas ?? undefined, nextMenus ?? undefined);
553
641
  }
554
642
  };
555
643
  rec(PAGINAS, MENUS_INTERNOS.PAGINAS);
556
644
  return out;
557
645
  })();
558
- function obterMenuInterno(pagina) { return MENUS_INTERNOS_POR_PAGINA.get(pagina); }
646
+ function obterMenuInterno(pagina) {
647
+ return MENUS_INTERNOS_POR_PAGINA.get(pagina);
648
+ }
559
649
  function resolverMenuInterno(pagina) {
560
650
  const nodes = obterMenuInterno(pagina);
561
651
  if (!nodes)
@@ -681,4 +771,4 @@ function acceptFromFormatos(formatos) {
681
771
  return Array.from(new Set(mimes)).join(',');
682
772
  }
683
773
  function isFormatoImagemBitmap(formato) { return formato === 'png' || formato === 'jpg'; }
684
- export { CAPACIDADES, PERMISSOES_ESTADOS, TIPOS_IMAGEM, temSudoBurlarCapacidades, AuthSession, SalaDeJogo_Tipo, SalaDeJogo_Estado, SalaDeJogo_TipoMestre, SalaDeJogo_TipoParticipante, menuItem, menuGrupo, montarHref, pagina, isWsErrorResponse, isWsUnauthorizedErrorResponse, wsErro, wsUnauthorized, wsMap, wsChain, createGateway, EventosWebSocket, isRecord, getEmitDelivery, AventuraEstado, EstadoPendenciaPersonagem, EstadoPendenciaAdministrativaPersonagem, EstadoOcupacaoPersonagem, EstadoSessao, DiaDaSemana, obtemDiaDaSemanaPorExtensoPorDDS, CargoExibicaoUsuario, FormatoMomento, EstiloSessao, PathTokenPadrao, LISTA_CAPACIDADES, criarEventosFiltrados, Eventos_Envia, Eventos_Emite, Eventos_EnviaERecebe, decidirAcessoPagina, decidirAcessoPagina_Rec, PAGINAS, filtrarMenuPorAcesso, MENU_PRINCIPAL, MENUS_INTERNOS, MENUS_INTERNOS_POR_PAGINA, obterMenuInterno, resolverMenuInterno, isNumeroInteiroPositivo, isNumeroPositivo, pushErro, validarFormatos, validarTamanho, validarDimensoesDim, validarDimensoesRegra, validarProporcao, validarMaxPixels, validarImagem, validarRegrasUploadArquivo, isRegrasUploadArquivoValidas, mimeFromFormato, acceptFromFormatos, isFormatoImagemBitmap };
774
+ export { CAPACIDADES, PERMISSOES_ESTADOS, TIPOS_IMAGEM, temSudoBurlarCapacidades, AuthSession, SalaDeJogo_Tipo, SalaDeJogo_Estado, SalaDeJogo_TipoMestre, SalaDeJogo_TipoParticipante, menuItem, menuGrupo, menuVazio, menuDinamico, montarHref, limparUndefined, pagina, paginaComLayoutContextualizado, isWsErrorResponse, isWsUnauthorizedErrorResponse, wsErro, wsUnauthorized, wsMap, wsChain, createGateway, EventosWebSocket, isRecord, getEmitDelivery, AventuraEstado, EstadoPendenciaPersonagem, EstadoPendenciaAdministrativaPersonagem, EstadoOcupacaoPersonagem, EstadoSessao, DiaDaSemana, obtemDiaDaSemanaPorExtensoPorDDS, CargoExibicaoUsuario, FormatoMomento, EstiloSessao, PathTokenPadrao, LISTA_CAPACIDADES, criarEventosFiltrados, Eventos_Envia, Eventos_Emite, Eventos_EnviaERecebe, decidirAcessoPagina, decidirAcessoPagina_Rec, PAGINAS, filtrarMenuPorAcesso, MENU_PRINCIPAL, MENUS_INTERNOS, MENUS_INTERNOS_LAYOUTCONTEXTO, isPaginaComLayout, isMenuLeaf, MENUS_LAYOUTCONTEXTO_POR_PAGINA, obterMenuInternoLayoutContexto, MENUS_INTERNOS_POR_PAGINA, obterMenuInterno, resolverMenuInterno, isNumeroInteiroPositivo, isNumeroPositivo, pushErro, validarFormatos, validarTamanho, validarDimensoesDim, validarDimensoesRegra, validarProporcao, validarMaxPixels, validarImagem, validarRegrasUploadArquivo, isRegrasUploadArquivoValidas, mimeFromFormato, acceptFromFormatos, isFormatoImagemBitmap };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "types-nora-api",
3
- "version": "0.0.249",
3
+ "version": "0.0.252",
4
4
  "description": "Tipagem da Nora-Api compartilhada com o universodomedo.com",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",