Exact script:
python - <<'PY'
from pathlib import Path
for p in Path('frontend/src').rglob('*'):
if p.suffix not in ('.ts','.vue'): continue
s=p.read_text()
if '@/helpers/fetcher' not in s: continue
# Old factory mocks have no consumers left.
if p.name in ('auth.renewToken.test.ts','auth.refreshUserInfo.test.ts','auth.linkShare.test.ts','base.test.ts'):
a=s.index('function fakeHttp()');b=s.index('\n}\n',a)+3;s=s[:a]+s[b:]
a=s.index("vi.mock('@/helpers/fetcher'");b=s.index('\n}))',a)+4;s=s[:a]+s[b:]
elif p.name in ('App.test.ts','General.test.ts'):
a=s.index("vi.mock('@/helpers/fetcher'");b=s.index('\n})',a)+3;s=s[:a]+s[b:]
elif p.name=='auth.test.ts':
s=s.replace("\n\tgetApiBaseUrl: () => '/api/v1/',",'').replace('\n\tHTTPFactory: () => ({post}),','')
s=s.replace('@/helpers/fetcher','@/helpers/apiUrl').replace('getApiV2BaseUrl','getApiBaseUrl')
s=s.replace('getApiBaseUrl, getApiBaseUrl','getApiBaseUrl')
p.write_text(s)
PY
Replace MigrationConfig with MigrationCredentialsBodyWritable and change the import from the deleted migration service to @/client/generated. No field or behavior changes.
Reproduce from repository root:
python3 - <<'PY'
from pathlib import Path
import re
p=Path('frontend/src/views/admin/UsersView.vue');s=p.read_text()
for old,new in [('isAdmin','is_admin'),('authProvider','auth_provider'),('skipEmailConfirm','skip_email_confirm')]:
for root in ['u.','u?.','detailTarget.','detailTarget.value.','editable.','createForm.','body.','target.']:
s=s.replace(root+old,root+new)
s=re.sub(r'\b'+old+r'(?=:)',new,s)
p.write_text(s)
p=Path('frontend/src/views/admin/OverviewView.vue');s=p.read_text()
for old,new in [('linkShares','link_shares'),('teamShares','team_shares'),('userShares','user_shares'),('expiresAt','expires_at'),('validatedAt','validated_at'),('lastCheckFailed','last_check_failed'),('instanceId','instance_id')]:
s=re.sub(r'\b'+old+r'\b',new,s)
p.write_text(s)
PY
Reproduce from repository root:
python3 - <<'PY'
from pathlib import Path
p=Path('frontend/src/components/misc/WebhookManager.vue');s=p.read_text()
for old,new in [('targetUrl','target_url'),('basicAuthUser','basic_auth_user'),('basicAuthPassword','basic_auth_password'),('createdBy','created_by')]:
for root in ['newWebhook.value.','newWebhook.','w.']:
s=s.replace(root+old,root+new)
p.write_text(s)
PY
Reproduce from repository root:
python3 - <<'PY'
from pathlib import Path
paths=[Path('frontend/src/components/token/ApiTokenForm.vue'), *Path('frontend/src/views/user/settings').glob('*.vue')]
for p in paths:
s=p.read_text()
if "@/modelTypes/IApiToken" not in s: continue
s=s.replace("import type {IApiToken} from '@/modelTypes/IApiToken'", "import type {ApiToken as IApiToken} from '@/client/generated'")
s=s.replace("import type {IApiToken, IApiPermission} from '@/modelTypes/IApiToken'", "import type {ApiToken as IApiToken} from '@/client/generated'\ntype IApiPermission = NonNullable<IApiToken['permissions']>")
s=s.replace("@/modelTypes/IApiTokenSettings", "@/helpers/apiToken")
for root in ['tk', 'token', 'newToken.value']:
s=s.replace(root+'.expiresAt',root+'.expires_at')
s=s.replace('(newToken.value as IApiToken & {ownerId: number}).ownerId', '(newToken.value as IApiToken & {owner_id: number}).owner_id')
p.write_text(s)
p=Path('frontend/src/views/user/settings/Mcp.test.ts');p.write_text(p.read_text().replace('@/modelTypes/IApiTokenSettings','@/helpers/apiToken'))
PY