synthos 0.8.0 → 0.10.0
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 +1 -1
- package/default-pages/application/page.html +42 -0
- package/default-pages/application/page.json +10 -0
- package/default-pages/elevenlabs_effects_studio/page.html +1363 -0
- package/default-pages/elevenlabs_effects_studio/page.json +11 -0
- package/default-pages/elevenlabs_voice_studio/page.html +801 -0
- package/default-pages/elevenlabs_voice_studio/page.json +11 -0
- package/default-pages/{json_tools.html → json_tools/page.html} +13 -11
- package/default-pages/json_tools/page.json +10 -0
- package/default-pages/my_notes/notes/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json +5 -0
- package/default-pages/my_notes/page.html +132 -0
- package/default-pages/{my_notes.json → my_notes/page.json} +2 -2
- package/default-pages/neon_asteroids/files/Ambient_Space.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ambient_Space2.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ambient_Space3.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Asteroid_Explosion.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Hyperspace_Jump.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Laser_Fire.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Menu_Navigate.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Power_Up_Collect.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Saucer_Alert.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ship_Thrust.mp3 +0 -0
- package/default-pages/neon_asteroids/files/effects.json +74 -0
- package/default-pages/neon_asteroids/page.html +1803 -0
- package/default-pages/{neon_asteroids.json → neon_asteroids/page.json} +3 -3
- package/default-pages/{oregon_trail.html → oregon_trail/page.html} +16 -30
- package/default-pages/{oregon_trail.json → oregon_trail/page.json} +2 -2
- package/default-pages/retro_game_starter/page.html +1308 -0
- package/default-pages/retro_game_starter/page.json +12 -0
- package/default-pages/{sidebar_page.html → sidebar_page/page.html} +12 -10
- package/default-pages/sidebar_page/page.json +10 -0
- package/default-pages/{solar_explorer.html → solar_explorer/page.html} +15 -12
- package/default-pages/{solar_explorer.json → solar_explorer/page.json} +2 -2
- package/default-pages/{solar_tutorial.html → solar_tutorial/page.html} +12 -10
- package/default-pages/solar_tutorial/page.json +10 -0
- package/default-pages/{two-panel_page.html → two-panel_page/page.html} +13 -11
- package/default-pages/two-panel_page/page.json +10 -0
- package/default-pages/{us_map.html → us_map/page.html} +193 -192
- package/default-pages/{us_map.json → us_map/page.json} +12 -12
- package/default-pages/{us_map_1850.html → us_map_1850/page.html} +326 -325
- package/default-pages/{us_map_1850.json → us_map_1850/page.json} +12 -12
- package/default-pages/{western_cities_1850.html → western_cities_1850/page.html} +527 -526
- package/default-pages/{western_cities_1850.json → western_cities_1850/page.json} +12 -12
- package/default-themes/aurora-dawn.json +19 -0
- package/default-themes/aurora-dawn.v3.css +198 -0
- package/default-themes/aurora-dusk.json +19 -0
- package/default-themes/aurora-dusk.v3.css +200 -0
- package/default-themes/cosmos-dawn.json +19 -0
- package/default-themes/cosmos-dawn.v3.css +198 -0
- package/default-themes/cosmos-dusk.json +19 -0
- package/default-themes/cosmos-dusk.v3.css +200 -0
- package/default-themes/high-contrast-dark.json +19 -0
- package/default-themes/high-contrast-dark.v3.css +200 -0
- package/default-themes/high-contrast-light.json +19 -0
- package/default-themes/high-contrast-light.v3.css +198 -0
- package/default-themes/nebula-dawn.v2.css +110 -0
- package/default-themes/nebula-dawn.v3.css +199 -0
- package/default-themes/nebula-dusk.v2.css +104 -0
- package/default-themes/nebula-dusk.v3.css +201 -0
- package/default-themes/solar-flare-dawn.json +19 -0
- package/default-themes/solar-flare-dawn.v3.css +198 -0
- package/default-themes/solar-flare-dusk.json +19 -0
- package/default-themes/solar-flare-dusk.v3.css +200 -0
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/openclaw/gatewayManager.d.ts +4 -0
- package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -1
- package/dist/agents/openclaw/gatewayManager.js +27 -11
- package/dist/agents/openclaw/gatewayManager.js.map +1 -1
- package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -1
- package/dist/agents/openclaw/openclawProvider.js +2 -4
- package/dist/agents/openclaw/openclawProvider.js.map +1 -1
- package/dist/agents/openclaw/sshTunnelManager.d.ts +2 -0
- package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -1
- package/dist/agents/openclaw/sshTunnelManager.js +31 -12
- package/dist/agents/openclaw/sshTunnelManager.js.map +1 -1
- package/dist/builders/anthropic.d.ts +31 -0
- package/dist/builders/anthropic.d.ts.map +1 -0
- package/dist/builders/anthropic.js +227 -0
- package/dist/builders/anthropic.js.map +1 -0
- package/dist/builders/fireworksai.d.ts +9 -0
- package/dist/builders/fireworksai.d.ts.map +1 -0
- package/dist/builders/fireworksai.js +57 -0
- package/dist/builders/fireworksai.js.map +1 -0
- package/dist/builders/index.d.ts +13 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +31 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/builders/openai.d.ts +8 -0
- package/dist/builders/openai.d.ts.map +1 -0
- package/dist/builders/openai.js +87 -0
- package/dist/builders/openai.js.map +1 -0
- package/dist/builders/types.d.ts +54 -0
- package/dist/builders/types.d.ts.map +1 -0
- package/dist/builders/types.js +211 -0
- package/dist/builders/types.js.map +1 -0
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +3 -2
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/registry.d.ts +2 -1
- package/dist/connectors/registry.d.ts.map +1 -1
- package/dist/connectors/registry.js +31 -8
- package/dist/connectors/registry.js.map +1 -1
- package/dist/customizer/Customizer.d.ts +62 -0
- package/dist/customizer/Customizer.d.ts.map +1 -0
- package/dist/customizer/Customizer.js +134 -0
- package/dist/customizer/Customizer.js.map +1 -0
- package/dist/customizer/index.d.ts +4 -0
- package/dist/customizer/index.d.ts.map +1 -0
- package/dist/customizer/index.js +9 -0
- package/dist/customizer/index.js.map +1 -0
- package/dist/files.d.ts +16 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +60 -1
- package/dist/files.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +12 -6
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +150 -133
- package/dist/init.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +23 -10
- package/dist/migrations.js.map +1 -1
- package/dist/models/anthropic.d.ts +4 -2
- package/dist/models/anthropic.d.ts.map +1 -1
- package/dist/models/anthropic.js +33 -6
- package/dist/models/anthropic.js.map +1 -1
- package/dist/models/fireworksai.d.ts.map +1 -1
- package/dist/models/fireworksai.js +9 -1
- package/dist/models/fireworksai.js.map +1 -1
- package/dist/models/index.d.ts +1 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +2 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/openai.d.ts +1 -1
- package/dist/models/openai.d.ts.map +1 -1
- package/dist/models/openai.js +24 -3
- package/dist/models/openai.js.map +1 -1
- package/dist/models/types.d.ts +20 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js +6 -1
- package/dist/models/types.js.map +1 -1
- package/dist/pages.d.ts +34 -10
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +229 -79
- package/dist/pages.js.map +1 -1
- package/dist/service/createCompletePrompt.d.ts +2 -1
- package/dist/service/createCompletePrompt.d.ts.map +1 -1
- package/dist/service/createCompletePrompt.js +2 -2
- package/dist/service/createCompletePrompt.js.map +1 -1
- package/dist/service/requiresSettings.d.ts +2 -1
- package/dist/service/requiresSettings.d.ts.map +1 -1
- package/dist/service/requiresSettings.js +3 -3
- package/dist/service/requiresSettings.js.map +1 -1
- package/dist/service/server.d.ts +2 -1
- package/dist/service/server.d.ts.map +1 -1
- package/dist/service/server.js +37 -8
- package/dist/service/server.js.map +1 -1
- package/dist/service/transformPage.d.ts +47 -20
- package/dist/service/transformPage.d.ts.map +1 -1
- package/dist/service/transformPage.js +514 -293
- package/dist/service/transformPage.js.map +1 -1
- package/dist/service/useAgentRoutes.d.ts +2 -1
- package/dist/service/useAgentRoutes.d.ts.map +1 -1
- package/dist/service/useAgentRoutes.js +17 -14
- package/dist/service/useAgentRoutes.js.map +1 -1
- package/dist/service/useApiRoutes.d.ts +2 -1
- package/dist/service/useApiRoutes.d.ts.map +1 -1
- package/dist/service/useApiRoutes.js +287 -172
- package/dist/service/useApiRoutes.js.map +1 -1
- package/dist/service/useConnectorRoutes.js +17 -17
- package/dist/service/useConnectorRoutes.js.map +1 -1
- package/dist/service/useDataRoutes.d.ts.map +1 -1
- package/dist/service/useDataRoutes.js +13 -10
- package/dist/service/useDataRoutes.js.map +1 -1
- package/dist/service/useFileRoutes.d.ts +4 -0
- package/dist/service/useFileRoutes.d.ts.map +1 -0
- package/dist/service/useFileRoutes.js +122 -0
- package/dist/service/useFileRoutes.js.map +1 -0
- package/dist/service/usePageRoutes.d.ts +2 -1
- package/dist/service/usePageRoutes.d.ts.map +1 -1
- package/dist/service/usePageRoutes.js +671 -74
- package/dist/service/usePageRoutes.js.map +1 -1
- package/dist/service/useSharedDataRoutes.d.ts +4 -0
- package/dist/service/useSharedDataRoutes.d.ts.map +1 -0
- package/dist/service/useSharedDataRoutes.js +107 -0
- package/dist/service/useSharedDataRoutes.js.map +1 -0
- package/dist/service/useSharedFileRoutes.d.ts +4 -0
- package/dist/service/useSharedFileRoutes.d.ts.map +1 -0
- package/dist/service/useSharedFileRoutes.js +121 -0
- package/dist/service/useSharedFileRoutes.js.map +1 -0
- package/dist/settings.d.ts +5 -3
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +12 -10
- package/dist/settings.js.map +1 -1
- package/dist/storage/FsStorageProvider.d.ts +25 -0
- package/dist/storage/FsStorageProvider.d.ts.map +1 -0
- package/dist/storage/FsStorageProvider.js +103 -0
- package/dist/storage/FsStorageProvider.js.map +1 -0
- package/dist/storage/StorageProvider.d.ts +31 -0
- package/dist/storage/StorageProvider.d.ts.map +1 -0
- package/dist/storage/StorageProvider.js +3 -0
- package/dist/storage/StorageProvider.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +6 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/synthos-cli.d.ts.map +1 -1
- package/dist/synthos-cli.js +4 -3
- package/dist/synthos-cli.js.map +1 -1
- package/dist/themes.d.ts +1 -0
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +65 -28
- package/dist/themes.js.map +1 -1
- package/migration-rules/v1-to-v2.md +193 -0
- package/migration-rules/v2-to-v3.md +481 -0
- package/package.json +11 -10
- package/required-pages/builder/page.html +43 -0
- package/required-pages/builder/page.json +10 -0
- package/required-pages/{pages.html → pages/page.html} +238 -233
- package/required-pages/pages/page.json +10 -0
- package/required-pages/{settings.html → settings/page.html} +389 -275
- package/required-pages/settings/page.json +10 -0
- package/required-pages/synthos_apis/page.html +846 -0
- package/required-pages/synthos_apis/page.json +10 -0
- package/required-pages/{synthos_scripts.html → synthos_scripts/page.html} +13 -11
- package/required-pages/synthos_scripts/page.json +10 -0
- package/src/agents/index.ts +1 -1
- package/src/agents/openclaw/gatewayManager.ts +22 -11
- package/src/agents/openclaw/openclawProvider.ts +2 -4
- package/src/agents/openclaw/sshTunnelManager.ts +19 -11
- package/src/builders/anthropic.ts +283 -0
- package/src/builders/fireworksai.ts +59 -0
- package/src/builders/index.ts +33 -0
- package/src/builders/openai.ts +89 -0
- package/src/builders/types.ts +261 -0
- package/src/connectors/index.ts +1 -1
- package/src/connectors/registry.ts +28 -8
- package/src/customizer/Customizer.ts +163 -0
- package/src/customizer/index.ts +5 -0
- package/src/files.ts +57 -0
- package/src/index.ts +3 -1
- package/src/init.ts +195 -145
- package/src/migrations.ts +30 -10
- package/src/models/anthropic.ts +40 -10
- package/src/models/fireworksai.ts +9 -2
- package/src/models/index.ts +1 -1
- package/src/models/openai.ts +26 -6
- package/src/models/types.ts +31 -1
- package/src/pages.ts +230 -77
- package/src/service/createCompletePrompt.ts +3 -2
- package/src/service/requiresSettings.ts +4 -3
- package/src/service/server.ts +36 -9
- package/src/service/transformPage.ts +557 -326
- package/src/service/useAgentRoutes.ts +19 -14
- package/src/service/useApiRoutes.ts +208 -84
- package/src/service/useConnectorRoutes.ts +18 -18
- package/src/service/useDataRoutes.ts +13 -10
- package/src/service/useFileRoutes.ts +128 -0
- package/src/service/usePageRoutes.ts +730 -81
- package/src/service/useSharedDataRoutes.ts +109 -0
- package/src/service/useSharedFileRoutes.ts +127 -0
- package/src/settings.ts +14 -10
- package/src/storage/FsStorageProvider.ts +87 -0
- package/src/storage/StorageProvider.ts +34 -0
- package/src/storage/index.ts +2 -0
- package/src/synthos-cli.ts +4 -3
- package/src/themes.ts +64 -27
- package/static-files/favicon.svg +12 -0
- package/static-files/fluentlm-instructions.llmd +868 -0
- package/static-files/fluentlm-instructions.md +1595 -0
- package/static-files/fluentlm.css +4844 -0
- package/static-files/fluentlm.js +3602 -0
- package/static-files/fluentlm.min.css +1 -0
- package/static-files/fluentlm.min.js +1 -0
- package/{page-scripts/helpers-v2.js → static-files/helpers.v3.js} +82 -0
- package/static-files/page.v3.js +1290 -0
- package/static-files/recommended-frameworks.llmd +81 -0
- package/static-files/recommended-frameworks.md +137 -0
- package/static-files/retro-game.js +877 -0
- package/static-files/shell.css +797 -0
- package/static-files/theme-dark.css +169 -0
- package/static-files/theme-light.css +169 -0
- package/tests/builders.spec.ts +139 -0
- package/tests/pages.spec.ts +54 -84
- package/tests/transformPage.spec.ts +299 -360
- package/default-pages/application.html +0 -40
- package/default-pages/application.json +0 -1
- package/default-pages/json_tools.json +0 -1
- package/default-pages/my_notes.html +0 -33
- package/default-pages/neon_asteroids.html +0 -77
- package/default-pages/sidebar_page.json +0 -1
- package/default-pages/solar_tutorial.json +0 -1
- package/default-pages/two-panel_page.json +0 -1
- package/dist/service/useGatewayRoutes.d.ts +0 -4
- package/dist/service/useGatewayRoutes.d.ts.map +0 -1
- package/dist/service/useGatewayRoutes.js +0 -168
- package/dist/service/useGatewayRoutes.js.map +0 -1
- package/page-scripts/page-v2.js +0 -656
- package/required-pages/builder.html +0 -48
- package/required-pages/builder.json +0 -1
- package/required-pages/pages.json +0 -1
- package/required-pages/settings.json +0 -1
- package/required-pages/synthos_apis.html +0 -327
- package/required-pages/synthos_apis.json +0 -1
- package/required-pages/synthos_scripts.json +0 -1
- package/src/connectors/airtable/connector.json +0 -27
- package/src/connectors/alpha-vantage/connector.json +0 -26
- package/src/connectors/brave-search/connector.json +0 -26
- package/src/connectors/cloudinary/connector.json +0 -27
- package/src/connectors/deepl/connector.json +0 -28
- package/src/connectors/elevenlabs/connector.json +0 -30
- package/src/connectors/giphy/connector.json +0 -27
- package/src/connectors/github/connector.json +0 -29
- package/src/connectors/huggingface/connector.json +0 -27
- package/src/connectors/imgur/connector.json +0 -29
- package/src/connectors/instagram/connector.json +0 -43
- package/src/connectors/jira/connector.json +0 -28
- package/src/connectors/mapbox/connector.json +0 -26
- package/src/connectors/nasa/connector.json +0 -27
- package/src/connectors/newsapi/connector.json +0 -27
- package/src/connectors/notion/connector.json +0 -28
- package/src/connectors/open-exchange-rates/connector.json +0 -27
- package/src/connectors/openweathermap/connector.json +0 -26
- package/src/connectors/pexels/connector.json +0 -27
- package/src/connectors/resend/connector.json +0 -29
- package/src/connectors/rss2json/connector.json +0 -27
- package/src/connectors/sendgrid/connector.json +0 -27
- package/src/connectors/spoonacular/connector.json +0 -28
- package/src/connectors/stability-ai/connector.json +0 -27
- package/src/connectors/twilio/connector.json +0 -28
- package/src/connectors/unsplash/connector.json +0 -27
- package/src/connectors/wolfram-alpha/connector.json +0 -26
- package/src/connectors/youtube-data/connector.json +0 -30
- /package/{dist/connectors → service-connectors}/airtable/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/alpha-vantage/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/brave-search/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/cloudinary/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/deepl/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/elevenlabs/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/giphy/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/github/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/huggingface/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/imgur/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/instagram/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/jira/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/mapbox/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/nasa/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/newsapi/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/notion/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/open-exchange-rates/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/openweathermap/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/pexels/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/resend/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/rss2json/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/sendgrid/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/spoonacular/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/stability-ai/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/twilio/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/unsplash/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/wolfram-alpha/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/youtube-data/connector.json +0 -0
package/tests/pages.spec.ts
CHANGED
|
@@ -9,12 +9,31 @@ import {
|
|
|
9
9
|
loadPageMetadata,
|
|
10
10
|
savePageState,
|
|
11
11
|
loadPageState,
|
|
12
|
-
updatePageState,
|
|
13
12
|
listPages,
|
|
14
13
|
deletePage,
|
|
15
14
|
copyPage,
|
|
16
15
|
PAGE_VERSION,
|
|
17
16
|
} from '../src/pages';
|
|
17
|
+
import { SynthOSConfig } from '../src/init';
|
|
18
|
+
import { FsStorageProvider } from '../src/storage';
|
|
19
|
+
|
|
20
|
+
/** Create a minimal SynthOSConfig for testing. */
|
|
21
|
+
function makeConfig(pagesFolder: string): SynthOSConfig {
|
|
22
|
+
return {
|
|
23
|
+
localFolder: '.synthos',
|
|
24
|
+
pagesFolder,
|
|
25
|
+
requiredPagesFolders: [],
|
|
26
|
+
defaultPagesFolders: [],
|
|
27
|
+
defaultScriptsFolders: [],
|
|
28
|
+
defaultThemesFolders: [],
|
|
29
|
+
staticFilesFolders: [],
|
|
30
|
+
serviceConnectorsFolders: [],
|
|
31
|
+
requiredPages: [],
|
|
32
|
+
storageProvider: new FsStorageProvider(),
|
|
33
|
+
debug: false,
|
|
34
|
+
debugPageUpdates: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
18
37
|
|
|
19
38
|
// ---------------------------------------------------------------------------
|
|
20
39
|
// normalizePageName
|
|
@@ -123,15 +142,16 @@ describe('parseMetadata', () => {
|
|
|
123
142
|
|
|
124
143
|
describe('page I/O', () => {
|
|
125
144
|
let tmpDir: string;
|
|
126
|
-
let
|
|
145
|
+
let config: SynthOSConfig;
|
|
127
146
|
let fallbackFolder: string;
|
|
128
147
|
|
|
129
148
|
beforeEach(async () => {
|
|
130
149
|
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'synthos-test-'));
|
|
131
|
-
pagesFolder = path.join(tmpDir, 'synthos');
|
|
150
|
+
const pagesFolder = path.join(tmpDir, 'synthos');
|
|
132
151
|
fallbackFolder = path.join(tmpDir, 'fallback');
|
|
133
152
|
await fs.mkdir(pagesFolder, { recursive: true });
|
|
134
153
|
await fs.mkdir(fallbackFolder, { recursive: true });
|
|
154
|
+
config = makeConfig(pagesFolder);
|
|
135
155
|
});
|
|
136
156
|
|
|
137
157
|
afterEach(async () => {
|
|
@@ -152,8 +172,8 @@ describe('page I/O', () => {
|
|
|
152
172
|
pageVersion: 2,
|
|
153
173
|
mode: 'locked' as const,
|
|
154
174
|
};
|
|
155
|
-
await savePageMetadata(
|
|
156
|
-
const loaded = await loadPageMetadata(
|
|
175
|
+
await savePageMetadata(config, 'mypage', meta);
|
|
176
|
+
const loaded = await loadPageMetadata(config, 'mypage');
|
|
157
177
|
assert.ok(loaded);
|
|
158
178
|
assert.strictEqual(loaded.title, 'Test Page');
|
|
159
179
|
assert.deepStrictEqual(loaded.categories, ['Tools', 'Dev']);
|
|
@@ -163,17 +183,19 @@ describe('page I/O', () => {
|
|
|
163
183
|
});
|
|
164
184
|
|
|
165
185
|
it('returns undefined when no metadata file exists', async () => {
|
|
166
|
-
const loaded = await loadPageMetadata(
|
|
186
|
+
const loaded = await loadPageMetadata(config, 'nonexistent');
|
|
167
187
|
assert.strictEqual(loaded, undefined);
|
|
168
188
|
});
|
|
169
189
|
|
|
170
190
|
it('falls back to fallbackFolder', async () => {
|
|
171
|
-
// Write a fallback JSON file
|
|
191
|
+
// Write a fallback JSON file in folder-based structure
|
|
192
|
+
const fallbackPageDir = path.join(fallbackFolder, 'system-page');
|
|
193
|
+
await fs.mkdir(fallbackPageDir, { recursive: true });
|
|
172
194
|
await fs.writeFile(
|
|
173
|
-
path.join(
|
|
195
|
+
path.join(fallbackPageDir, 'page.json'),
|
|
174
196
|
JSON.stringify({ title: 'System', categories: ['System'], pinned: true, pageVersion: 2, mode: 'locked' }),
|
|
175
197
|
);
|
|
176
|
-
const loaded = await loadPageMetadata(
|
|
198
|
+
const loaded = await loadPageMetadata(config, 'system-page', [fallbackFolder]);
|
|
177
199
|
assert.ok(loaded);
|
|
178
200
|
assert.strictEqual(loaded.title, 'System');
|
|
179
201
|
});
|
|
@@ -184,89 +206,46 @@ describe('page I/O', () => {
|
|
|
184
206
|
describe('savePageState / loadPageState', () => {
|
|
185
207
|
it('roundtrips page HTML and creates metadata', async () => {
|
|
186
208
|
const html = '<html><body>Hello</body></html>';
|
|
187
|
-
await savePageState(
|
|
188
|
-
const loaded = await loadPageState(
|
|
209
|
+
await savePageState(config, 'testpage', html, 'Test Title', ['Cat']);
|
|
210
|
+
const loaded = await loadPageState(config, 'testpage');
|
|
189
211
|
assert.strictEqual(loaded, html);
|
|
190
212
|
|
|
191
213
|
// Metadata should have been created
|
|
192
|
-
const meta = await loadPageMetadata(
|
|
214
|
+
const meta = await loadPageMetadata(config, 'testpage');
|
|
193
215
|
assert.ok(meta);
|
|
194
216
|
assert.strictEqual(meta.pageVersion, PAGE_VERSION);
|
|
195
217
|
});
|
|
196
218
|
|
|
197
219
|
it('returns undefined for non-existent page', async () => {
|
|
198
|
-
const loaded = await loadPageState(
|
|
220
|
+
const loaded = await loadPageState(config, 'nope');
|
|
199
221
|
assert.strictEqual(loaded, undefined);
|
|
200
222
|
});
|
|
201
|
-
|
|
202
|
-
it('with reset=true re-reads from disk', async () => {
|
|
203
|
-
const html1 = '<html>v1</html>';
|
|
204
|
-
const html2 = '<html>v2</html>';
|
|
205
|
-
await savePageState(pagesFolder, 'resetpage', html1);
|
|
206
|
-
// First load
|
|
207
|
-
const first = await loadPageState(pagesFolder, 'resetpage', false);
|
|
208
|
-
assert.strictEqual(first, html1);
|
|
209
|
-
|
|
210
|
-
// Overwrite the file on disk directly
|
|
211
|
-
const pageHtmlPath = path.join(pagesFolder, 'pages', 'resetpage', 'page.html');
|
|
212
|
-
await fs.writeFile(pageHtmlPath, html2);
|
|
213
|
-
|
|
214
|
-
// Without reset, should return cached version
|
|
215
|
-
const cached = await loadPageState(pagesFolder, 'resetpage', false);
|
|
216
|
-
assert.strictEqual(cached, html1);
|
|
217
|
-
|
|
218
|
-
// With reset, should re-read
|
|
219
|
-
const refreshed = await loadPageState(pagesFolder, 'resetpage', true);
|
|
220
|
-
assert.strictEqual(refreshed, html2);
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
// -- updatePageState -----------------------------------------------------
|
|
225
|
-
|
|
226
|
-
describe('updatePageState', () => {
|
|
227
|
-
it('updates in-memory cache', async () => {
|
|
228
|
-
await savePageState(pagesFolder, 'cachepage', '<html>original</html>');
|
|
229
|
-
await loadPageState(pagesFolder, 'cachepage', false);
|
|
230
|
-
|
|
231
|
-
updatePageState('cachepage', '<html>updated</html>');
|
|
232
|
-
|
|
233
|
-
// Loading without reset should return updated cache
|
|
234
|
-
const loaded = await loadPageState(pagesFolder, 'cachepage', false);
|
|
235
|
-
assert.strictEqual(loaded, '<html>updated</html>');
|
|
236
|
-
});
|
|
237
223
|
});
|
|
238
224
|
|
|
239
225
|
// -- listPages -----------------------------------------------------------
|
|
240
226
|
|
|
241
227
|
describe('listPages', () => {
|
|
242
228
|
it('lists folder-based pages', async () => {
|
|
243
|
-
await savePageState(
|
|
244
|
-
await savePageState(
|
|
245
|
-
const pages = await listPages(
|
|
229
|
+
await savePageState(config, 'alpha', '<html>A</html>');
|
|
230
|
+
await savePageState(config, 'beta', '<html>B</html>');
|
|
231
|
+
const pages = await listPages(config, [fallbackFolder]);
|
|
246
232
|
const names = pages.map(p => p.name);
|
|
247
233
|
assert.ok(names.includes('alpha'));
|
|
248
234
|
assert.ok(names.includes('beta'));
|
|
249
235
|
});
|
|
250
236
|
|
|
251
237
|
it('lists legacy flat HTML files', async () => {
|
|
252
|
-
await fs.writeFile(path.join(pagesFolder, 'legacy.html'), '<html>Legacy</html>');
|
|
253
|
-
const pages = await listPages(
|
|
238
|
+
await fs.writeFile(path.join(config.pagesFolder, 'legacy.html'), '<html>Legacy</html>');
|
|
239
|
+
const pages = await listPages(config, [fallbackFolder]);
|
|
254
240
|
const legacy = pages.find(p => p.name === 'legacy');
|
|
255
241
|
assert.ok(legacy);
|
|
256
242
|
assert.strictEqual(legacy.pageVersion, 1);
|
|
257
243
|
});
|
|
258
244
|
|
|
259
|
-
it('lists fallback (required) pages', async () => {
|
|
260
|
-
await fs.writeFile(path.join(fallbackFolder, 'builder.html'), '<html>Builder</html>');
|
|
261
|
-
const pages = await listPages(pagesFolder, fallbackFolder);
|
|
262
|
-
const builder = pages.find(p => p.name === 'builder');
|
|
263
|
-
assert.ok(builder);
|
|
264
|
-
});
|
|
265
|
-
|
|
266
245
|
it('returns pages sorted alphabetically', async () => {
|
|
267
|
-
await savePageState(
|
|
268
|
-
await savePageState(
|
|
269
|
-
const pages = await listPages(
|
|
246
|
+
await savePageState(config, 'zebra', '<html></html>');
|
|
247
|
+
await savePageState(config, 'apple', '<html></html>');
|
|
248
|
+
const pages = await listPages(config, [fallbackFolder]);
|
|
270
249
|
const names = pages.map(p => p.name);
|
|
271
250
|
const sortedNames = [...names].sort();
|
|
272
251
|
assert.deepStrictEqual(names, sortedNames);
|
|
@@ -276,19 +255,18 @@ describe('page I/O', () => {
|
|
|
276
255
|
// -- deletePage ----------------------------------------------------------
|
|
277
256
|
|
|
278
257
|
describe('deletePage', () => {
|
|
279
|
-
it('removes folder-based page
|
|
280
|
-
await savePageState(
|
|
281
|
-
await loadPageState(pagesFolder, 'doomed', false);
|
|
258
|
+
it('removes folder-based page', async () => {
|
|
259
|
+
await savePageState(config, 'doomed', '<html>bye</html>');
|
|
282
260
|
|
|
283
|
-
await deletePage(
|
|
261
|
+
await deletePage(config, 'doomed');
|
|
284
262
|
|
|
285
263
|
// Folder should be gone
|
|
286
|
-
const folderExists = await fs.access(path.join(pagesFolder, 'pages', 'doomed'))
|
|
264
|
+
const folderExists = await fs.access(path.join(config.pagesFolder, 'pages', 'doomed'))
|
|
287
265
|
.then(() => true).catch(() => false);
|
|
288
266
|
assert.strictEqual(folderExists, false);
|
|
289
267
|
|
|
290
|
-
//
|
|
291
|
-
const loaded = await loadPageState(
|
|
268
|
+
// Loading should return undefined
|
|
269
|
+
const loaded = await loadPageState(config, 'doomed');
|
|
292
270
|
assert.strictEqual(loaded, undefined);
|
|
293
271
|
});
|
|
294
272
|
});
|
|
@@ -297,13 +275,13 @@ describe('page I/O', () => {
|
|
|
297
275
|
|
|
298
276
|
describe('copyPage', () => {
|
|
299
277
|
it('copies HTML and creates metadata with correct title/categories', async () => {
|
|
300
|
-
await savePageState(
|
|
301
|
-
await copyPage(
|
|
278
|
+
await savePageState(config, 'source', '<html>Source</html>');
|
|
279
|
+
await copyPage(config, 'source', 'target', 'Copied Page', ['Copy'], [fallbackFolder]);
|
|
302
280
|
|
|
303
|
-
const html = await loadPageState(
|
|
281
|
+
const html = await loadPageState(config, 'target');
|
|
304
282
|
assert.strictEqual(html, '<html>Source</html>');
|
|
305
283
|
|
|
306
|
-
const meta = await loadPageMetadata(
|
|
284
|
+
const meta = await loadPageMetadata(config, 'target');
|
|
307
285
|
assert.ok(meta);
|
|
308
286
|
assert.strictEqual(meta.title, 'Copied Page');
|
|
309
287
|
assert.deepStrictEqual(meta.categories, ['Copy']);
|
|
@@ -312,17 +290,9 @@ describe('page I/O', () => {
|
|
|
312
290
|
|
|
313
291
|
it('throws when source page does not exist', async () => {
|
|
314
292
|
await assert.rejects(
|
|
315
|
-
() => copyPage(
|
|
293
|
+
() => copyPage(config, 'ghost', 'target', 'T', [], [fallbackFolder]),
|
|
316
294
|
/Source page "ghost" not found/,
|
|
317
295
|
);
|
|
318
296
|
});
|
|
319
|
-
|
|
320
|
-
it('copies from required pages folder as fallback', async () => {
|
|
321
|
-
await fs.writeFile(path.join(fallbackFolder, 'system.html'), '<html>System</html>');
|
|
322
|
-
await copyPage(pagesFolder, 'system', 'mycopy', 'My Copy', ['User'], fallbackFolder);
|
|
323
|
-
|
|
324
|
-
const html = await loadPageState(pagesFolder, 'mycopy', true);
|
|
325
|
-
assert.strictEqual(html, '<html>System</html>');
|
|
326
|
-
});
|
|
327
297
|
});
|
|
328
298
|
});
|