@monkeyplus/flow 6.0.12 → 6.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/package.json +1 -1
- package/server/lib/pages.mjs +24 -3
- package/src/runtime/page-discovery.mjs +24 -3
package/README.md
CHANGED
|
@@ -25,6 +25,11 @@ La guia detallada de authoring vive en `docs/authoring.md` e incluye:
|
|
|
25
25
|
- como organizar templates, layouts y `*.context.ts`
|
|
26
26
|
- como trabajar con `FlowIsland` y `client/islands/*`
|
|
27
27
|
|
|
28
|
+
Documentacion complementaria:
|
|
29
|
+
|
|
30
|
+
- `docs/modules.md`: referencia de modulos builtin
|
|
31
|
+
- `docs/recipes.md`: recetas basadas en el playground actual
|
|
32
|
+
|
|
28
33
|
Si vas a crear o mantener una app en Flow, ese archivo deberia ser el punto de entrada principal.
|
|
29
34
|
|
|
30
35
|
## API pública
|
package/package.json
CHANGED
package/server/lib/pages.mjs
CHANGED
|
@@ -130,6 +130,26 @@ function replacePath(pattern, url) {
|
|
|
130
130
|
function combineName(name, dynamicName) {
|
|
131
131
|
return `${name.replace(/\/*$/, "")}/${dynamicName.replace(/^\/*/, "")}`;
|
|
132
132
|
}
|
|
133
|
+
function resolveUrlTarget(namePage, explicitDynamicName) {
|
|
134
|
+
if (explicitDynamicName || !namePage.includes("/")) {
|
|
135
|
+
return {
|
|
136
|
+
namePage,
|
|
137
|
+
dynamicName: explicitDynamicName
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const match = pageDefinitions.filter((candidate) => candidate.name && namePage.startsWith(`${candidate.name}/`)).sort((left, right) => right.name.length - left.name.length)[0];
|
|
141
|
+
if (!match) {
|
|
142
|
+
return {
|
|
143
|
+
namePage,
|
|
144
|
+
dynamicName: explicitDynamicName
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const dynamicName = namePage.slice(match.name.length + 1);
|
|
148
|
+
return {
|
|
149
|
+
namePage: match.name,
|
|
150
|
+
dynamicName: dynamicName || explicitDynamicName
|
|
151
|
+
};
|
|
152
|
+
}
|
|
133
153
|
function getEnabledLocaleCodes() {
|
|
134
154
|
const runtimeConfig = getFlowRuntimeConfig();
|
|
135
155
|
return runtimeConfig.flow?.locale?.locales || [];
|
|
@@ -163,8 +183,9 @@ export async function getUrl(namePage, localeCode, options = {}) {
|
|
|
163
183
|
const enabledLocales = getEnabledLocaleCodes();
|
|
164
184
|
const targetLocale = localeCode || enabledLocales[0];
|
|
165
185
|
const runtimeConfig = getFlowRuntimeConfig();
|
|
186
|
+
const target = resolveUrlTarget(namePage, options.dynamicName);
|
|
166
187
|
for (const definition of pageDefinitions) {
|
|
167
|
-
if (definition.name !== namePage) {
|
|
188
|
+
if (definition.name !== target.namePage) {
|
|
168
189
|
continue;
|
|
169
190
|
}
|
|
170
191
|
const localeEntries = targetLocale ? [targetLocale] : Object.keys(definition.locales);
|
|
@@ -180,11 +201,11 @@ export async function getUrl(namePage, localeCode, options = {}) {
|
|
|
180
201
|
if (options.params) {
|
|
181
202
|
return replacePath(localizedRoute, options.params);
|
|
182
203
|
}
|
|
183
|
-
if (localePage.dynamic &&
|
|
204
|
+
if (localePage.dynamic && target.dynamicName) {
|
|
184
205
|
const locale = createLocale(code);
|
|
185
206
|
const ctx = createContext(definition, locale, localePage, toPublicRoute(runtimeConfig.flow, code, localePage.url), {});
|
|
186
207
|
const entries = await getDynamicEntries(definition, code, ctx);
|
|
187
|
-
const entry = entries.find((candidate) => candidate.name ===
|
|
208
|
+
const entry = entries.find((candidate) => candidate.name === target.dynamicName);
|
|
188
209
|
if (!entry) {
|
|
189
210
|
return void 0;
|
|
190
211
|
}
|
|
@@ -53,6 +53,26 @@ function replacePath(pattern, url) {
|
|
|
53
53
|
function combineName(name, dynamicName) {
|
|
54
54
|
return `${name.replace(/\/*$/, "")}/${dynamicName.replace(/^\/*/, "")}`;
|
|
55
55
|
}
|
|
56
|
+
function resolveUrlTarget(definitions, namePage, explicitDynamicName) {
|
|
57
|
+
if (explicitDynamicName || !namePage.includes("/")) {
|
|
58
|
+
return {
|
|
59
|
+
namePage,
|
|
60
|
+
dynamicName: explicitDynamicName
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const match = definitions.filter((candidate) => candidate.name && namePage.startsWith(`${candidate.name}/`)).sort((left, right) => right.name.length - left.name.length)[0];
|
|
64
|
+
if (!match) {
|
|
65
|
+
return {
|
|
66
|
+
namePage,
|
|
67
|
+
dynamicName: explicitDynamicName
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const dynamicName = namePage.slice(match.name.length + 1);
|
|
71
|
+
return {
|
|
72
|
+
namePage: match.name,
|
|
73
|
+
dynamicName: dynamicName || explicitDynamicName
|
|
74
|
+
};
|
|
75
|
+
}
|
|
56
76
|
function createContext(definitions, flowConfig, definition, locale, localePage, pathname, params, dynamic) {
|
|
57
77
|
return {
|
|
58
78
|
dynamic,
|
|
@@ -111,7 +131,8 @@ export async function loadPageDefinitions(projectRoot, flowConfig) {
|
|
|
111
131
|
return pages;
|
|
112
132
|
}
|
|
113
133
|
export async function getUrlFromDefinitions(definitions, flowConfig, namePage, localeCode = flowConfig.locale.locales[0], options = {}) {
|
|
114
|
-
const
|
|
134
|
+
const target = resolveUrlTarget(definitions, namePage, options.dynamicName);
|
|
135
|
+
const definition = definitions.find((candidate) => candidate.name === target.namePage);
|
|
115
136
|
if (!definition) {
|
|
116
137
|
return void 0;
|
|
117
138
|
}
|
|
@@ -126,9 +147,9 @@ export async function getUrlFromDefinitions(definitions, flowConfig, namePage, l
|
|
|
126
147
|
if (options.params) {
|
|
127
148
|
return replacePath(localizedRoute, options.params);
|
|
128
149
|
}
|
|
129
|
-
if (localePage.dynamic &&
|
|
150
|
+
if (localePage.dynamic && target.dynamicName) {
|
|
130
151
|
const entries = await getDynamicEntries(definitions, flowConfig, definition, localeCode, localePage);
|
|
131
|
-
const entry = entries.find((candidate) => candidate.name ===
|
|
152
|
+
const entry = entries.find((candidate) => candidate.name === target.dynamicName);
|
|
132
153
|
if (!entry) {
|
|
133
154
|
return void 0;
|
|
134
155
|
}
|