@igstack/app-catalog-backend-core 0.3.1-alpha-20260403020019 → 0.3.1-alpha-20260405015231

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.
Files changed (83) hide show
  1. package/dist/db/syncAppCatalog.d.mts +11 -1
  2. package/dist/db/syncAppCatalog.d.mts.map +1 -1
  3. package/dist/db/syncAppCatalog.mjs +54 -2
  4. package/dist/db/syncAppCatalog.mjs.map +1 -1
  5. package/dist/db/tableSyncMagazine.d.mts +18 -0
  6. package/dist/db/tableSyncMagazine.d.mts.map +1 -1
  7. package/dist/db/tableSyncMagazine.mjs +18 -0
  8. package/dist/db/tableSyncMagazine.mjs.map +1 -1
  9. package/dist/generated/prisma/client.mjs.map +1 -1
  10. package/dist/generated/prisma/commonInputTypes.d.mts +50 -50
  11. package/dist/generated/prisma/commonInputTypes.d.mts.map +1 -1
  12. package/dist/generated/prisma/enums.d.mts +2 -0
  13. package/dist/generated/prisma/enums.d.mts.map +1 -1
  14. package/dist/generated/prisma/internal/class.d.mts +48 -0
  15. package/dist/generated/prisma/internal/class.d.mts.map +1 -1
  16. package/dist/generated/prisma/internal/class.mjs +4 -4
  17. package/dist/generated/prisma/internal/class.mjs.map +1 -1
  18. package/dist/generated/prisma/internal/prismaNamespace.d.mts +362 -12
  19. package/dist/generated/prisma/internal/prismaNamespace.d.mts.map +1 -1
  20. package/dist/generated/prisma/models/DbAppForCatalog.d.mts +198 -3
  21. package/dist/generated/prisma/models/DbAppForCatalog.d.mts.map +1 -1
  22. package/dist/generated/prisma/models/DbAsset.d.mts +2 -8
  23. package/dist/generated/prisma/models/DbAsset.d.mts.map +1 -1
  24. package/dist/generated/prisma/models/DbGroup.d.mts +1124 -0
  25. package/dist/generated/prisma/models/DbGroup.d.mts.map +1 -0
  26. package/dist/generated/prisma/models/DbGroupMembership.d.mts +1199 -0
  27. package/dist/generated/prisma/models/DbGroupMembership.d.mts.map +1 -0
  28. package/dist/generated/prisma/models/DbPerson.d.mts +1155 -0
  29. package/dist/generated/prisma/models/DbPerson.d.mts.map +1 -0
  30. package/dist/generated/prisma/models/DbSubResource.d.mts +1468 -0
  31. package/dist/generated/prisma/models/DbSubResource.d.mts.map +1 -0
  32. package/dist/generated/prisma/models/SourceReference.d.mts +1 -1
  33. package/dist/generated/prisma/models.d.mts +6 -2
  34. package/dist/index.d.mts +5 -3
  35. package/dist/middleware/featureRegistry.mjs +5 -1
  36. package/dist/middleware/featureRegistry.mjs.map +1 -1
  37. package/dist/modules/appCatalog/checkLinks.d.mts.map +1 -1
  38. package/dist/modules/appCatalog/checkLinks.mjs +31 -2
  39. package/dist/modules/appCatalog/checkLinks.mjs.map +1 -1
  40. package/dist/modules/appCatalog/service.mjs +52 -5
  41. package/dist/modules/appCatalog/service.mjs.map +1 -1
  42. package/dist/modules/auth/registerAuthRoutes.mjs +5 -1
  43. package/dist/modules/auth/registerAuthRoutes.mjs.map +1 -1
  44. package/dist/modules/lighthouseKeeper/tools.d.mts +1 -1
  45. package/dist/modules/lighthouseKeeper/tools.mjs +1 -1
  46. package/dist/modules/lighthouseKeeper/tools.mjs.map +1 -1
  47. package/dist/types/common/appCatalogTypes.d.mts +19 -1
  48. package/dist/types/common/appCatalogTypes.d.mts.map +1 -1
  49. package/dist/types/common/approvalMethodTypes.d.mts +52 -36
  50. package/dist/types/common/approvalMethodTypes.d.mts.map +1 -1
  51. package/dist/types/common/personGroupTypes.d.mts +22 -0
  52. package/dist/types/common/personGroupTypes.d.mts.map +1 -0
  53. package/dist/types/common/subResourceTypes.d.mts +24 -0
  54. package/dist/types/common/subResourceTypes.d.mts.map +1 -0
  55. package/package.json +3 -3
  56. package/prisma/schema.prisma +59 -0
  57. package/src/db/syncAppCatalog.ts +73 -1
  58. package/src/db/tableSyncMagazine.ts +18 -0
  59. package/src/generated/prisma/browser.ts +20 -0
  60. package/src/generated/prisma/client.ts +20 -0
  61. package/src/generated/prisma/commonInputTypes.ts +54 -54
  62. package/src/generated/prisma/enums.ts +3 -1
  63. package/src/generated/prisma/internal/class.ts +44 -4
  64. package/src/generated/prisma/internal/prismaNamespace.ts +373 -15
  65. package/src/generated/prisma/internal/prismaNamespaceBrowser.ts +58 -0
  66. package/src/generated/prisma/models/DbAppForCatalog.ts +208 -1
  67. package/src/generated/prisma/models/DbAsset.ts +0 -8
  68. package/src/generated/prisma/models/DbGroup.ts +1324 -0
  69. package/src/generated/prisma/models/DbGroupMembership.ts +1432 -0
  70. package/src/generated/prisma/models/DbPerson.ts +1356 -0
  71. package/src/generated/prisma/models/DbSubResource.ts +1692 -0
  72. package/src/generated/prisma/models.ts +4 -0
  73. package/src/middleware/featureRegistry.ts +4 -1
  74. package/src/modules/appCatalog/checkLinks.ts +58 -5
  75. package/src/modules/appCatalog/service.ts +80 -6
  76. package/src/modules/auth/registerAuthRoutes.ts +4 -1
  77. package/src/modules/lighthouseKeeper/tools.ts +1 -1
  78. package/src/prisma-json-types.d.ts +6 -0
  79. package/src/types/common/appCatalogTypes.ts +23 -0
  80. package/src/types/common/approvalMethodTypes.ts +59 -57
  81. package/src/types/common/personGroupTypes.ts +20 -0
  82. package/src/types/common/subResourceTypes.ts +20 -0
  83. package/src/types/index.ts +2 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbSubResource.d.mts","names":[],"sources":["../../../../src/generated/prisma/models/DbSubResource.ts"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { NullableStringFieldUpdateOperationsInput, StringFieldUpdateOperationsInput } from "./user.mjs";
2
2
  import { NullableDateTimeFieldUpdateOperationsInput } from "./account.mjs";
3
+ import { IntFieldUpdateOperationsInput } from "./DbGroupMembership.mjs";
3
4
  import { StringNullableListFilter } from "./DbApprovalMethod.mjs";
4
5
  import { $DbAppForCatalogPayload, DbAppForCatalogCreateNestedOneWithoutSourceRefsInput, DbAppForCatalogDefaultArgs, DbAppForCatalogOrderByWithRelationInput, DbAppForCatalogScalarRelationFilter, DbAppForCatalogUpdateOneRequiredWithoutSourceRefsNestedInput, DbAppForCatalogWhereInput, Prisma__DbAppForCatalogClient } from "./DbAppForCatalog.mjs";
5
- import { IntFieldUpdateOperationsInput } from "./DbAsset.mjs";
6
6
  import { $SourcePayload, Prisma__SourceClient, SourceCreateNestedOneWithoutReferencesInput, SourceDefaultArgs, SourceOrderByWithRelationInput, SourceScalarRelationFilter, SourceUpdateOneRequiredWithoutReferencesNestedInput, SourceWhereInput } from "./Source.mjs";
7
7
  import { DateTimeNullableFilter, DateTimeNullableWithAggregatesFilter, IntFilter, IntWithAggregatesFilter, SortOrderInput, StringFilter, StringNullableFilter, StringNullableWithAggregatesFilter, StringWithAggregatesFilter } from "../commonInputTypes.mjs";
8
8
  import { AtLeast, BatchPayload, ExcludeUnderscoreKeys, Extends, False, FieldRef, GetHavingFields, GetScalarType, Has, Keys, MaybeTupleToUnion, Or, PickEnumerable, PrismaPromise, SelectSubset, SortOrder, SourceReferenceScalarFieldEnum, Subset, SubsetIntersection, True, TypeMap, XOR } from "../internal/prismaNamespace.mjs";
@@ -2,10 +2,14 @@ import { $userPayload, AggregateUser, BoolFieldUpdateOperationsInput, DateTimeFi
2
2
  import { $sessionPayload, AggregateSession, GetSessionAggregateType, Prisma__sessionClient, SessionAggregateArgs, SessionCountAggregateInputType, SessionCountAggregateOutputType, SessionGroupByOutputType, SessionListRelationFilter, SessionMaxAggregateInputType, SessionMaxAggregateOutputType, SessionMinAggregateInputType, SessionMinAggregateOutputType, sessionCountArgs, sessionCountOrderByAggregateInput, sessionCreateArgs, sessionCreateInput, sessionCreateManyAndReturnArgs, sessionCreateManyArgs, sessionCreateManyInput, sessionCreateManyUserInput, sessionCreateManyUserInputEnvelope, sessionCreateNestedManyWithoutUserInput, sessionCreateOrConnectWithoutUserInput, sessionCreateWithoutUserInput, sessionDelegate, sessionDeleteArgs, sessionDeleteManyArgs, sessionFieldRefs, sessionFindFirstArgs, sessionFindFirstOrThrowArgs, sessionFindManyArgs, sessionFindUniqueArgs, sessionFindUniqueOrThrowArgs, sessionGroupByArgs, sessionInclude, sessionIncludeCreateManyAndReturn, sessionIncludeUpdateManyAndReturn, sessionMaxOrderByAggregateInput, sessionMinOrderByAggregateInput, sessionOmit, sessionOrderByRelationAggregateInput, sessionOrderByWithAggregationInput, sessionOrderByWithRelationInput, sessionScalarWhereInput, sessionScalarWhereWithAggregatesInput, sessionSelect, sessionSelectCreateManyAndReturn, sessionSelectUpdateManyAndReturn, sessionUncheckedCreateInput, sessionUncheckedCreateNestedManyWithoutUserInput, sessionUncheckedCreateWithoutUserInput, sessionUncheckedUpdateInput, sessionUncheckedUpdateManyInput, sessionUncheckedUpdateManyWithoutUserInput, sessionUncheckedUpdateManyWithoutUserNestedInput, sessionUncheckedUpdateWithoutUserInput, sessionUpdateArgs, sessionUpdateInput, sessionUpdateManyAndReturnArgs, sessionUpdateManyArgs, sessionUpdateManyMutationInput, sessionUpdateManyWithWhereWithoutUserInput, sessionUpdateManyWithoutUserNestedInput, sessionUpdateWithWhereUniqueWithoutUserInput, sessionUpdateWithoutUserInput, sessionUpsertArgs, sessionUpsertWithWhereUniqueWithoutUserInput, sessionWhereInput, sessionWhereUniqueInput } from "./models/session.mjs";
3
3
  import { $accountPayload, AccountAggregateArgs, AccountCountAggregateInputType, AccountCountAggregateOutputType, AccountGroupByOutputType, AccountListRelationFilter, AccountMaxAggregateInputType, AccountMaxAggregateOutputType, AccountMinAggregateInputType, AccountMinAggregateOutputType, AggregateAccount, GetAccountAggregateType, NullableDateTimeFieldUpdateOperationsInput, Prisma__accountClient, accountCountArgs, accountCountOrderByAggregateInput, accountCreateArgs, accountCreateInput, accountCreateManyAndReturnArgs, accountCreateManyArgs, accountCreateManyInput, accountCreateManyUserInput, accountCreateManyUserInputEnvelope, accountCreateNestedManyWithoutUserInput, accountCreateOrConnectWithoutUserInput, accountCreateWithoutUserInput, accountDelegate, accountDeleteArgs, accountDeleteManyArgs, accountFieldRefs, accountFindFirstArgs, accountFindFirstOrThrowArgs, accountFindManyArgs, accountFindUniqueArgs, accountFindUniqueOrThrowArgs, accountGroupByArgs, accountInclude, accountIncludeCreateManyAndReturn, accountIncludeUpdateManyAndReturn, accountMaxOrderByAggregateInput, accountMinOrderByAggregateInput, accountOmit, accountOrderByRelationAggregateInput, accountOrderByWithAggregationInput, accountOrderByWithRelationInput, accountProviderIdAccountIdCompoundUniqueInput, accountScalarWhereInput, accountScalarWhereWithAggregatesInput, accountSelect, accountSelectCreateManyAndReturn, accountSelectUpdateManyAndReturn, accountUncheckedCreateInput, accountUncheckedCreateNestedManyWithoutUserInput, accountUncheckedCreateWithoutUserInput, accountUncheckedUpdateInput, accountUncheckedUpdateManyInput, accountUncheckedUpdateManyWithoutUserInput, accountUncheckedUpdateManyWithoutUserNestedInput, accountUncheckedUpdateWithoutUserInput, accountUpdateArgs, accountUpdateInput, accountUpdateManyAndReturnArgs, accountUpdateManyArgs, accountUpdateManyMutationInput, accountUpdateManyWithWhereWithoutUserInput, accountUpdateManyWithoutUserNestedInput, accountUpdateWithWhereUniqueWithoutUserInput, accountUpdateWithoutUserInput, accountUpsertArgs, accountUpsertWithWhereUniqueWithoutUserInput, accountWhereInput, accountWhereUniqueInput } from "./models/account.mjs";
4
4
  import { $verificationPayload, AggregateVerification, GetVerificationAggregateType, Prisma__verificationClient, VerificationAggregateArgs, VerificationCountAggregateInputType, VerificationCountAggregateOutputType, VerificationGroupByOutputType, VerificationMaxAggregateInputType, VerificationMaxAggregateOutputType, VerificationMinAggregateInputType, VerificationMinAggregateOutputType, verificationCountArgs, verificationCountOrderByAggregateInput, verificationCreateArgs, verificationCreateInput, verificationCreateManyAndReturnArgs, verificationCreateManyArgs, verificationCreateManyInput, verificationDelegate, verificationDeleteArgs, verificationDeleteManyArgs, verificationFieldRefs, verificationFindFirstArgs, verificationFindFirstOrThrowArgs, verificationFindManyArgs, verificationFindUniqueArgs, verificationFindUniqueOrThrowArgs, verificationGroupByArgs, verificationIdentifierValueCompoundUniqueInput, verificationMaxOrderByAggregateInput, verificationMinOrderByAggregateInput, verificationOmit, verificationOrderByWithAggregationInput, verificationOrderByWithRelationInput, verificationScalarWhereWithAggregatesInput, verificationSelect, verificationSelectCreateManyAndReturn, verificationSelectUpdateManyAndReturn, verificationUncheckedCreateInput, verificationUncheckedUpdateInput, verificationUncheckedUpdateManyInput, verificationUpdateArgs, verificationUpdateInput, verificationUpdateManyAndReturnArgs, verificationUpdateManyArgs, verificationUpdateManyMutationInput, verificationUpsertArgs, verificationWhereInput, verificationWhereUniqueInput } from "./models/verification.mjs";
5
+ import { $DbPersonPayload, AggregateDbPerson, DbPerson$membershipsArgs, DbPersonAggregateArgs, DbPersonCountAggregateInputType, DbPersonCountAggregateOutputType, DbPersonCountArgs, DbPersonCountOrderByAggregateInput, DbPersonCountOutputTypeCountMembershipsArgs, DbPersonCountOutputTypeDefaultArgs, DbPersonCountOutputTypeSelect, DbPersonCreateArgs, DbPersonCreateInput, DbPersonCreateManyAndReturnArgs, DbPersonCreateManyArgs, DbPersonCreateManyInput, DbPersonCreateNestedOneWithoutMembershipsInput, DbPersonCreateOrConnectWithoutMembershipsInput, DbPersonCreateWithoutMembershipsInput, DbPersonDefaultArgs, DbPersonDelegate, DbPersonDeleteArgs, DbPersonDeleteManyArgs, DbPersonFieldRefs, DbPersonFindFirstArgs, DbPersonFindFirstOrThrowArgs, DbPersonFindManyArgs, DbPersonFindUniqueArgs, DbPersonFindUniqueOrThrowArgs, DbPersonGroupByArgs, DbPersonGroupByOutputType, DbPersonInclude, DbPersonMaxAggregateInputType, DbPersonMaxAggregateOutputType, DbPersonMaxOrderByAggregateInput, DbPersonMinAggregateInputType, DbPersonMinAggregateOutputType, DbPersonMinOrderByAggregateInput, DbPersonOmit, DbPersonOrderByWithAggregationInput, DbPersonOrderByWithRelationInput, DbPersonScalarRelationFilter, DbPersonScalarWhereWithAggregatesInput, DbPersonSelect, DbPersonSelectCreateManyAndReturn, DbPersonSelectUpdateManyAndReturn, DbPersonUncheckedCreateInput, DbPersonUncheckedCreateWithoutMembershipsInput, DbPersonUncheckedUpdateInput, DbPersonUncheckedUpdateManyInput, DbPersonUncheckedUpdateWithoutMembershipsInput, DbPersonUpdateArgs, DbPersonUpdateInput, DbPersonUpdateManyAndReturnArgs, DbPersonUpdateManyArgs, DbPersonUpdateManyMutationInput, DbPersonUpdateOneRequiredWithoutMembershipsNestedInput, DbPersonUpdateToOneWithWhereWithoutMembershipsInput, DbPersonUpdateWithoutMembershipsInput, DbPersonUpsertArgs, DbPersonUpsertWithoutMembershipsInput, DbPersonWhereInput, DbPersonWhereUniqueInput, GetDbPersonAggregateType, Prisma__DbPersonClient } from "./models/DbPerson.mjs";
6
+ import { $DbGroupPayload, AggregateDbGroup, DbGroup$membershipsArgs, DbGroupAggregateArgs, DbGroupCountAggregateInputType, DbGroupCountAggregateOutputType, DbGroupCountArgs, DbGroupCountOrderByAggregateInput, DbGroupCountOutputTypeCountMembershipsArgs, DbGroupCountOutputTypeDefaultArgs, DbGroupCountOutputTypeSelect, DbGroupCreateArgs, DbGroupCreateInput, DbGroupCreateManyAndReturnArgs, DbGroupCreateManyArgs, DbGroupCreateManyInput, DbGroupCreateNestedOneWithoutMembershipsInput, DbGroupCreateOrConnectWithoutMembershipsInput, DbGroupCreateWithoutMembershipsInput, DbGroupDefaultArgs, DbGroupDelegate, DbGroupDeleteArgs, DbGroupDeleteManyArgs, DbGroupFieldRefs, DbGroupFindFirstArgs, DbGroupFindFirstOrThrowArgs, DbGroupFindManyArgs, DbGroupFindUniqueArgs, DbGroupFindUniqueOrThrowArgs, DbGroupGroupByArgs, DbGroupGroupByOutputType, DbGroupInclude, DbGroupMaxAggregateInputType, DbGroupMaxAggregateOutputType, DbGroupMaxOrderByAggregateInput, DbGroupMinAggregateInputType, DbGroupMinAggregateOutputType, DbGroupMinOrderByAggregateInput, DbGroupOmit, DbGroupOrderByWithAggregationInput, DbGroupOrderByWithRelationInput, DbGroupScalarRelationFilter, DbGroupScalarWhereWithAggregatesInput, DbGroupSelect, DbGroupSelectCreateManyAndReturn, DbGroupSelectUpdateManyAndReturn, DbGroupUncheckedCreateInput, DbGroupUncheckedCreateWithoutMembershipsInput, DbGroupUncheckedUpdateInput, DbGroupUncheckedUpdateManyInput, DbGroupUncheckedUpdateWithoutMembershipsInput, DbGroupUpdateArgs, DbGroupUpdateInput, DbGroupUpdateManyAndReturnArgs, DbGroupUpdateManyArgs, DbGroupUpdateManyMutationInput, DbGroupUpdateOneRequiredWithoutMembershipsNestedInput, DbGroupUpdateToOneWithWhereWithoutMembershipsInput, DbGroupUpdateWithoutMembershipsInput, DbGroupUpsertArgs, DbGroupUpsertWithoutMembershipsInput, DbGroupWhereInput, DbGroupWhereUniqueInput, GetDbGroupAggregateType, Prisma__DbGroupClient } from "./models/DbGroup.mjs";
7
+ import { $DbGroupMembershipPayload, AggregateDbGroupMembership, DbGroupMembershipAggregateArgs, DbGroupMembershipAvgAggregateInputType, DbGroupMembershipAvgAggregateOutputType, DbGroupMembershipAvgOrderByAggregateInput, DbGroupMembershipCountAggregateInputType, DbGroupMembershipCountAggregateOutputType, DbGroupMembershipCountArgs, DbGroupMembershipCountOrderByAggregateInput, DbGroupMembershipCreateArgs, DbGroupMembershipCreateInput, DbGroupMembershipCreateManyAndReturnArgs, DbGroupMembershipCreateManyArgs, DbGroupMembershipCreateManyGroupInput, DbGroupMembershipCreateManyGroupInputEnvelope, DbGroupMembershipCreateManyInput, DbGroupMembershipCreateManyPersonInput, DbGroupMembershipCreateManyPersonInputEnvelope, DbGroupMembershipCreateNestedManyWithoutGroupInput, DbGroupMembershipCreateNestedManyWithoutPersonInput, DbGroupMembershipCreateOrConnectWithoutGroupInput, DbGroupMembershipCreateOrConnectWithoutPersonInput, DbGroupMembershipCreateWithoutGroupInput, DbGroupMembershipCreateWithoutPersonInput, DbGroupMembershipDelegate, DbGroupMembershipDeleteArgs, DbGroupMembershipDeleteManyArgs, DbGroupMembershipFieldRefs, DbGroupMembershipFindFirstArgs, DbGroupMembershipFindFirstOrThrowArgs, DbGroupMembershipFindManyArgs, DbGroupMembershipFindUniqueArgs, DbGroupMembershipFindUniqueOrThrowArgs, DbGroupMembershipGroupByArgs, DbGroupMembershipGroupByOutputType, DbGroupMembershipGroupSlugPersonSlugCompoundUniqueInput, DbGroupMembershipInclude, DbGroupMembershipIncludeCreateManyAndReturn, DbGroupMembershipIncludeUpdateManyAndReturn, DbGroupMembershipListRelationFilter, DbGroupMembershipMaxAggregateInputType, DbGroupMembershipMaxAggregateOutputType, DbGroupMembershipMaxOrderByAggregateInput, DbGroupMembershipMinAggregateInputType, DbGroupMembershipMinAggregateOutputType, DbGroupMembershipMinOrderByAggregateInput, DbGroupMembershipOmit, DbGroupMembershipOrderByRelationAggregateInput, DbGroupMembershipOrderByWithAggregationInput, DbGroupMembershipOrderByWithRelationInput, DbGroupMembershipScalarWhereInput, DbGroupMembershipScalarWhereWithAggregatesInput, DbGroupMembershipSelect, DbGroupMembershipSelectCreateManyAndReturn, DbGroupMembershipSelectUpdateManyAndReturn, DbGroupMembershipSumAggregateInputType, DbGroupMembershipSumAggregateOutputType, DbGroupMembershipSumOrderByAggregateInput, DbGroupMembershipUncheckedCreateInput, DbGroupMembershipUncheckedCreateNestedManyWithoutGroupInput, DbGroupMembershipUncheckedCreateNestedManyWithoutPersonInput, DbGroupMembershipUncheckedCreateWithoutGroupInput, DbGroupMembershipUncheckedCreateWithoutPersonInput, DbGroupMembershipUncheckedUpdateInput, DbGroupMembershipUncheckedUpdateManyInput, DbGroupMembershipUncheckedUpdateManyWithoutGroupInput, DbGroupMembershipUncheckedUpdateManyWithoutGroupNestedInput, DbGroupMembershipUncheckedUpdateManyWithoutPersonInput, DbGroupMembershipUncheckedUpdateManyWithoutPersonNestedInput, DbGroupMembershipUncheckedUpdateWithoutGroupInput, DbGroupMembershipUncheckedUpdateWithoutPersonInput, DbGroupMembershipUpdateArgs, DbGroupMembershipUpdateInput, DbGroupMembershipUpdateManyAndReturnArgs, DbGroupMembershipUpdateManyArgs, DbGroupMembershipUpdateManyMutationInput, DbGroupMembershipUpdateManyWithWhereWithoutGroupInput, DbGroupMembershipUpdateManyWithWhereWithoutPersonInput, DbGroupMembershipUpdateManyWithoutGroupNestedInput, DbGroupMembershipUpdateManyWithoutPersonNestedInput, DbGroupMembershipUpdateWithWhereUniqueWithoutGroupInput, DbGroupMembershipUpdateWithWhereUniqueWithoutPersonInput, DbGroupMembershipUpdateWithoutGroupInput, DbGroupMembershipUpdateWithoutPersonInput, DbGroupMembershipUpsertArgs, DbGroupMembershipUpsertWithWhereUniqueWithoutGroupInput, DbGroupMembershipUpsertWithWhereUniqueWithoutPersonInput, DbGroupMembershipWhereInput, DbGroupMembershipWhereUniqueInput, GetDbGroupMembershipAggregateType, IntFieldUpdateOperationsInput, Prisma__DbGroupMembershipClient } from "./models/DbGroupMembership.mjs";
5
8
  import { $DbApprovalMethodPayload, AggregateDbApprovalMethod, DbApprovalMethodAggregateArgs, DbApprovalMethodCountAggregateInputType, DbApprovalMethodCountAggregateOutputType, DbApprovalMethodCountArgs, DbApprovalMethodCountOrderByAggregateInput, DbApprovalMethodCreateArgs, DbApprovalMethodCreateInput, DbApprovalMethodCreateManyAndReturnArgs, DbApprovalMethodCreateManyArgs, DbApprovalMethodCreateManyInput, DbApprovalMethodCreatedeprecatedAliasesInput, DbApprovalMethodDelegate, DbApprovalMethodDeleteArgs, DbApprovalMethodDeleteManyArgs, DbApprovalMethodFieldRefs, DbApprovalMethodFindFirstArgs, DbApprovalMethodFindFirstOrThrowArgs, DbApprovalMethodFindManyArgs, DbApprovalMethodFindUniqueArgs, DbApprovalMethodFindUniqueOrThrowArgs, DbApprovalMethodGroupByArgs, DbApprovalMethodGroupByOutputType, DbApprovalMethodMaxAggregateInputType, DbApprovalMethodMaxAggregateOutputType, DbApprovalMethodMaxOrderByAggregateInput, DbApprovalMethodMinAggregateInputType, DbApprovalMethodMinAggregateOutputType, DbApprovalMethodMinOrderByAggregateInput, DbApprovalMethodOmit, DbApprovalMethodOrderByWithAggregationInput, DbApprovalMethodOrderByWithRelationInput, DbApprovalMethodScalarWhereWithAggregatesInput, DbApprovalMethodSelect, DbApprovalMethodSelectCreateManyAndReturn, DbApprovalMethodSelectUpdateManyAndReturn, DbApprovalMethodTypeDisplayNameCompoundUniqueInput, DbApprovalMethodUncheckedCreateInput, DbApprovalMethodUncheckedUpdateInput, DbApprovalMethodUncheckedUpdateManyInput, DbApprovalMethodUpdateArgs, DbApprovalMethodUpdateInput, DbApprovalMethodUpdateManyAndReturnArgs, DbApprovalMethodUpdateManyArgs, DbApprovalMethodUpdateManyMutationInput, DbApprovalMethodUpdatedeprecatedAliasesInput, DbApprovalMethodUpsertArgs, DbApprovalMethodWhereInput, DbApprovalMethodWhereUniqueInput, EnumApprovalMethodTypeFieldUpdateOperationsInput, GetDbApprovalMethodAggregateType, Prisma__DbApprovalMethodClient, StringNullableListFilter } from "./models/DbApprovalMethod.mjs";
6
- import { $DbAppForCatalogPayload, AggregateDbAppForCatalog, DbAppForCatalog$sourceRefsArgs, DbAppForCatalogAggregateArgs, DbAppForCatalogCountAggregateInputType, DbAppForCatalogCountAggregateOutputType, DbAppForCatalogCountArgs, DbAppForCatalogCountOrderByAggregateInput, DbAppForCatalogCountOutputTypeCountSourceRefsArgs, DbAppForCatalogCountOutputTypeDefaultArgs, DbAppForCatalogCountOutputTypeSelect, DbAppForCatalogCreateArgs, DbAppForCatalogCreateInput, DbAppForCatalogCreateManyAndReturnArgs, DbAppForCatalogCreateManyArgs, DbAppForCatalogCreateManyInput, DbAppForCatalogCreateNestedOneWithoutSourceRefsInput, DbAppForCatalogCreateOrConnectWithoutSourceRefsInput, DbAppForCatalogCreateWithoutSourceRefsInput, DbAppForCatalogCreatenicknamesInput, DbAppForCatalogCreatescreenshotIdsInput, DbAppForCatalogCreatetagsInput, DbAppForCatalogCreateteamsInput, DbAppForCatalogCreateurlIssuesInput, DbAppForCatalogDefaultArgs, DbAppForCatalogDelegate, DbAppForCatalogDeleteArgs, DbAppForCatalogDeleteManyArgs, DbAppForCatalogFieldRefs, DbAppForCatalogFindFirstArgs, DbAppForCatalogFindFirstOrThrowArgs, DbAppForCatalogFindManyArgs, DbAppForCatalogFindUniqueArgs, DbAppForCatalogFindUniqueOrThrowArgs, DbAppForCatalogGroupByArgs, DbAppForCatalogGroupByOutputType, DbAppForCatalogInclude, DbAppForCatalogMaxAggregateInputType, DbAppForCatalogMaxAggregateOutputType, DbAppForCatalogMaxOrderByAggregateInput, DbAppForCatalogMinAggregateInputType, DbAppForCatalogMinAggregateOutputType, DbAppForCatalogMinOrderByAggregateInput, DbAppForCatalogOmit, DbAppForCatalogOrderByWithAggregationInput, DbAppForCatalogOrderByWithRelationInput, DbAppForCatalogScalarRelationFilter, DbAppForCatalogScalarWhereWithAggregatesInput, DbAppForCatalogSelect, DbAppForCatalogSelectCreateManyAndReturn, DbAppForCatalogSelectUpdateManyAndReturn, DbAppForCatalogUncheckedCreateInput, DbAppForCatalogUncheckedCreateWithoutSourceRefsInput, DbAppForCatalogUncheckedUpdateInput, DbAppForCatalogUncheckedUpdateManyInput, DbAppForCatalogUncheckedUpdateWithoutSourceRefsInput, DbAppForCatalogUpdateArgs, DbAppForCatalogUpdateInput, DbAppForCatalogUpdateManyAndReturnArgs, DbAppForCatalogUpdateManyArgs, DbAppForCatalogUpdateManyMutationInput, DbAppForCatalogUpdateOneRequiredWithoutSourceRefsNestedInput, DbAppForCatalogUpdateToOneWithWhereWithoutSourceRefsInput, DbAppForCatalogUpdateWithoutSourceRefsInput, DbAppForCatalogUpdatenicknamesInput, DbAppForCatalogUpdatescreenshotIdsInput, DbAppForCatalogUpdatetagsInput, DbAppForCatalogUpdateteamsInput, DbAppForCatalogUpdateurlIssuesInput, DbAppForCatalogUpsertArgs, DbAppForCatalogUpsertWithoutSourceRefsInput, DbAppForCatalogWhereInput, DbAppForCatalogWhereUniqueInput, GetDbAppForCatalogAggregateType, Prisma__DbAppForCatalogClient } from "./models/DbAppForCatalog.mjs";
9
+ import { $DbAppForCatalogPayload, AggregateDbAppForCatalog, DbAppForCatalog$sourceRefsArgs, DbAppForCatalog$subResourcesArgs, DbAppForCatalogAggregateArgs, DbAppForCatalogCountAggregateInputType, DbAppForCatalogCountAggregateOutputType, DbAppForCatalogCountArgs, DbAppForCatalogCountOrderByAggregateInput, DbAppForCatalogCountOutputTypeCountSourceRefsArgs, DbAppForCatalogCountOutputTypeCountSubResourcesArgs, DbAppForCatalogCountOutputTypeDefaultArgs, DbAppForCatalogCountOutputTypeSelect, DbAppForCatalogCreateArgs, DbAppForCatalogCreateInput, DbAppForCatalogCreateManyAndReturnArgs, DbAppForCatalogCreateManyArgs, DbAppForCatalogCreateManyInput, DbAppForCatalogCreateNestedOneWithoutSourceRefsInput, DbAppForCatalogCreateNestedOneWithoutSubResourcesInput, DbAppForCatalogCreateOrConnectWithoutSourceRefsInput, DbAppForCatalogCreateOrConnectWithoutSubResourcesInput, DbAppForCatalogCreateWithoutSourceRefsInput, DbAppForCatalogCreateWithoutSubResourcesInput, DbAppForCatalogCreatenicknamesInput, DbAppForCatalogCreatescreenshotIdsInput, DbAppForCatalogCreatetagsInput, DbAppForCatalogCreateteamsInput, DbAppForCatalogCreateurlIssuesInput, DbAppForCatalogDefaultArgs, DbAppForCatalogDelegate, DbAppForCatalogDeleteArgs, DbAppForCatalogDeleteManyArgs, DbAppForCatalogFieldRefs, DbAppForCatalogFindFirstArgs, DbAppForCatalogFindFirstOrThrowArgs, DbAppForCatalogFindManyArgs, DbAppForCatalogFindUniqueArgs, DbAppForCatalogFindUniqueOrThrowArgs, DbAppForCatalogGroupByArgs, DbAppForCatalogGroupByOutputType, DbAppForCatalogInclude, DbAppForCatalogMaxAggregateInputType, DbAppForCatalogMaxAggregateOutputType, DbAppForCatalogMaxOrderByAggregateInput, DbAppForCatalogMinAggregateInputType, DbAppForCatalogMinAggregateOutputType, DbAppForCatalogMinOrderByAggregateInput, DbAppForCatalogOmit, DbAppForCatalogOrderByWithAggregationInput, DbAppForCatalogOrderByWithRelationInput, DbAppForCatalogScalarRelationFilter, DbAppForCatalogScalarWhereWithAggregatesInput, DbAppForCatalogSelect, DbAppForCatalogSelectCreateManyAndReturn, DbAppForCatalogSelectUpdateManyAndReturn, DbAppForCatalogUncheckedCreateInput, DbAppForCatalogUncheckedCreateWithoutSourceRefsInput, DbAppForCatalogUncheckedCreateWithoutSubResourcesInput, DbAppForCatalogUncheckedUpdateInput, DbAppForCatalogUncheckedUpdateManyInput, DbAppForCatalogUncheckedUpdateWithoutSourceRefsInput, DbAppForCatalogUncheckedUpdateWithoutSubResourcesInput, DbAppForCatalogUpdateArgs, DbAppForCatalogUpdateInput, DbAppForCatalogUpdateManyAndReturnArgs, DbAppForCatalogUpdateManyArgs, DbAppForCatalogUpdateManyMutationInput, DbAppForCatalogUpdateOneRequiredWithoutSourceRefsNestedInput, DbAppForCatalogUpdateOneRequiredWithoutSubResourcesNestedInput, DbAppForCatalogUpdateToOneWithWhereWithoutSourceRefsInput, DbAppForCatalogUpdateToOneWithWhereWithoutSubResourcesInput, DbAppForCatalogUpdateWithoutSourceRefsInput, DbAppForCatalogUpdateWithoutSubResourcesInput, DbAppForCatalogUpdatenicknamesInput, DbAppForCatalogUpdatescreenshotIdsInput, DbAppForCatalogUpdatetagsInput, DbAppForCatalogUpdateteamsInput, DbAppForCatalogUpdateurlIssuesInput, DbAppForCatalogUpsertArgs, DbAppForCatalogUpsertWithoutSourceRefsInput, DbAppForCatalogUpsertWithoutSubResourcesInput, DbAppForCatalogWhereInput, DbAppForCatalogWhereUniqueInput, GetDbAppForCatalogAggregateType, Prisma__DbAppForCatalogClient } from "./models/DbAppForCatalog.mjs";
10
+ import { $DbSubResourcePayload, AggregateDbSubResource, DbSubResourceAggregateArgs, DbSubResourceCountAggregateInputType, DbSubResourceCountAggregateOutputType, DbSubResourceCountArgs, DbSubResourceCountOrderByAggregateInput, DbSubResourceCreateArgs, DbSubResourceCreateInput, DbSubResourceCreateManyAndReturnArgs, DbSubResourceCreateManyAppInput, DbSubResourceCreateManyAppInputEnvelope, DbSubResourceCreateManyArgs, DbSubResourceCreateManyInput, DbSubResourceCreateNestedManyWithoutAppInput, DbSubResourceCreateOrConnectWithoutAppInput, DbSubResourceCreateWithoutAppInput, DbSubResourceCreateaccessMaintainerGroupSlugsInput, DbSubResourceCreatealiasesInput, DbSubResourceDelegate, DbSubResourceDeleteArgs, DbSubResourceDeleteManyArgs, DbSubResourceFieldRefs, DbSubResourceFindFirstArgs, DbSubResourceFindFirstOrThrowArgs, DbSubResourceFindManyArgs, DbSubResourceFindUniqueArgs, DbSubResourceFindUniqueOrThrowArgs, DbSubResourceGroupByArgs, DbSubResourceGroupByOutputType, DbSubResourceInclude, DbSubResourceIncludeCreateManyAndReturn, DbSubResourceIncludeUpdateManyAndReturn, DbSubResourceListRelationFilter, DbSubResourceMaxAggregateInputType, DbSubResourceMaxAggregateOutputType, DbSubResourceMaxOrderByAggregateInput, DbSubResourceMinAggregateInputType, DbSubResourceMinAggregateOutputType, DbSubResourceMinOrderByAggregateInput, DbSubResourceOmit, DbSubResourceOrderByRelationAggregateInput, DbSubResourceOrderByWithAggregationInput, DbSubResourceOrderByWithRelationInput, DbSubResourceScalarWhereInput, DbSubResourceScalarWhereWithAggregatesInput, DbSubResourceSelect, DbSubResourceSelectCreateManyAndReturn, DbSubResourceSelectUpdateManyAndReturn, DbSubResourceUncheckedCreateInput, DbSubResourceUncheckedCreateNestedManyWithoutAppInput, DbSubResourceUncheckedCreateWithoutAppInput, DbSubResourceUncheckedUpdateInput, DbSubResourceUncheckedUpdateManyInput, DbSubResourceUncheckedUpdateManyWithoutAppInput, DbSubResourceUncheckedUpdateManyWithoutAppNestedInput, DbSubResourceUncheckedUpdateWithoutAppInput, DbSubResourceUpdateArgs, DbSubResourceUpdateInput, DbSubResourceUpdateManyAndReturnArgs, DbSubResourceUpdateManyArgs, DbSubResourceUpdateManyMutationInput, DbSubResourceUpdateManyWithWhereWithoutAppInput, DbSubResourceUpdateManyWithoutAppNestedInput, DbSubResourceUpdateWithWhereUniqueWithoutAppInput, DbSubResourceUpdateWithoutAppInput, DbSubResourceUpdateaccessMaintainerGroupSlugsInput, DbSubResourceUpdatealiasesInput, DbSubResourceUpsertArgs, DbSubResourceUpsertWithWhereUniqueWithoutAppInput, DbSubResourceWhereInput, DbSubResourceWhereUniqueInput, GetDbSubResourceAggregateType, Prisma__DbSubResourceClient } from "./models/DbSubResource.mjs";
7
11
  import { $DbAppTagDefinitionPayload, AggregateDbAppTagDefinition, DbAppTagDefinitionAggregateArgs, DbAppTagDefinitionCountAggregateInputType, DbAppTagDefinitionCountAggregateOutputType, DbAppTagDefinitionCountArgs, DbAppTagDefinitionCountOrderByAggregateInput, DbAppTagDefinitionCreateArgs, DbAppTagDefinitionCreateInput, DbAppTagDefinitionCreateManyAndReturnArgs, DbAppTagDefinitionCreateManyArgs, DbAppTagDefinitionCreateManyInput, DbAppTagDefinitionDelegate, DbAppTagDefinitionDeleteArgs, DbAppTagDefinitionDeleteManyArgs, DbAppTagDefinitionFieldRefs, DbAppTagDefinitionFindFirstArgs, DbAppTagDefinitionFindFirstOrThrowArgs, DbAppTagDefinitionFindManyArgs, DbAppTagDefinitionFindUniqueArgs, DbAppTagDefinitionFindUniqueOrThrowArgs, DbAppTagDefinitionGroupByArgs, DbAppTagDefinitionGroupByOutputType, DbAppTagDefinitionMaxAggregateInputType, DbAppTagDefinitionMaxAggregateOutputType, DbAppTagDefinitionMaxOrderByAggregateInput, DbAppTagDefinitionMinAggregateInputType, DbAppTagDefinitionMinAggregateOutputType, DbAppTagDefinitionMinOrderByAggregateInput, DbAppTagDefinitionOmit, DbAppTagDefinitionOrderByWithAggregationInput, DbAppTagDefinitionOrderByWithRelationInput, DbAppTagDefinitionScalarWhereWithAggregatesInput, DbAppTagDefinitionSelect, DbAppTagDefinitionSelectCreateManyAndReturn, DbAppTagDefinitionSelectUpdateManyAndReturn, DbAppTagDefinitionUncheckedCreateInput, DbAppTagDefinitionUncheckedUpdateInput, DbAppTagDefinitionUncheckedUpdateManyInput, DbAppTagDefinitionUpdateArgs, DbAppTagDefinitionUpdateInput, DbAppTagDefinitionUpdateManyAndReturnArgs, DbAppTagDefinitionUpdateManyArgs, DbAppTagDefinitionUpdateManyMutationInput, DbAppTagDefinitionUpsertArgs, DbAppTagDefinitionWhereInput, DbAppTagDefinitionWhereUniqueInput, GetDbAppTagDefinitionAggregateType, Prisma__DbAppTagDefinitionClient } from "./models/DbAppTagDefinition.mjs";
8
- import { $DbAssetPayload, AggregateDbAsset, BytesFieldUpdateOperationsInput, DbAssetAggregateArgs, DbAssetAvgAggregateInputType, DbAssetAvgAggregateOutputType, DbAssetAvgOrderByAggregateInput, DbAssetCountAggregateInputType, DbAssetCountAggregateOutputType, DbAssetCountArgs, DbAssetCountOrderByAggregateInput, DbAssetCreateArgs, DbAssetCreateInput, DbAssetCreateManyAndReturnArgs, DbAssetCreateManyArgs, DbAssetCreateManyInput, DbAssetDelegate, DbAssetDeleteArgs, DbAssetDeleteManyArgs, DbAssetFieldRefs, DbAssetFindFirstArgs, DbAssetFindFirstOrThrowArgs, DbAssetFindManyArgs, DbAssetFindUniqueArgs, DbAssetFindUniqueOrThrowArgs, DbAssetGroupByArgs, DbAssetGroupByOutputType, DbAssetMaxAggregateInputType, DbAssetMaxAggregateOutputType, DbAssetMaxOrderByAggregateInput, DbAssetMinAggregateInputType, DbAssetMinAggregateOutputType, DbAssetMinOrderByAggregateInput, DbAssetOmit, DbAssetOrderByWithAggregationInput, DbAssetOrderByWithRelationInput, DbAssetScalarWhereWithAggregatesInput, DbAssetSelect, DbAssetSelectCreateManyAndReturn, DbAssetSelectUpdateManyAndReturn, DbAssetSumAggregateInputType, DbAssetSumAggregateOutputType, DbAssetSumOrderByAggregateInput, DbAssetUncheckedCreateInput, DbAssetUncheckedUpdateInput, DbAssetUncheckedUpdateManyInput, DbAssetUpdateArgs, DbAssetUpdateInput, DbAssetUpdateManyAndReturnArgs, DbAssetUpdateManyArgs, DbAssetUpdateManyMutationInput, DbAssetUpsertArgs, DbAssetWhereInput, DbAssetWhereUniqueInput, EnumAssetTypeFieldUpdateOperationsInput, GetDbAssetAggregateType, IntFieldUpdateOperationsInput, NullableIntFieldUpdateOperationsInput, Prisma__DbAssetClient } from "./models/DbAsset.mjs";
12
+ import { $DbAssetPayload, AggregateDbAsset, BytesFieldUpdateOperationsInput, DbAssetAggregateArgs, DbAssetAvgAggregateInputType, DbAssetAvgAggregateOutputType, DbAssetAvgOrderByAggregateInput, DbAssetCountAggregateInputType, DbAssetCountAggregateOutputType, DbAssetCountArgs, DbAssetCountOrderByAggregateInput, DbAssetCreateArgs, DbAssetCreateInput, DbAssetCreateManyAndReturnArgs, DbAssetCreateManyArgs, DbAssetCreateManyInput, DbAssetDelegate, DbAssetDeleteArgs, DbAssetDeleteManyArgs, DbAssetFieldRefs, DbAssetFindFirstArgs, DbAssetFindFirstOrThrowArgs, DbAssetFindManyArgs, DbAssetFindUniqueArgs, DbAssetFindUniqueOrThrowArgs, DbAssetGroupByArgs, DbAssetGroupByOutputType, DbAssetMaxAggregateInputType, DbAssetMaxAggregateOutputType, DbAssetMaxOrderByAggregateInput, DbAssetMinAggregateInputType, DbAssetMinAggregateOutputType, DbAssetMinOrderByAggregateInput, DbAssetOmit, DbAssetOrderByWithAggregationInput, DbAssetOrderByWithRelationInput, DbAssetScalarWhereWithAggregatesInput, DbAssetSelect, DbAssetSelectCreateManyAndReturn, DbAssetSelectUpdateManyAndReturn, DbAssetSumAggregateInputType, DbAssetSumAggregateOutputType, DbAssetSumOrderByAggregateInput, DbAssetUncheckedCreateInput, DbAssetUncheckedUpdateInput, DbAssetUncheckedUpdateManyInput, DbAssetUpdateArgs, DbAssetUpdateInput, DbAssetUpdateManyAndReturnArgs, DbAssetUpdateManyArgs, DbAssetUpdateManyMutationInput, DbAssetUpsertArgs, DbAssetWhereInput, DbAssetWhereUniqueInput, EnumAssetTypeFieldUpdateOperationsInput, GetDbAssetAggregateType, NullableIntFieldUpdateOperationsInput, Prisma__DbAssetClient } from "./models/DbAsset.mjs";
9
13
  import { $SourcePayload, AggregateSource, GetSourceAggregateType, Prisma__SourceClient, Source$referencesArgs, SourceAggregateArgs, SourceCountAggregateInputType, SourceCountAggregateOutputType, SourceCountArgs, SourceCountOrderByAggregateInput, SourceCountOutputTypeCountReferencesArgs, SourceCountOutputTypeDefaultArgs, SourceCountOutputTypeSelect, SourceCreateArgs, SourceCreateInput, SourceCreateManyAndReturnArgs, SourceCreateManyArgs, SourceCreateManyInput, SourceCreateNestedOneWithoutReferencesInput, SourceCreateOrConnectWithoutReferencesInput, SourceCreateWithoutReferencesInput, SourceDefaultArgs, SourceDelegate, SourceDeleteArgs, SourceDeleteManyArgs, SourceFieldRefs, SourceFindFirstArgs, SourceFindFirstOrThrowArgs, SourceFindManyArgs, SourceFindUniqueArgs, SourceFindUniqueOrThrowArgs, SourceGroupByArgs, SourceGroupByOutputType, SourceInclude, SourceMaxAggregateInputType, SourceMaxAggregateOutputType, SourceMaxOrderByAggregateInput, SourceMinAggregateInputType, SourceMinAggregateOutputType, SourceMinOrderByAggregateInput, SourceOmit, SourceOrderByWithAggregationInput, SourceOrderByWithRelationInput, SourceScalarRelationFilter, SourceScalarWhereWithAggregatesInput, SourceSelect, SourceSelectCreateManyAndReturn, SourceSelectUpdateManyAndReturn, SourceUncheckedCreateInput, SourceUncheckedCreateWithoutReferencesInput, SourceUncheckedUpdateInput, SourceUncheckedUpdateManyInput, SourceUncheckedUpdateWithoutReferencesInput, SourceUpdateArgs, SourceUpdateInput, SourceUpdateManyAndReturnArgs, SourceUpdateManyArgs, SourceUpdateManyMutationInput, SourceUpdateOneRequiredWithoutReferencesNestedInput, SourceUpdateToOneWithWhereWithoutReferencesInput, SourceUpdateWithoutReferencesInput, SourceUpsertArgs, SourceUpsertWithoutReferencesInput, SourceWhereInput, SourceWhereUniqueInput } from "./models/Source.mjs";
10
14
  import { $SourceReferencePayload, AggregateSourceReference, GetSourceReferenceAggregateType, Prisma__SourceReferenceClient, SourceReferenceAggregateArgs, SourceReferenceAppIdUrlCompoundUniqueInput, SourceReferenceAvgAggregateInputType, SourceReferenceAvgAggregateOutputType, SourceReferenceAvgOrderByAggregateInput, SourceReferenceCountAggregateInputType, SourceReferenceCountAggregateOutputType, SourceReferenceCountArgs, SourceReferenceCountOrderByAggregateInput, SourceReferenceCreateArgs, SourceReferenceCreateInput, SourceReferenceCreateManyAndReturnArgs, SourceReferenceCreateManyAppInput, SourceReferenceCreateManyAppInputEnvelope, SourceReferenceCreateManyArgs, SourceReferenceCreateManyInput, SourceReferenceCreateManySourceInput, SourceReferenceCreateManySourceInputEnvelope, SourceReferenceCreateNestedManyWithoutAppInput, SourceReferenceCreateNestedManyWithoutSourceInput, SourceReferenceCreateOrConnectWithoutAppInput, SourceReferenceCreateOrConnectWithoutSourceInput, SourceReferenceCreateWithoutAppInput, SourceReferenceCreateWithoutSourceInput, SourceReferenceCreateexcerptsInput, SourceReferenceDelegate, SourceReferenceDeleteArgs, SourceReferenceDeleteManyArgs, SourceReferenceFieldRefs, SourceReferenceFindFirstArgs, SourceReferenceFindFirstOrThrowArgs, SourceReferenceFindManyArgs, SourceReferenceFindUniqueArgs, SourceReferenceFindUniqueOrThrowArgs, SourceReferenceGroupByArgs, SourceReferenceGroupByOutputType, SourceReferenceInclude, SourceReferenceIncludeCreateManyAndReturn, SourceReferenceIncludeUpdateManyAndReturn, SourceReferenceListRelationFilter, SourceReferenceMaxAggregateInputType, SourceReferenceMaxAggregateOutputType, SourceReferenceMaxOrderByAggregateInput, SourceReferenceMinAggregateInputType, SourceReferenceMinAggregateOutputType, SourceReferenceMinOrderByAggregateInput, SourceReferenceOmit, SourceReferenceOrderByRelationAggregateInput, SourceReferenceOrderByWithAggregationInput, SourceReferenceOrderByWithRelationInput, SourceReferenceScalarWhereInput, SourceReferenceScalarWhereWithAggregatesInput, SourceReferenceSelect, SourceReferenceSelectCreateManyAndReturn, SourceReferenceSelectUpdateManyAndReturn, SourceReferenceSumAggregateInputType, SourceReferenceSumAggregateOutputType, SourceReferenceSumOrderByAggregateInput, SourceReferenceUncheckedCreateInput, SourceReferenceUncheckedCreateNestedManyWithoutAppInput, SourceReferenceUncheckedCreateNestedManyWithoutSourceInput, SourceReferenceUncheckedCreateWithoutAppInput, SourceReferenceUncheckedCreateWithoutSourceInput, SourceReferenceUncheckedUpdateInput, SourceReferenceUncheckedUpdateManyInput, SourceReferenceUncheckedUpdateManyWithoutAppInput, SourceReferenceUncheckedUpdateManyWithoutAppNestedInput, SourceReferenceUncheckedUpdateManyWithoutSourceInput, SourceReferenceUncheckedUpdateManyWithoutSourceNestedInput, SourceReferenceUncheckedUpdateWithoutAppInput, SourceReferenceUncheckedUpdateWithoutSourceInput, SourceReferenceUpdateArgs, SourceReferenceUpdateInput, SourceReferenceUpdateManyAndReturnArgs, SourceReferenceUpdateManyArgs, SourceReferenceUpdateManyMutationInput, SourceReferenceUpdateManyWithWhereWithoutAppInput, SourceReferenceUpdateManyWithWhereWithoutSourceInput, SourceReferenceUpdateManyWithoutAppNestedInput, SourceReferenceUpdateManyWithoutSourceNestedInput, SourceReferenceUpdateWithWhereUniqueWithoutAppInput, SourceReferenceUpdateWithWhereUniqueWithoutSourceInput, SourceReferenceUpdateWithoutAppInput, SourceReferenceUpdateWithoutSourceInput, SourceReferenceUpdateexcerptsInput, SourceReferenceUpsertArgs, SourceReferenceUpsertWithWhereUniqueWithoutAppInput, SourceReferenceUpsertWithWhereUniqueWithoutSourceInput, SourceReferenceWhereInput, SourceReferenceWhereUniqueInput } from "./models/SourceReference.mjs";
11
15
  import { BoolFilter, BoolWithAggregatesFilter, BytesFilter, BytesWithAggregatesFilter, DateTimeFilter, DateTimeNullableFilter, DateTimeNullableWithAggregatesFilter, DateTimeWithAggregatesFilter, EnumApprovalMethodTypeFilter, EnumApprovalMethodTypeWithAggregatesFilter, EnumAssetTypeFilter, EnumAssetTypeWithAggregatesFilter, IntFilter, IntNullableFilter, IntNullableWithAggregatesFilter, IntWithAggregatesFilter, JsonFilter, JsonFilterBase, JsonNullableFilter, JsonNullableFilterBase, JsonNullableWithAggregatesFilter, JsonNullableWithAggregatesFilterBase, JsonWithAggregatesFilter, JsonWithAggregatesFilterBase, NestedBoolFilter, NestedBoolWithAggregatesFilter, NestedBytesFilter, NestedBytesWithAggregatesFilter, NestedDateTimeFilter, NestedDateTimeNullableFilter, NestedDateTimeNullableWithAggregatesFilter, NestedDateTimeWithAggregatesFilter, NestedEnumApprovalMethodTypeFilter, NestedEnumApprovalMethodTypeWithAggregatesFilter, NestedEnumAssetTypeFilter, NestedEnumAssetTypeWithAggregatesFilter, NestedFloatFilter, NestedFloatNullableFilter, NestedIntFilter, NestedIntNullableFilter, NestedIntNullableWithAggregatesFilter, NestedIntWithAggregatesFilter, NestedJsonFilter, NestedJsonFilterBase, NestedJsonNullableFilter, NestedJsonNullableFilterBase, NestedStringFilter, NestedStringNullableFilter, NestedStringNullableWithAggregatesFilter, NestedStringWithAggregatesFilter, SortOrderInput, StringFilter, StringNullableFilter, StringNullableWithAggregatesFilter, StringWithAggregatesFilter } from "./commonInputTypes.mjs";
package/dist/index.d.mts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { AcMetaDictionary, Tag } from "./types/common/sharedTypes.mjs";
2
2
  import { AcResourceIndexed } from "./types/common/resourceTypes.mjs";
3
- import { AppAccessRequest, AppRole, ApprovalMethod, ApprovalMethodConfig, ApprovalMethodType, ApprovalUrl, ApproverContact, CreateApprovalMethodInput, CustomConfig, PersonTeamConfig, ReachOutContact, ServiceConfig, UpdateApprovalMethodInput } from "./types/common/approvalMethodTypes.mjs";
4
- import { AppApprovalMethod, AppCatalogData, AppCategory, AppForCatalog, AppVersionInfo, GroupingTagDefinition, GroupingTagValue, SourceReference, VersionInfo } from "./types/common/appCatalogTypes.mjs";
3
+ import { AppAccessRequest, AppRole, ApprovalMethod, ApprovalMethodConfig, ApprovalMethodType, ApprovalUrl, CustomConfig, PersonTeamConfig, ServiceConfig } from "./types/common/approvalMethodTypes.mjs";
4
+ import { Group, Person } from "./types/common/personGroupTypes.mjs";
5
+ import { SubResource } from "./types/common/subResourceTypes.mjs";
6
+ import { AppApprovalMethod, AppCatalogData, AppCategory, AppForCatalog, AppTierVariant, AppVersionInfo, GroupingTagDefinition, GroupingTagValue, SourceReference, VersionInfo } from "./types/common/appCatalogTypes.mjs";
5
7
  import { AcEnvIndexed } from "./types/common/env/envTypes.mjs";
6
8
  import { AcAppPageIndexed, AcAppUiIndexed } from "./types/common/app/ui/appUiTypes.mjs";
7
9
  import { AcAppIndexed } from "./types/common/app/appTypes.mjs";
@@ -33,4 +35,4 @@ import { injectCustomScripts } from "./middleware/htmlInjection.mjs";
33
35
  import { runLighthouseKeeperDemo } from "./modules/lighthouseKeeper/demo.mjs";
34
36
  import { APP_CATALOG_AI_SYSTEM_PROMPT, createAppCatalogAITools } from "./modules/lighthouseKeeper/tools.mjs";
35
37
  import { getBuildPipelineId, getFrontendPackageVersion, getVersionInfo } from "./utils/versionUtils.mjs";
36
- export { APP_CATALOG_AI_SYSTEM_PROMPT, AcAppIndexed, AcAppPageIndexed, AcAppUiIndexed, AcAppsMeta, type AcAuthConfig, AcBackendAppDto, AcBackendAppInput, AcBackendAppUIBaseInput, AcBackendAppUIInput, AcBackendCredentialInput, AcBackendDataFreshness, AcBackendDataSourceInput, AcBackendDataSourceInputCommon, AcBackendDataSourceInputDb, AcBackendDataSourceInputKafka, AcBackendDataVersion, AcBackendDeployableInput, AcBackendDeployment, AcBackendDeploymentInput, AcBackendEnvironmentInput, AcBackendPageInput, type AcBackendProvider, AcBackendTagDescriptionDataIndexed, AcBackendTagFixedTagValue, AcBackendTagsDescriptionDataIndexed, AcBackendUiDefaultsInput, AcBackendVersionsRequestParams, AcBackendVersionsReturn, AcContextIndexed, type AcDatabaseConfig, AcDatabaseManager, AcEnvIndexed, type AcFeatureToggles, type AcLifecycleHooks, type AcLighthouseKeeperConfig, type AcMcpServerConfig, AcMetaDictionary, type AcMiddlewareOptions, type AcMiddlewareResult, AcResourceIndexed, type AcStaticControllerContract, type AcTrpcContext, type AcTrpcContextOptions, AppAccessRequest, AppApprovalMethod, AppCatalogCompanySpecificBackend, AppCatalogData, AppCategory, type AppForCatalog, AppRole, AppVersionInfo, ApprovalMethod, ApprovalMethodConfig, ApprovalMethodType, ApprovalUrl, ApproverContact, type AssetRestControllerConfig, type AuthRouter, type BetterAuth, CreateApprovalMethodInput, CustomConfig, GroupingTagDefinition, GroupingTagValue, type IconRestControllerConfig, type MakeTFromPrismaModel, type MiddlewareContext, type ObjectKeys, PersonTeamConfig, ReachOutContact, type ScalarFilter, type ScalarKeys, type ScreenshotRestControllerConfig, ServiceConfig, SourceReference, type SyncAppCatalogResult, type SyncAssetsConfig, TABLE_SYNC_MAGAZINE, type TRPCRouter, type TableSyncMagazine, type TableSyncMagazineModelNameKey, type TableSyncParamsPrisma, Tag, UpdateApprovalMethodInput, type UpsertIconInput, VersionInfo, checkAllLinks, connectDb, createAcMiddleware, createAcTrpcContext, createAppCatalogAITools, createAuth, createAuthRouter, createTrpcRouter, disconnectDb, getAssetByName, getBuildPipelineId, getDbClient, getFrontendPackageVersion, getVersionInfo, injectCustomScripts, printLinkCheckReport, registerAssetRestController, registerAuthRoutes, registerIconRestController, registerScreenshotRestController, runLighthouseKeeperDemo, setDbClient, staticControllerContract, syncAppCatalog, syncAssets, tableSyncPrisma, upsertIcon, upsertIcons };
38
+ export { APP_CATALOG_AI_SYSTEM_PROMPT, AcAppIndexed, AcAppPageIndexed, AcAppUiIndexed, AcAppsMeta, type AcAuthConfig, AcBackendAppDto, AcBackendAppInput, AcBackendAppUIBaseInput, AcBackendAppUIInput, AcBackendCredentialInput, AcBackendDataFreshness, AcBackendDataSourceInput, AcBackendDataSourceInputCommon, AcBackendDataSourceInputDb, AcBackendDataSourceInputKafka, AcBackendDataVersion, AcBackendDeployableInput, AcBackendDeployment, AcBackendDeploymentInput, AcBackendEnvironmentInput, AcBackendPageInput, type AcBackendProvider, AcBackendTagDescriptionDataIndexed, AcBackendTagFixedTagValue, AcBackendTagsDescriptionDataIndexed, AcBackendUiDefaultsInput, AcBackendVersionsRequestParams, AcBackendVersionsReturn, AcContextIndexed, type AcDatabaseConfig, AcDatabaseManager, AcEnvIndexed, type AcFeatureToggles, type AcLifecycleHooks, type AcLighthouseKeeperConfig, type AcMcpServerConfig, AcMetaDictionary, type AcMiddlewareOptions, type AcMiddlewareResult, AcResourceIndexed, type AcStaticControllerContract, type AcTrpcContext, type AcTrpcContextOptions, AppAccessRequest, AppApprovalMethod, AppCatalogCompanySpecificBackend, AppCatalogData, AppCategory, type AppForCatalog, AppRole, AppTierVariant, AppVersionInfo, ApprovalMethod, ApprovalMethodConfig, ApprovalMethodType, ApprovalUrl, type AssetRestControllerConfig, type AuthRouter, type BetterAuth, CustomConfig, Group, GroupingTagDefinition, GroupingTagValue, type IconRestControllerConfig, type MakeTFromPrismaModel, type MiddlewareContext, type ObjectKeys, Person, PersonTeamConfig, type ScalarFilter, type ScalarKeys, type ScreenshotRestControllerConfig, ServiceConfig, SourceReference, SubResource, type SyncAppCatalogResult, type SyncAssetsConfig, TABLE_SYNC_MAGAZINE, type TRPCRouter, type TableSyncMagazine, type TableSyncMagazineModelNameKey, type TableSyncParamsPrisma, Tag, type UpsertIconInput, VersionInfo, checkAllLinks, connectDb, createAcMiddleware, createAcTrpcContext, createAppCatalogAITools, createAuth, createAuthRouter, createTrpcRouter, disconnectDb, getAssetByName, getBuildPipelineId, getDbClient, getFrontendPackageVersion, getVersionInfo, injectCustomScripts, printLinkCheckReport, registerAssetRestController, registerAuthRoutes, registerIconRestController, registerScreenshotRestController, runLighthouseKeeperDemo, setDbClient, staticControllerContract, syncAppCatalog, syncAssets, tableSyncPrisma, upsertIcon, upsertIcons };
@@ -39,7 +39,11 @@ const FEATURES = [{
39
39
  ...session,
40
40
  isAdmin: admin
41
41
  });
42
- } else res.status(401).json({ error: "Not authenticated" });
42
+ } else res.json({
43
+ session: null,
44
+ user: null,
45
+ isAuthenticated: false
46
+ });
43
47
  } catch (error) {
44
48
  console.error("[Auth Session Error]", error);
45
49
  res.status(500).json({ error: "Internal server error" });
@@ -1 +1 @@
1
- {"version":3,"file":"featureRegistry.mjs","names":[],"sources":["../../src/middleware/featureRegistry.ts"],"sourcesContent":["import type { Router } from 'express'\nimport { toNodeHandler } from 'better-auth/node'\nimport type {\n AcFeatureToggles,\n AcMiddlewareOptions,\n MiddlewareContext,\n} from './types'\nimport { registerIconRestController } from '../modules/icons/iconRestController'\nimport { registerAssetRestController } from '../modules/assets/assetRestController'\nimport { registerScreenshotRestController } from '../modules/assets/screenshotRestController'\nimport { createMockSessionResponse } from '../modules/auth/devMockUserUtils'\n\n/** Parse a single cookie value from the Cookie header */\nfunction getCookie(\n req: { headers: { cookie?: string } },\n name: string,\n): string | undefined {\n const cookies = req.headers.cookie ?? ''\n if (!cookies) return undefined\n const match = cookies.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n return match?.[1] !== undefined ? decodeURIComponent(match[1]) : undefined\n}\n\ninterface FeatureRegistration {\n name: keyof AcFeatureToggles\n defaultEnabled: boolean\n register: (\n router: Router,\n options: Required<Pick<AcMiddlewareOptions, 'basePath'>> &\n AcMiddlewareOptions,\n context: MiddlewareContext,\n ) => void\n}\n\n// Optional features that can be toggled\nconst FEATURES: FeatureRegistration[] = [\n {\n name: 'auth',\n defaultEnabled: true,\n register: (router, options, ctx) => {\n const basePath = options.basePath\n\n // Dev mock cookie name — used by dev-login and session endpoints\n const DEV_SESSION_COOKIE = 'ac-dev-session'\n\n // Explicit session endpoint handler\n router.get(\n `${basePath}/auth/session`,\n async (req, res): Promise<void> => {\n try {\n // Check for dev mock session cookie (set by dev-login endpoint)\n if (\n options.auth.devMockUser &&\n getCookie(req, DEV_SESSION_COOKIE) === '1'\n ) {\n res.json(createMockSessionResponse(options.auth.devMockUser))\n return\n }\n\n const session = await ctx.auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n if (session) {\n let admin = false\n if (ctx.isAdmin) {\n try {\n admin = !!(await ctx.isAdmin(session.user, session.session, {\n request: req,\n auth: ctx.auth,\n }))\n } catch {\n admin = false\n }\n }\n res.json({ ...session, isAdmin: admin })\n } else {\n res.status(401).json({ error: 'Not authenticated' })\n }\n } catch (error) {\n console.error('[Auth Session Error]', error)\n res.status(500).json({ error: 'Internal server error' })\n }\n },\n )\n\n // Dev login/logout endpoints (only when devMockUser is configured)\n if (options.auth.devMockUser) {\n const devMockUser = options.auth.devMockUser\n\n router.post(`${basePath}/auth/dev-login`, (_req, res) => {\n const mockSession = createMockSessionResponse(devMockUser)\n res.cookie(DEV_SESSION_COOKIE, '1', {\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days\n })\n res.json(mockSession)\n })\n\n router.post(`${basePath}/auth/dev-logout`, (_req, res) => {\n res.clearCookie(DEV_SESSION_COOKIE, { path: '/' })\n res.json({ ok: true })\n })\n }\n\n // Use toNodeHandler to adapt better-auth for Express/Node.js\n const authHandler = toNodeHandler(ctx.auth)\n router.all(`${basePath}/auth/{*any}`, authHandler)\n },\n },\n]\n\n/**\n * Registers all enabled features on the router.\n */\nexport function registerFeatures(\n router: Router,\n options: Required<Pick<AcMiddlewareOptions, 'basePath'>> &\n AcMiddlewareOptions,\n context: MiddlewareContext,\n): void {\n const basePath = options.basePath\n\n // Always-on features (required for core functionality)\n\n // Icons\n registerIconRestController(router, {\n basePath: `${basePath}/icons`,\n })\n\n // Assets\n registerAssetRestController(router, {\n basePath: `${basePath}/assets`,\n })\n\n // Screenshots\n registerScreenshotRestController(router, {\n basePath: `${basePath}/screenshots`,\n })\n\n // Optional toggleable features\n const toggles = options.features || {}\n\n for (const feature of FEATURES) {\n const isEnabled = toggles[feature.name] ?? feature.defaultEnabled\n\n if (isEnabled) {\n feature.register(router, options, context)\n }\n }\n}\n"],"mappings":";;;;;;;;AAaA,SAAS,UACP,KACA,MACoB;CACpB,MAAM,UAAU,IAAI,QAAQ,UAAU;AACtC,KAAI,CAAC,QAAS,QAAO;CACrB,MAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,cAAc,KAAK,UAAU,CAAC;AACrE,QAAO,QAAQ,OAAO,SAAY,mBAAmB,MAAM,GAAG,GAAG;;AAenE,MAAM,WAAkC,CACtC;CACE,MAAM;CACN,gBAAgB;CAChB,WAAW,QAAQ,SAAS,QAAQ;EAClC,MAAM,WAAW,QAAQ;EAGzB,MAAM,qBAAqB;AAG3B,SAAO,IACL,GAAG,SAAS,gBACZ,OAAO,KAAK,QAAuB;AACjC,OAAI;AAEF,QACE,QAAQ,KAAK,eACb,UAAU,KAAK,mBAAmB,KAAK,KACvC;AACA,SAAI,KAAK,0BAA0B,QAAQ,KAAK,YAAY,CAAC;AAC7D;;IAGF,MAAM,UAAU,MAAM,IAAI,KAAK,IAAI,WAAW,EAC5C,SAAS,IAAI,SACd,CAAC;AACF,QAAI,SAAS;KACX,IAAI,QAAQ;AACZ,SAAI,IAAI,QACN,KAAI;AACF,cAAQ,CAAC,CAAE,MAAM,IAAI,QAAQ,QAAQ,MAAM,QAAQ,SAAS;OAC1D,SAAS;OACT,MAAM,IAAI;OACX,CAAC;aACI;AACN,cAAQ;;AAGZ,SAAI,KAAK;MAAE,GAAG;MAAS,SAAS;MAAO,CAAC;UAExC,KAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,qBAAqB,CAAC;YAE/C,OAAO;AACd,YAAQ,MAAM,wBAAwB,MAAM;AAC5C,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;IAG7D;AAGD,MAAI,QAAQ,KAAK,aAAa;GAC5B,MAAM,cAAc,QAAQ,KAAK;AAEjC,UAAO,KAAK,GAAG,SAAS,mBAAmB,MAAM,QAAQ;IACvD,MAAM,cAAc,0BAA0B,YAAY;AAC1D,QAAI,OAAO,oBAAoB,KAAK;KAClC,UAAU;KACV,UAAU;KACV,MAAM;KACN,QAAQ,MAAU,KAAK,KAAK;KAC7B,CAAC;AACF,QAAI,KAAK,YAAY;KACrB;AAEF,UAAO,KAAK,GAAG,SAAS,oBAAoB,MAAM,QAAQ;AACxD,QAAI,YAAY,oBAAoB,EAAE,MAAM,KAAK,CAAC;AAClD,QAAI,KAAK,EAAE,IAAI,MAAM,CAAC;KACtB;;EAIJ,MAAM,cAAc,cAAc,IAAI,KAAK;AAC3C,SAAO,IAAI,GAAG,SAAS,eAAe,YAAY;;CAErD,CACF;;;;AAKD,SAAgB,iBACd,QACA,SAEA,SACM;CACN,MAAM,WAAW,QAAQ;AAKzB,4BAA2B,QAAQ,EACjC,UAAU,GAAG,SAAS,SACvB,CAAC;AAGF,6BAA4B,QAAQ,EAClC,UAAU,GAAG,SAAS,UACvB,CAAC;AAGF,kCAAiC,QAAQ,EACvC,UAAU,GAAG,SAAS,eACvB,CAAC;CAGF,MAAM,UAAU,QAAQ,YAAY,EAAE;AAEtC,MAAK,MAAM,WAAW,SAGpB,KAFkB,QAAQ,QAAQ,SAAS,QAAQ,eAGjD,SAAQ,SAAS,QAAQ,SAAS,QAAQ"}
1
+ {"version":3,"file":"featureRegistry.mjs","names":[],"sources":["../../src/middleware/featureRegistry.ts"],"sourcesContent":["import type { Router } from 'express'\nimport { toNodeHandler } from 'better-auth/node'\nimport type {\n AcFeatureToggles,\n AcMiddlewareOptions,\n MiddlewareContext,\n} from './types'\nimport { registerIconRestController } from '../modules/icons/iconRestController'\nimport { registerAssetRestController } from '../modules/assets/assetRestController'\nimport { registerScreenshotRestController } from '../modules/assets/screenshotRestController'\nimport { createMockSessionResponse } from '../modules/auth/devMockUserUtils'\n\n/** Parse a single cookie value from the Cookie header */\nfunction getCookie(\n req: { headers: { cookie?: string } },\n name: string,\n): string | undefined {\n const cookies = req.headers.cookie ?? ''\n if (!cookies) return undefined\n const match = cookies.match(new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`))\n return match?.[1] !== undefined ? decodeURIComponent(match[1]) : undefined\n}\n\ninterface FeatureRegistration {\n name: keyof AcFeatureToggles\n defaultEnabled: boolean\n register: (\n router: Router,\n options: Required<Pick<AcMiddlewareOptions, 'basePath'>> &\n AcMiddlewareOptions,\n context: MiddlewareContext,\n ) => void\n}\n\n// Optional features that can be toggled\nconst FEATURES: FeatureRegistration[] = [\n {\n name: 'auth',\n defaultEnabled: true,\n register: (router, options, ctx) => {\n const basePath = options.basePath\n\n // Dev mock cookie name — used by dev-login and session endpoints\n const DEV_SESSION_COOKIE = 'ac-dev-session'\n\n // Explicit session endpoint handler\n router.get(\n `${basePath}/auth/session`,\n async (req, res): Promise<void> => {\n try {\n // Check for dev mock session cookie (set by dev-login endpoint)\n if (\n options.auth.devMockUser &&\n getCookie(req, DEV_SESSION_COOKIE) === '1'\n ) {\n res.json(createMockSessionResponse(options.auth.devMockUser))\n return\n }\n\n const session = await ctx.auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n if (session) {\n let admin = false\n if (ctx.isAdmin) {\n try {\n admin = !!(await ctx.isAdmin(session.user, session.session, {\n request: req,\n auth: ctx.auth,\n }))\n } catch {\n admin = false\n }\n }\n res.json({ ...session, isAdmin: admin })\n } else {\n // Return 200 with null session instead of 401 to avoid\n // browser \"Failed to load resource\" console errors.\n // The frontend checks for session.user to determine auth state.\n res.json({ session: null, user: null, isAuthenticated: false })\n }\n } catch (error) {\n console.error('[Auth Session Error]', error)\n res.status(500).json({ error: 'Internal server error' })\n }\n },\n )\n\n // Dev login/logout endpoints (only when devMockUser is configured)\n if (options.auth.devMockUser) {\n const devMockUser = options.auth.devMockUser\n\n router.post(`${basePath}/auth/dev-login`, (_req, res) => {\n const mockSession = createMockSessionResponse(devMockUser)\n res.cookie(DEV_SESSION_COOKIE, '1', {\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days\n })\n res.json(mockSession)\n })\n\n router.post(`${basePath}/auth/dev-logout`, (_req, res) => {\n res.clearCookie(DEV_SESSION_COOKIE, { path: '/' })\n res.json({ ok: true })\n })\n }\n\n // Use toNodeHandler to adapt better-auth for Express/Node.js\n const authHandler = toNodeHandler(ctx.auth)\n router.all(`${basePath}/auth/{*any}`, authHandler)\n },\n },\n]\n\n/**\n * Registers all enabled features on the router.\n */\nexport function registerFeatures(\n router: Router,\n options: Required<Pick<AcMiddlewareOptions, 'basePath'>> &\n AcMiddlewareOptions,\n context: MiddlewareContext,\n): void {\n const basePath = options.basePath\n\n // Always-on features (required for core functionality)\n\n // Icons\n registerIconRestController(router, {\n basePath: `${basePath}/icons`,\n })\n\n // Assets\n registerAssetRestController(router, {\n basePath: `${basePath}/assets`,\n })\n\n // Screenshots\n registerScreenshotRestController(router, {\n basePath: `${basePath}/screenshots`,\n })\n\n // Optional toggleable features\n const toggles = options.features || {}\n\n for (const feature of FEATURES) {\n const isEnabled = toggles[feature.name] ?? feature.defaultEnabled\n\n if (isEnabled) {\n feature.register(router, options, context)\n }\n }\n}\n"],"mappings":";;;;;;;;AAaA,SAAS,UACP,KACA,MACoB;CACpB,MAAM,UAAU,IAAI,QAAQ,UAAU;AACtC,KAAI,CAAC,QAAS,QAAO;CACrB,MAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,cAAc,KAAK,UAAU,CAAC;AACrE,QAAO,QAAQ,OAAO,SAAY,mBAAmB,MAAM,GAAG,GAAG;;AAenE,MAAM,WAAkC,CACtC;CACE,MAAM;CACN,gBAAgB;CAChB,WAAW,QAAQ,SAAS,QAAQ;EAClC,MAAM,WAAW,QAAQ;EAGzB,MAAM,qBAAqB;AAG3B,SAAO,IACL,GAAG,SAAS,gBACZ,OAAO,KAAK,QAAuB;AACjC,OAAI;AAEF,QACE,QAAQ,KAAK,eACb,UAAU,KAAK,mBAAmB,KAAK,KACvC;AACA,SAAI,KAAK,0BAA0B,QAAQ,KAAK,YAAY,CAAC;AAC7D;;IAGF,MAAM,UAAU,MAAM,IAAI,KAAK,IAAI,WAAW,EAC5C,SAAS,IAAI,SACd,CAAC;AACF,QAAI,SAAS;KACX,IAAI,QAAQ;AACZ,SAAI,IAAI,QACN,KAAI;AACF,cAAQ,CAAC,CAAE,MAAM,IAAI,QAAQ,QAAQ,MAAM,QAAQ,SAAS;OAC1D,SAAS;OACT,MAAM,IAAI;OACX,CAAC;aACI;AACN,cAAQ;;AAGZ,SAAI,KAAK;MAAE,GAAG;MAAS,SAAS;MAAO,CAAC;UAKxC,KAAI,KAAK;KAAE,SAAS;KAAM,MAAM;KAAM,iBAAiB;KAAO,CAAC;YAE1D,OAAO;AACd,YAAQ,MAAM,wBAAwB,MAAM;AAC5C,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;IAG7D;AAGD,MAAI,QAAQ,KAAK,aAAa;GAC5B,MAAM,cAAc,QAAQ,KAAK;AAEjC,UAAO,KAAK,GAAG,SAAS,mBAAmB,MAAM,QAAQ;IACvD,MAAM,cAAc,0BAA0B,YAAY;AAC1D,QAAI,OAAO,oBAAoB,KAAK;KAClC,UAAU;KACV,UAAU;KACV,MAAM;KACN,QAAQ,MAAU,KAAK,KAAK;KAC7B,CAAC;AACF,QAAI,KAAK,YAAY;KACrB;AAEF,UAAO,KAAK,GAAG,SAAS,oBAAoB,MAAM,QAAQ;AACxD,QAAI,YAAY,oBAAoB,EAAE,MAAM,KAAK,CAAC;AAClD,QAAI,KAAK,EAAE,IAAI,MAAM,CAAC;KACtB;;EAIJ,MAAM,cAAc,cAAc,IAAI,KAAK;AAC3C,SAAO,IAAI,GAAG,SAAS,eAAe,YAAY;;CAErD,CACF;;;;AAKD,SAAgB,iBACd,QACA,SAEA,SACM;CACN,MAAM,WAAW,QAAQ;AAKzB,4BAA2B,QAAQ,EACjC,UAAU,GAAG,SAAS,SACvB,CAAC;AAGF,6BAA4B,QAAQ,EAClC,UAAU,GAAG,SAAS,UACvB,CAAC;AAGF,kCAAiC,QAAQ,EACvC,UAAU,GAAG,SAAS,eACvB,CAAC;CAGF,MAAM,UAAU,QAAQ,YAAY,EAAE;AAEtC,MAAK,MAAM,WAAW,SAGpB,KAFkB,QAAQ,QAAQ,SAAS,QAAQ,eAGjD,SAAQ,SAAS,QAAQ,SAAS,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"checkLinks.d.mts","names":[],"sources":["../../../src/modules/appCatalog/checkLinks.ts"],"mappings":";UAGU,SAAA;EACR,GAAA;EACA,MAAA;EACA,KAAA;EACA,OAAA;EACA,QAAA;AAAA;AAAA,UAGQ,iBAAA;EACR,aAAA;EACA,OAAA;EACA,UAAA;EACA,UAAA,IAAc,MAAA,EAAQ,SAAA;AAAA;;;;iBAkIF,aAAA,CAAc,OAAA,GAAS,iBAAA,GAAyB,OAAA;EACpE,KAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA;EACA,MAAA,EAAQ,SAAA;AAAA;;AALV;;iBAiHgB,oBAAA,CAAqB,MAAA;EACnC,KAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA;EACA,MAAA,EAAQ,SAAA;AAAA"}
1
+ {"version":3,"file":"checkLinks.d.mts","names":[],"sources":["../../../src/modules/appCatalog/checkLinks.ts"],"mappings":";UAGU,SAAA;EACR,GAAA;EACA,MAAA;EACA,KAAA;EACA,OAAA;EACA,QAAA;AAAA;AAAA,UAGQ,iBAAA;EACR,aAAA;EACA,OAAA;EACA,UAAA;EACA,UAAA,IAAc,MAAA,EAAQ,SAAA;AAAA;;;;iBAuLF,aAAA,CAAc,OAAA,GAAS,iBAAA,GAAyB,OAAA;EACpE,KAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA;EACA,MAAA,EAAQ,SAAA;AAAA;;AALV;;iBAiHgB,oBAAA,CAAqB,MAAA;EACnC,KAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA;EACA,MAAA,EAAQ,SAAA;AAAA"}
@@ -4,6 +4,35 @@ import { getDbClient } from "../../db/client.mjs";
4
4
  async function sleep(ms) {
5
5
  return new Promise((resolve) => setTimeout(resolve, ms));
6
6
  }
7
+ function classifyNetworkError(err) {
8
+ const cause = err instanceof Error && "cause" in err && err.cause instanceof Error ? err.cause : null;
9
+ const hasCode = (obj) => obj != null && typeof obj === "object" && "code" in obj;
10
+ const code = (hasCode(cause) ? cause.code : null) ?? (hasCode(err) ? err.code : null);
11
+ const causeMsg = cause?.message ?? "";
12
+ const topMsg = err instanceof Error ? err.message : String(err);
13
+ if (code) switch (code) {
14
+ case "ENOTFOUND":
15
+ case "EAI_AGAIN": return `DNS resolution failed (${code})`;
16
+ case "ECONNREFUSED": return `Connection refused (${code})`;
17
+ case "ETIMEDOUT":
18
+ case "ECONNRESET": return `Connection timeout (${code})`;
19
+ case "ENETUNREACH":
20
+ case "EHOSTUNREACH": return `Network unreachable (${code})`;
21
+ case "UNABLE_TO_VERIFY_LEAF_SIGNATURE": return `SSL certificate error: unable to verify certificate (${code})`;
22
+ case "CERT_HAS_EXPIRED": return `SSL certificate error: certificate expired (${code})`;
23
+ case "ERR_TLS_CERT_ALTNAME_INVALID": return `SSL certificate error: hostname mismatch (${code})`;
24
+ case "DEPTH_ZERO_SELF_SIGNED_CERT":
25
+ case "SELF_SIGNED_CERT_IN_CHAIN": return `SSL certificate error: self-signed certificate (${code})`;
26
+ default:
27
+ if (code.startsWith("ERR_TLS") || code.startsWith("CERT")) return `SSL/TLS error (${code}): ${causeMsg || topMsg}`;
28
+ return `Network error (${code}): ${causeMsg || topMsg}`;
29
+ }
30
+ const msg = causeMsg || topMsg;
31
+ if (/certificate/i.test(msg) || /SSL|TLS/i.test(msg)) return `SSL/TLS error: ${msg}`;
32
+ if (/abort|timeout/i.test(msg)) return `Request timeout: ${msg}`;
33
+ if (/dns|resolve/i.test(msg)) return `DNS error: ${msg}`;
34
+ return causeMsg || topMsg;
35
+ }
7
36
  async function checkUrlWithRetry(url, options) {
8
37
  let lastError;
9
38
  for (let attempt = 0; attempt <= options.maxRetries; attempt++) try {
@@ -13,9 +42,9 @@ async function checkUrlWithRetry(url, options) {
13
42
  signal: AbortSignal.timeout(options.timeout)
14
43
  })).status };
15
44
  } catch (error) {
16
- const errorMessage = error instanceof Error ? error.message : String(error);
45
+ const errorMessage = classifyNetworkError(error);
17
46
  lastError = errorMessage;
18
- if ((errorMessage.includes("aborted") || errorMessage.includes("timeout") || errorMessage.includes("fetch failed")) && attempt < options.maxRetries) {
47
+ if ((errorMessage.includes("timeout") || errorMessage.includes("ECONNRESET") || errorMessage.includes("ETIMEDOUT") || errorMessage.includes("EAI_AGAIN")) && attempt < options.maxRetries) {
19
48
  await sleep(1e3 * 2 ** attempt);
20
49
  continue;
21
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"checkLinks.mjs","names":[],"sources":["../../../src/modules/appCatalog/checkLinks.ts"],"sourcesContent":["import type { AppForCatalog } from '../../types/common/appCatalogTypes'\nimport { getDbClient } from '../../db/client'\n\ninterface LinkCheck {\n url: string\n status: number | null\n error?: string\n appSlug: string\n linkType: 'appUrl' | 'sources' | 'accessRequest.urls'\n}\n\ninterface CheckLinksOptions {\n maxConcurrent?: number\n timeout?: number\n maxRetries?: number\n onProgress?: (result: LinkCheck) => void\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function checkUrlWithRetry(\n url: string,\n options: {\n timeout: number\n maxRetries: number\n },\n): Promise<{ status: number | null; error?: string }> {\n let lastError: string | undefined\n\n for (let attempt = 0; attempt <= options.maxRetries; attempt++) {\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n redirect: 'manual', // Don't follow redirects\n signal: AbortSignal.timeout(options.timeout),\n })\n return { status: response.status }\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n lastError = errorMessage\n\n // Check if it's a retryable error (timeout or fetch failed)\n const isRetryable =\n errorMessage.includes('aborted') ||\n errorMessage.includes('timeout') ||\n errorMessage.includes('fetch failed')\n\n if (isRetryable && attempt < options.maxRetries) {\n // Exponential backoff: 1s, 2s, 4s\n const backoffMs = 1000 * 2 ** attempt\n await sleep(backoffMs)\n continue\n }\n\n break\n }\n }\n\n return { status: null, error: lastError }\n}\n\nfunction getStatusEmoji(status: number | null): string {\n if (status === null) return '❌'\n if (status >= 200 && status < 300) return '✅'\n if (status >= 300 && status < 400) return '🔀'\n if (status === 403) return '🔒' // 403 is not an error, just forbidden\n if (status && status >= 400 && status < 500) return '⚠️'\n return '❌'\n}\n\nfunction isWorkingLink(status: number | null): boolean {\n if (status === null) return false\n // 2xx, 3xx, and 403 are considered working\n if (status >= 200 && status < 400) return true\n if (status === 403) return true\n return false\n}\n\nfunction isBrokenLink(status: number | null): boolean {\n if (status === null) return true\n // 403 is not broken\n if (status === 403) return false\n // 4xx (except 403) and 5xx are broken\n return status >= 400\n}\n\nfunction formatStatus(status: number | null, error?: string): string {\n if (status === null) {\n return `ERROR: ${error || 'Unknown error'}`\n }\n return `${status}`\n}\n\nasync function getAppsFromDb(): Promise<AppForCatalog[]> {\n const prisma = getDbClient()\n const rows = await prisma.dbAppForCatalog.findMany({\n include: {\n sourceRefs: true,\n },\n })\n\n return rows.map((row) => {\n const accessRequest =\n row.accessRequest as unknown as AppForCatalog['accessRequest']\n const teams = (row.teams as unknown as string[] | null) ?? []\n const tags = (row.tags as unknown as AppForCatalog['tags']) ?? []\n const screenshotIds =\n (row.screenshotIds as unknown as AppForCatalog['screenshotIds']) ?? []\n const sources = row.sourceRefs.map((ref) => ({\n sourceSlug: ref.sourceSlug,\n url: ref.url,\n parseDate: ref.parseDate ? ref.parseDate.toISOString() : null,\n }))\n const notes = row.notes == null ? undefined : row.notes\n const appUrl = row.appUrl == null ? undefined : row.appUrl\n const iconName = row.iconName == null ? undefined : row.iconName\n const deprecated =\n row.deprecated == null\n ? undefined\n : (row.deprecated as unknown as AppForCatalog['deprecated'])\n\n return {\n id: row.id,\n slug: row.slug,\n displayName: row.displayName,\n description: row.description,\n accessRequest,\n teams,\n notes,\n tags,\n appUrl,\n iconName,\n screenshotIds,\n sources,\n deprecated,\n }\n })\n}\n\n/**\n * Check all links in the app catalog and return a report\n */\nexport async function checkAllLinks(options: CheckLinksOptions = {}): Promise<{\n total: number\n working: number\n broken: number\n redirects: number\n checks: LinkCheck[]\n}> {\n const {\n maxConcurrent = 10,\n timeout = 60000,\n maxRetries = 3,\n onProgress,\n } = options\n\n const apps = await getAppsFromDb()\n const checks: Omit<LinkCheck, 'status' | 'error'>[] = []\n\n // Collect all links\n for (const app of apps) {\n // Check appUrl\n if (app.appUrl) {\n checks.push({\n url: app.appUrl,\n appSlug: app.slug,\n linkType: 'appUrl',\n })\n }\n\n // Check sources\n if (app.sources && app.sources.length > 0) {\n for (const source of app.sources) {\n const url = typeof source === 'string' ? source : source.url\n checks.push({\n url,\n appSlug: app.slug,\n linkType: 'sources',\n })\n }\n }\n\n // Check accessRequest.urls\n if (app.accessRequest?.urls && app.accessRequest.urls.length > 0) {\n for (const link of app.accessRequest.urls) {\n checks.push({\n url: link.url,\n appSlug: app.slug,\n linkType: 'accessRequest.urls',\n })\n }\n }\n }\n\n // Check all links with concurrency control\n const results: LinkCheck[] = []\n const queue = [...checks]\n const inProgress = new Set<Promise<void>>()\n\n while (queue.length > 0 || inProgress.size > 0) {\n // Start new requests up to maxConcurrent\n while (queue.length > 0 && inProgress.size < maxConcurrent) {\n const check = queue.shift()!\n\n const promise = (async () => {\n const result = await checkUrlWithRetry(check.url, {\n timeout,\n maxRetries,\n })\n\n const linkCheck: LinkCheck = {\n ...check,\n status: result.status,\n error: result.error,\n }\n results.push(linkCheck)\n\n // Stream result if callback provided\n if (onProgress) {\n onProgress(linkCheck)\n }\n })()\n\n inProgress.add(promise)\n\n // Clean up when promise completes\n void promise.finally(() => {\n inProgress.delete(promise)\n })\n }\n\n // Wait for at least one to complete before continuing\n if (inProgress.size > 0) {\n await Promise.race(inProgress)\n }\n }\n\n const working = results.filter((r) => isWorkingLink(r.status))\n const broken = results.filter((r) => isBrokenLink(r.status))\n const redirects = results.filter(\n (r) => r.status && r.status >= 300 && r.status < 400,\n )\n\n return {\n total: results.length,\n working: working.length,\n broken: broken.length,\n redirects: redirects.length,\n checks: results,\n }\n}\n\n/**\n * Print a formatted report of link check results\n */\nexport function printLinkCheckReport(report: {\n total: number\n working: number\n broken: number\n redirects: number\n checks: LinkCheck[]\n}): void {\n console.log('📊 Results:\\n')\n console.log(`✅ Working links: ${report.working}`)\n console.log(`❌ Broken links: ${report.broken}`)\n console.log(`🔀 Redirects: ${report.redirects}`)\n console.log()\n\n const broken = report.checks.filter((r) => isBrokenLink(r.status))\n const redirects = report.checks.filter(\n (r) => r.status && r.status >= 300 && r.status < 400,\n )\n\n // Show broken links\n if (broken.length > 0) {\n console.log('❌ Broken Links:\\n')\n for (const link of broken) {\n console.log(\n ` ${getStatusEmoji(link.status)} [${link.appSlug}] ${link.linkType}`,\n )\n console.log(` ${link.url}`)\n console.log(` Status: ${formatStatus(link.status, link.error)}`)\n console.log()\n }\n }\n\n // Show redirects\n if (redirects.length > 0) {\n console.log('🔀 Redirects:\\n')\n for (const link of redirects) {\n console.log(\n ` ${getStatusEmoji(link.status)} [${link.appSlug}] ${link.linkType}`,\n )\n console.log(` ${link.url}`)\n console.log(` Status: ${formatStatus(link.status, link.error)}`)\n console.log()\n }\n }\n\n // Summary by app\n const appStats = new Map<\n string,\n { working: number; broken: number; total: number }\n >()\n for (const result of report.checks) {\n const stats = appStats.get(result.appSlug) || {\n working: 0,\n broken: 0,\n total: 0,\n }\n stats.total++\n if (isWorkingLink(result.status)) {\n stats.working++\n } else {\n stats.broken++\n }\n appStats.set(result.appSlug, stats)\n }\n\n const appsWithBrokenLinks = Array.from(appStats.entries())\n .filter(([_, stats]) => stats.broken > 0)\n .sort((a, b) => b[1].broken - a[1].broken)\n\n if (appsWithBrokenLinks.length > 0) {\n console.log('📱 Apps with broken links:\\n')\n for (const [appSlug, stats] of appsWithBrokenLinks) {\n console.log(` ${appSlug}: ${stats.broken}/${stats.total} broken`)\n }\n console.log()\n }\n\n if (broken.length > 0) {\n console.log(`\\n❌ Found ${broken.length} broken link(s)`)\n } else {\n console.log('\\n✅ All links are working!')\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"checkLinks.mjs","names":[],"sources":["../../../src/modules/appCatalog/checkLinks.ts"],"sourcesContent":["import type { AppForCatalog } from '../../types/common/appCatalogTypes'\nimport { getDbClient } from '../../db/client'\n\ninterface LinkCheck {\n url: string\n status: number | null\n error?: string\n appSlug: string\n linkType: 'appUrl' | 'sources' | 'accessRequest.urls'\n}\n\ninterface CheckLinksOptions {\n maxConcurrent?: number\n timeout?: number\n maxRetries?: number\n onProgress?: (result: LinkCheck) => void\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction classifyNetworkError(err: unknown): string {\n // Node's fetch wraps the real error in error.cause\n const cause =\n err instanceof Error && 'cause' in err && err.cause instanceof Error\n ? err.cause\n : null\n\n const hasCode = (obj: unknown): obj is { code: string } =>\n obj != null && typeof obj === 'object' && 'code' in obj\n\n const code =\n (hasCode(cause) ? cause.code : null) ?? (hasCode(err) ? err.code : null)\n const causeMsg = cause?.message ?? ''\n const topMsg = err instanceof Error ? err.message : String(err)\n\n if (code) {\n switch (code) {\n case 'ENOTFOUND':\n case 'EAI_AGAIN':\n return `DNS resolution failed (${code})`\n case 'ECONNREFUSED':\n return `Connection refused (${code})`\n case 'ETIMEDOUT':\n case 'ECONNRESET':\n return `Connection timeout (${code})`\n case 'ENETUNREACH':\n case 'EHOSTUNREACH':\n return `Network unreachable (${code})`\n case 'UNABLE_TO_VERIFY_LEAF_SIGNATURE':\n return `SSL certificate error: unable to verify certificate (${code})`\n case 'CERT_HAS_EXPIRED':\n return `SSL certificate error: certificate expired (${code})`\n case 'ERR_TLS_CERT_ALTNAME_INVALID':\n return `SSL certificate error: hostname mismatch (${code})`\n case 'DEPTH_ZERO_SELF_SIGNED_CERT':\n case 'SELF_SIGNED_CERT_IN_CHAIN':\n return `SSL certificate error: self-signed certificate (${code})`\n default:\n if (code.startsWith('ERR_TLS') || code.startsWith('CERT'))\n return `SSL/TLS error (${code}): ${causeMsg || topMsg}`\n return `Network error (${code}): ${causeMsg || topMsg}`\n }\n }\n\n const msg = causeMsg || topMsg\n if (/certificate/i.test(msg) || /SSL|TLS/i.test(msg))\n return `SSL/TLS error: ${msg}`\n if (/abort|timeout/i.test(msg)) return `Request timeout: ${msg}`\n if (/dns|resolve/i.test(msg)) return `DNS error: ${msg}`\n\n return causeMsg || topMsg\n}\n\nasync function checkUrlWithRetry(\n url: string,\n options: {\n timeout: number\n maxRetries: number\n },\n): Promise<{ status: number | null; error?: string }> {\n let lastError: string | undefined\n\n for (let attempt = 0; attempt <= options.maxRetries; attempt++) {\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n redirect: 'manual', // Don't follow redirects\n signal: AbortSignal.timeout(options.timeout),\n })\n return { status: response.status }\n } catch (error: unknown) {\n const errorMessage = classifyNetworkError(error)\n lastError = errorMessage\n\n // Check if it's a retryable error (timeout or transient network issues)\n const isRetryable =\n errorMessage.includes('timeout') ||\n errorMessage.includes('ECONNRESET') ||\n errorMessage.includes('ETIMEDOUT') ||\n errorMessage.includes('EAI_AGAIN')\n\n if (isRetryable && attempt < options.maxRetries) {\n // Exponential backoff: 1s, 2s, 4s\n const backoffMs = 1000 * 2 ** attempt\n await sleep(backoffMs)\n continue\n }\n\n break\n }\n }\n\n return { status: null, error: lastError }\n}\n\nfunction getStatusEmoji(status: number | null): string {\n if (status === null) return '❌'\n if (status >= 200 && status < 300) return '✅'\n if (status >= 300 && status < 400) return '🔀'\n if (status === 403) return '🔒' // 403 is not an error, just forbidden\n if (status && status >= 400 && status < 500) return '⚠️'\n return '❌'\n}\n\nfunction isWorkingLink(status: number | null): boolean {\n if (status === null) return false\n // 2xx, 3xx, and 403 are considered working\n if (status >= 200 && status < 400) return true\n if (status === 403) return true\n return false\n}\n\nfunction isBrokenLink(status: number | null): boolean {\n if (status === null) return true\n // 403 is not broken\n if (status === 403) return false\n // 4xx (except 403) and 5xx are broken\n return status >= 400\n}\n\nfunction formatStatus(status: number | null, error?: string): string {\n if (status === null) {\n return `ERROR: ${error || 'Unknown error'}`\n }\n return `${status}`\n}\n\nasync function getAppsFromDb(): Promise<AppForCatalog[]> {\n const prisma = getDbClient()\n const rows = await prisma.dbAppForCatalog.findMany({\n include: {\n sourceRefs: true,\n },\n })\n\n return rows.map((row) => {\n const accessRequest =\n row.accessRequest as unknown as AppForCatalog['accessRequest']\n const teams = (row.teams as unknown as string[] | null) ?? []\n const tags = (row.tags as unknown as AppForCatalog['tags']) ?? []\n const screenshotIds =\n (row.screenshotIds as unknown as AppForCatalog['screenshotIds']) ?? []\n const sources = row.sourceRefs.map((ref) => ({\n sourceSlug: ref.sourceSlug,\n url: ref.url,\n parseDate: ref.parseDate ? ref.parseDate.toISOString() : null,\n }))\n const notes = row.notes == null ? undefined : row.notes\n const appUrl = row.appUrl == null ? undefined : row.appUrl\n const iconName = row.iconName == null ? undefined : row.iconName\n const deprecated =\n row.deprecated == null\n ? undefined\n : (row.deprecated as unknown as AppForCatalog['deprecated'])\n\n return {\n id: row.id,\n slug: row.slug,\n displayName: row.displayName,\n description: row.description,\n accessRequest,\n teams,\n notes,\n tags,\n appUrl,\n iconName,\n screenshotIds,\n sources,\n deprecated,\n }\n })\n}\n\n/**\n * Check all links in the app catalog and return a report\n */\nexport async function checkAllLinks(options: CheckLinksOptions = {}): Promise<{\n total: number\n working: number\n broken: number\n redirects: number\n checks: LinkCheck[]\n}> {\n const {\n maxConcurrent = 10,\n timeout = 60000,\n maxRetries = 3,\n onProgress,\n } = options\n\n const apps = await getAppsFromDb()\n const checks: Omit<LinkCheck, 'status' | 'error'>[] = []\n\n // Collect all links\n for (const app of apps) {\n // Check appUrl\n if (app.appUrl) {\n checks.push({\n url: app.appUrl,\n appSlug: app.slug,\n linkType: 'appUrl',\n })\n }\n\n // Check sources\n if (app.sources && app.sources.length > 0) {\n for (const source of app.sources) {\n const url = typeof source === 'string' ? source : source.url\n checks.push({\n url,\n appSlug: app.slug,\n linkType: 'sources',\n })\n }\n }\n\n // Check accessRequest.urls\n if (app.accessRequest?.urls && app.accessRequest.urls.length > 0) {\n for (const link of app.accessRequest.urls) {\n checks.push({\n url: link.url,\n appSlug: app.slug,\n linkType: 'accessRequest.urls',\n })\n }\n }\n }\n\n // Check all links with concurrency control\n const results: LinkCheck[] = []\n const queue = [...checks]\n const inProgress = new Set<Promise<void>>()\n\n while (queue.length > 0 || inProgress.size > 0) {\n // Start new requests up to maxConcurrent\n while (queue.length > 0 && inProgress.size < maxConcurrent) {\n const check = queue.shift()!\n\n const promise = (async () => {\n const result = await checkUrlWithRetry(check.url, {\n timeout,\n maxRetries,\n })\n\n const linkCheck: LinkCheck = {\n ...check,\n status: result.status,\n error: result.error,\n }\n results.push(linkCheck)\n\n // Stream result if callback provided\n if (onProgress) {\n onProgress(linkCheck)\n }\n })()\n\n inProgress.add(promise)\n\n // Clean up when promise completes\n void promise.finally(() => {\n inProgress.delete(promise)\n })\n }\n\n // Wait for at least one to complete before continuing\n if (inProgress.size > 0) {\n await Promise.race(inProgress)\n }\n }\n\n const working = results.filter((r) => isWorkingLink(r.status))\n const broken = results.filter((r) => isBrokenLink(r.status))\n const redirects = results.filter(\n (r) => r.status && r.status >= 300 && r.status < 400,\n )\n\n return {\n total: results.length,\n working: working.length,\n broken: broken.length,\n redirects: redirects.length,\n checks: results,\n }\n}\n\n/**\n * Print a formatted report of link check results\n */\nexport function printLinkCheckReport(report: {\n total: number\n working: number\n broken: number\n redirects: number\n checks: LinkCheck[]\n}): void {\n console.log('📊 Results:\\n')\n console.log(`✅ Working links: ${report.working}`)\n console.log(`❌ Broken links: ${report.broken}`)\n console.log(`🔀 Redirects: ${report.redirects}`)\n console.log()\n\n const broken = report.checks.filter((r) => isBrokenLink(r.status))\n const redirects = report.checks.filter(\n (r) => r.status && r.status >= 300 && r.status < 400,\n )\n\n // Show broken links\n if (broken.length > 0) {\n console.log('❌ Broken Links:\\n')\n for (const link of broken) {\n console.log(\n ` ${getStatusEmoji(link.status)} [${link.appSlug}] ${link.linkType}`,\n )\n console.log(` ${link.url}`)\n console.log(` Status: ${formatStatus(link.status, link.error)}`)\n console.log()\n }\n }\n\n // Show redirects\n if (redirects.length > 0) {\n console.log('🔀 Redirects:\\n')\n for (const link of redirects) {\n console.log(\n ` ${getStatusEmoji(link.status)} [${link.appSlug}] ${link.linkType}`,\n )\n console.log(` ${link.url}`)\n console.log(` Status: ${formatStatus(link.status, link.error)}`)\n console.log()\n }\n }\n\n // Summary by app\n const appStats = new Map<\n string,\n { working: number; broken: number; total: number }\n >()\n for (const result of report.checks) {\n const stats = appStats.get(result.appSlug) || {\n working: 0,\n broken: 0,\n total: 0,\n }\n stats.total++\n if (isWorkingLink(result.status)) {\n stats.working++\n } else {\n stats.broken++\n }\n appStats.set(result.appSlug, stats)\n }\n\n const appsWithBrokenLinks = Array.from(appStats.entries())\n .filter(([_, stats]) => stats.broken > 0)\n .sort((a, b) => b[1].broken - a[1].broken)\n\n if (appsWithBrokenLinks.length > 0) {\n console.log('📱 Apps with broken links:\\n')\n for (const [appSlug, stats] of appsWithBrokenLinks) {\n console.log(` ${appSlug}: ${stats.broken}/${stats.total} broken`)\n }\n console.log()\n }\n\n if (broken.length > 0) {\n console.log(`\\n❌ Found ${broken.length} broken link(s)`)\n } else {\n console.log('\\n✅ All links are working!')\n }\n}\n"],"mappings":"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"}
@@ -49,12 +49,22 @@ async function getApprovalMethodsFromPrisma() {
49
49
  type: "service",
50
50
  config
51
51
  };
52
- case "personTeam": return {
52
+ case "custom": return {
53
53
  ...baseFields,
54
- type: "personTeam",
54
+ type: "custom",
55
55
  config
56
56
  };
57
- case "custom": return {
57
+ case "noAccessRequired": return {
58
+ ...baseFields,
59
+ type: "noAccessRequired",
60
+ config
61
+ };
62
+ case "unknown": return {
63
+ ...baseFields,
64
+ type: "unknown",
65
+ config
66
+ };
67
+ case "personTeam": return {
58
68
  ...baseFields,
59
69
  type: "custom",
60
70
  config
@@ -80,6 +90,7 @@ function rowToAppForCatalog(row) {
80
90
  const deprecated = row.deprecated == null ? void 0 : row.deprecated;
81
91
  const aiPrompt = row.aiPrompt == null ? void 0 : row.aiPrompt;
82
92
  const urlIssues = row.urlIssues?.length ? row.urlIssues : void 0;
93
+ const tiers = row.tiers == null ? void 0 : row.tiers;
83
94
  return {
84
95
  id: row.id,
85
96
  slug: row.slug,
@@ -97,7 +108,8 @@ function rowToAppForCatalog(row) {
97
108
  sources,
98
109
  deprecated,
99
110
  aiPrompt,
100
- urlIssues
111
+ urlIssues,
112
+ tiers
101
113
  };
102
114
  }
103
115
  async function getAppsFromPrisma() {
@@ -141,11 +153,46 @@ async function updateApp(input) {
141
153
  }
142
154
  return rowToAppForCatalog(updated);
143
155
  }
156
+ async function getPersonsFromPrisma() {
157
+ return (await getDbClient().dbPerson.findMany()).map((row) => ({
158
+ slug: row.slug,
159
+ firstName: row.firstName,
160
+ lastName: row.lastName,
161
+ email: row.email ?? void 0
162
+ }));
163
+ }
164
+ async function getGroupsFromPrisma() {
165
+ return (await getDbClient().dbGroup.findMany({ include: { memberships: true } })).map((row) => ({
166
+ slug: row.slug,
167
+ displayName: row.displayName ?? void 0,
168
+ email: row.email ?? void 0,
169
+ memberSlugs: row.memberships.map((m) => m.personSlug)
170
+ }));
171
+ }
172
+ async function getSubResourcesFromPrisma() {
173
+ return (await getDbClient().dbSubResource.findMany()).map((row) => ({
174
+ slug: row.slug,
175
+ displayName: row.displayName,
176
+ description: row.description ?? void 0,
177
+ appSlug: row.appSlug,
178
+ familySlug: row.familySlug ?? void 0,
179
+ tierSlug: row.tierSlug ?? void 0,
180
+ aliases: row.aliases,
181
+ ownerPersonSlug: row.ownerPersonSlug ?? void 0,
182
+ accessMaintainerGroupSlugs: row.accessMaintainerGroupSlugs,
183
+ accessRequest: row.accessRequest ? row.accessRequest : void 0,
184
+ accessComments: row.accessComments ?? void 0,
185
+ extra: row.extra ? row.extra : void 0
186
+ }));
187
+ }
144
188
  async function getAppCatalogData(getAppsOptional) {
145
189
  return {
146
190
  apps: getAppsOptional ? await getAppsOptional() : await getAppsFromPrisma(),
147
191
  tagsDefinitions: await getGroupingTagDefinitionsFromPrisma(),
148
- approvalMethods: await getApprovalMethodsFromPrisma()
192
+ approvalMethods: await getApprovalMethodsFromPrisma(),
193
+ persons: await getPersonsFromPrisma(),
194
+ groups: await getGroupsFromPrisma(),
195
+ subResources: await getSubResourcesFromPrisma()
149
196
  };
150
197
  }
151
198
 
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":[],"sources":["../../../src/modules/appCatalog/service.ts"],"sourcesContent":["import { getDbClient } from '../../db/client'\nimport type { Prisma } from '../../generated/prisma/client'\nimport type {\n AppApprovalMethod,\n AppCatalogData,\n AppCategory,\n AppForCatalog,\n GroupingTagDefinition,\n} from '../../types/common/appCatalogTypes'\nimport type {\n CustomConfig,\n PersonTeamConfig,\n ServiceConfig,\n} from '../../types/common/approvalMethodTypes'\nimport { omit } from 'radashi'\nimport { parseSourceSlug } from '../../utils/parseSourceSlug'\n\n/** Prisma query result for DbAppForCatalog with sourceRefs included (used by rowToAppForCatalog) */\ntype AppRowWithSourceRefs = Prisma.DbAppForCatalogGetPayload<{\n include: { sourceRefs: true }\n}>\n\nfunction capitalize(word: string): string {\n if (!word) return word\n return word.charAt(0).toUpperCase() + word.slice(1)\n}\n\nexport async function getGroupingTagDefinitionsFromPrisma(): Promise<\n GroupingTagDefinition[]\n> {\n const prisma = getDbClient()\n\n // Fetch all tag definitions\n const rows = await prisma.dbAppTagDefinition.findMany()\n\n // Fetch all apps to count tag usage\n const apps = await prisma.dbAppForCatalog.findMany({\n select: { tags: true },\n })\n\n // Count tag values across all apps\n const tagCounts = new Map<string, Map<string, number>>()\n\n for (const app of apps) {\n const tags = (app.tags as unknown as string[] | null) ?? []\n for (const tag of tags) {\n const [prefix, value] = tag.split(':')\n if (prefix && value) {\n if (!tagCounts.has(prefix)) {\n tagCounts.set(prefix, new Map())\n }\n const prefixCounts = tagCounts.get(prefix)!\n prefixCounts.set(value, (prefixCounts.get(value) ?? 0) + 1)\n }\n }\n }\n\n // Sort values by count and return definitions\n return rows.map((row) => {\n const definition = omit(row, ['id', 'updatedAt', 'createdAt'])\n const counts = tagCounts.get(definition.prefix) ?? new Map()\n\n // Sort values by count (descending)\n const sortedValues = [...definition.values].sort((a, b) => {\n const countA = counts.get(a.value) ?? 0\n const countB = counts.get(b.value) ?? 0\n return countB - countA\n })\n\n return {\n ...definition,\n values: sortedValues,\n }\n })\n}\n\nexport async function getApprovalMethodsFromPrisma(): Promise<\n AppApprovalMethod[]\n> {\n const prisma = getDbClient()\n\n // Fetch all apps\n const rows = await prisma.dbApprovalMethod.findMany()\n\n return rows.map((row) => {\n // Handle discriminated union by explicitly narrowing based on type\n const baseFields = {\n slug: row.slug,\n displayName: row.displayName,\n }\n\n // Provide default empty config if null, as AppApprovalMethod discriminated union requires config\n const config = row.config ?? {}\n\n switch (row.type) {\n case 'service':\n return {\n ...baseFields,\n type: 'service',\n config: config as ServiceConfig,\n }\n case 'personTeam':\n return {\n ...baseFields,\n type: 'personTeam',\n config: config as PersonTeamConfig,\n }\n case 'custom':\n return { ...baseFields, type: 'custom', config: config as CustomConfig }\n }\n })\n}\n\nfunction rowToAppForCatalog(row: AppRowWithSourceRefs): AppForCatalog {\n const accessRequest =\n row.accessRequest as unknown as AppForCatalog['accessRequest']\n const teams = (row.teams as unknown as string[] | null) ?? []\n const tags = (row.tags as unknown as AppForCatalog['tags']) ?? []\n const screenshotIds =\n (row.screenshotIds as unknown as AppForCatalog['screenshotIds']) ?? []\n const sources = row.sourceRefs.map((ref) => ({\n sourceSlug: ref.sourceSlug,\n url: ref.url,\n parseDate: ref.parseDate ? ref.parseDate.toISOString() : null,\n }))\n const notes = row.notes == null ? undefined : row.notes\n const appUrl = row.appUrl == null ? undefined : row.appUrl\n const iconName = row.iconName == null ? undefined : row.iconName\n const abbreviation = row.abbreviation == null ? undefined : row.abbreviation\n const nicknames = (row.nicknames as unknown as string[] | null)?.length\n ? (row.nicknames as unknown as string[])\n : undefined\n const deprecated =\n row.deprecated == null\n ? undefined\n : (row.deprecated as unknown as AppForCatalog['deprecated'])\n const aiPrompt = row.aiPrompt == null ? undefined : row.aiPrompt\n const urlIssues = (row.urlIssues as unknown as string[] | null)?.length\n ? (row.urlIssues as unknown as string[])\n : undefined\n\n return {\n id: row.id,\n slug: row.slug,\n displayName: row.displayName,\n abbreviation,\n nicknames,\n description: row.description,\n accessRequest,\n teams,\n notes,\n tags,\n appUrl,\n iconName,\n screenshotIds,\n sources,\n deprecated,\n aiPrompt,\n urlIssues,\n }\n}\n\nexport async function getAppsFromPrisma(): Promise<AppForCatalog[]> {\n const prisma = getDbClient()\n\n const rows = await prisma.dbAppForCatalog.findMany({\n include: {\n sourceRefs: true,\n },\n })\n\n return rows.map(rowToAppForCatalog)\n}\n\nexport interface UpdateAppInput {\n id: string\n data: {\n displayName?: string\n abbreviation?: string | null\n slug?: string\n appUrl?: string\n description?: string\n sources?: string[]\n aiPrompt?: string | null\n }\n}\n\nexport async function updateApp(input: UpdateAppInput): Promise<AppForCatalog> {\n const prisma = getDbClient()\n const { id, data } = input\n\n const updatePayload: {\n displayName?: string\n abbreviation?: string | null\n slug?: string\n appUrl?: string\n description?: string\n aiPrompt?: string | null\n } = {}\n if (data.displayName !== undefined)\n updatePayload.displayName = data.displayName\n if (data.abbreviation !== undefined)\n updatePayload.abbreviation = data.abbreviation\n if (data.slug !== undefined) updatePayload.slug = data.slug\n if (data.appUrl !== undefined) updatePayload.appUrl = data.appUrl\n if (data.description !== undefined)\n updatePayload.description = data.description\n if (data.aiPrompt !== undefined) updatePayload.aiPrompt = data.aiPrompt\n\n const updated = await prisma.dbAppForCatalog.update({\n where: { id },\n data: updatePayload,\n include: { sourceRefs: true },\n })\n\n if (data.sources !== undefined) {\n const urls = [...new Set(data.sources.map((u) => u.trim()).filter(Boolean))]\n const uniqueSourceSlugs = [...new Set(urls.map(parseSourceSlug))]\n\n for (const sourceSlug of uniqueSourceSlugs) {\n await prisma.source.upsert({\n where: { slug: sourceSlug },\n create: { slug: sourceSlug },\n update: {},\n })\n }\n\n await prisma.sourceReference.deleteMany({\n where: { appId: updated.id },\n })\n\n if (urls.length > 0) {\n await prisma.sourceReference.createMany({\n data: urls.map((url) => ({\n appId: updated.id,\n sourceSlug: parseSourceSlug(url),\n url: url.trim(),\n })),\n })\n }\n\n const refetched = await prisma.dbAppForCatalog.findUnique({\n where: { id },\n include: { sourceRefs: true },\n })\n if (!refetched) throw new Error('App not found after update')\n return rowToAppForCatalog(refetched)\n }\n\n return rowToAppForCatalog(updated)\n}\n\nexport function deriveCategories(apps: AppForCatalog[]): AppCategory[] {\n const tagSet = new Set<string>()\n for (const app of apps) {\n for (const tag of app.tags ?? []) {\n const normalized = tag.trim().toLowerCase()\n if (normalized) tagSet.add(normalized)\n }\n }\n const categories: AppCategory[] = [{ id: 'all', name: 'All' }]\n for (const tag of Array.from(tagSet).sort()) {\n categories.push({ id: tag, name: capitalize(tag) })\n }\n return categories\n}\n\nexport async function getAppCatalogData(\n getAppsOptional?: () => Promise<AppForCatalog[]>,\n): Promise<AppCatalogData> {\n const apps = getAppsOptional\n ? await getAppsOptional()\n : await getAppsFromPrisma()\n\n return {\n apps,\n tagsDefinitions: await getGroupingTagDefinitionsFromPrisma(),\n approvalMethods: await getApprovalMethodsFromPrisma(),\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.mjs","names":[],"sources":["../../../src/modules/appCatalog/service.ts"],"sourcesContent":["import { getDbClient } from '../../db/client'\nimport type { Prisma } from '../../generated/prisma/client'\nimport type {\n AppApprovalMethod,\n AppCatalogData,\n AppCategory,\n AppForCatalog,\n GroupingTagDefinition,\n} from '../../types/common/appCatalogTypes'\nimport type {\n CustomConfig,\n ServiceConfig,\n} from '../../types/common/approvalMethodTypes'\nimport type { Group, Person } from '../../types/common/personGroupTypes'\nimport type { SubResource } from '../../types/common/subResourceTypes'\nimport { omit } from 'radashi'\nimport { parseSourceSlug } from '../../utils/parseSourceSlug'\n\n/** Prisma query result for DbAppForCatalog with sourceRefs included (used by rowToAppForCatalog) */\ntype AppRowWithSourceRefs = Prisma.DbAppForCatalogGetPayload<{\n include: { sourceRefs: true }\n}>\n\nfunction capitalize(word: string): string {\n if (!word) return word\n return word.charAt(0).toUpperCase() + word.slice(1)\n}\n\nexport async function getGroupingTagDefinitionsFromPrisma(): Promise<\n GroupingTagDefinition[]\n> {\n const prisma = getDbClient()\n\n // Fetch all tag definitions\n const rows = await prisma.dbAppTagDefinition.findMany()\n\n // Fetch all apps to count tag usage\n const apps = await prisma.dbAppForCatalog.findMany({\n select: { tags: true },\n })\n\n // Count tag values across all apps\n const tagCounts = new Map<string, Map<string, number>>()\n\n for (const app of apps) {\n const tags = (app.tags as unknown as string[] | null) ?? []\n for (const tag of tags) {\n const [prefix, value] = tag.split(':')\n if (prefix && value) {\n if (!tagCounts.has(prefix)) {\n tagCounts.set(prefix, new Map())\n }\n const prefixCounts = tagCounts.get(prefix)!\n prefixCounts.set(value, (prefixCounts.get(value) ?? 0) + 1)\n }\n }\n }\n\n // Sort values by count and return definitions\n return rows.map((row) => {\n const definition = omit(row, ['id', 'updatedAt', 'createdAt'])\n const counts = tagCounts.get(definition.prefix) ?? new Map()\n\n // Sort values by count (descending)\n const sortedValues = [...definition.values].sort((a, b) => {\n const countA = counts.get(a.value) ?? 0\n const countB = counts.get(b.value) ?? 0\n return countB - countA\n })\n\n return {\n ...definition,\n values: sortedValues,\n }\n })\n}\n\nexport async function getApprovalMethodsFromPrisma(): Promise<\n AppApprovalMethod[]\n> {\n const prisma = getDbClient()\n\n // Fetch all apps\n const rows = await prisma.dbApprovalMethod.findMany()\n\n return rows.map((row) => {\n // Handle discriminated union by explicitly narrowing based on type\n const baseFields = {\n slug: row.slug,\n displayName: row.displayName,\n }\n\n // Provide default empty config if null, as AppApprovalMethod discriminated union requires config\n const config = row.config ?? {}\n\n switch (row.type) {\n case 'service':\n return {\n ...baseFields,\n type: 'service' as const,\n config: config as ServiceConfig,\n }\n case 'custom':\n return {\n ...baseFields,\n type: 'custom' as const,\n config: config as CustomConfig,\n }\n case 'noAccessRequired':\n return {\n ...baseFields,\n type: 'noAccessRequired' as const,\n config: config as CustomConfig,\n }\n case 'unknown':\n return {\n ...baseFields,\n type: 'unknown' as const,\n config: config as CustomConfig,\n }\n case 'personTeam':\n // Legacy: map personTeam to custom\n return {\n ...baseFields,\n type: 'custom' as const,\n config: config as CustomConfig,\n }\n }\n })\n}\n\nfunction rowToAppForCatalog(row: AppRowWithSourceRefs): AppForCatalog {\n const accessRequest =\n row.accessRequest as unknown as AppForCatalog['accessRequest']\n const teams = (row.teams as unknown as string[] | null) ?? []\n const tags = (row.tags as unknown as AppForCatalog['tags']) ?? []\n const screenshotIds =\n (row.screenshotIds as unknown as AppForCatalog['screenshotIds']) ?? []\n const sources = row.sourceRefs.map((ref) => ({\n sourceSlug: ref.sourceSlug,\n url: ref.url,\n parseDate: ref.parseDate ? ref.parseDate.toISOString() : null,\n }))\n const notes = row.notes == null ? undefined : row.notes\n const appUrl = row.appUrl == null ? undefined : row.appUrl\n const iconName = row.iconName == null ? undefined : row.iconName\n const abbreviation = row.abbreviation == null ? undefined : row.abbreviation\n const nicknames = (row.nicknames as unknown as string[] | null)?.length\n ? (row.nicknames as unknown as string[])\n : undefined\n const deprecated =\n row.deprecated == null\n ? undefined\n : (row.deprecated as unknown as AppForCatalog['deprecated'])\n const aiPrompt = row.aiPrompt == null ? undefined : row.aiPrompt\n const urlIssues = (row.urlIssues as unknown as string[] | null)?.length\n ? (row.urlIssues as unknown as string[])\n : undefined\n const tiers =\n row.tiers == null\n ? undefined\n : (row.tiers as unknown as AppForCatalog['tiers'])\n\n return {\n id: row.id,\n slug: row.slug,\n displayName: row.displayName,\n abbreviation,\n nicknames,\n description: row.description,\n accessRequest,\n teams,\n notes,\n tags,\n appUrl,\n iconName,\n screenshotIds,\n sources,\n deprecated,\n aiPrompt,\n urlIssues,\n tiers,\n }\n}\n\nexport async function getAppsFromPrisma(): Promise<AppForCatalog[]> {\n const prisma = getDbClient()\n\n const rows = await prisma.dbAppForCatalog.findMany({\n include: {\n sourceRefs: true,\n },\n })\n\n return rows.map(rowToAppForCatalog)\n}\n\nexport interface UpdateAppInput {\n id: string\n data: {\n displayName?: string\n abbreviation?: string | null\n slug?: string\n appUrl?: string\n description?: string\n sources?: string[]\n aiPrompt?: string | null\n }\n}\n\nexport async function updateApp(input: UpdateAppInput): Promise<AppForCatalog> {\n const prisma = getDbClient()\n const { id, data } = input\n\n const updatePayload: {\n displayName?: string\n abbreviation?: string | null\n slug?: string\n appUrl?: string\n description?: string\n aiPrompt?: string | null\n } = {}\n if (data.displayName !== undefined)\n updatePayload.displayName = data.displayName\n if (data.abbreviation !== undefined)\n updatePayload.abbreviation = data.abbreviation\n if (data.slug !== undefined) updatePayload.slug = data.slug\n if (data.appUrl !== undefined) updatePayload.appUrl = data.appUrl\n if (data.description !== undefined)\n updatePayload.description = data.description\n if (data.aiPrompt !== undefined) updatePayload.aiPrompt = data.aiPrompt\n\n const updated = await prisma.dbAppForCatalog.update({\n where: { id },\n data: updatePayload,\n include: { sourceRefs: true },\n })\n\n if (data.sources !== undefined) {\n const urls = [...new Set(data.sources.map((u) => u.trim()).filter(Boolean))]\n const uniqueSourceSlugs = [...new Set(urls.map(parseSourceSlug))]\n\n for (const sourceSlug of uniqueSourceSlugs) {\n await prisma.source.upsert({\n where: { slug: sourceSlug },\n create: { slug: sourceSlug },\n update: {},\n })\n }\n\n await prisma.sourceReference.deleteMany({\n where: { appId: updated.id },\n })\n\n if (urls.length > 0) {\n await prisma.sourceReference.createMany({\n data: urls.map((url) => ({\n appId: updated.id,\n sourceSlug: parseSourceSlug(url),\n url: url.trim(),\n })),\n })\n }\n\n const refetched = await prisma.dbAppForCatalog.findUnique({\n where: { id },\n include: { sourceRefs: true },\n })\n if (!refetched) throw new Error('App not found after update')\n return rowToAppForCatalog(refetched)\n }\n\n return rowToAppForCatalog(updated)\n}\n\nexport function deriveCategories(apps: AppForCatalog[]): AppCategory[] {\n const tagSet = new Set<string>()\n for (const app of apps) {\n for (const tag of app.tags ?? []) {\n const normalized = tag.trim().toLowerCase()\n if (normalized) tagSet.add(normalized)\n }\n }\n const categories: AppCategory[] = [{ id: 'all', name: 'All' }]\n for (const tag of Array.from(tagSet).sort()) {\n categories.push({ id: tag, name: capitalize(tag) })\n }\n return categories\n}\n\nexport async function getPersonsFromPrisma(): Promise<Person[]> {\n const prisma = getDbClient()\n const rows = await prisma.dbPerson.findMany()\n return rows.map((row) => ({\n slug: row.slug,\n firstName: row.firstName,\n lastName: row.lastName,\n email: row.email ?? undefined,\n }))\n}\n\nexport async function getGroupsFromPrisma(): Promise<Group[]> {\n const prisma = getDbClient()\n const rows = await prisma.dbGroup.findMany({\n include: { memberships: true },\n })\n return rows.map((row) => ({\n slug: row.slug,\n displayName: row.displayName ?? undefined,\n email: row.email ?? undefined,\n memberSlugs: row.memberships.map((m) => m.personSlug),\n }))\n}\n\nexport async function getSubResourcesFromPrisma(): Promise<SubResource[]> {\n const prisma = getDbClient()\n const rows = await prisma.dbSubResource.findMany()\n return rows.map((row) => ({\n slug: row.slug,\n displayName: row.displayName,\n description: row.description ?? undefined,\n appSlug: row.appSlug,\n familySlug: row.familySlug ?? undefined,\n tierSlug: row.tierSlug ?? undefined,\n aliases: row.aliases as unknown as string[],\n ownerPersonSlug: row.ownerPersonSlug ?? undefined,\n accessMaintainerGroupSlugs:\n row.accessMaintainerGroupSlugs as unknown as string[],\n accessRequest: row.accessRequest\n ? (row.accessRequest as unknown as SubResource['accessRequest'])\n : undefined,\n accessComments: row.accessComments ?? undefined,\n extra: row.extra\n ? (row.extra as unknown as Record<string, unknown>)\n : undefined,\n }))\n}\n\nexport async function getAppCatalogData(\n getAppsOptional?: () => Promise<AppForCatalog[]>,\n): Promise<AppCatalogData> {\n const apps = getAppsOptional\n ? await getAppsOptional()\n : await getAppsFromPrisma()\n\n return {\n apps,\n tagsDefinitions: await getGroupingTagDefinitionsFromPrisma(),\n approvalMethods: await getApprovalMethodsFromPrisma(),\n persons: await getPersonsFromPrisma(),\n groups: await getGroupsFromPrisma(),\n subResources: await getSubResourcesFromPrisma(),\n }\n}\n"],"mappings":"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"}
@@ -25,7 +25,11 @@ function registerAuthRoutes(app, auth, isAdmin) {
25
25
  ...session,
26
26
  isAdmin: admin
27
27
  });
28
- } else res.status(401).json({ error: "Not authenticated" });
28
+ } else res.json({
29
+ session: null,
30
+ user: null,
31
+ isAuthenticated: false
32
+ });
29
33
  } catch (error) {
30
34
  console.error("[Auth Session Error]", error);
31
35
  res.status(500).json({ error: "Internal server error" });
@@ -1 +1 @@
1
- {"version":3,"file":"registerAuthRoutes.mjs","names":[],"sources":["../../../src/modules/auth/registerAuthRoutes.ts"],"sourcesContent":["import { toNodeHandler } from 'better-auth/node'\nimport type { Express, Request, Response } from 'express'\nimport type { Session, User } from 'better-auth/types'\nimport type { BetterAuth } from './auth'\n\n/**\n * Register Better Auth routes with Express\n * @param app - Express application instance\n * @param auth - Better Auth instance\n * @param isAdmin - Optional callback to determine if user is admin\n */\nexport function registerAuthRoutes(\n app: Express,\n auth: BetterAuth,\n isAdmin?: (\n user: User,\n session: Session,\n ctx: { request: Request; auth: BetterAuth },\n ) => boolean | Promise<boolean>,\n) {\n // Explicit session endpoint handler\n app.get('/api/auth/session', async (req: Request, res: Response) => {\n try {\n const session = await auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n if (session) {\n let admin = false\n if (isAdmin) {\n try {\n admin = !!(await isAdmin(session.user, session.session, {\n request: req,\n auth,\n }))\n } catch {\n admin = false\n }\n }\n res.json({ ...session, isAdmin: admin })\n } else {\n res.status(401).json({ error: 'Not authenticated' })\n }\n } catch (error) {\n console.error('[Auth Session Error]', error)\n res.status(500).json({ error: 'Internal server error' })\n }\n })\n\n // Use toNodeHandler to adapt better-auth for Express/Node.js\n const authHandler = toNodeHandler(auth)\n app.all('/api/auth/{*any}', authHandler)\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,mBACd,KACA,MACA,SAKA;AAEA,KAAI,IAAI,qBAAqB,OAAO,KAAc,QAAkB;AAClE,MAAI;GACF,MAAM,UAAU,MAAM,KAAK,IAAI,WAAW,EACxC,SAAS,IAAI,SACd,CAAC;AACF,OAAI,SAAS;IACX,IAAI,QAAQ;AACZ,QAAI,QACF,KAAI;AACF,aAAQ,CAAC,CAAE,MAAM,QAAQ,QAAQ,MAAM,QAAQ,SAAS;MACtD,SAAS;MACT;MACD,CAAC;YACI;AACN,aAAQ;;AAGZ,QAAI,KAAK;KAAE,GAAG;KAAS,SAAS;KAAO,CAAC;SAExC,KAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,qBAAqB,CAAC;WAE/C,OAAO;AACd,WAAQ,MAAM,wBAAwB,MAAM;AAC5C,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;GAE1D;CAGF,MAAM,cAAc,cAAc,KAAK;AACvC,KAAI,IAAI,oBAAoB,YAAY"}
1
+ {"version":3,"file":"registerAuthRoutes.mjs","names":[],"sources":["../../../src/modules/auth/registerAuthRoutes.ts"],"sourcesContent":["import { toNodeHandler } from 'better-auth/node'\nimport type { Express, Request, Response } from 'express'\nimport type { Session, User } from 'better-auth/types'\nimport type { BetterAuth } from './auth'\n\n/**\n * Register Better Auth routes with Express\n * @param app - Express application instance\n * @param auth - Better Auth instance\n * @param isAdmin - Optional callback to determine if user is admin\n */\nexport function registerAuthRoutes(\n app: Express,\n auth: BetterAuth,\n isAdmin?: (\n user: User,\n session: Session,\n ctx: { request: Request; auth: BetterAuth },\n ) => boolean | Promise<boolean>,\n) {\n // Explicit session endpoint handler\n app.get('/api/auth/session', async (req: Request, res: Response) => {\n try {\n const session = await auth.api.getSession({\n headers: req.headers as HeadersInit,\n })\n if (session) {\n let admin = false\n if (isAdmin) {\n try {\n admin = !!(await isAdmin(session.user, session.session, {\n request: req,\n auth,\n }))\n } catch {\n admin = false\n }\n }\n res.json({ ...session, isAdmin: admin })\n } else {\n // Return 200 with null session instead of 401 to avoid\n // browser \"Failed to load resource\" console errors.\n // The frontend checks for session.user to determine auth state.\n res.json({ session: null, user: null, isAuthenticated: false })\n }\n } catch (error) {\n console.error('[Auth Session Error]', error)\n res.status(500).json({ error: 'Internal server error' })\n }\n })\n\n // Use toNodeHandler to adapt better-auth for Express/Node.js\n const authHandler = toNodeHandler(auth)\n app.all('/api/auth/{*any}', authHandler)\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,mBACd,KACA,MACA,SAKA;AAEA,KAAI,IAAI,qBAAqB,OAAO,KAAc,QAAkB;AAClE,MAAI;GACF,MAAM,UAAU,MAAM,KAAK,IAAI,WAAW,EACxC,SAAS,IAAI,SACd,CAAC;AACF,OAAI,SAAS;IACX,IAAI,QAAQ;AACZ,QAAI,QACF,KAAI;AACF,aAAQ,CAAC,CAAE,MAAM,QAAQ,QAAQ,MAAM,QAAQ,SAAS;MACtD,SAAS;MACT;MACD,CAAC;YACI;AACN,aAAQ;;AAGZ,QAAI,KAAK;KAAE,GAAG;KAAS,SAAS;KAAO,CAAC;SAKxC,KAAI,KAAK;IAAE,SAAS;IAAM,MAAM;IAAM,iBAAiB;IAAO,CAAC;WAE1D,OAAO;AACd,WAAQ,MAAM,wBAAwB,MAAM;AAC5C,OAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;GAE1D;CAGF,MAAM,cAAc,cAAc,KAAK;AACvC,KAAI,IAAI,oBAAoB,YAAY"}
@@ -11,7 +11,7 @@ declare function createAppCatalogAITools(databaseConfig: AcDatabaseConfig): Reco
11
11
  * Default system prompt for AI working with app catalog cards.
12
12
  * Use this when configuring lighthouseKeeper for card updates.
13
13
  */
14
- declare const APP_CATALOG_AI_SYSTEM_PROMPT = "You are an assistant that helps update app catalog cards based on information from provided links.\n\nWhen given a link and an app ID:\n1. Use getAppCard to fetch the current card information\n2. Analyze the provided link for relevant information\n3. Output a new card structure with updated information based on the link\n\nReturn the updated card as a structured JSON object matching the card format:\n- displayName: App title\n- description: Full description\n- tags: Array of tags\n- teams: Array of team names\n- appUrl: Main application URL\n- links: Array of {url, title} objects for related links\n- sources: Array of source URLs (documentation, Confluence pages, etc.)\n- accessRequest: Object with approvalMethodId, comments, requestPrompt, postApprovalInstructions, roles, approvers, urls, whoToReachOut\n- notes: Additional notes\n- deprecated: Optional deprecation info with type, replacementSlug, comment\n\nDo NOT save the card to the database. Only output the updated structure.";
14
+ declare const APP_CATALOG_AI_SYSTEM_PROMPT = "You are an assistant that helps update app catalog cards based on information from provided links.\n\nWhen given a link and an app ID:\n1. Use getAppCard to fetch the current card information\n2. Analyze the provided link for relevant information\n3. Output a new card structure with updated information based on the link\n\nReturn the updated card as a structured JSON object matching the card format:\n- displayName: App title\n- description: Full description\n- tags: Array of tags\n- teams: Array of team names\n- appUrl: Main application URL\n- links: Array of {url, title} objects for related links\n- sources: Array of source URLs (documentation, Confluence pages, etc.)\n- accessRequest: Object with approvalMethodSlug, comments, requestPrompt, postApprovalInstructions, roles, approverPersonSlugs, urls\n- notes: Additional notes\n- deprecated: Optional deprecation info with type, replacementSlug, comment\n\nDo NOT save the card to the database. Only output the updated structure.";
15
15
  //#endregion
16
16
  export { APP_CATALOG_AI_SYSTEM_PROMPT, createAppCatalogAITools };
17
17
  //# sourceMappingURL=tools.d.mts.map
@@ -71,7 +71,7 @@ Return the updated card as a structured JSON object matching the card format:
71
71
  - appUrl: Main application URL
72
72
  - links: Array of {url, title} objects for related links
73
73
  - sources: Array of source URLs (documentation, Confluence pages, etc.)
74
- - accessRequest: Object with approvalMethodId, comments, requestPrompt, postApprovalInstructions, roles, approvers, urls, whoToReachOut
74
+ - accessRequest: Object with approvalMethodSlug, comments, requestPrompt, postApprovalInstructions, roles, approverPersonSlugs, urls
75
75
  - notes: Additional notes
76
76
  - deprecated: Optional deprecation info with type, replacementSlug, comment
77
77