pulse-framework 0.1.47__tar.gz → 0.1.49__tar.gz
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.
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/PKG-INFO +1 -1
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/pyproject.toml +1 -1
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/app.py +4 -1
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/processes.py +1 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/helpers.py +11 -19
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/proxy.py +21 -8
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/imports.py +7 -2
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/README.md +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/channel.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/cmd.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/dependencies.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/folder_lock.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/helpers.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/models.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/packages.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/secrets.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cli/uvicorn_log_config.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/codegen/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/codegen/codegen.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/codegen/js.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/codegen/templates/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/codegen/templates/layout.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/codegen/templates/route.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/codegen/templates/routes_ts.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/codegen/utils.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/components/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/components/for_.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/components/if_.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/components/react_router.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/context.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/cookies.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/decorators.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/env.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/form.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/hooks/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/hooks/core.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/hooks/effects.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/hooks/init.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/hooks/runtime.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/hooks/setup.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/hooks/stable.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/hooks/states.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/html/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/html/elements.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/html/events.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/html/props.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/html/svg.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/html/tags.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/html/tags.pyi +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/__init__.pyi +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/_types.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/array.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/console.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/date.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/document.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/error.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/json.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/map.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/math.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/navigator.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/number.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/object.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/promise.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/regexp.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/set.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/string.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/weakmap.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/weakset.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/js/window.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/messages.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/middleware.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/plugin.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/py.typed +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/client.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/common.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/effect.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/infinite_query.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/mutation.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/protocol.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/query.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/queries/store.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/react_component.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/reactive.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/reactive_extensions.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/render_session.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/renderer.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/request.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/routing.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/serializer.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/state.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/builtins.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/constants.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/context.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/errors.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/function.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/ids.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/js_module.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/modules/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/modules/asyncio.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/modules/json.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/modules/math.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/modules/re.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/modules/tags.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/modules/typing.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/nodes.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/py_module.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/transpiler.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/transpiler/utils.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/types/__init__.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/types/event_handler.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/user_session.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/vdom.py +0 -0
- {pulse_framework-0.1.47 → pulse_framework-0.1.49}/src/pulse/version.py +0 -0
|
@@ -576,7 +576,10 @@ class App:
|
|
|
576
576
|
+ "Use 'pulse run' CLI command or set the environment variable."
|
|
577
577
|
)
|
|
578
578
|
|
|
579
|
-
proxy_handler = ReactProxy(
|
|
579
|
+
proxy_handler = ReactProxy(
|
|
580
|
+
react_server_address=react_server_address,
|
|
581
|
+
server_address=server_address,
|
|
582
|
+
)
|
|
580
583
|
|
|
581
584
|
@self.fastapi.api_route(
|
|
582
585
|
"/{path:path}",
|
|
@@ -257,6 +257,7 @@ def _write_tagged_line(name: str, message: str, colors: Mapping[str, str]) -> No
|
|
|
257
257
|
if (
|
|
258
258
|
"Network: use --host to expose" in clean_message
|
|
259
259
|
or "press h + enter to show help" in clean_message
|
|
260
|
+
or "➜ Local:" in clean_message
|
|
260
261
|
):
|
|
261
262
|
return
|
|
262
263
|
|
|
@@ -364,11 +364,11 @@ def get_client_address(request: Request) -> str | None:
|
|
|
364
364
|
"""Best-effort client origin/address from an HTTP request.
|
|
365
365
|
|
|
366
366
|
Preference order:
|
|
367
|
-
1) Origin (full scheme://host:port)
|
|
368
|
-
1b) Referer (full URL) when Origin missing
|
|
367
|
+
1) Origin header (full scheme://host:port)
|
|
368
|
+
1b) Referer header (full URL) when Origin missing
|
|
369
369
|
2) Forwarded header (proto + for)
|
|
370
370
|
3) X-Forwarded-* headers
|
|
371
|
-
4)
|
|
371
|
+
4) Host header (server address the client connected to)
|
|
372
372
|
"""
|
|
373
373
|
try:
|
|
374
374
|
origin = request.headers.get("origin")
|
|
@@ -402,14 +402,10 @@ def get_client_address(request: Request) -> str | None:
|
|
|
402
402
|
host = "localhost"
|
|
403
403
|
return f"{proto}://{host}:{xfp}" if xfp else f"{proto}://{host}"
|
|
404
404
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
if
|
|
408
|
-
|
|
409
|
-
if host and port:
|
|
410
|
-
return f"{proto}://{host}:{port}"
|
|
411
|
-
if host:
|
|
412
|
-
return f"{proto}://{host}"
|
|
405
|
+
# Fallback: use Host header which contains the server address the client connected to
|
|
406
|
+
host_header = request.headers.get("host")
|
|
407
|
+
if host_header:
|
|
408
|
+
return f"{proto}://{host_header}"
|
|
413
409
|
return None
|
|
414
410
|
except Exception:
|
|
415
411
|
return None
|
|
@@ -447,14 +443,10 @@ def get_client_address_socketio(environ: dict[str, Any]) -> str | None:
|
|
|
447
443
|
host = "localhost"
|
|
448
444
|
return f"{proto}://{host}:{xfp}" if xfp else f"{proto}://{host}"
|
|
449
445
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
if
|
|
453
|
-
|
|
454
|
-
if host and port:
|
|
455
|
-
return f"{proto}://{host}:{port}"
|
|
456
|
-
if host:
|
|
457
|
-
return f"{proto}://{host}"
|
|
446
|
+
# Fallback: use HTTP_HOST which contains the server address the client connected to
|
|
447
|
+
host_header = environ.get("HTTP_HOST")
|
|
448
|
+
if host_header:
|
|
449
|
+
return f"{proto}://{host_header}"
|
|
458
450
|
return None
|
|
459
451
|
except Exception:
|
|
460
452
|
return None
|
|
@@ -21,19 +21,32 @@ logger = logging.getLogger(__name__)
|
|
|
21
21
|
class ReactProxy:
|
|
22
22
|
"""
|
|
23
23
|
Handles proxying HTTP requests and WebSocket connections to React Router server.
|
|
24
|
+
|
|
25
|
+
In single-server mode, the Python server proxies unmatched routes to the React
|
|
26
|
+
dev server. This proxy rewrites URLs in responses to use the external server
|
|
27
|
+
address instead of the internal React server address.
|
|
24
28
|
"""
|
|
25
29
|
|
|
26
30
|
react_server_address: str
|
|
31
|
+
server_address: str
|
|
27
32
|
_client: httpx.AsyncClient | None
|
|
28
33
|
|
|
29
|
-
def __init__(self, react_server_address: str):
|
|
34
|
+
def __init__(self, react_server_address: str, server_address: str):
|
|
30
35
|
"""
|
|
31
36
|
Args:
|
|
32
|
-
react_server_address: React Router server
|
|
37
|
+
react_server_address: Internal React Router server URL (e.g., http://localhost:5173)
|
|
38
|
+
server_address: External server URL exposed to clients (e.g., http://localhost:8000)
|
|
33
39
|
"""
|
|
34
40
|
self.react_server_address = react_server_address
|
|
41
|
+
self.server_address = server_address
|
|
35
42
|
self._client = None
|
|
36
43
|
|
|
44
|
+
def rewrite_url(self, url: str) -> str:
|
|
45
|
+
"""Rewrite internal React server URLs to external server address."""
|
|
46
|
+
if self.react_server_address in url:
|
|
47
|
+
return url.replace(self.react_server_address, self.server_address)
|
|
48
|
+
return url
|
|
49
|
+
|
|
37
50
|
@property
|
|
38
51
|
def client(self) -> httpx.AsyncClient:
|
|
39
52
|
"""Lazy initialization of HTTP client."""
|
|
@@ -190,12 +203,12 @@ class ReactProxy:
|
|
|
190
203
|
# Send request with streaming
|
|
191
204
|
r = await self.client.send(req, stream=True)
|
|
192
205
|
|
|
193
|
-
#
|
|
194
|
-
response_headers = {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
206
|
+
# Rewrite headers that may contain internal React server URLs
|
|
207
|
+
response_headers: dict[str, str] = {}
|
|
208
|
+
for k, v in r.headers.items():
|
|
209
|
+
if k.lower() in ("location", "content-location"):
|
|
210
|
+
v = self.rewrite_url(v)
|
|
211
|
+
response_headers[k] = v
|
|
199
212
|
|
|
200
213
|
return StreamingResponse(
|
|
201
214
|
r.aiter_raw(),
|
|
@@ -293,6 +293,7 @@ class CssImport(Import):
|
|
|
293
293
|
- Absolute path (e.g., "/path/to/styles.css")
|
|
294
294
|
module: If True, import as a CSS module (default export for class access).
|
|
295
295
|
If False, import for side effects only (global styles).
|
|
296
|
+
Automatically set to True if path ends with ".module.css".
|
|
296
297
|
relative: If True, resolve path relative to the caller's file.
|
|
297
298
|
before: List of import sources that should come after this import.
|
|
298
299
|
|
|
@@ -300,8 +301,8 @@ class CssImport(Import):
|
|
|
300
301
|
# Side-effect CSS import (global styles)
|
|
301
302
|
CssImport("@mantine/core/styles.css")
|
|
302
303
|
|
|
303
|
-
# CSS module for class access
|
|
304
|
-
styles = CssImport("./styles.module.css",
|
|
304
|
+
# CSS module for class access (module=True auto-detected from .module.css)
|
|
305
|
+
styles = CssImport("./styles.module.css", relative=True)
|
|
305
306
|
styles.container # Returns JSMember for 'container' class
|
|
306
307
|
|
|
307
308
|
# Local CSS file (will be copied during codegen)
|
|
@@ -316,6 +317,10 @@ class CssImport(Import):
|
|
|
316
317
|
relative: bool = False,
|
|
317
318
|
before: Sequence[str] = (),
|
|
318
319
|
) -> None:
|
|
320
|
+
# Auto-detect CSS modules based on filename
|
|
321
|
+
if path.endswith(".module.css"):
|
|
322
|
+
module = True
|
|
323
|
+
|
|
319
324
|
source_path: Path | None = None
|
|
320
325
|
import_src = path
|
|
321
326
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|