types-nora-api 0.0.486 → 0.0.490

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.
Files changed (52) hide show
  1. package/dist/api/graphql/leituras/ArquivoTipadoMusica/index.d.ts +24 -2
  2. package/dist/api/graphql/leituras/ArquivoTipadoMusica/index.js +33 -2
  3. package/dist/api/graphql/leituras/Card/index.d.ts +58 -0
  4. package/dist/api/graphql/leituras/Card/index.js +88 -0
  5. package/dist/api/graphql/leituras/CoeficienteGanhoEstatisticaClasse/index.d.ts +48 -0
  6. package/dist/api/graphql/leituras/CoeficienteGanhoEstatisticaClasse/index.js +66 -0
  7. package/dist/api/graphql/leituras/Coluna/index.d.ts +46 -0
  8. package/dist/api/graphql/leituras/Coluna/index.js +68 -0
  9. package/dist/api/graphql/leituras/Comentario/index.d.ts +57 -0
  10. package/dist/api/graphql/leituras/Comentario/index.js +87 -0
  11. package/dist/api/graphql/leituras/DependenciaCard/index.d.ts +51 -0
  12. package/dist/api/graphql/leituras/DependenciaCard/index.js +75 -0
  13. package/dist/api/graphql/leituras/DesenhoFluxograma/index.d.ts +43 -0
  14. package/dist/api/graphql/leituras/DesenhoFluxograma/index.js +63 -0
  15. package/dist/api/graphql/leituras/DimensaoClima/index.d.ts +38 -0
  16. package/dist/api/graphql/leituras/DimensaoClima/index.js +52 -0
  17. package/dist/api/graphql/leituras/FonteMusica/index.d.ts +38 -0
  18. package/dist/api/graphql/leituras/FonteMusica/index.js +56 -0
  19. package/dist/api/graphql/leituras/ItemChecklist/index.d.ts +50 -0
  20. package/dist/api/graphql/leituras/ItemChecklist/index.js +72 -0
  21. package/dist/api/graphql/leituras/Menu/index.d.ts +47 -0
  22. package/dist/api/graphql/leituras/Menu/index.js +67 -0
  23. package/dist/api/graphql/leituras/MusicaConfigurada/index.d.ts +75 -0
  24. package/dist/api/graphql/leituras/MusicaConfigurada/index.js +103 -0
  25. package/dist/api/graphql/leituras/Objetivo/index.d.ts +49 -0
  26. package/dist/api/graphql/leituras/Objetivo/index.js +73 -0
  27. package/dist/api/graphql/leituras/PaginaNavegacao/index.d.ts +48 -0
  28. package/dist/api/graphql/leituras/PaginaNavegacao/index.js +70 -0
  29. package/dist/api/graphql/leituras/Partida/index.d.ts +128 -0
  30. package/dist/api/graphql/leituras/Partida/index.js +154 -0
  31. package/dist/api/graphql/leituras/PosicaoFluxogramaCard/index.d.ts +45 -0
  32. package/dist/api/graphql/leituras/PosicaoFluxogramaCard/index.js +65 -0
  33. package/dist/api/graphql/leituras/SerDetalhe/index.d.ts +11 -2
  34. package/dist/api/graphql/leituras/SerDetalhe/index.js +17 -2
  35. package/dist/api/graphql/leituras/TipoStatusCard/index.d.ts +42 -0
  36. package/dist/api/graphql/leituras/TipoStatusCard/index.js +60 -0
  37. package/dist/api/graphql/leituras/index.d.ts +64 -0
  38. package/dist/api/graphql/leituras/index.js +64 -0
  39. package/dist/api/rest/index.d.ts +178 -3
  40. package/dist/api/rest/index.js +355 -2
  41. package/dist/dominio/index.d.ts +114 -1
  42. package/dist/dominio/index.js +28 -1
  43. package/dist/dtos/index.d.ts +602 -13
  44. package/dist/dtos/index.js +100 -2
  45. package/dist/menus/index.d.ts +2 -160
  46. package/dist/menus/index.js +1 -330
  47. package/dist/paginas/index.d.ts +90 -74
  48. package/dist/paginas/index.js +76 -106
  49. package/dist/shared/index.d.ts +175 -1
  50. package/dist/ws/index.d.ts +295 -14
  51. package/dist/ws/index.js +40 -3
  52. package/package.json +1 -1
@@ -1,83 +1,12 @@
1
- import type { CtxAcesso } from '../acessos';
2
1
  import type { LayoutContextualizadoInicial } from '../dtos';
3
2
  import type { AcessoPagina } from '../shared';
4
- type Brand<T, B extends string> = T & {
5
- readonly __brand: B;
6
- };
7
- type ParamSingle = string | number;
8
- type ParamMany = (string | number)[];
9
- type ParamValue = ParamSingle | ParamMany | undefined;
10
- type ParamsRecord = Record<string, ParamValue>;
11
- type ExtrairParamsDoTemplate<S extends string, Acc extends ParamsRecord = {}> = S extends `${infer _A}[[...${infer P}]]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
12
- [K in P]?: ParamMany;
13
- }> : S extends `${infer _A}[...${infer P}]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
14
- [K in P]: ParamMany;
15
- }> : S extends `${infer _A}[${infer P}]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
16
- [K in P]: ParamSingle;
17
- }> : Acc;
18
- type PaginaParamsDoTemplate<T extends string> = ExtrairParamsDoTemplate<T>;
19
- type PaginaInfoBase = {
20
- readonly label: string;
21
- readonly comCabecalho?: true;
22
- readonly acesso?: AcessoPagina;
23
- readonly acessoPorMenuInterno?: true;
24
- readonly prioridadePresenca?: number;
25
- };
26
- type PaginaInfoComLayoutContextualizado = PaginaInfoBase & {
27
- readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
28
- };
29
- type PaginaInfo = PaginaInfoBase | PaginaInfoComLayoutContextualizado;
30
- type PaginaTemplate<T extends string = string> = Brand<T, 'PaginaTemplate'>;
31
- type PaginaDef<T extends string, I extends PaginaInfo = PaginaInfo> = I & {
32
- readonly template: PaginaTemplate<T>;
33
- readonly hrefTemplate: T;
34
- readonly href: T;
35
- };
36
- type PaginaParams<P extends {
37
- hrefTemplate: string;
38
- }> = PaginaParamsDoTemplate<P['hrefTemplate']>;
39
- declare function montarHref(template: string, params: ParamsRecord): string;
40
- type LimparUndefinedValue = string | number | boolean | object | null | undefined;
41
- type LimparUndefinedRecord = Record<string, LimparUndefinedValue>;
42
- declare function limparUndefined<T extends LimparUndefinedRecord>(obj: T): T;
43
- declare function pagina<const T extends string>(hrefTemplate: T, info: PaginaInfoBase): PaginaDef<T, PaginaInfoBase>;
44
- declare function paginaComLayoutContextualizado<const T extends string>(hrefTemplate: T, info: PaginaInfoBase, layoutContextualizadoInicial: LayoutContextualizadoInicial): PaginaDef<T, PaginaInfoComLayoutContextualizado>;
45
- type RequiredKeys<T> = {
46
- [K in keyof T]-?: {} extends Pick<T, K> ? never : K;
47
- }[keyof T];
48
- type ParamsProps<P extends PaginaDef<string>> = keyof PaginaParams<P> extends never ? {
49
- params?: never;
50
- } : RequiredKeys<PaginaParams<P>> extends never ? {
51
- params?: PaginaParams<P>;
52
- } : {
53
- params: PaginaParams<P>;
54
- };
55
- declare function toParamsRecord(params: object): ParamsRecord;
56
- type DecisaoAcessoPagina = {
57
- permitido: true;
58
- } | {
59
- permitido: false;
60
- motivo: 'NAO_AUTENTICADO';
61
- redirecionarPara: PaginaFolha;
62
- } | {
63
- permitido: false;
64
- motivo: 'SEM_CAPACIDADE';
65
- redirecionarPara: PaginaFolha;
66
- };
67
- type ResolverMenuInterno = (pagina: PaginaFolha) => readonly PaginaFolha[] | undefined;
68
- type Opts = {
69
- resolverMenuInterno?: ResolverMenuInterno;
70
- redirectNaoAutenticado: PaginaFolha;
71
- redirectSemCapacidade: PaginaFolha;
72
- };
73
- declare function decidirAcessoPagina(pagina: PaginaFolha, ctx: CtxAcesso, opts: Opts): DecisaoAcessoPagina;
74
- declare function decidirAcessoPagina_Rec(pagina: PaginaFolha, ctx: CtxAcesso, opts: Opts, visitados: Set<string>): DecisaoAcessoPagina;
75
3
  declare const PAGINAS: {
76
4
  readonly home: PaginaDef<"/", PaginaInfoBase>;
77
5
  readonly acessar: PaginaDef<"/acessar", PaginaInfoBase>;
78
6
  readonly cadastrar: PaginaDef<"/cadastrar", PaginaInfoBase>;
79
7
  readonly definicoes: PaginaDef<"/definicoes/[[...slug]]", PaginaInfoBase>;
80
8
  readonly dicas: PaginaDef<"/dicas/[[...slug]]", PaginaInfoBase>;
9
+ readonly testeMixer: PaginaDef<"/teste-mixer", PaginaInfoBase>;
81
10
  readonly jogo: {
82
11
  readonly admin: {
83
12
  readonly gerenciarSalas: PaginaDef<"/jogo/admin/gerenciar-salas", PaginaInfoComLayoutContextualizado>;
@@ -87,12 +16,13 @@ declare const PAGINAS: {
87
16
  readonly sessoesMestre: PaginaDef<"/jogo/mestre/sessoes-mestre", PaginaInfoComLayoutContextualizado>;
88
17
  };
89
18
  readonly jogador: {
90
- readonly solo: PaginaDef<"/jogo/jogador/solo", PaginaInfoBase>;
19
+ readonly partidas: PaginaDef<"/jogo/jogador/partidas", PaginaInfoBase>;
91
20
  readonly label: string;
92
21
  readonly comCabecalho?: true;
93
22
  readonly acesso?: AcessoPagina;
94
23
  readonly acessoPorMenuInterno?: true;
95
24
  readonly prioridadePresenca?: number;
25
+ readonly idMusicaPagina?: number;
96
26
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
97
27
  readonly template: PaginaTemplate<"/jogo/jogador">;
98
28
  readonly hrefTemplate: "/jogo/jogador";
@@ -115,13 +45,18 @@ declare const PAGINAS: {
115
45
  readonly deletarArquivosFileServer: PaginaDef<"/minhas-paginas/admin/deletar-arquivos-file-server", PaginaInfoComLayoutContextualizado>;
116
46
  readonly uploadRecursosInternos: PaginaDef<"/minhas-paginas/admin/uploads-recursos-internos", PaginaInfoComLayoutContextualizado>;
117
47
  readonly uploadMusica: PaginaDef<"/minhas-paginas/admin/upload-musica", PaginaInfoComLayoutContextualizado>;
48
+ readonly mixerControl: PaginaDef<"/minhas-paginas/admin/mixer-control", PaginaInfoComLayoutContextualizado>;
49
+ readonly configurarMusica: PaginaDef<"/minhas-paginas/admin/configurar-musica", PaginaInfoComLayoutContextualizado>;
50
+ readonly gerenciarDimensoes: PaginaDef<"/minhas-paginas/admin/gerenciar-dimensoes", PaginaInfoComLayoutContextualizado>;
118
51
  readonly tutoriais: PaginaDef<"/minhas-paginas/admin/tutoriais", PaginaInfoComLayoutContextualizado>;
119
52
  readonly disparosEventosUsuario: PaginaDef<"/minhas-paginas/admin/disparos-eventos-usuario", PaginaInfoComLayoutContextualizado>;
53
+ readonly gestaoNavegacao: PaginaDef<"/minhas-paginas/admin/gestao-navegacao", PaginaInfoComLayoutContextualizado>;
120
54
  readonly label: string;
121
55
  readonly comCabecalho?: true;
122
56
  readonly acesso?: AcessoPagina;
123
57
  readonly acessoPorMenuInterno?: true;
124
58
  readonly prioridadePresenca?: number;
59
+ readonly idMusicaPagina?: number;
125
60
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
126
61
  readonly template: PaginaTemplate<"/minhas-paginas/admin">;
127
62
  readonly hrefTemplate: "/minhas-paginas/admin";
@@ -131,16 +66,32 @@ declare const PAGINAS: {
131
66
  readonly dashboardAprovacaoImagensArtista: PaginaDef<"/minhas-paginas/moderador/aprovar-imagens-artista", PaginaInfoComLayoutContextualizado>;
132
67
  readonly gerenciarEmblemas: PaginaDef<"/minhas-paginas/moderador/emblemas", PaginaInfoComLayoutContextualizado>;
133
68
  readonly gerenciarConquistas: PaginaDef<"/minhas-paginas/moderador/conquistas", PaginaInfoComLayoutContextualizado>;
69
+ readonly editorDefinicoes: PaginaDef<"/minhas-paginas/moderador/definicoes/[[...slug]]", PaginaInfoBase>;
70
+ readonly editorDicas: PaginaDef<"/minhas-paginas/moderador/dicas/[[...slug]]", PaginaInfoBase>;
134
71
  readonly label: string;
135
72
  readonly comCabecalho?: true;
136
73
  readonly acesso?: AcessoPagina;
137
74
  readonly acessoPorMenuInterno?: true;
138
75
  readonly prioridadePresenca?: number;
76
+ readonly idMusicaPagina?: number;
139
77
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
140
78
  readonly template: PaginaTemplate<"/minhas-paginas/moderador">;
141
79
  readonly hrefTemplate: "/minhas-paginas/moderador";
142
80
  readonly href: "/minhas-paginas/moderador";
143
81
  };
82
+ readonly colaborador: {
83
+ readonly painelDoMedo: PaginaDef<"/minhas-paginas/colaborador/painel-do-medo", PaginaInfoComLayoutContextualizado>;
84
+ readonly label: string;
85
+ readonly comCabecalho?: true;
86
+ readonly acesso?: AcessoPagina;
87
+ readonly acessoPorMenuInterno?: true;
88
+ readonly prioridadePresenca?: number;
89
+ readonly idMusicaPagina?: number;
90
+ readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
91
+ readonly template: PaginaTemplate<"/minhas-paginas/colaborador">;
92
+ readonly hrefTemplate: "/minhas-paginas/colaborador";
93
+ readonly href: "/minhas-paginas/colaborador";
94
+ };
144
95
  readonly gameDesigner: {
145
96
  readonly criar: {
146
97
  readonly seres: PaginaDef<"/minhas-paginas/game-designer/criar/seres", PaginaInfoComLayoutContextualizado>;
@@ -152,6 +103,11 @@ declare const PAGINAS: {
152
103
  readonly configurar: {
153
104
  readonly configuracaoTestePericia: PaginaDef<"/minhas-paginas/game-designer/configurar/configuracao-teste-pericia", PaginaInfoComLayoutContextualizado>;
154
105
  readonly configuracaoPatentesTestePericia: PaginaDef<"/minhas-paginas/game-designer/configurar/configuracao-patentes-teste-pericia", PaginaInfoComLayoutContextualizado>;
106
+ readonly coeficientesGanhoEstatistica: PaginaDef<"/minhas-paginas/game-designer/configurar/coeficientes-ganho-estatistica", PaginaInfoComLayoutContextualizado>;
107
+ readonly desafios: PaginaDef<"/minhas-paginas/game-designer/configurar/desafios", PaginaInfoComLayoutContextualizado>;
108
+ readonly desafiosAtivos: PaginaDef<"/minhas-paginas/game-designer/configurar/desafios-ativos", PaginaInfoComLayoutContextualizado>;
109
+ readonly configuracaoPartida: PaginaDef<"/minhas-paginas/game-designer/configurar/configuracao-partida", PaginaInfoComLayoutContextualizado>;
110
+ readonly catalogosPartida: PaginaDef<"/minhas-paginas/game-designer/configurar/catalogos-partida", PaginaInfoComLayoutContextualizado>;
155
111
  };
156
112
  readonly analisar: {
157
113
  readonly simuladorDistribuicoesTeste: PaginaDef<"/minhas-paginas/game-designer/analisar/distribuicoes-testes", PaginaInfoComLayoutContextualizado>;
@@ -162,6 +118,7 @@ declare const PAGINAS: {
162
118
  readonly acesso?: AcessoPagina;
163
119
  readonly acessoPorMenuInterno?: true;
164
120
  readonly prioridadePresenca?: number;
121
+ readonly idMusicaPagina?: number;
165
122
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
166
123
  readonly template: PaginaTemplate<"/minhas-paginas/game-designer">;
167
124
  readonly hrefTemplate: "/minhas-paginas/game-designer";
@@ -185,6 +142,7 @@ declare const PAGINAS: {
185
142
  readonly acesso?: AcessoPagina;
186
143
  readonly acessoPorMenuInterno?: true;
187
144
  readonly prioridadePresenca?: number;
145
+ readonly idMusicaPagina?: number;
188
146
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
189
147
  readonly template: PaginaTemplate<"/minhas-paginas/mestre">;
190
148
  readonly hrefTemplate: "/minhas-paginas/mestre";
@@ -193,6 +151,7 @@ declare const PAGINAS: {
193
151
  readonly artista: {
194
152
  readonly minhasImagens: PaginaDef<"/minhas-paginas/artista/minhas-imagens", PaginaInfoComLayoutContextualizado>;
195
153
  readonly adicionarImagem: PaginaDef<"/minhas-paginas/artista/adicionar-imagem", PaginaInfoComLayoutContextualizado>;
154
+ readonly assinatura: PaginaDef<"/minhas-paginas/artista/assinatura", PaginaInfoComLayoutContextualizado>;
196
155
  readonly avatares: {
197
156
  readonly gerenciarAvatares: PaginaDef<"/minhas-paginas/artista/avatares", PaginaInfoComLayoutContextualizado>;
198
157
  };
@@ -207,6 +166,7 @@ declare const PAGINAS: {
207
166
  readonly acesso?: AcessoPagina;
208
167
  readonly acessoPorMenuInterno?: true;
209
168
  readonly prioridadePresenca?: number;
169
+ readonly idMusicaPagina?: number;
210
170
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
211
171
  readonly template: PaginaTemplate<"/minhas-paginas/artista">;
212
172
  readonly hrefTemplate: "/minhas-paginas/artista";
@@ -224,6 +184,7 @@ declare const PAGINAS: {
224
184
  readonly acesso?: AcessoPagina;
225
185
  readonly acessoPorMenuInterno?: true;
226
186
  readonly prioridadePresenca?: number;
187
+ readonly idMusicaPagina?: number;
227
188
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
228
189
  readonly template: PaginaTemplate<"/minhas-paginas/jogador">;
229
190
  readonly hrefTemplate: "/minhas-paginas/jogador";
@@ -237,6 +198,7 @@ declare const PAGINAS: {
237
198
  readonly acesso?: AcessoPagina;
238
199
  readonly acessoPorMenuInterno?: true;
239
200
  readonly prioridadePresenca?: number;
201
+ readonly idMusicaPagina?: number;
240
202
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
241
203
  readonly template: PaginaTemplate<"/minhas-paginas/minhas-configuracoes">;
242
204
  readonly hrefTemplate: "/minhas-paginas/minhas-configuracoes";
@@ -247,6 +209,7 @@ declare const PAGINAS: {
247
209
  readonly acesso?: AcessoPagina;
248
210
  readonly acessoPorMenuInterno?: true;
249
211
  readonly prioridadePresenca?: number;
212
+ readonly idMusicaPagina?: number;
250
213
  readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
251
214
  readonly template: PaginaTemplate<"/minhas-paginas">;
252
215
  readonly hrefTemplate: "/minhas-paginas";
@@ -275,4 +238,57 @@ type PaginaHrefTemplate = PaginaFolha['hrefTemplate'];
275
238
  type PaginaHref = PaginaFolha['href'];
276
239
  type PaginaDefAny = PaginaDef<string>;
277
240
  type PaginaTemplateAny = PaginaTemplate<string>;
278
- export { Brand, DecisaoAcessoPagina, ExtrairParamsDoTemplate, Folhas, LimparUndefinedRecord, LimparUndefinedValue, Opts, PAGINAS, PaginaDef, PaginaDefAny, PaginaDestino, PaginaDestinoPagina, PaginaFolha, PaginaHref, PaginaHrefTemplate, PaginaInfo, PaginaInfoBase, PaginaInfoComLayoutContextualizado, PaginaParams, PaginaParamsDoTemplate, PaginaTemplate, PaginaTemplateAny, PaginaTemplateFolha, ParamMany, ParamSingle, ParamValue, ParamsProps, ParamsRecord, RequiredKeys, ResolverMenuInterno, decidirAcessoPagina, decidirAcessoPagina_Rec, limparUndefined, montarHref, pagina, paginaComLayoutContextualizado, toParamsRecord };
241
+ type Brand<T, B extends string> = T & {
242
+ readonly __brand: B;
243
+ };
244
+ type ParamSingle = string | number;
245
+ type ParamMany = (string | number)[];
246
+ type ParamValue = ParamSingle | ParamMany | undefined;
247
+ type ParamsRecord = Record<string, ParamValue>;
248
+ type ExtrairParamsDoTemplate<S extends string, Acc extends ParamsRecord = {}> = S extends `${infer _A}[[...${infer P}]]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
249
+ [K in P]?: ParamMany;
250
+ }> : S extends `${infer _A}[...${infer P}]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
251
+ [K in P]: ParamMany;
252
+ }> : S extends `${infer _A}[${infer P}]${infer Rest}` ? ExtrairParamsDoTemplate<Rest, Acc & {
253
+ [K in P]: ParamSingle;
254
+ }> : Acc;
255
+ type PaginaParamsDoTemplate<T extends string> = ExtrairParamsDoTemplate<T>;
256
+ type PaginaInfoBase = {
257
+ readonly label: string;
258
+ readonly comCabecalho?: true;
259
+ readonly acesso?: AcessoPagina;
260
+ readonly acessoPorMenuInterno?: true;
261
+ readonly prioridadePresenca?: number;
262
+ readonly idMusicaPagina?: number;
263
+ };
264
+ type PaginaInfoComLayoutContextualizado = PaginaInfoBase & {
265
+ readonly layoutContextualizadoInicial: LayoutContextualizadoInicial;
266
+ };
267
+ type PaginaInfo = PaginaInfoBase | PaginaInfoComLayoutContextualizado;
268
+ type PaginaTemplate<T extends string = string> = Brand<T, 'PaginaTemplate'>;
269
+ type PaginaDef<T extends string, I extends PaginaInfo = PaginaInfo> = I & {
270
+ readonly template: PaginaTemplate<T>;
271
+ readonly hrefTemplate: T;
272
+ readonly href: T;
273
+ };
274
+ type PaginaParams<P extends {
275
+ hrefTemplate: string;
276
+ }> = PaginaParamsDoTemplate<P['hrefTemplate']>;
277
+ declare function montarHref(template: string, params: ParamsRecord): string;
278
+ type LimparUndefinedValue = string | number | boolean | object | null | undefined;
279
+ type LimparUndefinedRecord = Record<string, LimparUndefinedValue>;
280
+ declare function limparUndefined<T extends LimparUndefinedRecord>(obj: T): T;
281
+ declare function pagina<const T extends string>(hrefTemplate: T, info: PaginaInfoBase): PaginaDef<T, PaginaInfoBase>;
282
+ declare function paginaComLayoutContextualizado<const T extends string>(hrefTemplate: T, info: PaginaInfoBase, layoutContextualizadoInicial: LayoutContextualizadoInicial): PaginaDef<T, PaginaInfoComLayoutContextualizado>;
283
+ type RequiredKeys<T> = {
284
+ [K in keyof T]-?: {} extends Pick<T, K> ? never : K;
285
+ }[keyof T];
286
+ type ParamsProps<P extends PaginaDef<string>> = keyof PaginaParams<P> extends never ? {
287
+ params?: never;
288
+ } : RequiredKeys<PaginaParams<P>> extends never ? {
289
+ params?: PaginaParams<P>;
290
+ } : {
291
+ params: PaginaParams<P>;
292
+ };
293
+ declare function toParamsRecord(params: object): ParamsRecord;
294
+ export { Brand, ExtrairParamsDoTemplate, Folhas, LimparUndefinedRecord, LimparUndefinedValue, PAGINAS, PaginaDef, PaginaDefAny, PaginaDestino, PaginaDestinoPagina, PaginaFolha, PaginaHref, PaginaHrefTemplate, PaginaInfo, PaginaInfoBase, PaginaInfoComLayoutContextualizado, PaginaParams, PaginaParamsDoTemplate, PaginaTemplate, PaginaTemplateAny, PaginaTemplateFolha, ParamMany, ParamSingle, ParamValue, ParamsProps, ParamsRecord, RequiredKeys, limparUndefined, montarHref, pagina, paginaComLayoutContextualizado, toParamsRecord };
@@ -1,113 +1,13 @@
1
1
  // AUTO-GENERATED FILE - DO NOT EDIT
2
2
  // Contratos de páginas
3
- import { temSudoBurlarCapacidades } from '../acessos';
4
3
  import { CAPACIDADES } from '../dominio';
5
- function montarHref(template, params) {
6
- const out = template.replace(/\[\[\.\.\.([^\]]+)\]\]|\[\.\.\.([^\]]+)\]|\[([^\]]+)\]/g, (_m, optCatchAll, catchAll, single) => {
7
- const key = (optCatchAll || catchAll || single);
8
- const value = params[key];
9
- if (optCatchAll) {
10
- if (value == null)
11
- return '';
12
- if (!Array.isArray(value))
13
- throw new Error(`PAGINAS.montarHref: "${key}" deve ser (string|number)[] (optional catch-all)`);
14
- return value.map((x) => encodeURIComponent(String(x))).join('/');
15
- }
16
- if (catchAll) {
17
- if (!Array.isArray(value))
18
- throw new Error(`PAGINAS.montarHref: "${key}" deve ser (string|number)[] (catch-all)`);
19
- return value.map((x) => encodeURIComponent(String(x))).join('/');
20
- }
21
- if (value == null)
22
- throw new Error(`PAGINAS.montarHref: "${key}" é obrigatório`);
23
- if (Array.isArray(value))
24
- throw new Error(`PAGINAS.montarHref: "${key}" deve ser string|number (single param)`);
25
- return encodeURIComponent(String(value));
26
- });
27
- const cleaned = out.replace(/\/+/g, '/').replace(/\/$/, '');
28
- return cleaned === '' ? '/' : cleaned;
29
- }
30
- function limparUndefined(obj) {
31
- const out = {};
32
- for (const k in obj) {
33
- if (!Object.prototype.hasOwnProperty.call(obj, k))
34
- continue;
35
- const key = k;
36
- const v = obj[key];
37
- if (v !== undefined)
38
- out[key] = v;
39
- }
40
- return out;
41
- }
42
- function pagina(hrefTemplate, info) {
43
- const template = hrefTemplate;
44
- return limparUndefined({ template, hrefTemplate, href: hrefTemplate, ...info });
45
- }
46
- function paginaComLayoutContextualizado(hrefTemplate, info, layoutContextualizadoInicial) {
47
- const template = hrefTemplate;
48
- return limparUndefined({ template, hrefTemplate, href: hrefTemplate, ...info, layoutContextualizadoInicial });
49
- }
50
- function toParamsRecord(params) {
51
- const out = {};
52
- for (const k in params) {
53
- if (!Object.prototype.hasOwnProperty.call(params, k))
54
- continue;
55
- out[k] = params[k];
56
- }
57
- return out;
58
- }
59
- /*
60
- SSOT: regra de acesso única, usada por:
61
- - ControladorSlot (bloqueio/redirect)
62
- - Menu principal (filtrar itens antes de render)
63
- - Menus internos (filtrar itens antes de render)
64
- */
65
- function decidirAcessoPagina(pagina, ctx, opts) {
66
- const visitados = new Set();
67
- return decidirAcessoPagina_Rec(pagina, ctx, opts, visitados);
68
- }
69
- function decidirAcessoPagina_Rec(pagina, ctx, opts, visitados) {
70
- const key = String(pagina.template);
71
- if (visitados.has(key))
72
- return { permitido: true };
73
- visitados.add(key);
74
- const acesso = pagina.acesso;
75
- if (acesso != null && 'cadastroPermitido' in acesso) {
76
- if (!ctx.cadastroPermitido)
77
- return { permitido: false, motivo: 'NAO_AUTENTICADO', redirecionarPara: opts.redirectNaoAutenticado };
78
- }
79
- if (acesso != null && 'listaDeCapacidadesNecessarias' in acesso) {
80
- if (!ctx.estaAutenticado)
81
- return { permitido: false, motivo: 'NAO_AUTENTICADO', redirecionarPara: opts.redirectNaoAutenticado };
82
- if (temSudoBurlarCapacidades(ctx))
83
- return { permitido: true };
84
- const lista = acesso.listaDeCapacidadesNecessarias;
85
- const permitido = Array.isArray(lista) && lista.length > 0 && lista.every((cap) => ctx.verificarCapacidade(cap));
86
- if (!permitido)
87
- return { permitido: false, motivo: 'SEM_CAPACIDADE', redirecionarPara: opts.redirectSemCapacidade };
88
- }
89
- if (acesso != null && 'autenticado' in acesso) {
90
- if (!ctx.estaAutenticado)
91
- return { permitido: false, motivo: 'NAO_AUTENTICADO', redirecionarPara: opts.redirectNaoAutenticado };
92
- }
93
- if (pagina.acessoPorMenuInterno === true) {
94
- if (!ctx.estaAutenticado)
95
- return { permitido: false, motivo: 'NAO_AUTENTICADO', redirecionarPara: opts.redirectNaoAutenticado };
96
- if (temSudoBurlarCapacidades(ctx))
97
- return { permitido: true };
98
- const folhas = (opts.resolverMenuInterno?.(pagina) ?? []).filter((p) => String(p.template) !== String(pagina.template));
99
- const permitido = folhas.some((p) => decidirAcessoPagina_Rec(p, ctx, opts, visitados).permitido);
100
- if (!permitido)
101
- return { permitido: false, motivo: 'SEM_CAPACIDADE', redirecionarPara: opts.redirectSemCapacidade };
102
- }
103
- return { permitido: true };
104
- }
105
4
  const PAGINAS = {
106
5
  home: pagina('/', { label: 'Página Inicial', comCabecalho: true }),
107
6
  acessar: pagina('/acessar', { label: 'Acessar' }),
108
7
  cadastrar: pagina('/cadastrar', { label: 'Cadastrar', acesso: { cadastroPermitido: true } }),
109
- definicoes: pagina('/definicoes/[[...slug]]', { label: 'Definições', comCabecalho: true }),
110
- dicas: pagina('/dicas/[[...slug]]', { label: 'Dicas', comCabecalho: true }),
8
+ definicoes: pagina('/definicoes/[[...slug]]', { label: 'Definições', comCabecalho: true, idMusicaPagina: 1 }),
9
+ dicas: pagina('/dicas/[[...slug]]', { label: 'Dicas', comCabecalho: true, idMusicaPagina: 2 }),
10
+ testeMixer: pagina('/teste-mixer', { label: 'Teste Mixer', comCabecalho: true, acesso: { autenticado: true }, prioridadePresenca: 1 }),
111
11
  jogo: {
112
12
  admin: {
113
13
  gerenciarSalas: paginaComLayoutContextualizado('/jogo/admin/gerenciar-salas', { label: 'Admin - Gerenciar Salas', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__ACOMPANHAMENTO__SESSAO_DE_JOGO] }, prioridadePresenca: 2 }, { titulo: 'Gerenciar Salas', proporcaoConteudo: 84 }),
@@ -118,7 +18,7 @@ const PAGINAS = {
118
18
  },
119
19
  jogador: {
120
20
  ...paginaComLayoutContextualizado('/jogo/jogador', { label: 'Jogo - Jogador', acesso: { autenticado: true }, prioridadePresenca: 1 }, { titulo: null, proporcaoConteudo: 84 }),
121
- solo: pagina('/jogo/jogador/solo', { label: 'Modo Solo', acesso: { autenticado: true }, prioridadePresenca: 1 }),
21
+ partidas: pagina('/jogo/jogador/partidas', { label: 'Partidas', acesso: { autenticado: true }, prioridadePresenca: 1, idMusicaPagina: 3 }),
122
22
  },
123
23
  emJogo: pagina('/jogo/em-jogo', { label: 'Em Jogo', acesso: { autenticado: true }, prioridadePresenca: 1 }),
124
24
  },
@@ -139,14 +39,24 @@ const PAGINAS = {
139
39
  deletarArquivosFileServer: paginaComLayoutContextualizado('/minhas-paginas/admin/deletar-arquivos-file-server', { label: 'Admin - Deletar Arquivos', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__SUDO__DELETAR_ARQUIVOS_FILE_SERVER] }, prioridadePresenca: 2 }, { titulo: 'Deletar Arquivos', proporcaoConteudo: 84 }),
140
40
  uploadRecursosInternos: paginaComLayoutContextualizado('/minhas-paginas/admin/uploads-recursos-internos', { label: 'Admin - Uploads', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__GERENCIAMENTO__UPLOAD_RECURSOS_INTERNOS] }, prioridadePresenca: 2 }, { titulo: 'Upload de Recursos Internos', proporcaoConteudo: 84 }),
141
41
  uploadMusica: paginaComLayoutContextualizado('/minhas-paginas/admin/upload-musica', { label: 'Admin - Upload de Música', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__SUDO__BURLAR_CAPACIDADES] }, prioridadePresenca: 2 }, { titulo: 'Upload de Música', proporcaoConteudo: 84 }),
42
+ mixerControl: paginaComLayoutContextualizado('/minhas-paginas/admin/mixer-control', { label: 'Admin - Controle do Mixer', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__SUDO__BURLAR_CAPACIDADES] }, prioridadePresenca: 2 }, { titulo: 'Controle do Mixer', proporcaoConteudo: 84 }),
43
+ configurarMusica: paginaComLayoutContextualizado('/minhas-paginas/admin/configurar-musica', { label: 'Admin - Configurar Música', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__SUDO__BURLAR_CAPACIDADES] }, prioridadePresenca: 2 }, { titulo: 'Configurar Música', proporcaoConteudo: 84 }),
44
+ gerenciarDimensoes: paginaComLayoutContextualizado('/minhas-paginas/admin/gerenciar-dimensoes', { label: 'Admin - Gerenciar Dimensões', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__SUDO__BURLAR_CAPACIDADES] }, prioridadePresenca: 2 }, { titulo: 'Gerenciar Dimensões de Clima', proporcaoConteudo: 84 }),
142
45
  tutoriais: paginaComLayoutContextualizado('/minhas-paginas/admin/tutoriais', { label: 'Admin - Tutoriais', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__SUDO__BURLAR_CAPACIDADES] }, prioridadePresenca: 2 }, { titulo: 'Gerenciamento de Tutoriais', proporcaoConteudo: 84 }),
143
46
  disparosEventosUsuario: paginaComLayoutContextualizado('/minhas-paginas/admin/disparos-eventos-usuario', { label: 'Admin - Disparos de Eventos de Usuário', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__SUDO__BURLAR_CAPACIDADES] }, prioridadePresenca: 2 }, { titulo: 'Disparos de Eventos de Usuário (Dev)', proporcaoConteudo: 84 }),
47
+ gestaoNavegacao: paginaComLayoutContextualizado('/minhas-paginas/admin/gestao-navegacao', { label: 'Admin - Gestão de Navegação', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ADMINISTRADOR__SUDO__BURLAR_CAPACIDADES] }, prioridadePresenca: 2 }, { titulo: 'Gestão de Navegação', proporcaoConteudo: 84 }),
144
48
  },
145
49
  moderador: {
146
50
  ...paginaComLayoutContextualizado('/minhas-paginas/moderador', { label: 'Área do Moderador', acesso: { autenticado: true }, acessoPorMenuInterno: true, prioridadePresenca: 2 }, { titulo: 'Página de Moderador', proporcaoConteudo: 84 }),
147
51
  dashboardAprovacaoImagensArtista: paginaComLayoutContextualizado('/minhas-paginas/moderador/aprovar-imagens-artista', { label: 'Aprovar Imagens de Artistas', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MODERADOR__IMAGENS] }, prioridadePresenca: 2 }, { titulo: 'Aprovar Imagens de Artistas', proporcaoConteudo: 84 }),
148
52
  gerenciarEmblemas: paginaComLayoutContextualizado('/minhas-paginas/moderador/emblemas', { label: 'Gerenciar Emblemas', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MODERADOR__CADASTROS__EMBLEMAS] }, prioridadePresenca: 2 }, { titulo: 'Gerenciar Emblemas', proporcaoConteudo: 84 }),
149
53
  gerenciarConquistas: paginaComLayoutContextualizado('/minhas-paginas/moderador/conquistas', { label: 'Gerenciar Conquistas', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MODERADOR__CADASTROS__CONQUISTAS] }, prioridadePresenca: 2 }, { titulo: 'Gerenciar Conquistas', proporcaoConteudo: 84 }),
54
+ editorDefinicoes: pagina('/minhas-paginas/moderador/definicoes/[[...slug]]', { label: 'Editor de Definições', comCabecalho: true, acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MODERADOR__CADASTROS__EMBLEMAS] }, prioridadePresenca: 2 }),
55
+ editorDicas: pagina('/minhas-paginas/moderador/dicas/[[...slug]]', { label: 'Editor de Dicas', comCabecalho: true, acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.MODERADOR__CADASTROS__EMBLEMAS] }, prioridadePresenca: 2 }),
56
+ },
57
+ colaborador: {
58
+ ...paginaComLayoutContextualizado('/minhas-paginas/colaborador', { label: 'Área do Colaborador', acesso: { autenticado: true }, acessoPorMenuInterno: true, prioridadePresenca: 3 }, { titulo: 'Página de Colaborador', proporcaoConteudo: 84 }),
59
+ painelDoMedo: paginaComLayoutContextualizado('/minhas-paginas/colaborador/painel-do-medo', { label: 'Painel do Medo', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.COLABORADOR__PAINEL_DO_MEDO] }, prioridadePresenca: 3 }, { titulo: 'Painel do Medo', proporcaoConteudo: 100 }),
150
60
  },
151
61
  gameDesigner: {
152
62
  ...paginaComLayoutContextualizado('/minhas-paginas/game-designer', { label: 'Área do Game Designer', acesso: { autenticado: true }, acessoPorMenuInterno: true, prioridadePresenca: 3 }, { titulo: 'Página de Game Designer', proporcaoConteudo: 84 }),
@@ -160,6 +70,11 @@ const PAGINAS = {
160
70
  configurar: {
161
71
  configuracaoTestePericia: paginaComLayoutContextualizado('/minhas-paginas/game-designer/configurar/configuracao-teste-pericia', { label: 'Configuração de Teste de Perícia - Atributo', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.GAME_DESIGNER__GAME_BALANCE__TESTE_DE_PERICIA] }, prioridadePresenca: 2 }, { titulo: 'Configuração de Teste de Perícia - Atributo', proporcaoConteudo: 84 }),
162
72
  configuracaoPatentesTestePericia: paginaComLayoutContextualizado('/minhas-paginas/game-designer/configurar/configuracao-patentes-teste-pericia', { label: 'Configuração de Teste de Perícia - Patente de Perícia', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.GAME_DESIGNER__GAME_BALANCE__TESTE_DE_PERICIA] }, prioridadePresenca: 2 }, { titulo: 'Configuração de Teste de Perícia - Patente de Perícia', proporcaoConteudo: 84 }),
73
+ coeficientesGanhoEstatistica: paginaComLayoutContextualizado('/minhas-paginas/game-designer/configurar/coeficientes-ganho-estatistica', { label: 'Coeficientes de Ganho de Estatística', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.GAME_DESIGNER__GAME_BALANCE__TESTE_DE_PERICIA] }, prioridadePresenca: 2 }, { titulo: 'Coeficientes de Ganho de Estatística', proporcaoConteudo: 84 }),
74
+ desafios: paginaComLayoutContextualizado('/minhas-paginas/game-designer/configurar/desafios', { label: 'Desafios', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.GAME_DESIGNER__CRIACAO__SER] }, prioridadePresenca: 2 }, { titulo: 'Desafios', proporcaoConteudo: 84 }),
75
+ desafiosAtivos: paginaComLayoutContextualizado('/minhas-paginas/game-designer/configurar/desafios-ativos', { label: 'Inspetor de Desafios', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.GAME_DESIGNER__CRIACAO__SER] }, prioridadePresenca: 2 }, { titulo: 'Inspetor de Desafios', proporcaoConteudo: 84 }),
76
+ configuracaoPartida: paginaComLayoutContextualizado('/minhas-paginas/game-designer/configurar/configuracao-partida', { label: 'Configuração de Partida', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.GAME_DESIGNER__CRIACAO__SER] }, prioridadePresenca: 2 }, { titulo: 'Configuração de Partida', proporcaoConteudo: 84 }),
77
+ catalogosPartida: paginaComLayoutContextualizado('/minhas-paginas/game-designer/configurar/catalogos-partida', { label: 'Catálogos de Partida', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.GAME_DESIGNER__CRIACAO__SER] }, prioridadePresenca: 2 }, { titulo: 'Catálogos de Partida', proporcaoConteudo: 84 }),
163
78
  },
164
79
  analisar: {
165
80
  simuladorDistribuicoesTeste: paginaComLayoutContextualizado('/minhas-paginas/game-designer/analisar/distribuicoes-testes', { label: 'Simulador de Distribuições de Teste', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.GAME_DESIGNER__GAME_BALANCE__TESTE_DE_PERICIA] }, prioridadePresenca: 2 }, { titulo: 'Simulador de Distribuições de Teste', proporcaoConteudo: 100 }),
@@ -185,6 +100,7 @@ const PAGINAS = {
185
100
  ...paginaComLayoutContextualizado('/minhas-paginas/artista', { label: 'Área do Artista', acesso: { autenticado: true }, acessoPorMenuInterno: true, prioridadePresenca: 3 }, { titulo: 'Página de Artista', proporcaoConteudo: 84 }),
186
101
  minhasImagens: paginaComLayoutContextualizado('/minhas-paginas/artista/minhas-imagens', { label: 'Minhas Imagens', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ARTISTA__CRIACAO__UPLOAD_IMAGEM] }, prioridadePresenca: 3 }, { titulo: 'Minhas Imagens', proporcaoConteudo: 84 }),
187
102
  adicionarImagem: paginaComLayoutContextualizado('/minhas-paginas/artista/adicionar-imagem', { label: 'Adicionar Imagem', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ARTISTA__CRIACAO__UPLOAD_IMAGEM] }, prioridadePresenca: 3 }, { titulo: 'Adicionar Nova Imagem', proporcaoConteudo: 84 }),
103
+ assinatura: paginaComLayoutContextualizado('/minhas-paginas/artista/assinatura', { label: 'Minha Assinatura', acesso: { autenticado: true }, prioridadePresenca: 3 }, { titulo: 'Minha Assinatura de Artista', proporcaoConteudo: 84 }),
188
104
  avatares: {
189
105
  gerenciarAvatares: paginaComLayoutContextualizado('/minhas-paginas/artista/avatares', { label: 'Gerenciar Avatares', acesso: { listaDeCapacidadesNecessarias: [CAPACIDADES.ARTISTA__CRIACAO__RESPONSABILIDADES__AVATARES] }, prioridadePresenca: 3 }, { titulo: 'Gerenciar Avatares', proporcaoConteudo: 84 }),
190
106
  },
@@ -208,7 +124,7 @@ const PAGINAS = {
208
124
  minhasConfiguracoes: {
209
125
  ...paginaComLayoutContextualizado('/minhas-paginas/minhas-configuracoes', { label: 'Minhas Configurações', acesso: { autenticado: true }, prioridadePresenca: 3 }, { titulo: 'Minhas Configurações', proporcaoConteudo: 84 }),
210
126
  passeDeJogador: paginaComLayoutContextualizado('/minhas-paginas/minhas-configuracoes/passe-de-jogador', { label: 'Meu Passe de Jogador', acesso: { autenticado: true }, prioridadePresenca: 3 }, { titulo: 'Meu Passe de Jogador', proporcaoConteudo: 84 }),
211
- }
127
+ },
212
128
  },
213
129
  palco: paginaComLayoutContextualizado('/palco', { label: 'Palco', acesso: { autenticado: true }, prioridadePresenca: 1 }, { titulo: 'Palco', proporcaoConteudo: 84 }),
214
130
  fichas: paginaComLayoutContextualizado('/fichas', { label: 'Fichas', acesso: { autenticado: true }, prioridadePresenca: 3 }, { titulo: 'Minhas Fichas', proporcaoConteudo: 84 }),
@@ -218,4 +134,58 @@ const PAGINAS = {
218
134
  assistir: paginaComLayoutContextualizado('/assistir', { label: 'Assistir', prioridadePresenca: 1 }, { titulo: 'Assistir', proporcaoConteudo: 80 }),
219
135
  perfilUsuario: pagina('perfil-usuario', { label: 'Página de Visualização do Perfil de Usuário', acesso: { autenticado: true } }),
220
136
  };
221
- export { PAGINAS, decidirAcessoPagina, decidirAcessoPagina_Rec, limparUndefined, montarHref, pagina, paginaComLayoutContextualizado, toParamsRecord };
137
+ function montarHref(template, params) {
138
+ const out = template.replace(/\[\[\.\.\.([^\]]+)\]\]|\[\.\.\.([^\]]+)\]|\[([^\]]+)\]/g, (_m, optCatchAll, catchAll, single) => {
139
+ const key = (optCatchAll || catchAll || single);
140
+ const value = params[key];
141
+ if (optCatchAll) {
142
+ if (value == null)
143
+ return '';
144
+ if (!Array.isArray(value))
145
+ throw new Error(`PAGINAS.montarHref: "${key}" deve ser (string|number)[] (optional catch-all)`);
146
+ return value.map((x) => encodeURIComponent(String(x))).join('/');
147
+ }
148
+ if (catchAll) {
149
+ if (!Array.isArray(value))
150
+ throw new Error(`PAGINAS.montarHref: "${key}" deve ser (string|number)[] (catch-all)`);
151
+ return value.map((x) => encodeURIComponent(String(x))).join('/');
152
+ }
153
+ if (value == null)
154
+ throw new Error(`PAGINAS.montarHref: "${key}" é obrigatório`);
155
+ if (Array.isArray(value))
156
+ throw new Error(`PAGINAS.montarHref: "${key}" deve ser string|number (single param)`);
157
+ return encodeURIComponent(String(value));
158
+ });
159
+ const cleaned = out.replace(/\/+/g, '/').replace(/\/$/, '');
160
+ return cleaned === '' ? '/' : cleaned;
161
+ }
162
+ function limparUndefined(obj) {
163
+ const out = {};
164
+ for (const k in obj) {
165
+ if (!Object.prototype.hasOwnProperty.call(obj, k))
166
+ continue;
167
+ const key = k;
168
+ const v = obj[key];
169
+ if (v !== undefined)
170
+ out[key] = v;
171
+ }
172
+ return out;
173
+ }
174
+ function pagina(hrefTemplate, info) {
175
+ const template = hrefTemplate;
176
+ return limparUndefined({ template, hrefTemplate, href: hrefTemplate, ...info });
177
+ }
178
+ function paginaComLayoutContextualizado(hrefTemplate, info, layoutContextualizadoInicial) {
179
+ const template = hrefTemplate;
180
+ return limparUndefined({ template, hrefTemplate, href: hrefTemplate, ...info, layoutContextualizadoInicial });
181
+ }
182
+ function toParamsRecord(params) {
183
+ const out = {};
184
+ for (const k in params) {
185
+ if (!Object.prototype.hasOwnProperty.call(params, k))
186
+ continue;
187
+ out[k] = params[k];
188
+ }
189
+ return out;
190
+ }
191
+ export { PAGINAS, limparUndefined, montarHref, pagina, paginaComLayoutContextualizado, toParamsRecord };