Skip to content

Commit 5e018bf

Browse files
committed
#7446 buildScripts/generate-seo-files.mjs => #-based routes
1 parent 72c5260 commit 5e018bf

2 files changed

Lines changed: 87 additions & 86 deletions

File tree

apps/portal/sitemap.xml

Lines changed: 83 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,252 +1,252 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
33
<url>
4-
<loc>https://neomjs.com/learn/benefits/ConfigSystem</loc>
4+
<loc>https://neomjs.com/#/learn/benefits/ConfigSystem</loc>
55
</url>
66
<url>
7-
<loc>https://neomjs.com/learn/benefits/Effort</loc>
7+
<loc>https://neomjs.com/#/learn/benefits/Effort</loc>
88
</url>
99
<url>
10-
<loc>https://neomjs.com/learn/benefits/Features</loc>
10+
<loc>https://neomjs.com/#/learn/benefits/Features</loc>
1111
</url>
1212
<url>
13-
<loc>https://neomjs.com/learn/benefits/FormsEngine</loc>
13+
<loc>https://neomjs.com/#/learn/benefits/FormsEngine</loc>
1414
</url>
1515
<url>
16-
<loc>https://neomjs.com/learn/benefits/FourEnvironments</loc>
16+
<loc>https://neomjs.com/#/learn/benefits/FourEnvironments</loc>
1717
</url>
1818
<url>
19-
<loc>https://neomjs.com/learn/benefits/Introduction</loc>
19+
<loc>https://neomjs.com/#/learn/benefits/Introduction</loc>
2020
</url>
2121
<url>
22-
<loc>https://neomjs.com/learn/benefits/MultiWindow</loc>
22+
<loc>https://neomjs.com/#/learn/benefits/MultiWindow</loc>
2323
</url>
2424
<url>
25-
<loc>https://neomjs.com/learn/benefits/OffTheMainThread</loc>
25+
<loc>https://neomjs.com/#/learn/benefits/OffTheMainThread</loc>
2626
</url>
2727
<url>
28-
<loc>https://neomjs.com/learn/benefits/Quick</loc>
28+
<loc>https://neomjs.com/#/learn/benefits/Quick</loc>
2929
</url>
3030
<url>
31-
<loc>https://neomjs.com/learn/benefits/RPCLayer</loc>
31+
<loc>https://neomjs.com/#/learn/benefits/RPCLayer</loc>
3232
</url>
3333
<url>
34-
<loc>https://neomjs.com/learn/benefits/Speed</loc>
34+
<loc>https://neomjs.com/#/learn/benefits/Speed</loc>
3535
</url>
3636
<url>
37-
<loc>https://neomjs.com/learn/blog/ai-native-platform-answers-questions</loc>
37+
<loc>https://neomjs.com/#/learn/blog/ai-native-platform-answers-questions</loc>
3838
</url>
3939
<url>
40-
<loc>https://neomjs.com/learn/blog/benchmarking-frontends-2025</loc>
40+
<loc>https://neomjs.com/#/learn/blog/benchmarking-frontends-2025</loc>
4141
</url>
4242
<url>
43-
<loc>https://neomjs.com/learn/blog/context-engineering-done-right</loc>
43+
<loc>https://neomjs.com/#/learn/blog/context-engineering-done-right</loc>
4444
</url>
4545
<url>
46-
<loc>https://neomjs.com/learn/blog/json-blueprints-and-shared-workers</loc>
46+
<loc>https://neomjs.com/#/learn/blog/json-blueprints-and-shared-workers</loc>
4747
</url>
4848
<url>
49-
<loc>https://neomjs.com/learn/blog/v10-deep-dive-functional-components</loc>
49+
<loc>https://neomjs.com/#/learn/blog/v10-deep-dive-functional-components</loc>
5050
</url>
5151
<url>
52-
<loc>https://neomjs.com/learn/blog/v10-deep-dive-reactivity</loc>
52+
<loc>https://neomjs.com/#/learn/blog/v10-deep-dive-reactivity</loc>
5353
</url>
5454
<url>
55-
<loc>https://neomjs.com/learn/blog/v10-deep-dive-state-provider</loc>
55+
<loc>https://neomjs.com/#/learn/blog/v10-deep-dive-state-provider</loc>
5656
</url>
5757
<url>
58-
<loc>https://neomjs.com/learn/blog/v10-deep-dive-vdom-revolution</loc>
58+
<loc>https://neomjs.com/#/learn/blog/v10-deep-dive-vdom-revolution</loc>
5959
</url>
6060
<url>
61-
<loc>https://neomjs.com/learn/blog/v10-post1-love-story</loc>
61+
<loc>https://neomjs.com/#/learn/blog/v10-post1-love-story</loc>
6262
</url>
6363
<url>
64-
<loc>https://neomjs.com/learn/comparisons/NeoVsAngular</loc>
64+
<loc>https://neomjs.com/#/learn/comparisons/NeoVsAngular</loc>
6565
</url>
6666
<url>
67-
<loc>https://neomjs.com/learn/comparisons/NeoVsExtJs</loc>
67+
<loc>https://neomjs.com/#/learn/comparisons/NeoVsExtJs</loc>
6868
</url>
6969
<url>
70-
<loc>https://neomjs.com/learn/comparisons/NeoVsNextJs</loc>
70+
<loc>https://neomjs.com/#/learn/comparisons/NeoVsNextJs</loc>
7171
</url>
7272
<url>
73-
<loc>https://neomjs.com/learn/comparisons/NeoVsReact</loc>
73+
<loc>https://neomjs.com/#/learn/comparisons/NeoVsReact</loc>
7474
</url>
7575
<url>
76-
<loc>https://neomjs.com/learn/comparisons/NeoVsSolid</loc>
76+
<loc>https://neomjs.com/#/learn/comparisons/NeoVsSolid</loc>
7777
</url>
7878
<url>
79-
<loc>https://neomjs.com/learn/comparisons/NeoVsVue</loc>
79+
<loc>https://neomjs.com/#/learn/comparisons/NeoVsVue</loc>
8080
</url>
8181
<url>
82-
<loc>https://neomjs.com/learn/comparisons/Overview</loc>
82+
<loc>https://neomjs.com/#/learn/comparisons/Overview</loc>
8383
</url>
8484
<url>
85-
<loc>https://neomjs.com/learn/gettingstarted/ComponentModels</loc>
85+
<loc>https://neomjs.com/#/learn/gettingstarted/ComponentModels</loc>
8686
</url>
8787
<url>
88-
<loc>https://neomjs.com/learn/gettingstarted/Config</loc>
88+
<loc>https://neomjs.com/#/learn/gettingstarted/Config</loc>
8989
</url>
9090
<url>
91-
<loc>https://neomjs.com/learn/gettingstarted/CreatingYourFirstApp</loc>
91+
<loc>https://neomjs.com/#/learn/gettingstarted/CreatingYourFirstApp</loc>
9292
</url>
9393
<url>
94-
<loc>https://neomjs.com/learn/gettingstarted/DescribingTheUI</loc>
94+
<loc>https://neomjs.com/#/learn/gettingstarted/DescribingTheUI</loc>
9595
</url>
9696
<url>
97-
<loc>https://neomjs.com/learn/gettingstarted/Events</loc>
97+
<loc>https://neomjs.com/#/learn/gettingstarted/Events</loc>
9898
</url>
9999
<url>
100-
<loc>https://neomjs.com/learn/gettingstarted/Extending</loc>
100+
<loc>https://neomjs.com/#/learn/gettingstarted/Extending</loc>
101101
</url>
102102
<url>
103-
<loc>https://neomjs.com/learn/gettingstarted/References</loc>
103+
<loc>https://neomjs.com/#/learn/gettingstarted/References</loc>
104104
</url>
105105
<url>
106-
<loc>https://neomjs.com/learn/gettingstarted/Setup</loc>
106+
<loc>https://neomjs.com/#/learn/gettingstarted/Setup</loc>
107107
</url>
108108
<url>
109-
<loc>https://neomjs.com/learn/gettingstarted/Workspaces</loc>
109+
<loc>https://neomjs.com/#/learn/gettingstarted/Workspaces</loc>
110110
</url>
111111
<url>
112-
<loc>https://neomjs.com/learn/Glossary</loc>
112+
<loc>https://neomjs.com/#/learn/Glossary</loc>
113113
</url>
114114
<url>
115-
<loc>https://neomjs.com/learn/guides/ai/AgentAgnosticMcpConfig</loc>
115+
<loc>https://neomjs.com/#/learn/guides/ai/AgentAgnosticMcpConfig</loc>
116116
</url>
117117
<url>
118-
<loc>https://neomjs.com/learn/guides/ai/AiToolingWslSetup</loc>
118+
<loc>https://neomjs.com/#/learn/guides/ai/AiToolingWslSetup</loc>
119119
</url>
120120
<url>
121-
<loc>https://neomjs.com/learn/guides/ai/ChromeDevToolsMcpServer</loc>
121+
<loc>https://neomjs.com/#/learn/guides/ai/ChromeDevToolsMcpServer</loc>
122122
</url>
123123
<url>
124-
<loc>https://neomjs.com/learn/guides/ai/GitHubCLISetup</loc>
124+
<loc>https://neomjs.com/#/learn/guides/ai/GitHubCLISetup</loc>
125125
</url>
126126
<url>
127-
<loc>https://neomjs.com/learn/guides/ai/GitHubWorkflowServerGhAbsent</loc>
127+
<loc>https://neomjs.com/#/learn/guides/ai/GitHubWorkflowServerGhAbsent</loc>
128128
</url>
129129
<url>
130-
<loc>https://neomjs.com/learn/guides/ai/MemoryCoreMcpApi</loc>
130+
<loc>https://neomjs.com/#/learn/guides/ai/MemoryCoreMcpApi</loc>
131131
</url>
132132
<url>
133-
<loc>https://neomjs.com/learn/guides/ai/StrategicWorkflows</loc>
133+
<loc>https://neomjs.com/#/learn/guides/ai/StrategicWorkflows</loc>
134134
</url>
135135
<url>
136-
<loc>https://neomjs.com/learn/guides/ai/TroubleshootingToolCalls</loc>
136+
<loc>https://neomjs.com/#/learn/guides/ai/TroubleshootingToolCalls</loc>
137137
</url>
138138
<url>
139-
<loc>https://neomjs.com/learn/guides/datahandling/Collections</loc>
139+
<loc>https://neomjs.com/#/learn/guides/datahandling/Collections</loc>
140140
</url>
141141
<url>
142-
<loc>https://neomjs.com/learn/guides/datahandling/Grids</loc>
142+
<loc>https://neomjs.com/#/learn/guides/datahandling/Grids</loc>
143143
</url>
144144
<url>
145-
<loc>https://neomjs.com/learn/guides/datahandling/Records</loc>
145+
<loc>https://neomjs.com/#/learn/guides/datahandling/Records</loc>
146146
</url>
147147
<url>
148-
<loc>https://neomjs.com/learn/guides/datahandling/StateProviders</loc>
148+
<loc>https://neomjs.com/#/learn/guides/datahandling/StateProviders</loc>
149149
</url>
150150
<url>
151-
<loc>https://neomjs.com/learn/guides/datahandling/Tables</loc>
151+
<loc>https://neomjs.com/#/learn/guides/datahandling/Tables</loc>
152152
</url>
153153
<url>
154-
<loc>https://neomjs.com/learn/guides/fundamentals/ApplicationBootstrap</loc>
154+
<loc>https://neomjs.com/#/learn/guides/fundamentals/ApplicationBootstrap</loc>
155155
</url>
156156
<url>
157-
<loc>https://neomjs.com/learn/guides/fundamentals/CodebaseOverview</loc>
157+
<loc>https://neomjs.com/#/learn/guides/fundamentals/CodebaseOverview</loc>
158158
</url>
159159
<url>
160-
<loc>https://neomjs.com/learn/guides/fundamentals/ConfigSystemDeepDive</loc>
160+
<loc>https://neomjs.com/#/learn/guides/fundamentals/ConfigSystemDeepDive</loc>
161161
</url>
162162
<url>
163-
<loc>https://neomjs.com/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom</loc>
163+
<loc>https://neomjs.com/#/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom</loc>
164164
</url>
165165
<url>
166-
<loc>https://neomjs.com/learn/guides/fundamentals/DeclarativeVDOMWithEffects</loc>
166+
<loc>https://neomjs.com/#/learn/guides/fundamentals/DeclarativeVDOMWithEffects</loc>
167167
</url>
168168
<url>
169-
<loc>https://neomjs.com/learn/guides/fundamentals/ExtendingNeoClasses</loc>
169+
<loc>https://neomjs.com/#/learn/guides/fundamentals/ExtendingNeoClasses</loc>
170170
</url>
171171
<url>
172-
<loc>https://neomjs.com/learn/guides/fundamentals/InstanceLifecycle</loc>
172+
<loc>https://neomjs.com/#/learn/guides/fundamentals/InstanceLifecycle</loc>
173173
</url>
174174
<url>
175-
<loc>https://neomjs.com/learn/guides/fundamentals/MainThreadAddons</loc>
175+
<loc>https://neomjs.com/#/learn/guides/fundamentals/MainThreadAddons</loc>
176176
</url>
177177
<url>
178-
<loc>https://neomjs.com/learn/guides/specificfeatures/Mixins</loc>
178+
<loc>https://neomjs.com/#/learn/guides/specificfeatures/Mixins</loc>
179179
</url>
180180
<url>
181-
<loc>https://neomjs.com/learn/guides/specificfeatures/MultiWindow</loc>
181+
<loc>https://neomjs.com/#/learn/guides/specificfeatures/MultiWindow</loc>
182182
</url>
183183
<url>
184-
<loc>https://neomjs.com/learn/guides/specificfeatures/PortalApp</loc>
184+
<loc>https://neomjs.com/#/learn/guides/specificfeatures/PortalApp</loc>
185185
</url>
186186
<url>
187-
<loc>https://neomjs.com/learn/guides/testing/UnitTestingWithSiesta</loc>
187+
<loc>https://neomjs.com/#/learn/guides/testing/UnitTestingWithSiesta</loc>
188188
</url>
189189
<url>
190-
<loc>https://neomjs.com/learn/guides/uibuildingblocks/ComponentsAndContainers</loc>
190+
<loc>https://neomjs.com/#/learn/guides/uibuildingblocks/ComponentsAndContainers</loc>
191191
</url>
192192
<url>
193-
<loc>https://neomjs.com/learn/guides/uibuildingblocks/CustomComponents</loc>
193+
<loc>https://neomjs.com/#/learn/guides/uibuildingblocks/CustomComponents</loc>
194194
</url>
195195
<url>
196-
<loc>https://neomjs.com/learn/guides/uibuildingblocks/HtmlTemplates</loc>
196+
<loc>https://neomjs.com/#/learn/guides/uibuildingblocks/HtmlTemplates</loc>
197197
</url>
198198
<url>
199-
<loc>https://neomjs.com/learn/guides/uibuildingblocks/HtmlTemplatesUnderTheHood</loc>
199+
<loc>https://neomjs.com/#/learn/guides/uibuildingblocks/HtmlTemplatesUnderTheHood</loc>
200200
</url>
201201
<url>
202-
<loc>https://neomjs.com/learn/guides/uibuildingblocks/Layouts</loc>
202+
<loc>https://neomjs.com/#/learn/guides/uibuildingblocks/Layouts</loc>
203203
</url>
204204
<url>
205-
<loc>https://neomjs.com/learn/guides/uibuildingblocks/StylingAndTheming</loc>
205+
<loc>https://neomjs.com/#/learn/guides/uibuildingblocks/StylingAndTheming</loc>
206206
</url>
207207
<url>
208-
<loc>https://neomjs.com/learn/guides/uibuildingblocks/WorkingWithVDom</loc>
208+
<loc>https://neomjs.com/#/learn/guides/uibuildingblocks/WorkingWithVDom</loc>
209209
</url>
210210
<url>
211-
<loc>https://neomjs.com/learn/guides/userinteraction/events/CustomEvents</loc>
211+
<loc>https://neomjs.com/#/learn/guides/userinteraction/events/CustomEvents</loc>
212212
</url>
213213
<url>
214-
<loc>https://neomjs.com/learn/guides/userinteraction/events/DomEvents</loc>
214+
<loc>https://neomjs.com/#/learn/guides/userinteraction/events/DomEvents</loc>
215215
</url>
216216
<url>
217-
<loc>https://neomjs.com/learn/guides/userinteraction/form_fields/ComboBox</loc>
217+
<loc>https://neomjs.com/#/learn/guides/userinteraction/form_fields/ComboBox</loc>
218218
</url>
219219
<url>
220-
<loc>https://neomjs.com/learn/guides/userinteraction/Forms</loc>
220+
<loc>https://neomjs.com/#/learn/guides/userinteraction/Forms</loc>
221221
</url>
222222
<url>
223-
<loc>https://neomjs.com/learn/javascript/Classes</loc>
223+
<loc>https://neomjs.com/#/learn/javascript/Classes</loc>
224224
</url>
225225
<url>
226-
<loc>https://neomjs.com/learn/javascript/ClassFeatures</loc>
226+
<loc>https://neomjs.com/#/learn/javascript/ClassFeatures</loc>
227227
</url>
228228
<url>
229-
<loc>https://neomjs.com/learn/javascript/Overrides</loc>
229+
<loc>https://neomjs.com/#/learn/javascript/Overrides</loc>
230230
</url>
231231
<url>
232-
<loc>https://neomjs.com/learn/javascript/Super</loc>
232+
<loc>https://neomjs.com/#/learn/javascript/Super</loc>
233233
</url>
234234
<url>
235-
<loc>https://neomjs.com/learn/tutorials/CreatingAFunctionalButton</loc>
235+
<loc>https://neomjs.com/#/learn/tutorials/CreatingAFunctionalButton</loc>
236236
</url>
237237
<url>
238-
<loc>https://neomjs.com/learn/tutorials/Earthquakes</loc>
238+
<loc>https://neomjs.com/#/learn/tutorials/Earthquakes</loc>
239239
</url>
240240
<url>
241-
<loc>https://neomjs.com/learn/tutorials/Routing</loc>
241+
<loc>https://neomjs.com/#/learn/tutorials/Routing</loc>
242242
</url>
243243
<url>
244-
<loc>https://neomjs.com/learn/tutorials/RSP</loc>
244+
<loc>https://neomjs.com/#/learn/tutorials/RSP</loc>
245245
</url>
246246
<url>
247-
<loc>https://neomjs.com/learn/tutorials/TodoList</loc>
247+
<loc>https://neomjs.com/#/learn/tutorials/TodoList</loc>
248248
</url>
249249
<url>
250-
<loc>https://neomjs.com/learn/UsingTheseTopics</loc>
250+
<loc>https://neomjs.com/#/learn/UsingTheseTopics</loc>
251251
</url>
252252
</urlset>

buildScripts/generate-seo-files.mjs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,18 @@ async function collectRoutesFromTree() {
6868

6969

7070
/**
71-
* Normalizes a content id into a route path using the provided base path.
71+
* Normalizes a content id into a hash-based route path suitable for a Single-Page Application.
7272
* @param {String} id
7373
* @param {String} [basePath=DEFAULT_BASE_PATH]
74-
* @returns {String}
74+
* @returns {String} e.g., /#/learn/benefits/Introduction
7575
*/
7676
function buildRouteFromId(id, basePath = DEFAULT_BASE_PATH) {
7777
const trimmedBase = (basePath ?? '').replace(/\/$/, '');
7878
const trimmedId = id.replace(/^\//, '');
7979
const prefix = trimmedBase.length > 0 ? trimmedBase : '';
8080
const route = `${prefix}/${trimmedId}`.replace(/\/+/g, '/');
81-
return route.startsWith('/') ? route : `/${route}`;
81+
// Return a hash-based path for the SPA
82+
return `/#${route.startsWith('/') ? route : `/${route}`}`;
8283
}
8384

8485
/**

0 commit comments

Comments
 (0)