veryfront 0.1.215 → 0.1.217
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/esm/cli/commands/extension/command-help.d.ts +3 -0
- package/esm/cli/commands/extension/command-help.d.ts.map +1 -0
- package/esm/cli/commands/extension/command-help.js +16 -0
- package/esm/cli/commands/extension/handler.d.ts +3 -0
- package/esm/cli/commands/extension/handler.d.ts.map +1 -0
- package/esm/cli/commands/extension/handler.js +36 -0
- package/esm/cli/commands/extension/init-command.d.ts +19 -0
- package/esm/cli/commands/extension/init-command.d.ts.map +1 -0
- package/esm/cli/commands/extension/init-command.js +122 -0
- package/esm/cli/commands/extension/validate-command.d.ts +13 -0
- package/esm/cli/commands/extension/validate-command.d.ts.map +1 -0
- package/esm/cli/commands/extension/validate-command.js +62 -0
- package/esm/cli/commands/generate/integration-generator-helpers.d.ts +35 -0
- package/esm/cli/commands/generate/integration-generator-helpers.d.ts.map +1 -0
- package/esm/cli/commands/generate/integration-generator-helpers.js +123 -0
- package/esm/cli/commands/generate/integration-generator.d.ts +1 -2
- package/esm/cli/commands/generate/integration-generator.d.ts.map +1 -1
- package/esm/cli/commands/generate/integration-generator.js +1 -123
- package/esm/cli/commands/knowledge/command-helpers.d.ts +48 -0
- package/esm/cli/commands/knowledge/command-helpers.d.ts.map +1 -0
- package/esm/cli/commands/knowledge/command-helpers.js +216 -0
- package/esm/cli/commands/knowledge/command.d.ts +12 -17
- package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +26 -214
- package/esm/cli/help/command-definitions.d.ts.map +1 -1
- package/esm/cli/help/command-definitions.js +2 -0
- package/esm/cli/mcp/remote-file-tool-helpers.d.ts +5 -0
- package/esm/cli/mcp/remote-file-tool-helpers.d.ts.map +1 -0
- package/esm/cli/mcp/remote-file-tool-helpers.js +22 -0
- package/esm/cli/mcp/remote-file-tools.d.ts.map +1 -1
- package/esm/cli/mcp/remote-file-tools.js +1 -22
- package/esm/cli/router.d.ts.map +1 -1
- package/esm/cli/router.js +2 -0
- package/esm/cli/templates/integration-loader-helpers.d.ts +8 -0
- package/esm/cli/templates/integration-loader-helpers.d.ts.map +1 -0
- package/esm/cli/templates/integration-loader-helpers.js +29 -0
- package/esm/cli/templates/integration-loader.d.ts.map +1 -1
- package/esm/cli/templates/integration-loader.js +5 -21
- package/esm/cli/templates/manifest.d.ts +1 -0
- package/esm/cli/templates/manifest.js +2 -1
- package/esm/deno.d.ts +3 -0
- package/esm/deno.js +5 -2
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +48 -90
- package/esm/src/chat/ag-ui-helpers.d.ts +17 -0
- package/esm/src/chat/ag-ui-helpers.d.ts.map +1 -0
- package/esm/src/chat/ag-ui-helpers.js +111 -0
- package/esm/src/chat/ag-ui.d.ts.map +1 -1
- package/esm/src/chat/ag-ui.js +1 -111
- package/esm/src/config/schemas/config.schema.d.ts +1 -0
- package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
- package/esm/src/config/schemas/config.schema.js +11 -0
- package/esm/src/config/schemas/index.d.ts +11 -1
- package/esm/src/config/schemas/index.d.ts.map +1 -1
- package/esm/src/errors/error-registry-helpers.d.ts +6 -0
- package/esm/src/errors/error-registry-helpers.d.ts.map +1 -0
- package/esm/src/errors/error-registry-helpers.js +9 -0
- package/esm/src/errors/error-registry.d.ts.map +1 -1
- package/esm/src/errors/error-registry.js +4 -3
- package/esm/src/extensions/capabilities.d.ts +20 -0
- package/esm/src/extensions/capabilities.d.ts.map +1 -0
- package/esm/src/extensions/capabilities.js +77 -0
- package/esm/src/extensions/contracts.d.ts +10 -0
- package/esm/src/extensions/contracts.d.ts.map +1 -0
- package/esm/src/extensions/contracts.js +28 -0
- package/esm/src/extensions/discovery.d.ts +48 -0
- package/esm/src/extensions/discovery.d.ts.map +1 -0
- package/esm/src/extensions/discovery.js +179 -0
- package/esm/src/extensions/errors.d.ts +10 -0
- package/esm/src/extensions/errors.d.ts.map +1 -0
- package/esm/src/extensions/errors.js +34 -0
- package/esm/src/extensions/factory-loader.d.ts +29 -0
- package/esm/src/extensions/factory-loader.d.ts.map +1 -0
- package/esm/src/extensions/factory-loader.js +63 -0
- package/esm/src/extensions/index.d.ts +37 -0
- package/esm/src/extensions/index.d.ts.map +1 -0
- package/esm/src/extensions/index.js +41 -0
- package/esm/src/extensions/interfaces/ai-model-provider.d.ts +94 -0
- package/esm/src/extensions/interfaces/ai-model-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/ai-model-provider.js +8 -0
- package/esm/src/extensions/interfaces/auth-provider.d.ts +49 -0
- package/esm/src/extensions/interfaces/auth-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/auth-provider.js +8 -0
- package/esm/src/extensions/interfaces/bundler.d.ts +118 -0
- package/esm/src/extensions/interfaces/bundler.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/bundler.js +8 -0
- package/esm/src/extensions/interfaces/cache-store.d.ts +27 -0
- package/esm/src/extensions/interfaces/cache-store.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/cache-store.js +8 -0
- package/esm/src/extensions/interfaces/code-parser.d.ts +76 -0
- package/esm/src/extensions/interfaces/code-parser.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/code-parser.js +8 -0
- package/esm/src/extensions/interfaces/content-transformer.d.ts +40 -0
- package/esm/src/extensions/interfaces/content-transformer.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/content-transformer.js +8 -0
- package/esm/src/extensions/interfaces/css-processor.d.ts +38 -0
- package/esm/src/extensions/interfaces/css-processor.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/css-processor.js +8 -0
- package/esm/src/extensions/interfaces/database-client.d.ts +31 -0
- package/esm/src/extensions/interfaces/database-client.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/database-client.js +8 -0
- package/esm/src/extensions/interfaces/embedding-provider.d.ts +37 -0
- package/esm/src/extensions/interfaces/embedding-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/embedding-provider.js +8 -0
- package/esm/src/extensions/interfaces/index.d.ts +21 -0
- package/esm/src/extensions/interfaces/index.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/index.js +9 -0
- package/esm/src/extensions/interfaces/node-compat.d.ts +25 -0
- package/esm/src/extensions/interfaces/node-compat.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/node-compat.js +8 -0
- package/esm/src/extensions/interfaces/schema-validator.d.ts +46 -0
- package/esm/src/extensions/interfaces/schema-validator.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/schema-validator.js +8 -0
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts +44 -0
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/tracing-exporter.js +8 -0
- package/esm/src/extensions/loader.d.ts +33 -0
- package/esm/src/extensions/loader.d.ts.map +1 -0
- package/esm/src/extensions/loader.js +209 -0
- package/esm/src/extensions/orchestrate.d.ts +54 -0
- package/esm/src/extensions/orchestrate.d.ts.map +1 -0
- package/esm/src/extensions/orchestrate.js +116 -0
- package/esm/src/extensions/recommendations.d.ts +7 -0
- package/esm/src/extensions/recommendations.d.ts.map +1 -0
- package/esm/src/extensions/recommendations.js +22 -0
- package/esm/src/extensions/types.d.ts +47 -0
- package/esm/src/extensions/types.d.ts.map +1 -0
- package/esm/src/extensions/types.js +6 -0
- package/esm/src/extensions/validation.d.ts +44 -0
- package/esm/src/extensions/validation.d.ts.map +1 -0
- package/esm/src/extensions/validation.js +115 -0
- package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
- package/esm/src/html/styles-builder/plugin-loader.js +23 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts +29 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts.map +1 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.js +48 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts +15 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts.map +1 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.js +22 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts +0 -2
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/loader.js +4 -24
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts +19 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts.map +1 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.js +26 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/adapter.js +4 -20
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts +1 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.js +3 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations.js +4 -7
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts +28 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts.map +1 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.js +41 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts +1 -4
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.js +7 -40
- package/esm/src/platform/compat/process/command.d.ts +31 -0
- package/esm/src/platform/compat/process/command.d.ts.map +1 -0
- package/esm/src/platform/compat/process/command.js +193 -0
- package/esm/src/platform/compat/process/env.d.ts +31 -0
- package/esm/src/platform/compat/process/env.d.ts.map +1 -0
- package/esm/src/platform/compat/process/env.js +175 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts +98 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts.map +1 -0
- package/esm/src/platform/compat/process/lifecycle.js +305 -0
- package/esm/src/platform/compat/process/runtime-process.d.ts +10 -0
- package/esm/src/platform/compat/process/runtime-process.d.ts.map +1 -0
- package/esm/src/platform/compat/process/runtime-process.js +24 -0
- package/esm/src/platform/compat/process.d.ts +4 -165
- package/esm/src/platform/compat/process.d.ts.map +1 -1
- package/esm/src/platform/compat/process.js +4 -682
- package/esm/src/platform/index.d.ts +1 -1
- package/esm/src/platform/index.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader/provider-endpoints.d.ts +8 -0
- package/esm/src/provider/runtime-loader/provider-endpoints.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/provider-endpoints.js +27 -0
- package/esm/src/provider/runtime-loader/provider-request-init.d.ts +32 -0
- package/esm/src/provider/runtime-loader/provider-request-init.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/provider-request-init.js +67 -0
- package/esm/src/provider/runtime-loader/tool-input-status.d.ts +17 -0
- package/esm/src/provider/runtime-loader/tool-input-status.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/tool-input-status.js +155 -0
- package/esm/src/provider/runtime-loader.d.ts +2 -3
- package/esm/src/provider/runtime-loader.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader.js +92 -291
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +14 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts +8 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts.map +1 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.js +20 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts +0 -3
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +4 -22
- package/esm/src/routing/api/module-loader/loader-helpers.d.ts +10 -0
- package/esm/src/routing/api/module-loader/loader-helpers.d.ts.map +1 -0
- package/esm/src/routing/api/module-loader/loader-helpers.js +62 -0
- package/esm/src/routing/api/module-loader/loader.d.ts +1 -1
- package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.js +2 -60
- package/esm/src/server/bootstrap.d.ts +22 -2
- package/esm/src/server/bootstrap.d.ts.map +1 -1
- package/esm/src/server/bootstrap.js +67 -5
- package/esm/src/server/dev-ui/manifest.d.ts +2 -0
- package/esm/src/server/dev-ui/manifest.js +3 -1
- package/esm/src/server/handlers/request/api/project-discovery.d.ts.map +1 -1
- package/esm/src/server/handlers/request/api/project-discovery.js +14 -8
- package/esm/src/server/production-server.js +1 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.d.ts.map +1 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +2 -2
- package/esm/src/server/utils/domain-parser.d.ts.map +1 -1
- package/esm/src/server/utils/domain-parser.js +4 -0
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
- package/esm/src/tool/index.d.ts +1 -1
- package/esm/src/tool/index.d.ts.map +1 -1
- package/esm/src/tool/types.d.ts +20 -0
- package/esm/src/tool/types.d.ts.map +1 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +7 -1
- package/src/cli/commands/extension/command-help.ts +18 -0
- package/src/cli/commands/extension/handler.ts +41 -0
- package/src/cli/commands/extension/init-command.ts +140 -0
- package/src/cli/commands/extension/validate-command.ts +78 -0
- package/src/cli/commands/generate/integration-generator-helpers.ts +185 -0
- package/src/cli/commands/generate/integration-generator.ts +12 -168
- package/src/cli/commands/knowledge/command-helpers.ts +295 -0
- package/src/cli/commands/knowledge/command.ts +34 -261
- package/src/cli/help/command-definitions.ts +2 -0
- package/src/cli/mcp/remote-file-tool-helpers.ts +27 -0
- package/src/cli/mcp/remote-file-tools.ts +6 -28
- package/src/cli/router.ts +2 -0
- package/src/cli/templates/integration-loader-helpers.ts +49 -0
- package/src/cli/templates/integration-loader.ts +10 -28
- package/src/cli/templates/manifest.js +2 -1
- package/src/deno.js +5 -2
- package/src/src/agent/runtime/index.ts +77 -94
- package/src/src/chat/ag-ui-helpers.ts +139 -0
- package/src/src/chat/ag-ui.ts +11 -139
- package/src/src/config/schemas/config.schema.ts +11 -0
- package/src/src/config/schemas/index.ts +15 -1
- package/src/src/errors/error-registry-helpers.ts +23 -0
- package/src/src/errors/error-registry.ts +8 -3
- package/src/src/extensions/capabilities.ts +97 -0
- package/src/src/extensions/contracts.ts +36 -0
- package/src/src/extensions/discovery.ts +221 -0
- package/src/src/extensions/errors.ts +39 -0
- package/src/src/extensions/factory-loader.ts +76 -0
- package/src/src/extensions/index.ts +79 -0
- package/src/src/extensions/interfaces/ai-model-provider.ts +100 -0
- package/src/src/extensions/interfaces/auth-provider.ts +52 -0
- package/src/src/extensions/interfaces/bundler.ts +116 -0
- package/src/src/extensions/interfaces/cache-store.ts +27 -0
- package/src/src/extensions/interfaces/code-parser.ts +84 -0
- package/src/src/extensions/interfaces/content-transformer.ts +38 -0
- package/src/src/extensions/interfaces/css-processor.ts +40 -0
- package/src/src/extensions/interfaces/database-client.ts +35 -0
- package/src/src/extensions/interfaces/embedding-provider.ts +39 -0
- package/src/src/extensions/interfaces/index.ts +81 -0
- package/src/src/extensions/interfaces/node-compat.ts +25 -0
- package/src/src/extensions/interfaces/schema-validator.ts +51 -0
- package/src/src/extensions/interfaces/tracing-exporter.ts +42 -0
- package/src/src/extensions/loader.ts +245 -0
- package/src/src/extensions/orchestrate.ts +184 -0
- package/src/src/extensions/recommendations.ts +24 -0
- package/src/src/extensions/types.ts +57 -0
- package/src/src/extensions/validation.ts +147 -0
- package/src/src/html/styles-builder/plugin-loader.ts +32 -0
- package/src/src/html/styles-builder/tailwind-plugin-allowlist.ts +51 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader-helpers.ts +37 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +8 -39
- package/src/src/platform/adapters/fs/veryfront/adapter-helpers.ts +43 -0
- package/src/src/platform/adapters/fs/veryfront/adapter.ts +8 -22
- package/src/src/platform/adapters/fs/veryfront/read-operations-helpers.ts +4 -0
- package/src/src/platform/adapters/fs/veryfront/read-operations.ts +4 -7
- package/src/src/platform/adapters/fs/veryfront/websocket-manager-helpers.ts +73 -0
- package/src/src/platform/adapters/fs/veryfront/websocket-manager.ts +29 -44
- package/src/src/platform/compat/process/command.ts +297 -0
- package/src/src/platform/compat/process/env.ts +227 -0
- package/src/src/platform/compat/process/lifecycle.ts +330 -0
- package/src/src/platform/compat/process/runtime-process.ts +27 -0
- package/src/src/platform/compat/process.ts +37 -870
- package/src/src/platform/index.ts +1 -0
- package/src/src/provider/runtime-loader/provider-endpoints.ts +50 -0
- package/src/src/provider/runtime-loader/provider-request-init.ts +101 -0
- package/src/src/provider/runtime-loader/tool-input-status.ts +210 -0
- package/src/src/provider/runtime-loader.ts +113 -368
- package/src/src/proxy/handler.ts +16 -0
- package/src/src/rendering/orchestrator/pipeline-helpers.ts +35 -0
- package/src/src/rendering/orchestrator/pipeline.ts +8 -35
- package/src/src/routing/api/module-loader/loader-helpers.ts +68 -0
- package/src/src/routing/api/module-loader/loader.ts +8 -65
- package/src/src/server/bootstrap.ts +88 -7
- package/src/src/server/dev-ui/manifest.js +3 -1
- package/src/src/server/handlers/request/api/project-discovery.ts +19 -8
- package/src/src/server/production-server.ts +1 -1
- package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +2 -2
- package/src/src/server/utils/domain-parser.ts +4 -0
- package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
- package/src/src/tool/index.ts +1 -0
- package/src/src/tool/types.ts +21 -0
- package/src/src/utils/version-constant.ts +1 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for the veryfront extension system.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/types
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Declares a system capability an extension requires.
|
|
8
|
+
* Object-based for extensibility -- scoping fields vary by type.
|
|
9
|
+
*/
|
|
10
|
+
export interface Capability {
|
|
11
|
+
type: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface ExtensionContext {
|
|
15
|
+
get<T>(contract: string): T | undefined;
|
|
16
|
+
require<T>(contract: string): T;
|
|
17
|
+
provide<T>(contract: string, impl: T): void;
|
|
18
|
+
config: Record<string, unknown>;
|
|
19
|
+
logger: ExtensionLogger;
|
|
20
|
+
}
|
|
21
|
+
export interface ExtensionLogger {
|
|
22
|
+
debug(message: string, ...args: unknown[]): void;
|
|
23
|
+
info(message: string, ...args: unknown[]): void;
|
|
24
|
+
warn(message: string, ...args: unknown[]): void;
|
|
25
|
+
error(message: string, ...args: unknown[]): void;
|
|
26
|
+
}
|
|
27
|
+
export interface Extension {
|
|
28
|
+
name: string;
|
|
29
|
+
version: string;
|
|
30
|
+
capabilities: Capability[];
|
|
31
|
+
setup?(ctx: ExtensionContext): Promise<void> | void;
|
|
32
|
+
teardown?(): Promise<void> | void;
|
|
33
|
+
provides?: Record<string, unknown>;
|
|
34
|
+
extends?: Extension[];
|
|
35
|
+
}
|
|
36
|
+
export type ExtensionFactory = (config?: unknown) => Extension;
|
|
37
|
+
export type ExtensionConfigEntry = Extension | {
|
|
38
|
+
name: string;
|
|
39
|
+
enabled: false;
|
|
40
|
+
};
|
|
41
|
+
export type ExtensionSource = "config" | "package" | "project" | "local-file";
|
|
42
|
+
export interface ResolvedExtension {
|
|
43
|
+
extension: Extension;
|
|
44
|
+
source: ExtensionSource;
|
|
45
|
+
origin: string;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,KAAK,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,SAAS,CAAC;AAE/D,MAAM,MAAM,oBAAoB,GAC5B,SAAS,GACT;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,SAAS,GACT,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension validation and conflict detection.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/validation
|
|
5
|
+
*/
|
|
6
|
+
import type { ExtensionSource, ResolvedExtension } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Information about a contract conflict between extensions.
|
|
9
|
+
*/
|
|
10
|
+
export interface ConflictInfo {
|
|
11
|
+
contract: string;
|
|
12
|
+
providers: Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
source: ExtensionSource;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Priority map for extension sources.
|
|
19
|
+
* Lower number = higher priority.
|
|
20
|
+
*/
|
|
21
|
+
export declare const SOURCE_PRIORITY: Record<ExtensionSource, number>;
|
|
22
|
+
/**
|
|
23
|
+
* Select the highest-priority provider for each contract across a list of
|
|
24
|
+
* resolved extensions. When multiple extensions provide the same contract,
|
|
25
|
+
* the one whose source has the lowest `SOURCE_PRIORITY` number wins.
|
|
26
|
+
* Ties break on first-seen order (mirrors detectConflicts semantics).
|
|
27
|
+
*/
|
|
28
|
+
export declare function selectContractProviders(extensions: ResolvedExtension[]): Map<string, ResolvedExtension>;
|
|
29
|
+
/**
|
|
30
|
+
* Validate the shape of an extension object.
|
|
31
|
+
* Returns an array of issue descriptions (empty array = valid).
|
|
32
|
+
*
|
|
33
|
+
* Accepts `unknown` so callers at module-boundary / config-loading paths can
|
|
34
|
+
* validate arbitrary imported values without casting.
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateExtension(ext: unknown): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Detect contract conflicts between resolved extensions.
|
|
39
|
+
*
|
|
40
|
+
* A conflict exists when two or more extensions provide the same contract
|
|
41
|
+
* and no single provider has strictly higher source priority than all others.
|
|
42
|
+
*/
|
|
43
|
+
export declare function detectConflicts(extensions: ResolvedExtension[]): ConflictInfo[];
|
|
44
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAa,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAK3D,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,iBAAiB,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAgBhC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAmCxD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE,CA2C/E"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension validation and conflict detection.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/validation
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Priority map for extension sources.
|
|
8
|
+
* Lower number = higher priority.
|
|
9
|
+
*/
|
|
10
|
+
export const SOURCE_PRIORITY = {
|
|
11
|
+
config: 0,
|
|
12
|
+
package: 1,
|
|
13
|
+
project: 2,
|
|
14
|
+
"local-file": 3,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Select the highest-priority provider for each contract across a list of
|
|
18
|
+
* resolved extensions. When multiple extensions provide the same contract,
|
|
19
|
+
* the one whose source has the lowest `SOURCE_PRIORITY` number wins.
|
|
20
|
+
* Ties break on first-seen order (mirrors detectConflicts semantics).
|
|
21
|
+
*/
|
|
22
|
+
export function selectContractProviders(extensions) {
|
|
23
|
+
const winner = new Map();
|
|
24
|
+
for (const resolved of extensions) {
|
|
25
|
+
const provides = resolved.extension.provides;
|
|
26
|
+
if (!provides)
|
|
27
|
+
continue;
|
|
28
|
+
for (const contract of Object.keys(provides)) {
|
|
29
|
+
const current = winner.get(contract);
|
|
30
|
+
if (!current ||
|
|
31
|
+
SOURCE_PRIORITY[resolved.source] < SOURCE_PRIORITY[current.source]) {
|
|
32
|
+
winner.set(contract, resolved);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return winner;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate the shape of an extension object.
|
|
40
|
+
* Returns an array of issue descriptions (empty array = valid).
|
|
41
|
+
*
|
|
42
|
+
* Accepts `unknown` so callers at module-boundary / config-loading paths can
|
|
43
|
+
* validate arbitrary imported values without casting.
|
|
44
|
+
*/
|
|
45
|
+
export function validateExtension(ext) {
|
|
46
|
+
const issues = [];
|
|
47
|
+
if (ext === null || typeof ext !== "object" || Array.isArray(ext)) {
|
|
48
|
+
issues.push("extension must be a non-null object");
|
|
49
|
+
return issues;
|
|
50
|
+
}
|
|
51
|
+
const candidate = ext;
|
|
52
|
+
if (typeof candidate.name !== "string" || candidate.name.length === 0) {
|
|
53
|
+
issues.push("name must be a non-empty string");
|
|
54
|
+
}
|
|
55
|
+
if (typeof candidate.version !== "string" || candidate.version.length === 0) {
|
|
56
|
+
issues.push("version must be a non-empty string");
|
|
57
|
+
}
|
|
58
|
+
if (!Array.isArray(candidate.capabilities)) {
|
|
59
|
+
issues.push("capabilities must be an array");
|
|
60
|
+
return issues;
|
|
61
|
+
}
|
|
62
|
+
for (let i = 0; i < candidate.capabilities.length; i++) {
|
|
63
|
+
const cap = candidate.capabilities[i];
|
|
64
|
+
if (typeof cap !== "object" || cap === null || Array.isArray(cap)) {
|
|
65
|
+
issues.push(`capabilities[${i}] must be an object`);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (typeof cap.type !== "string" || cap.type.length === 0) {
|
|
69
|
+
issues.push(`capabilities[${i}].type must be a non-empty string`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return issues;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Detect contract conflicts between resolved extensions.
|
|
76
|
+
*
|
|
77
|
+
* A conflict exists when two or more extensions provide the same contract
|
|
78
|
+
* and no single provider has strictly higher source priority than all others.
|
|
79
|
+
*/
|
|
80
|
+
export function detectConflicts(extensions) {
|
|
81
|
+
const contractProviders = new Map();
|
|
82
|
+
for (const resolved of extensions) {
|
|
83
|
+
const provides = resolved.extension.provides;
|
|
84
|
+
if (!provides)
|
|
85
|
+
continue;
|
|
86
|
+
for (const contract of Object.keys(provides)) {
|
|
87
|
+
let list = contractProviders.get(contract);
|
|
88
|
+
if (!list) {
|
|
89
|
+
list = [];
|
|
90
|
+
contractProviders.set(contract, list);
|
|
91
|
+
}
|
|
92
|
+
list.push({
|
|
93
|
+
name: resolved.extension.name,
|
|
94
|
+
source: resolved.source,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const conflicts = [];
|
|
99
|
+
for (const [contract, providers] of contractProviders) {
|
|
100
|
+
if (providers.length < 2)
|
|
101
|
+
continue;
|
|
102
|
+
// Find the highest priority (lowest number) among providers
|
|
103
|
+
const priorities = providers.map((p) => SOURCE_PRIORITY[p.source]);
|
|
104
|
+
const bestPriority = Math.min(...priorities);
|
|
105
|
+
const winnersCount = priorities.filter((p) => p === bestPriority).length;
|
|
106
|
+
// If exactly one provider has the best priority, no conflict
|
|
107
|
+
if (winnersCount === 1)
|
|
108
|
+
continue;
|
|
109
|
+
conflicts.push({
|
|
110
|
+
contract,
|
|
111
|
+
providers: providers.map((p) => ({ name: p.name, source: p.source })),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return conflicts;
|
|
115
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../../../src/src/html/styles-builder/plugin-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../../../src/src/html/styles-builder/plugin-loader.ts"],"names":[],"mappings":"AAiIA;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4D/E;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC,CAwClB"}
|
|
@@ -13,7 +13,25 @@ import colors from "tailwindcss/colors";
|
|
|
13
13
|
import { serverLogger } from "../../utils/index.js";
|
|
14
14
|
import { getErrorBySlug, IMPORT_RESOLUTION_ERROR, NETWORK_ERROR, VeryfrontError, } from "../../errors/index.js";
|
|
15
15
|
import { getTailwindPluginBundleUrl } from "../../build/binary-plugin-includes.js";
|
|
16
|
+
import { bareName, PACKAGE_SPEC_RE, TAILWIND_PLUGIN_ALLOWLIST, } from "./tailwind-plugin-allowlist.js";
|
|
16
17
|
const logger = serverLogger.component("tailwind");
|
|
18
|
+
/**
|
|
19
|
+
* Enforce the Tailwind plugin allowlist (VULN-FS-1).
|
|
20
|
+
*
|
|
21
|
+
* Called at the top of every entry point that can load third-party plugin
|
|
22
|
+
* code. Rejects anything that is not a syntactically valid npm package
|
|
23
|
+
* specifier, and anything whose bare name is not on the allowlist.
|
|
24
|
+
*/
|
|
25
|
+
function assertPluginAllowed(spec) {
|
|
26
|
+
if (!PACKAGE_SPEC_RE.test(spec)) {
|
|
27
|
+
throw new Error(`Invalid Tailwind plugin specifier: ${spec}`);
|
|
28
|
+
}
|
|
29
|
+
const name = bareName(spec);
|
|
30
|
+
if (!TAILWIND_PLUGIN_ALLOWLIST.has(name)) {
|
|
31
|
+
throw new Error(`Package "${name}" is not on the Tailwind plugin allowlist. ` +
|
|
32
|
+
`See src/html/styles-builder/tailwind-plugin-allowlist.ts.`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
17
35
|
// Provide localStorage shim for plugins that use util-deprecate (which checks localStorage)
|
|
18
36
|
// This prevents "LocalStorage is not supported in this context" errors in Deno.
|
|
19
37
|
try {
|
|
@@ -89,6 +107,7 @@ async function importBundledModule(code) {
|
|
|
89
107
|
* dynamic imports from URLs. Fetches bundled code, rewrites imports, loads via temp file.
|
|
90
108
|
*/
|
|
91
109
|
export async function loadModuleFromEsmSh(packageName) {
|
|
110
|
+
assertPluginAllowed(packageName);
|
|
92
111
|
const stubUrl = getTailwindPluginBundleUrl(packageName);
|
|
93
112
|
logger.debug("Fetching esm.sh stub", { url: stubUrl });
|
|
94
113
|
const stubResponse = await fetch(stubUrl);
|
|
@@ -133,6 +152,10 @@ export async function loadModuleFromEsmSh(packageName) {
|
|
|
133
152
|
return await importBundledModule(code);
|
|
134
153
|
}
|
|
135
154
|
export async function loadPlugin(id, pluginCache, pluginErrors) {
|
|
155
|
+
// Enforce the allowlist before consulting any caches so a disallowed id can
|
|
156
|
+
// never be served from a pre-seeded or stale cache entry — defence-in-depth
|
|
157
|
+
// against future changes that might pre-populate these maps.
|
|
158
|
+
assertPluginAllowed(id);
|
|
136
159
|
const cachedError = pluginErrors.get(id);
|
|
137
160
|
if (cachedError)
|
|
138
161
|
throw cachedError;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allowlist of Tailwind CSS plugin package names that may be dynamically loaded
|
|
3
|
+
* via `loadPlugin` / `loadModuleFromEsmSh`.
|
|
4
|
+
*
|
|
5
|
+
* Tailwind v4 stylesheets can request plugins through the `@plugin "..."`
|
|
6
|
+
* directive. Without restriction, this turns arbitrary project CSS into a
|
|
7
|
+
* remote-code-execution vector because the loader fetches and imports code
|
|
8
|
+
* from https://esm.sh. Only the packages listed here may be loaded.
|
|
9
|
+
*
|
|
10
|
+
* @module html/styles-builder/tailwind-plugin-allowlist
|
|
11
|
+
*/
|
|
12
|
+
export declare const TAILWIND_PLUGIN_ALLOWLIST: ReadonlySet<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Matches npm package specifiers, optionally scoped and optionally suffixed
|
|
15
|
+
* with an `@version` range. Deliberately restrictive: ASCII only, no path
|
|
16
|
+
* separators, no whitespace, no control characters.
|
|
17
|
+
*/
|
|
18
|
+
export declare const PACKAGE_SPEC_RE: RegExp;
|
|
19
|
+
/**
|
|
20
|
+
* Return the bare package name (without any `@version` suffix) for a spec.
|
|
21
|
+
*
|
|
22
|
+
* Examples:
|
|
23
|
+
* bareName("pkg") -> "pkg"
|
|
24
|
+
* bareName("pkg@1.0.0") -> "pkg"
|
|
25
|
+
* bareName("@scope/pkg") -> "@scope/pkg"
|
|
26
|
+
* bareName("@scope/pkg@1.0") -> "@scope/pkg"
|
|
27
|
+
*/
|
|
28
|
+
export declare function bareName(spec: string): string;
|
|
29
|
+
//# sourceMappingURL=tailwind-plugin-allowlist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-plugin-allowlist.d.ts","sourceRoot":"","sources":["../../../../src/src/html/styles-builder/tailwind-plugin-allowlist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,MAAM,CAaxD,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAA4D,CAAC;AAEzF;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO7C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allowlist of Tailwind CSS plugin package names that may be dynamically loaded
|
|
3
|
+
* via `loadPlugin` / `loadModuleFromEsmSh`.
|
|
4
|
+
*
|
|
5
|
+
* Tailwind v4 stylesheets can request plugins through the `@plugin "..."`
|
|
6
|
+
* directive. Without restriction, this turns arbitrary project CSS into a
|
|
7
|
+
* remote-code-execution vector because the loader fetches and imports code
|
|
8
|
+
* from https://esm.sh. Only the packages listed here may be loaded.
|
|
9
|
+
*
|
|
10
|
+
* @module html/styles-builder/tailwind-plugin-allowlist
|
|
11
|
+
*/
|
|
12
|
+
export const TAILWIND_PLUGIN_ALLOWLIST = new Set([
|
|
13
|
+
// Bundled into the compiled binary (see src/build/binary-plugin-includes.ts).
|
|
14
|
+
// Must stay in sync with BINARY_TAILWIND_PLUGIN_PACKAGES — an invariant
|
|
15
|
+
// enforced by tailwind-plugin-allowlist.test.ts.
|
|
16
|
+
"@tailwindcss/typography",
|
|
17
|
+
"@tailwindcss/forms",
|
|
18
|
+
"tailwindcss-animate",
|
|
19
|
+
"tailwind-scrollbar-hide",
|
|
20
|
+
"daisyui",
|
|
21
|
+
// Allowlisted but NOT bundled: loaded from esm.sh on first use. Adding an
|
|
22
|
+
// entry here is arbitrary-code-exec surface; review each one explicitly.
|
|
23
|
+
"@tailwindcss/aspect-ratio",
|
|
24
|
+
"@tailwindcss/container-queries",
|
|
25
|
+
]);
|
|
26
|
+
/**
|
|
27
|
+
* Matches npm package specifiers, optionally scoped and optionally suffixed
|
|
28
|
+
* with an `@version` range. Deliberately restrictive: ASCII only, no path
|
|
29
|
+
* separators, no whitespace, no control characters.
|
|
30
|
+
*/
|
|
31
|
+
export const PACKAGE_SPEC_RE = /^(?:@[a-z0-9][\w.-]*\/)?[a-z0-9][\w.-]*(?:@[\w.+-]+)?$/i;
|
|
32
|
+
/**
|
|
33
|
+
* Return the bare package name (without any `@version` suffix) for a spec.
|
|
34
|
+
*
|
|
35
|
+
* Examples:
|
|
36
|
+
* bareName("pkg") -> "pkg"
|
|
37
|
+
* bareName("pkg@1.0.0") -> "pkg"
|
|
38
|
+
* bareName("@scope/pkg") -> "@scope/pkg"
|
|
39
|
+
* bareName("@scope/pkg@1.0") -> "@scope/pkg"
|
|
40
|
+
*/
|
|
41
|
+
export function bareName(spec) {
|
|
42
|
+
if (spec.startsWith("@")) {
|
|
43
|
+
const idx = spec.indexOf("@", 1);
|
|
44
|
+
return idx === -1 ? spec : spec.slice(0, idx);
|
|
45
|
+
}
|
|
46
|
+
const idx = spec.indexOf("@");
|
|
47
|
+
return idx === -1 ? spec : spec.slice(0, idx);
|
|
48
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type TransformCapacityErrorMode = "plain" | "build";
|
|
2
|
+
export type ImportErrorClassification = {
|
|
3
|
+
type: "http-bundle-missing";
|
|
4
|
+
hash: string;
|
|
5
|
+
message: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: "module-not-found";
|
|
8
|
+
message: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: "unknown";
|
|
11
|
+
message: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function classifyImportError(importError: unknown): ImportErrorClassification;
|
|
14
|
+
export declare function createTransformCapacityError(mode: TransformCapacityErrorMode, message: string, filePath: string): Error;
|
|
15
|
+
//# sourceMappingURL=loader-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader-helpers.d.ts","sourceRoot":"","sources":["../../../../../src/src/modules/react-loader/ssr-module-loader/loader-helpers.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,0BAA0B,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,OAAO,GAAG,yBAAyB,CAUnF;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,0BAA0B,EAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,KAAK,CASP"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createError, toError } from "../../../errors/veryfront-error.js";
|
|
2
|
+
const MISSING_HTTP_BUNDLE_PATTERN = /veryfront-http-bundle\/http-([a-f0-9]+)\.mjs/;
|
|
3
|
+
export function classifyImportError(importError) {
|
|
4
|
+
const message = importError instanceof Error ? importError.message : String(importError);
|
|
5
|
+
const bundleMatch = message.match(MISSING_HTTP_BUNDLE_PATTERN);
|
|
6
|
+
if (bundleMatch?.[1]) {
|
|
7
|
+
return { type: "http-bundle-missing", hash: bundleMatch[1], message };
|
|
8
|
+
}
|
|
9
|
+
if (message.includes("Cannot find module") || message.includes("Module not found")) {
|
|
10
|
+
return { type: "module-not-found", message };
|
|
11
|
+
}
|
|
12
|
+
return { type: "unknown", message };
|
|
13
|
+
}
|
|
14
|
+
export function createTransformCapacityError(mode, message, filePath) {
|
|
15
|
+
if (mode === "plain")
|
|
16
|
+
return new Error(message);
|
|
17
|
+
return toError(createError({
|
|
18
|
+
type: "build",
|
|
19
|
+
message,
|
|
20
|
+
context: { file: filePath, phase: "transform" },
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
@@ -19,8 +19,6 @@ export declare class SSRModuleLoader {
|
|
|
19
19
|
private circuitBreaker;
|
|
20
20
|
private depValidator;
|
|
21
21
|
constructor(options: SSRModuleLoaderOptions);
|
|
22
|
-
private classifyImportError;
|
|
23
|
-
private createTransformCapacityError;
|
|
24
22
|
private withTransformCapacity;
|
|
25
23
|
private importModuleFromCacheEntry;
|
|
26
24
|
loadRawModule(filePath: string, source: string): Promise<Record<string, unknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/modules/react-loader/ssr-module-loader/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/modules/react-loader/ssr-module-loader/loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAsCpC,OAAO,KAAK,EAAoB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAkB3E;;;;;GAKG;AACH,qBAAa,eAAe;IAKd,OAAO,CAAC,OAAO;IAJ3B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,YAAY,CAAyB;gBAEzB,OAAO,EAAE,sBAAsB;YAWrC,qBAAqB;YAuCrB,0BAA0B;IAwHxC,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA+C7B,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAK1C,2BAA2B;IAYzC,OAAO,CAAC,yBAAyB;YAiBnB,2BAA2B;CA+V1C"}
|
|
@@ -16,6 +16,7 @@ import { rendererLogger } from "../../../utils/index.js";
|
|
|
16
16
|
import { withSpan } from "../../../observability/tracing/otlp-setup.js";
|
|
17
17
|
import { SpanNames } from "../../../observability/tracing/span-names.js";
|
|
18
18
|
import { extractComponent } from "../extract-component.js";
|
|
19
|
+
import { classifyImportError, createTransformCapacityError, } from "./loader-helpers.js";
|
|
19
20
|
import { getMaxConcurrentTransforms, IN_PROGRESS_WAIT_TIMEOUT_MS, MAX_TRANSFORM_DEPTH, TRANSFORM_ACQUIRE_TIMEOUT_MS, TRANSFORM_BATCH_SIZE, } from "./constants.js";
|
|
20
21
|
import { withTimeoutThrow } from "../../../rendering/utils/stream-utils.js";
|
|
21
22
|
import { getFromRedis, getTransformSemaphore, globalInProgress, globalModuleCache, isSSRDistributedCacheEnabled, releaseTransformSlot, setInRedis, tryAcquireTransformSlot, } from "./cache/index.js";
|
|
@@ -34,7 +35,6 @@ import { registerCSSImport } from "../css-import-collector.js";
|
|
|
34
35
|
import { injectNodePositions } from "../../../transforms/plugins/babel-node-positions.js";
|
|
35
36
|
import { ensureMdxModuleDependencies } from "../../../transforms/mdx/esm-module-loader/module-fetcher/dependency-recovery.js";
|
|
36
37
|
const logger = rendererLogger.component("ssr-module-loader");
|
|
37
|
-
const MISSING_HTTP_BUNDLE_PATTERN = /veryfront-http-bundle\/http-([a-f0-9]+)\.mjs/;
|
|
38
38
|
/**
|
|
39
39
|
* SSR Module Loader with Redis Support.
|
|
40
40
|
*
|
|
@@ -51,39 +51,19 @@ export class SSRModuleLoader {
|
|
|
51
51
|
this.cache = new SSRCacheManager(options);
|
|
52
52
|
this.depValidator = new SSRDependencyValidator((filePath) => this.cache.getCacheKey(filePath), (filePath, source, depth) => this.transformWithDependencies(filePath, source, depth), (crossImport) => this.transformCrossProjectImport(crossImport), options.adapter, options.projectDir);
|
|
53
53
|
}
|
|
54
|
-
classifyImportError(importError) {
|
|
55
|
-
const message = importError instanceof Error ? importError.message : String(importError);
|
|
56
|
-
const bundleMatch = message.match(MISSING_HTTP_BUNDLE_PATTERN);
|
|
57
|
-
if (bundleMatch?.[1]) {
|
|
58
|
-
return { type: "http-bundle-missing", hash: bundleMatch[1], message };
|
|
59
|
-
}
|
|
60
|
-
if (message.includes("Cannot find module") || message.includes("Module not found")) {
|
|
61
|
-
return { type: "module-not-found", message };
|
|
62
|
-
}
|
|
63
|
-
return { type: "unknown", message };
|
|
64
|
-
}
|
|
65
|
-
createTransformCapacityError(mode, message, filePath) {
|
|
66
|
-
if (mode === "plain")
|
|
67
|
-
return new Error(message);
|
|
68
|
-
return toError(createError({
|
|
69
|
-
type: "build",
|
|
70
|
-
message,
|
|
71
|
-
context: { file: filePath, phase: "transform" },
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
54
|
async withTransformCapacity(filePath, mode, operation) {
|
|
75
55
|
const useSemaphore = getMaxConcurrentTransforms() > 0;
|
|
76
56
|
const projectId = this.options.projectId;
|
|
77
57
|
const semaphore = useSemaphore ? getTransformSemaphore() : undefined;
|
|
78
58
|
let semaphoreAcquired = false;
|
|
79
59
|
if (!await tryAcquireTransformSlot(projectId, TRANSFORM_ACQUIRE_TIMEOUT_MS)) {
|
|
80
|
-
throw
|
|
60
|
+
throw createTransformCapacityError(mode, `Project ${projectId} at transform capacity. Consider reducing page complexity or request rate.`, filePath);
|
|
81
61
|
}
|
|
82
62
|
try {
|
|
83
63
|
if (semaphore) {
|
|
84
64
|
semaphoreAcquired = await semaphore.tryAcquire(TRANSFORM_ACQUIRE_TIMEOUT_MS);
|
|
85
65
|
if (!semaphoreAcquired) {
|
|
86
|
-
throw
|
|
66
|
+
throw createTransformCapacityError(mode, `Transform capacity exceeded (${semaphore.waiting} waiting). Service is overloaded.`, filePath);
|
|
87
67
|
}
|
|
88
68
|
}
|
|
89
69
|
return await operation();
|
|
@@ -115,7 +95,7 @@ export class SSRModuleLoader {
|
|
|
115
95
|
return (await withSpan(SpanNames.SSR_DYNAMIC_IMPORT, () => import(`file://${cacheEntry.tempPath}?v=${cacheEntry.contentHash}`), { "ssr.file": fileName }));
|
|
116
96
|
}
|
|
117
97
|
catch (importError) {
|
|
118
|
-
const classifiedError =
|
|
98
|
+
const classifiedError = classifyImportError(importError);
|
|
119
99
|
if (classifiedError.type === "http-bundle-missing") {
|
|
120
100
|
const hash = classifiedError.hash;
|
|
121
101
|
const cacheDir = getHttpBundleCacheDir();
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { VeryfrontAPIConfig } from "../../veryfront-api-client/types.js";
|
|
2
|
+
import type { FileCacheOptions } from "../cache/types.js";
|
|
3
|
+
import type { ContentSource, FSAdapterConfig } from "./types.js";
|
|
4
|
+
export declare const DEFAULT_MAX_RETRIES = 3;
|
|
5
|
+
export declare const DEFAULT_INITIAL_RETRY_DELAY_MS = 1000;
|
|
6
|
+
export declare const DEFAULT_MAX_RETRY_DELAY_MS = 10000;
|
|
7
|
+
export declare const DEFAULT_CACHE_TTL_MS = 60000;
|
|
8
|
+
export declare const DEFAULT_CACHE_MAX_ENTRIES = 1000;
|
|
9
|
+
export declare const DEFAULT_CACHE_MAX_MEMORY_BYTES: number;
|
|
10
|
+
type VeryfrontConfigOverrides = NonNullable<FSAdapterConfig["veryfront"]>;
|
|
11
|
+
type RetryOverrides = VeryfrontConfigOverrides["retry"];
|
|
12
|
+
type CacheOverrides = VeryfrontConfigOverrides["cache"];
|
|
13
|
+
export declare function buildRetryConfig(retry?: RetryOverrides): NonNullable<VeryfrontAPIConfig["retry"]>;
|
|
14
|
+
export declare function buildFileCacheOptions(cache?: CacheOverrides): FileCacheOptions;
|
|
15
|
+
export declare function shouldBackgroundPregenerateStyles(contentContext: {
|
|
16
|
+
sourceType: ContentSource["type"];
|
|
17
|
+
} | null): boolean;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=adapter-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-helpers.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,8BAA8B,OAAQ,CAAC;AACpD,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAC/C,eAAO,MAAM,8BAA8B,QAAoB,CAAC;AAEhE,KAAK,wBAAwB,GAAG,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;AAC1E,KAAK,cAAc,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;AACxD,KAAK,cAAc,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAExD,wBAAgB,gBAAgB,CAC9B,KAAK,CAAC,EAAE,cAAc,GACrB,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAO1C;AAED,wBAAgB,qBAAqB,CACnC,KAAK,CAAC,EAAE,cAAc,GACrB,gBAAgB,CAQlB;AAED,wBAAgB,iCAAiC,CAC/C,cAAc,EAAE;IAAE,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,GAC3D,OAAO,CAET"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const DEFAULT_MAX_RETRIES = 3;
|
|
2
|
+
export const DEFAULT_INITIAL_RETRY_DELAY_MS = 1_000;
|
|
3
|
+
export const DEFAULT_MAX_RETRY_DELAY_MS = 10_000;
|
|
4
|
+
export const DEFAULT_CACHE_TTL_MS = 60_000;
|
|
5
|
+
export const DEFAULT_CACHE_MAX_ENTRIES = 1_000;
|
|
6
|
+
export const DEFAULT_CACHE_MAX_MEMORY_BYTES = 100 * 1024 * 1024;
|
|
7
|
+
export function buildRetryConfig(retry) {
|
|
8
|
+
return {
|
|
9
|
+
maxRetries: DEFAULT_MAX_RETRIES,
|
|
10
|
+
initialDelay: DEFAULT_INITIAL_RETRY_DELAY_MS,
|
|
11
|
+
maxDelay: DEFAULT_MAX_RETRY_DELAY_MS,
|
|
12
|
+
...retry,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function buildFileCacheOptions(cache) {
|
|
16
|
+
return {
|
|
17
|
+
enabled: true,
|
|
18
|
+
ttl: DEFAULT_CACHE_TTL_MS,
|
|
19
|
+
maxSize: DEFAULT_CACHE_MAX_ENTRIES,
|
|
20
|
+
maxMemory: DEFAULT_CACHE_MAX_MEMORY_BYTES,
|
|
21
|
+
...cache,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function shouldBackgroundPregenerateStyles(contentContext) {
|
|
25
|
+
return contentContext?.sourceType !== "branch";
|
|
26
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EAEV,cAAc,EACd,SAAS,EACT,eAAe,EAEf,sBAAsB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,13 +10,8 @@ import { buildFileCacheKeyPrefix, buildFileListCacheKey } from "./cache-keys.js"
|
|
|
10
10
|
import { isPrefixBeingInvalidated } from "./invalidation-state.js";
|
|
11
11
|
import { WebSocketManager } from "./websocket-manager.js";
|
|
12
12
|
import { fetchFileListForContext, hasContentContextChanged, resolveContentContext, summarizeFileList, toClientContext, } from "./adapter-content-context.js";
|
|
13
|
+
import { buildFileCacheOptions, buildRetryConfig, shouldBackgroundPregenerateStyles, } from "./adapter-helpers.js";
|
|
13
14
|
const logger = baseLogger.component("veryfront-fs-adapter");
|
|
14
|
-
const DEFAULT_MAX_RETRIES = 3;
|
|
15
|
-
const DEFAULT_INITIAL_RETRY_DELAY_MS = 1_000;
|
|
16
|
-
const DEFAULT_MAX_RETRY_DELAY_MS = 10_000;
|
|
17
|
-
const DEFAULT_CACHE_TTL_MS = 60_000;
|
|
18
|
-
const DEFAULT_CACHE_MAX_ENTRIES = 1_000;
|
|
19
|
-
const DEFAULT_CACHE_MAX_MEMORY_BYTES = 100 * 1024 * 1024;
|
|
20
15
|
export class VeryfrontFSAdapter {
|
|
21
16
|
client;
|
|
22
17
|
cache;
|
|
@@ -85,12 +80,7 @@ export class VeryfrontFSAdapter {
|
|
|
85
80
|
this.projectSlug = vf.projectSlug ?? "";
|
|
86
81
|
this.contentSource = vf.contentSource ?? { type: "branch", branch: "main" };
|
|
87
82
|
this.proxyMode = vf.proxyMode ?? false;
|
|
88
|
-
const retryConfig =
|
|
89
|
-
maxRetries: DEFAULT_MAX_RETRIES,
|
|
90
|
-
initialDelay: DEFAULT_INITIAL_RETRY_DELAY_MS,
|
|
91
|
-
maxDelay: DEFAULT_MAX_RETRY_DELAY_MS,
|
|
92
|
-
...vf.retry,
|
|
93
|
-
};
|
|
83
|
+
const retryConfig = buildRetryConfig(vf.retry);
|
|
94
84
|
this.client = new VeryfrontApiClient({
|
|
95
85
|
apiBaseUrl: this.apiBaseUrl,
|
|
96
86
|
apiToken: this.apiToken,
|
|
@@ -99,13 +89,7 @@ export class VeryfrontFSAdapter {
|
|
|
99
89
|
proxyMode: vf.proxyMode,
|
|
100
90
|
retry: retryConfig,
|
|
101
91
|
});
|
|
102
|
-
const cacheConfig =
|
|
103
|
-
enabled: true,
|
|
104
|
-
ttl: DEFAULT_CACHE_TTL_MS,
|
|
105
|
-
maxSize: DEFAULT_CACHE_MAX_ENTRIES,
|
|
106
|
-
maxMemory: DEFAULT_CACHE_MAX_MEMORY_BYTES,
|
|
107
|
-
...vf.cache,
|
|
108
|
-
};
|
|
92
|
+
const cacheConfig = buildFileCacheOptions(vf.cache);
|
|
109
93
|
this.cache = new FileCache(cacheConfig);
|
|
110
94
|
this.normalizer = new PathNormalizer(config.projectDir);
|
|
111
95
|
const contentContextGetter = {
|
|
@@ -283,7 +267,7 @@ export class VeryfrontFSAdapter {
|
|
|
283
267
|
// Branch previews should recover the last registered stylesheet artifact on
|
|
284
268
|
// cold starts before rebuilding CSS locally. Live edit pokes still
|
|
285
269
|
// pregenerate through the WebSocket path after branch content changes.
|
|
286
|
-
return this.contentContext
|
|
270
|
+
return shouldBackgroundPregenerateStyles(this.contentContext);
|
|
287
271
|
}
|
|
288
272
|
scheduleFileListWarmup(reason, cacheKey) {
|
|
289
273
|
if (!this.initialized || !this.contentContext)
|
|
@@ -31,6 +31,7 @@ interface BuildReadFetchStateOptions {
|
|
|
31
31
|
export declare function assertProjectSourcePath(normalizedPath: string): void;
|
|
32
32
|
export declare function buildReadFetchState(options: BuildReadFetchStateOptions): ReadFetchState;
|
|
33
33
|
export declare function getResolvedCacheKey(cacheKeyPrefix: string, normalizedResolvedPath: string): string;
|
|
34
|
+
export declare function buildContentPreview(content: string, max?: number): string;
|
|
34
35
|
export declare function buildExtensionCandidatePaths(basePath: string): string[];
|
|
35
36
|
export declare function splitKnownFileExtension(apiPath: string): {
|
|
36
37
|
originalExtension: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-operations-helpers.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/read-operations-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,iCAAiC,EAAE,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,UAAU,uBAAuB;IAC/B,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,4BAA4B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,yBAAyB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,0BAA0B;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC9C,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/C;AAED,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAOpE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,cAAc,CA2BvF;AAED,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,MAAM,EACtB,sBAAsB,EAAE,MAAM,GAC7B,MAAM,CAER;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvE;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GACd;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASxD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG3D;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAEvE"}
|
|
1
|
+
{"version":3,"file":"read-operations-helpers.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/read-operations-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,iCAAiC,EAAE,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,UAAU,uBAAuB;IAC/B,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,4BAA4B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,yBAAyB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D;AAED,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,0BAA0B;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC9C,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/C;AAED,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAOpE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,cAAc,CA2BvF;AAED,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,MAAM,EACtB,sBAAsB,EAAE,MAAM,GAC7B,MAAM,CAER;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAErE;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvE;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,GACd;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASxD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG3D;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAEvE"}
|
|
@@ -40,6 +40,9 @@ export function buildReadFetchState(options) {
|
|
|
40
40
|
export function getResolvedCacheKey(cacheKeyPrefix, normalizedResolvedPath) {
|
|
41
41
|
return `${cacheKeyPrefix}:${normalizedResolvedPath}`;
|
|
42
42
|
}
|
|
43
|
+
export function buildContentPreview(content, max = 80) {
|
|
44
|
+
return content.length > max ? `${content.slice(0, max)}...` : content;
|
|
45
|
+
}
|
|
43
46
|
export function buildExtensionCandidatePaths(basePath) {
|
|
44
47
|
return READ_OPERATION_EXTENSION_PRIORITY.map((ext) => `${basePath}${ext}`);
|
|
45
48
|
}
|