recce-nightly 0.61.0.20250413__py3-none-any.whl → 0.61.0.20250415__py3-none-any.whl
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.
Potentially problematic release.
This version of recce-nightly might be problematic. Click here for more details.
- recce/VERSION +1 -1
- recce/adapter/dbt_adapter/__init__.py +66 -10
- recce/cli.py +18 -10
- recce/data/404.html +1 -1
- recce/data/_next/static/-FZ7AfDqKYJ7K1mEhSe5l/_buildManifest.js +1 -0
- recce/data/_next/static/chunks/{38610ee6-24a85e2dfb424ddb.js → 1f229bf6-d9fe92e56db8d93b.js} +1 -1
- recce/data/_next/static/chunks/{29e3cc0d-6e3b0cf904a6874d.js → 29e3cc0d-8c150e37dff9631b.js} +1 -1
- recce/data/_next/static/chunks/36e1c10d-bb0210cbd6573a8d.js +1 -0
- recce/data/_next/static/chunks/{3998a672-63fc54b2b517ee2b.js → 3998a672-eaad84bdd88cc73e.js} +1 -1
- recce/data/_next/static/chunks/{450c323b-b36e745822edebe2.js → 450c323b-1bb5db526e54435a.js} +1 -1
- recce/data/_next/static/chunks/{47d8844f-0516cea2ef568380.js → 47d8844f-79a1b53c66a7d7ec.js} +1 -1
- recce/data/_next/static/chunks/500-e51c92a025a51234.js +65 -0
- recce/data/_next/static/chunks/6dc81886-c94b9b91bc2c3caf.js +1 -0
- recce/data/_next/static/chunks/700-3b65fc3666820d00.js +2 -0
- recce/data/_next/static/chunks/{7a8a3e83-dd26fafa0a7421e5.js → 7a8a3e83-d7fa409d97b38b2b.js} +1 -1
- recce/data/_next/static/chunks/{7f27ae6c-4ddea120696db611.js → 7f27ae6c-413f6b869a04183a.js} +1 -1
- recce/data/_next/static/chunks/9746af58-d74bef4d03eea6ab.js +1 -0
- recce/data/_next/static/chunks/{a30376cd-1ad5a3f522da896c.js → a30376cd-7d806e1602f2dc3a.js} +1 -1
- recce/data/_next/static/chunks/app/_not-found/page-8a886fa0855c3105.js +1 -0
- recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +1 -0
- recce/data/_next/static/chunks/app/page-635a088390dcb7ac.js +1 -0
- recce/data/_next/static/chunks/{b63b1b3f-fe714039749c1250.js → b63b1b3f-7395c74e11a14e95.js} +1 -1
- recce/data/_next/static/chunks/c132bf7d-8102037f9ccf372a.js +1 -0
- recce/data/_next/static/chunks/{c1ceaa8b-64142a5184f1b8b2.js → c1ceaa8b-a1e442154d23515e.js} +1 -1
- recce/data/_next/static/chunks/{cd9f8d63-543677b0ef49da87.js → cd9f8d63-cf0d5a7b0f7a92e8.js} +3 -3
- recce/data/_next/static/chunks/ce84277d-f42c2c58049cea2d.js +1 -0
- recce/data/_next/static/chunks/e24bf851-0f8cbc99656833e7.js +1 -0
- recce/data/_next/static/chunks/fee69bc6-f17d36c080742e74.js +1 -0
- recce/data/_next/static/chunks/main-a0859f1f36d0aa6c.js +1 -0
- recce/data/_next/static/chunks/main-app-0225a2255968e566.js +1 -0
- recce/data/_next/static/chunks/pages/_app-d5672bf3d8b6371b.js +1 -0
- recce/data/_next/static/chunks/pages/_error-ed75be3f25588548.js +1 -0
- recce/data/_next/static/chunks/{webpack-8a8709fe9d22c323.js → webpack-567d72f0bc0820d5.js} +1 -1
- recce/data/index.html +2 -2
- recce/data/index.txt +5 -5
- recce/models/types.py +10 -2
- recce/server.py +40 -1
- recce/state.py +6 -8
- recce/util/breaking.py +32 -35
- recce/util/recce_cloud.py +2 -0
- {recce_nightly-0.61.0.20250413.dist-info → recce_nightly-0.61.0.20250415.dist-info}/METADATA +1 -1
- {recce_nightly-0.61.0.20250413.dist-info → recce_nightly-0.61.0.20250415.dist-info}/RECORD +48 -48
- tests/test_core.py +1 -1
- recce/data/_next/static/chunks/269-83bbdbcbd0cc1ddb.js +0 -65
- recce/data/_next/static/chunks/36e1c10d-800596efe83e74a6.js +0 -1
- recce/data/_next/static/chunks/6dc81886-9871b611a22bd997.js +0 -1
- recce/data/_next/static/chunks/783-784ce10322400a48.js +0 -2
- recce/data/_next/static/chunks/9746af58-527fd8cbd2d17eee.js +0 -1
- recce/data/_next/static/chunks/app/_not-found/page-76f691066176b63a.js +0 -1
- recce/data/_next/static/chunks/app/layout-fdacc83a3bf974a3.js +0 -1
- recce/data/_next/static/chunks/app/page-35403e208468490c.js +0 -1
- recce/data/_next/static/chunks/c132bf7d-4cb4c4a123e27340.js +0 -1
- recce/data/_next/static/chunks/ce84277d-4bca7695ec1ada94.js +0 -1
- recce/data/_next/static/chunks/e24bf851-5db5db8459b0b291.js +0 -1
- recce/data/_next/static/chunks/fee69bc6-1df8306af9d11293.js +0 -1
- recce/data/_next/static/chunks/main-7183c49fe89a1f9b.js +0 -1
- recce/data/_next/static/chunks/main-app-cfd795a5fe58bf37.js +0 -1
- recce/data/_next/static/chunks/pages/_app-9f1049bbd7b90455.js +0 -1
- recce/data/_next/static/chunks/pages/_error-71ed60313c005df1.js +0 -1
- recce/data/_next/static/hD8g5-RYxHasL_ZuMPw1A/_buildManifest.js +0 -1
- /recce/data/_next/static/{hD8g5-RYxHasL_ZuMPw1A → -FZ7AfDqKYJ7K1mEhSe5l}/_ssgManifest.js +0 -0
- {recce_nightly-0.61.0.20250413.dist-info → recce_nightly-0.61.0.20250415.dist-info}/WHEEL +0 -0
- {recce_nightly-0.61.0.20250413.dist-info → recce_nightly-0.61.0.20250415.dist-info}/entry_points.txt +0 -0
- {recce_nightly-0.61.0.20250413.dist-info → recce_nightly-0.61.0.20250415.dist-info}/licenses/LICENSE +0 -0
- {recce_nightly-0.61.0.20250413.dist-info → recce_nightly-0.61.0.20250415.dist-info}/top_level.txt +0 -0
recce/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.61.0.
|
|
1
|
+
0.61.0.20250415
|
|
@@ -13,8 +13,9 @@ from typing import Callable, Dict, List, Optional, Tuple, Iterator, Any, Set, Un
|
|
|
13
13
|
from recce.event import log_performance
|
|
14
14
|
from recce.exceptions import RecceException
|
|
15
15
|
from recce.util.cll import cll, CLLPerformanceTracking
|
|
16
|
-
from ...tasks.profile import ProfileTask
|
|
17
16
|
from recce.util.lineage import find_upstream, find_downstream
|
|
17
|
+
from ...tasks.profile import ProfileTask
|
|
18
|
+
from ...util.breaking import parse_change_category
|
|
18
19
|
|
|
19
20
|
try:
|
|
20
21
|
import agate
|
|
@@ -31,7 +32,7 @@ from recce.adapter.base import BaseAdapter
|
|
|
31
32
|
from recce.state import ArtifactsRoot
|
|
32
33
|
from .dbt_version import DbtVersion
|
|
33
34
|
from ...models import RunType
|
|
34
|
-
from ...models.types import LineageDiff, NodeDiff
|
|
35
|
+
from ...models.types import LineageDiff, NodeDiff, NodeChange
|
|
35
36
|
from ...tasks import Task, QueryTask, QueryBaseTask, QueryDiffTask, ValueDiffTask, ValueDiffDetailTask, ProfileDiffTask, \
|
|
36
37
|
RowCountTask, RowCountDiffTask, TopKDiffTask, HistogramDiffTask
|
|
37
38
|
|
|
@@ -740,6 +741,26 @@ class DbtAdapter(BaseAdapter):
|
|
|
740
741
|
*base.get('nodes', {}).keys(),
|
|
741
742
|
*current.get('nodes', {}).keys()
|
|
742
743
|
}
|
|
744
|
+
base_manifest = as_manifest(self.get_manifest(True))
|
|
745
|
+
curr_manifest = as_manifest(self.get_manifest(False))
|
|
746
|
+
|
|
747
|
+
def ref_func(*args):
|
|
748
|
+
if len(args) == 1:
|
|
749
|
+
node = args[0]
|
|
750
|
+
elif len(args) > 1:
|
|
751
|
+
node = args[1]
|
|
752
|
+
else:
|
|
753
|
+
return None
|
|
754
|
+
return node
|
|
755
|
+
|
|
756
|
+
def source_func(source_name, table_name):
|
|
757
|
+
source_name = source_name.replace('-', '_')
|
|
758
|
+
return f"__{source_name}__{table_name}"
|
|
759
|
+
|
|
760
|
+
jinja_context = dict(
|
|
761
|
+
ref=ref_func,
|
|
762
|
+
source=source_func,
|
|
763
|
+
)
|
|
743
764
|
|
|
744
765
|
# for each node, compare the base and current lineage
|
|
745
766
|
diff = {}
|
|
@@ -752,19 +773,54 @@ class DbtAdapter(BaseAdapter):
|
|
|
752
773
|
if base_checksum is None or curr_checksum is None or base_checksum == curr_checksum:
|
|
753
774
|
continue
|
|
754
775
|
|
|
755
|
-
change_category = 'breaking'
|
|
756
776
|
if curr_node.get('resource_type') == 'model':
|
|
757
777
|
try:
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
778
|
+
def _get_schema(lineage):
|
|
779
|
+
schema = {}
|
|
780
|
+
nodes = lineage['nodes']
|
|
781
|
+
parent_list = lineage['parent_map'].get(key, [])
|
|
782
|
+
for parent_id in parent_list:
|
|
783
|
+
parent_node = nodes.get(parent_id)
|
|
784
|
+
if parent_node is None:
|
|
785
|
+
continue
|
|
786
|
+
columns = parent_node.get('columns') or {}
|
|
787
|
+
name = parent_node.get('name')
|
|
788
|
+
if parent_node.get('resource_type') == 'source':
|
|
789
|
+
parts = parent_id.split('.')
|
|
790
|
+
source = parts[2]
|
|
791
|
+
table = parts[3]
|
|
792
|
+
source = source.replace('-', '_')
|
|
793
|
+
name = f"__{source}__{table}"
|
|
794
|
+
schema[name] = {
|
|
795
|
+
name: column.get('type') for name, column in columns.items()
|
|
796
|
+
}
|
|
797
|
+
return schema
|
|
798
|
+
|
|
799
|
+
base_sql = self.generate_sql(
|
|
800
|
+
base_node.get('raw_code'),
|
|
801
|
+
context=jinja_context,
|
|
802
|
+
provided_manifest=base_manifest
|
|
803
|
+
)
|
|
804
|
+
curr_sql = self.generate_sql(
|
|
805
|
+
curr_node.get('raw_code'),
|
|
806
|
+
context=jinja_context,
|
|
807
|
+
provided_manifest=curr_manifest
|
|
808
|
+
)
|
|
809
|
+
base_schema = _get_schema(base)
|
|
810
|
+
curr_schema = _get_schema(current)
|
|
761
811
|
dialect = self.adapter.connections.TYPE
|
|
762
|
-
|
|
763
|
-
|
|
812
|
+
|
|
813
|
+
change = parse_change_category(
|
|
814
|
+
base_sql,
|
|
815
|
+
curr_sql,
|
|
816
|
+
old_schema=base_schema,
|
|
817
|
+
new_schema=curr_schema,
|
|
818
|
+
dialect=dialect
|
|
819
|
+
)
|
|
764
820
|
except Exception:
|
|
765
|
-
|
|
821
|
+
change = NodeChange(category='unknown')
|
|
766
822
|
|
|
767
|
-
diff[key] = NodeDiff(change_status='modified',
|
|
823
|
+
diff[key] = NodeDiff(change_status='modified', change=change)
|
|
768
824
|
elif base_node:
|
|
769
825
|
diff[key] = NodeDiff(change_status='removed')
|
|
770
826
|
elif curr_node:
|
recce/cli.py
CHANGED
|
@@ -201,6 +201,8 @@ def diff(sql, primary_keys: List[str] = None, keep_shape: bool = False, keep_equ
|
|
|
201
201
|
@click.option('--host', default='localhost', show_default=True, help='The host to bind to.')
|
|
202
202
|
@click.option('--port', default=8000, show_default=True, help='The port to bind to.', type=int)
|
|
203
203
|
@click.option('--review', is_flag=True, help='Open the state file in the review mode.')
|
|
204
|
+
@click.option('--api-token', help='The token used by Recce Cloud API.', type=click.STRING,
|
|
205
|
+
envvar='RECCE_API_TOKEN')
|
|
204
206
|
@add_options(dbt_related_options)
|
|
205
207
|
@add_options(sqlmesh_related_options)
|
|
206
208
|
@add_options(recce_options)
|
|
@@ -257,6 +259,10 @@ def server(host, port, state_file=None, **kwargs):
|
|
|
257
259
|
cloud_onboarding_state = get_recce_cloud_onboarding_state(kwargs.get('cloud_token'))
|
|
258
260
|
flag['show_onboarding_guide'] = False if cloud_onboarding_state == 'completed' else True
|
|
259
261
|
|
|
262
|
+
auth_options = {}
|
|
263
|
+
api_token = kwargs.get('api_token') if kwargs.get('api_token') else get_recce_api_token()
|
|
264
|
+
auth_options['api_token'] = api_token
|
|
265
|
+
|
|
260
266
|
# Check Single Environment Onboarding Mode if the review mode is False
|
|
261
267
|
if not os.path.isdir(kwargs.get('target_base_path')) and is_review is False:
|
|
262
268
|
# Mark as single env onboarding mode if user provides the target-path only
|
|
@@ -293,7 +299,7 @@ def server(host, port, state_file=None, **kwargs):
|
|
|
293
299
|
console.print(f"[[red]Error[/red]] {message}")
|
|
294
300
|
exit(1)
|
|
295
301
|
|
|
296
|
-
state = AppState(state_loader=state_loader, kwargs=kwargs, flag=flag)
|
|
302
|
+
state = AppState(state_loader=state_loader, kwargs=kwargs, flag=flag, auth_options=auth_options)
|
|
297
303
|
app.state = state
|
|
298
304
|
|
|
299
305
|
uvicorn.run(app, host=host, port=port, lifespan='on')
|
|
@@ -763,15 +769,12 @@ def share(state_file, **kwargs):
|
|
|
763
769
|
"""
|
|
764
770
|
from rich.console import Console
|
|
765
771
|
|
|
766
|
-
handle_debug_flag(**kwargs)
|
|
767
|
-
cloud_options = {
|
|
768
|
-
'api_token': kwargs.get('api_token'),
|
|
769
|
-
}
|
|
770
|
-
|
|
771
772
|
console = Console()
|
|
773
|
+
handle_debug_flag(**kwargs)
|
|
774
|
+
cloud_options = None
|
|
772
775
|
|
|
773
776
|
# read or input the api token
|
|
774
|
-
api_token =
|
|
777
|
+
api_token = kwargs.get('api_token') if kwargs.get('api_token') else get_recce_api_token()
|
|
775
778
|
if api_token is None:
|
|
776
779
|
console.print("Please login Recce Cloud and copy the API token from the setting page.\n"
|
|
777
780
|
f"{RECCE_CLOUD_API_HOST}/settings#tokens\n"
|
|
@@ -779,7 +782,7 @@ def share(state_file, **kwargs):
|
|
|
779
782
|
api_token = click.prompt('Your Recce API token', type=str, hide_input=True, show_default=False)
|
|
780
783
|
update_user_profile({'api_token': api_token})
|
|
781
784
|
|
|
782
|
-
|
|
785
|
+
auth_options = {'api_token': api_token}
|
|
783
786
|
|
|
784
787
|
# load local state
|
|
785
788
|
state_loader = create_state_loader(review_mode=True, cloud_mode=False, state_file=state_file,
|
|
@@ -792,7 +795,7 @@ def share(state_file, **kwargs):
|
|
|
792
795
|
exit(1)
|
|
793
796
|
|
|
794
797
|
# check if state exists in cloud
|
|
795
|
-
state_manager = RecceShareStateManager(
|
|
798
|
+
state_manager = RecceShareStateManager(auth_options)
|
|
796
799
|
if not state_manager.verify():
|
|
797
800
|
error, hint = state_manager.error_and_hint
|
|
798
801
|
console.print(f"[[red]Error[/red]] {error}")
|
|
@@ -803,7 +806,12 @@ def share(state_file, **kwargs):
|
|
|
803
806
|
state_file_name = os.path.basename(state_file)
|
|
804
807
|
|
|
805
808
|
try:
|
|
806
|
-
|
|
809
|
+
response = state_manager.share_state(state_file_name, state_loader.state)
|
|
810
|
+
if response.get('status') == 'error':
|
|
811
|
+
console.print("[[red]Error[/red]] Failed to share the state.\n"
|
|
812
|
+
f"Reason: {response.get('message')}")
|
|
813
|
+
else:
|
|
814
|
+
console.print(f"Shared Link: {response.get('share_url')}")
|
|
807
815
|
except RecceCloudException as e:
|
|
808
816
|
console.print(f"[[red]Error[/red]] {e}")
|
|
809
817
|
console.print(f"Reason: {e.reason}")
|
recce/data/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-567d72f0bc0820d5.js"/><script src="/_next/static/chunks/1f229bf6-d9fe92e56db8d93b.js" async=""></script><script src="/_next/static/chunks/700-3b65fc3666820d00.js" async=""></script><script src="/_next/static/chunks/main-app-0225a2255968e566.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-567d72f0bc0820d5.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[37194,[],\"\"]\n3:I[79137,[],\"\"]\n4:I[63846,[],\"\"]\na:I[67160,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"-FZ7AfDqKYJ7K1mEhSe5l\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L2\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$5\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$6\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$7\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$8\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$L9\"],\"globalErrorComponent\":\"$a\",\"missingSlots\":\"$Wb\"}]\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}]]\n2:null\n"])</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-ed75be3f25588548.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|