@tdk-landscape/tdk-cli-core 1.3.14 → 1.3.22
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 +3 -3
- package/Tiltfile +144 -0
- package/discovery/AGENTS.md +362 -0
- package/discovery/TILT_DISCOVERY.star +424 -0
- package/discovery/Tiltfile +58 -0
- package/discovery/config.star +258 -0
- package/discovery/constants.star +127 -0
- package/discovery/deterministic.star +211 -0
- package/discovery/discovery_daemon.star +191 -0
- package/discovery/discovery_orchestrator.star +460 -0
- package/discovery/filtering.star +5 -0
- package/discovery/identity-management-backend/service.yaml +26 -0
- package/discovery/identity-management-frontend/service.yaml +29 -0
- package/discovery/identity-sdk/service.yaml +9 -0
- package/discovery/incremental_discovery.star +213 -0
- package/discovery/indexing.star +7 -0
- package/discovery/json_manifest_scanner.star +51 -0
- package/discovery/libraries.star +46 -0
- package/discovery/loading.star +23 -0
- package/discovery/manifest/constants.star +104 -0
- package/discovery/manifest/loading.star +386 -0
- package/discovery/manifest/normalize.star +281 -0
- package/discovery/manifest/validation.star +108 -0
- package/discovery/normalization.star +11 -0
- package/discovery/registry.star +544 -0
- package/discovery/resource_snapshot.py +382 -0
- package/discovery/resource_snapshot.star +143 -0
- package/discovery/schemas.star +1 -0
- package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
- package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
- package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
- package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
- package/discovery/test_resource_snapshot.py +251 -0
- package/discovery/validation.star +78 -0
- package/discovery/versioning.star +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +36 -41
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/resource.d.ts.map +1 -1
- package/dist/commands/resource.js +51 -55
- package/dist/commands/resource.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +22 -24
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +1 -2
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +1 -2
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/upgrade.d.ts +8 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +62 -21
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/generator/extension-fetch.d.ts +19 -0
- package/dist/generator/extension-fetch.d.ts.map +1 -1
- package/dist/generator/extension-fetch.js +71 -5
- package/dist/generator/extension-fetch.js.map +1 -1
- package/dist/generator/template-engine.d.ts +1 -0
- package/dist/generator/template-engine.d.ts.map +1 -1
- package/dist/generator/template-engine.js +50 -6
- package/dist/generator/template-engine.js.map +1 -1
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +7 -9
- package/dist/utils/command-helpers.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +1 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +6 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/paths.js +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/project-features.d.ts.map +1 -1
- package/dist/utils/project-features.js +1 -1
- package/dist/utils/project-features.js.map +1 -1
- package/dist/utils/resource-features.d.ts.map +1 -1
- package/dist/utils/resource-features.js +2 -2
- package/dist/utils/resource-features.js.map +1 -1
- package/dist/utils/tar.js +4 -4
- package/dist/utils/tar.js.map +1 -1
- package/dist/utils/validation.d.ts +7 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +9 -0
- package/dist/utils/validation.js.map +1 -1
- package/engine/AGENTS.md +705 -0
- package/engine/README.md +29 -0
- package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
- package/engine/Tiltfile +80 -0
- package/engine/assets/docker/golden-layers.Dockerfile +221 -0
- package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
- package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
- package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
- package/engine/config.star +3 -0
- package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
- package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
- package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
- package/engine/docs/C4-ARCHITECTURE.md +17 -0
- package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
- package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
- package/engine/docs/README.md +284 -0
- package/engine/entrypoint.star +97 -0
- package/engine/lifecycle/orchestrator.star +260 -0
- package/engine/paths.star +717 -0
- package/engine/schemas/manifest-schema.json +301 -0
- package/engine/schemas/service-schema.json +301 -0
- package/engine/scripts/README.md +89 -0
- package/engine/scripts/build-and-publish-lib.sh +205 -0
- package/engine/scripts/check-lib-publish.sh +85 -0
- package/engine/scripts/debug-container.sh +258 -0
- package/engine/scripts/generate-manifest.sh +197 -0
- package/engine/spec.master +702 -0
- package/engine/spec.master.example +341 -0
- package/engine/topologies/README.md +34 -0
- package/engine/topologies/platform/docker/AGENTS.md +59 -0
- package/engine/topologies/platform/docker/auth/auth.star +167 -0
- package/engine/topologies/platform/docker/build/golden_image.star +37 -0
- package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
- package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
- package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
- package/engine/topologies/platform/docker/compose/compose.star +636 -0
- package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
- package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
- package/engine/topologies/platform/docker/config/bunignore.star +142 -0
- package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
- package/engine/topologies/platform/docker/constants.star +170 -0
- package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
- package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
- package/engine/topologies/platform/docker/index.star +27 -0
- package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
- package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
- package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
- package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
- package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
- package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
- package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
- package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
- package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
- package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
- package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
- package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
- package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
- package/engine/topologies/platform/docker/networking/traefik.star +232 -0
- package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
- package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
- package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
- package/engine/topologies/platform/net/proxy.star +4 -0
- package/engine/topologies/platform/registries/local.star +4 -0
- package/engine/topologies/platform/security/secrets.star +239 -0
- package/engine/topologies/platform/state/relational.star +4 -0
- package/engine/topologies/tilt/common/AGENTS.md +59 -0
- package/engine/topologies/tilt/common/utils.star +364 -0
- package/engine/topologies/tilt/common/utils_debug.star +69 -0
- package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
- package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
- package/engine/topologies/tilt/common/utils_env.star +43 -0
- package/engine/topologies/tilt/common/utils_output.star +97 -0
- package/engine/topologies/tilt/config/AGENTS.md +68 -0
- package/engine/topologies/tilt/config/defaults.star +3 -0
- package/engine/topologies/tilt/config/feature_flags.star +10 -0
- package/engine/topologies/tilt/config/global.star +55 -0
- package/engine/topologies/tilt/config/profiles.star +382 -0
- package/engine/topologies/tilt/generators/agents_md.star +62 -0
- package/engine/topologies/tilt/generators/api_gateway.star +145 -0
- package/engine/topologies/tilt/generators/index.star +124 -0
- package/engine/topologies/tilt/generators/infisical/README.md +424 -0
- package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
- package/engine/topologies/tilt/generators/infisical/index.star +57 -0
- package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
- package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
- package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
- package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
- package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
- package/engine/topologies/tilt/generators/npmrc.star +111 -0
- package/engine/topologies/tilt/generators/tsconfig.star +23 -0
- package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
- package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
- package/engine/topologies/tilt/generators/typescript/common.star +7 -0
- package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
- package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
- package/engine/topologies/tilt/generators/typescript/include.star +23 -0
- package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
- package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
- package/engine/topologies/tilt/generators/validators.star +853 -0
- package/engine/topologies/tilt/generators/vite/backend.star +78 -0
- package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
- package/engine/topologies/tilt/generators/vite/generators.star +43 -0
- package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
- package/engine/topologies/tilt/generators/vite/library.star +65 -0
- package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
- package/engine/topologies/tilt/generators/vite/templates.star +737 -0
- package/engine/topologies/tilt/generators/vite_config.star +22 -0
- package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
- package/engine/topologies/tilt/manifest/README.md +693 -0
- package/engine/topologies/tilt/manifest/__init__.star +218 -0
- package/engine/topologies/tilt/manifest/constants.star +252 -0
- package/engine/topologies/tilt/manifest/errors.star +266 -0
- package/engine/topologies/tilt/manifest/integration.star +339 -0
- package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
- package/engine/topologies/tilt/manifest/loader.star +214 -0
- package/engine/topologies/tilt/manifest/mapper.star +227 -0
- package/engine/topologies/tilt/manifest/parser.star +400 -0
- package/engine/topologies/tilt/manifest/schema.star +462 -0
- package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
- package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
- package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
- package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
- package/engine/topologies/tilt/manifest/validator.star +717 -0
- package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
- package/engine/topologies/tilt/resources/AGENTS.md +71 -0
- package/engine/topologies/tilt/resources/conditions.star +3 -0
- package/engine/topologies/tilt/resources/databases.star +244 -0
- package/engine/topologies/tilt/resources/declaration.star +3 -0
- package/engine/topologies/tilt/resources/deps.star +3 -0
- package/engine/topologies/tilt/resources/infra-loader.star +437 -0
- package/engine/topologies/tilt/resources/libs.star +30 -0
- package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
- package/engine/topologies/tilt/resources/libs_paths.star +79 -0
- package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
- package/engine/topologies/tilt/resources/libs_setup.star +164 -0
- package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
- package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
- package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
- package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
- package/engine/topologies/tilt/resources/orchestrator.star +54 -0
- package/engine/topologies/tilt/resources/ordering.star +3 -0
- package/engine/topologies/tilt/resources/triggers.star +3 -0
- package/engine/topologies/tilt/resources/watchers.star +299 -0
- package/engine/where-things-live.star +717 -0
- package/ext/Tiltfile +66 -0
- package/ext/ide-components/README.md +219 -0
- package/ext/ide-components/code_executor/server.py +268 -0
- package/ext/ide-components/code_viewer/server.py +206 -0
- package/ext/ide-components/config_inspector/server.py +1050 -0
- package/ext/ide-components/file_browser/server.py +285 -0
- package/ext/ide-components/shared/config_service.py +469 -0
- package/ext/ide-components/shared/file_utils.py +298 -0
- package/ext/ide-components/shared/http_utils.py +232 -0
- package/ext/ide-components/shared/static/styles.css +1334 -0
- package/ext/ide-components/shared/syntax_highlighter.py +140 -0
- package/ext/ide-components/shared/template_engine.py +123 -0
- package/ext/ide-components/shared/templates/base.html +121 -0
- package/ext/ide-components/shared/test_config_service.py +326 -0
- package/ext/ide-components/shared/tilt_integration.py +158 -0
- package/ext/ui-enhancements/cron-status-server.sh +49 -0
- package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
- package/ext/ui-enhancements/extension.yaml +36 -0
- package/ext/ui-enhancements/tiltfile.py +99 -0
- package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
- package/ext/ui-enhancements/ui/help-panel.css +279 -0
- package/ext/ui-enhancements/ui/icons.css +125 -0
- package/ext/ui-enhancements/ui/tooltips.css +114 -0
- package/package.json +13 -9
- package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
- package/specs/specs/TILT_TECH_STACK.star +159 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Syntax highlighting utilities using Pygments
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
# Try to import pygments
|
|
10
|
+
try:
|
|
11
|
+
from pygments import highlight
|
|
12
|
+
from pygments.lexers import get_lexer_by_name, guess_lexer_for_filename, TextLexer
|
|
13
|
+
from pygments.formatters import HtmlFormatter
|
|
14
|
+
PYGMENTS_AVAILABLE = True
|
|
15
|
+
except ImportError:
|
|
16
|
+
PYGMENTS_AVAILABLE = False
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SyntaxHighlighter:
|
|
20
|
+
"""Syntax highlighting using Pygments (if available) or fallback"""
|
|
21
|
+
|
|
22
|
+
@staticmethod
|
|
23
|
+
def highlight_code(code: str, language: str = None, filename: str = None) -> str:
|
|
24
|
+
"""
|
|
25
|
+
Highlight code and return HTML
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
code: Source code to highlight
|
|
29
|
+
language: Language name (optional)
|
|
30
|
+
filename: Filename for guessing language (optional)
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
HTML string with highlighted code
|
|
34
|
+
"""
|
|
35
|
+
if not PYGMENTS_AVAILABLE:
|
|
36
|
+
return SyntaxHighlighter._fallback_highlight(code)
|
|
37
|
+
|
|
38
|
+
try:
|
|
39
|
+
# Try to get lexer by language name
|
|
40
|
+
if language:
|
|
41
|
+
try:
|
|
42
|
+
lexer = get_lexer_by_name(language)
|
|
43
|
+
except (ValueError, TypeError):
|
|
44
|
+
lexer = None
|
|
45
|
+
else:
|
|
46
|
+
lexer = None
|
|
47
|
+
|
|
48
|
+
# Try to guess from filename
|
|
49
|
+
if not lexer and filename:
|
|
50
|
+
try:
|
|
51
|
+
lexer = guess_lexer_for_filename(filename, code)
|
|
52
|
+
except (ValueError, TypeError):
|
|
53
|
+
lexer = None
|
|
54
|
+
|
|
55
|
+
# Default to text lexer
|
|
56
|
+
if not lexer:
|
|
57
|
+
lexer = TextLexer()
|
|
58
|
+
|
|
59
|
+
# Create formatter with custom CSS class
|
|
60
|
+
formatter = HtmlFormatter(
|
|
61
|
+
cssclass='syntax-highlighted',
|
|
62
|
+
style='monokai',
|
|
63
|
+
linenos=False,
|
|
64
|
+
wrapcode=True
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return highlight(code, lexer, formatter)
|
|
68
|
+
|
|
69
|
+
except Exception as e:
|
|
70
|
+
return SyntaxHighlighter._fallback_highlight(code)
|
|
71
|
+
|
|
72
|
+
@staticmethod
|
|
73
|
+
def _fallback_highlight(code: str) -> str:
|
|
74
|
+
"""Simple fallback when Pygments is not available"""
|
|
75
|
+
import html
|
|
76
|
+
|
|
77
|
+
# Escape HTML
|
|
78
|
+
escaped = html.escape(code)
|
|
79
|
+
|
|
80
|
+
# Wrap in pre/code
|
|
81
|
+
return f'<pre class="syntax-highlighted"><code>{escaped}</code></pre>'
|
|
82
|
+
|
|
83
|
+
@staticmethod
|
|
84
|
+
def get_styles() -> str:
|
|
85
|
+
"""Get CSS styles for syntax highlighting"""
|
|
86
|
+
if not PYGMENTS_AVAILABLE:
|
|
87
|
+
return ''
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
from pygments.formatters import HtmlFormatter
|
|
91
|
+
formatter = HtmlFormatter(style='monokai')
|
|
92
|
+
return formatter.get_style_defs('.syntax-highlighted')
|
|
93
|
+
except (ImportError, AttributeError):
|
|
94
|
+
return ''
|
|
95
|
+
|
|
96
|
+
@staticmethod
|
|
97
|
+
def get_language_from_ext(ext: str) -> str:
|
|
98
|
+
"""Map file extension to Pygments language name"""
|
|
99
|
+
mapping = {
|
|
100
|
+
'.py': 'python',
|
|
101
|
+
'.js': 'javascript',
|
|
102
|
+
'.ts': 'typescript',
|
|
103
|
+
'.tsx': 'typescript',
|
|
104
|
+
'.jsx': 'javascript',
|
|
105
|
+
'.json': 'json',
|
|
106
|
+
'.yaml': 'yaml',
|
|
107
|
+
'.yml': 'yaml',
|
|
108
|
+
'.md': 'markdown',
|
|
109
|
+
'.sh': 'bash',
|
|
110
|
+
'.bash': 'bash',
|
|
111
|
+
'.star': 'python', # Starlark is Python-like
|
|
112
|
+
'.go': 'go',
|
|
113
|
+
'.rs': 'rust',
|
|
114
|
+
'.java': 'java',
|
|
115
|
+
'.sql': 'sql',
|
|
116
|
+
'.css': 'css',
|
|
117
|
+
'.scss': 'scss',
|
|
118
|
+
'.html': 'html',
|
|
119
|
+
'.xml': 'xml',
|
|
120
|
+
'.dockerfile': 'docker',
|
|
121
|
+
'.prisma': 'sql', # Close enough
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return mapping.get(ext.lower(), 'text')
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
if __name__ == '__main__':
|
|
128
|
+
print(f"Pygments available: {PYGMENTS_AVAILABLE}")
|
|
129
|
+
|
|
130
|
+
# Test
|
|
131
|
+
test_code = '''
|
|
132
|
+
def hello_world():
|
|
133
|
+
"""Say hello"""
|
|
134
|
+
print("Hello, World!")
|
|
135
|
+
return True
|
|
136
|
+
'''
|
|
137
|
+
|
|
138
|
+
result = SyntaxHighlighter.highlight_code(test_code, language='python')
|
|
139
|
+
print("\nHighlighted code:")
|
|
140
|
+
print(result[:500])
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Simple template engine for IDE components
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import re
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TemplateEngine:
|
|
11
|
+
"""Simple template engine with variable substitution"""
|
|
12
|
+
|
|
13
|
+
@staticmethod
|
|
14
|
+
def render(template: str, **kwargs) -> str:
|
|
15
|
+
"""
|
|
16
|
+
Render a template with variable substitution
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
template: Template string with {variable} placeholders
|
|
20
|
+
**kwargs: Variables to substitute
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Rendered string
|
|
24
|
+
"""
|
|
25
|
+
result = template
|
|
26
|
+
for key, value in kwargs.items():
|
|
27
|
+
placeholder = '{' + key + '}'
|
|
28
|
+
result = result.replace(placeholder, str(value))
|
|
29
|
+
return result
|
|
30
|
+
|
|
31
|
+
@staticmethod
|
|
32
|
+
def render_file(template_path: Path, **kwargs) -> str:
|
|
33
|
+
"""
|
|
34
|
+
Load template from file and render
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
template_path: Path to template file
|
|
38
|
+
**kwargs: Variables to substitute
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
Rendered string
|
|
42
|
+
"""
|
|
43
|
+
try:
|
|
44
|
+
with open(template_path, 'r', encoding='utf-8') as f:
|
|
45
|
+
template = f.read()
|
|
46
|
+
return TemplateEngine.render(template, **kwargs)
|
|
47
|
+
except Exception as e:
|
|
48
|
+
return f"<!-- Template error: {e} -->"
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def render_conditional(template: str, conditions: dict) -> str:
|
|
52
|
+
"""
|
|
53
|
+
Render template with conditional blocks
|
|
54
|
+
|
|
55
|
+
Syntax:
|
|
56
|
+
{{if condition}}content{{endif}}
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
template: Template with conditionals
|
|
60
|
+
conditions: Dict of condition names to boolean values
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Rendered string with conditionals evaluated
|
|
64
|
+
"""
|
|
65
|
+
result = template
|
|
66
|
+
|
|
67
|
+
# Process each condition
|
|
68
|
+
for condition_name, condition_value in conditions.items():
|
|
69
|
+
pattern = rf'{{{{if {condition_name}}}}(.*?){{{{endif}}}}'
|
|
70
|
+
|
|
71
|
+
if condition_value:
|
|
72
|
+
# Keep content, remove tags
|
|
73
|
+
result = re.sub(pattern, r'\1', result, flags=re.DOTALL)
|
|
74
|
+
else:
|
|
75
|
+
# Remove entire block
|
|
76
|
+
result = re.sub(pattern, '', result, flags=re.DOTALL)
|
|
77
|
+
|
|
78
|
+
return result
|
|
79
|
+
|
|
80
|
+
@staticmethod
|
|
81
|
+
def render_loop(template: str, items: list, item_template: str) -> str:
|
|
82
|
+
"""
|
|
83
|
+
Render template with a loop
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
template: Main template with {items} placeholder
|
|
87
|
+
items: List of dicts with item data
|
|
88
|
+
item_template: Template for each item
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
Rendered string
|
|
92
|
+
"""
|
|
93
|
+
rendered_items = []
|
|
94
|
+
for item in items:
|
|
95
|
+
rendered = TemplateEngine.render(item_template, **item)
|
|
96
|
+
rendered_items.append(rendered)
|
|
97
|
+
|
|
98
|
+
return template.replace('{items}', ''.join(rendered_items))
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
if __name__ == '__main__':
|
|
102
|
+
# Test basic rendering
|
|
103
|
+
template = "Hello, {name}! Welcome to {place}."
|
|
104
|
+
result = TemplateEngine.render(template, name="World", place="Tilt IDE")
|
|
105
|
+
print(f"Basic: {result}")
|
|
106
|
+
|
|
107
|
+
# Test conditionals
|
|
108
|
+
conditional_template = "{{if show_greeting}}Hello!{{endif}} {{if show_name}}{name}{{endif}}"
|
|
109
|
+
result = TemplateEngine.render_conditional(
|
|
110
|
+
conditional_template,
|
|
111
|
+
{'show_greeting': True, 'show_name': False}
|
|
112
|
+
)
|
|
113
|
+
print(f"Conditional: {result}")
|
|
114
|
+
|
|
115
|
+
# Test loop
|
|
116
|
+
loop_template = "<ul>{items}</ul>"
|
|
117
|
+
item_template = "<li>{name}: {value}</li>"
|
|
118
|
+
items = [
|
|
119
|
+
{'name': 'File Browser', 'value': 'Port 9765'},
|
|
120
|
+
{'name': 'Code Viewer', 'value': 'Port 9766'},
|
|
121
|
+
]
|
|
122
|
+
result = TemplateEngine.render_loop(loop_template, items, item_template)
|
|
123
|
+
print(f"Loop: {result}")
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>{title} - TDK Tilt IDE</title>
|
|
7
|
+
<link rel="stylesheet" href="/static/styles.css">
|
|
8
|
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>{favicon}</text></svg>">
|
|
9
|
+
<script>
|
|
10
|
+
// Theme initialization - runs before page renders to prevent flash
|
|
11
|
+
(function() {{
|
|
12
|
+
const savedTheme = localStorage.getItem('tilt-ide-theme');
|
|
13
|
+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
14
|
+
const theme = savedTheme || (prefersDark ? 'dark' : 'light');
|
|
15
|
+
if (theme === 'light') {{
|
|
16
|
+
document.documentElement.setAttribute('data-theme', 'light');
|
|
17
|
+
}}
|
|
18
|
+
}})();
|
|
19
|
+
|
|
20
|
+
// Handle unavailable IDE services
|
|
21
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
22
|
+
const links = [
|
|
23
|
+
{ id: 'filesLink', name: 'File Browser', port: 9765 },
|
|
24
|
+
{ id: 'viewerLink', name: 'Code Viewer', port: 9766 },
|
|
25
|
+
{ id: 'terminalLink', name: 'Terminal', port: 9768 }
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
links.forEach(function(link) {
|
|
29
|
+
const el = document.getElementById(link.id);
|
|
30
|
+
if (!el) return;
|
|
31
|
+
|
|
32
|
+
const isAvailable = el.getAttribute('data-available') === 'true';
|
|
33
|
+
|
|
34
|
+
if (!isAvailable) {
|
|
35
|
+
el.style.opacity = '0.5';
|
|
36
|
+
el.style.cursor = 'not-allowed';
|
|
37
|
+
el.title = link.name + ' not running (port ' + link.port + ')';
|
|
38
|
+
|
|
39
|
+
el.addEventListener('click', function(e) {
|
|
40
|
+
e.preventDefault();
|
|
41
|
+
showServiceUnavailable(link.name, link.port);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
function showServiceUnavailable(name, port) {
|
|
48
|
+
const existing = document.querySelector('.notification-toast');
|
|
49
|
+
if (existing) existing.remove();
|
|
50
|
+
|
|
51
|
+
const toast = document.createElement('div');
|
|
52
|
+
toast.className = 'notification-toast warning';
|
|
53
|
+
toast.innerHTML = '<strong>' + name + ' not running</strong><br>Start it with: <code>tilt up ' + name.toLowerCase().replace(' ', '-') + '</code> (port ' + port + ')';
|
|
54
|
+
document.body.appendChild(toast);
|
|
55
|
+
|
|
56
|
+
setTimeout(() => toast.classList.add('show'), 10);
|
|
57
|
+
setTimeout(() => {
|
|
58
|
+
toast.classList.remove('show');
|
|
59
|
+
setTimeout(() => toast.remove(), 300);
|
|
60
|
+
}, 4000);
|
|
61
|
+
}
|
|
62
|
+
</script>
|
|
63
|
+
</head>
|
|
64
|
+
<body>
|
|
65
|
+
<header class="header">
|
|
66
|
+
<button class="mobile-menu-toggle" id="mobileMenuToggle" aria-label="Toggle menu">
|
|
67
|
+
☰
|
|
68
|
+
</button>
|
|
69
|
+
<h1>
|
|
70
|
+
<span class="header-icon">{icon}</span>
|
|
71
|
+
{title}
|
|
72
|
+
</h1>
|
|
73
|
+
<nav class="nav">
|
|
74
|
+
<a href="http://localhost:9765" class="{active_browser}" id="filesLink" data-available="{files_available}">📁 Files</a>
|
|
75
|
+
<a href="http://localhost:9766" class="{active_viewer}" id="viewerLink" data-available="{viewer_available}">👁️ Code</a>
|
|
76
|
+
<a href="http://localhost:9767" class="{active_inspector}">⚙️ Configs</a>
|
|
77
|
+
<a href="http://localhost:9768" class="{active_terminal}" id="terminalLink" data-available="{terminal_available}">💻 Terminal</a>
|
|
78
|
+
</nav>
|
|
79
|
+
<button class="theme-toggle" id="themeToggle" title="Toggle theme">
|
|
80
|
+
🌓
|
|
81
|
+
</button>
|
|
82
|
+
{controls}
|
|
83
|
+
</header>
|
|
84
|
+
|
|
85
|
+
<div class="container" id="mainContainer">
|
|
86
|
+
{sidebar}
|
|
87
|
+
<main class="content">
|
|
88
|
+
{content}
|
|
89
|
+
</main>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<script>
|
|
93
|
+
// Theme toggle functionality
|
|
94
|
+
(function() {{
|
|
95
|
+
const themeToggle = document.getElementById('themeToggle');
|
|
96
|
+
if (themeToggle) {{
|
|
97
|
+
themeToggle.addEventListener('click', function() {{
|
|
98
|
+
const currentTheme = document.documentElement.getAttribute('data-theme');
|
|
99
|
+
const newTheme = currentTheme === 'light' ? 'dark' : 'light';
|
|
100
|
+
if (newTheme === 'light') {{
|
|
101
|
+
document.documentElement.setAttribute('data-theme', 'light');
|
|
102
|
+
}} else {{
|
|
103
|
+
document.documentElement.removeAttribute('data-theme');
|
|
104
|
+
}}
|
|
105
|
+
localStorage.setItem('tilt-ide-theme', newTheme);
|
|
106
|
+
}});
|
|
107
|
+
}}
|
|
108
|
+
|
|
109
|
+
// Mobile menu toggle
|
|
110
|
+
const mobileMenuToggle = document.getElementById('mobileMenuToggle');
|
|
111
|
+
const container = document.getElementById('mainContainer');
|
|
112
|
+
if (mobileMenuToggle && container) {{
|
|
113
|
+
mobileMenuToggle.addEventListener('click', function() {{
|
|
114
|
+
container.classList.toggle('sidebar-open');
|
|
115
|
+
}});
|
|
116
|
+
}}
|
|
117
|
+
}})();
|
|
118
|
+
</script>
|
|
119
|
+
{scripts}
|
|
120
|
+
</body>
|
|
121
|
+
</html>
|