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.
- package/dist/api/graphql/leituras/ArquivoTipadoMusica/index.d.ts +24 -2
- package/dist/api/graphql/leituras/ArquivoTipadoMusica/index.js +33 -2
- package/dist/api/graphql/leituras/Card/index.d.ts +58 -0
- package/dist/api/graphql/leituras/Card/index.js +88 -0
- package/dist/api/graphql/leituras/CoeficienteGanhoEstatisticaClasse/index.d.ts +48 -0
- package/dist/api/graphql/leituras/CoeficienteGanhoEstatisticaClasse/index.js +66 -0
- package/dist/api/graphql/leituras/Coluna/index.d.ts +46 -0
- package/dist/api/graphql/leituras/Coluna/index.js +68 -0
- package/dist/api/graphql/leituras/Comentario/index.d.ts +57 -0
- package/dist/api/graphql/leituras/Comentario/index.js +87 -0
- package/dist/api/graphql/leituras/DependenciaCard/index.d.ts +51 -0
- package/dist/api/graphql/leituras/DependenciaCard/index.js +75 -0
- package/dist/api/graphql/leituras/DesenhoFluxograma/index.d.ts +43 -0
- package/dist/api/graphql/leituras/DesenhoFluxograma/index.js +63 -0
- package/dist/api/graphql/leituras/DimensaoClima/index.d.ts +38 -0
- package/dist/api/graphql/leituras/DimensaoClima/index.js +52 -0
- package/dist/api/graphql/leituras/FonteMusica/index.d.ts +38 -0
- package/dist/api/graphql/leituras/FonteMusica/index.js +56 -0
- package/dist/api/graphql/leituras/ItemChecklist/index.d.ts +50 -0
- package/dist/api/graphql/leituras/ItemChecklist/index.js +72 -0
- package/dist/api/graphql/leituras/Menu/index.d.ts +47 -0
- package/dist/api/graphql/leituras/Menu/index.js +67 -0
- package/dist/api/graphql/leituras/MusicaConfigurada/index.d.ts +75 -0
- package/dist/api/graphql/leituras/MusicaConfigurada/index.js +103 -0
- package/dist/api/graphql/leituras/Objetivo/index.d.ts +49 -0
- package/dist/api/graphql/leituras/Objetivo/index.js +73 -0
- package/dist/api/graphql/leituras/PaginaNavegacao/index.d.ts +48 -0
- package/dist/api/graphql/leituras/PaginaNavegacao/index.js +70 -0
- package/dist/api/graphql/leituras/Partida/index.d.ts +128 -0
- package/dist/api/graphql/leituras/Partida/index.js +154 -0
- package/dist/api/graphql/leituras/PosicaoFluxogramaCard/index.d.ts +45 -0
- package/dist/api/graphql/leituras/PosicaoFluxogramaCard/index.js +65 -0
- package/dist/api/graphql/leituras/SerDetalhe/index.d.ts +11 -2
- package/dist/api/graphql/leituras/SerDetalhe/index.js +17 -2
- package/dist/api/graphql/leituras/TipoStatusCard/index.d.ts +42 -0
- package/dist/api/graphql/leituras/TipoStatusCard/index.js +60 -0
- package/dist/api/graphql/leituras/index.d.ts +64 -0
- package/dist/api/graphql/leituras/index.js +64 -0
- package/dist/api/rest/index.d.ts +178 -3
- package/dist/api/rest/index.js +355 -2
- package/dist/dominio/index.d.ts +114 -1
- package/dist/dominio/index.js +28 -1
- package/dist/dtos/index.d.ts +602 -13
- package/dist/dtos/index.js +100 -2
- package/dist/menus/index.d.ts +2 -160
- package/dist/menus/index.js +1 -330
- package/dist/paginas/index.d.ts +90 -74
- package/dist/paginas/index.js +76 -106
- package/dist/shared/index.d.ts +175 -1
- package/dist/ws/index.d.ts +295 -14
- package/dist/ws/index.js +40 -3
- package/package.json +1 -1
package/dist/paginas/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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 };
|
package/dist/paginas/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 };
|