@package-broker/core 0.11.0 → 0.13.1

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.
@@ -799,6 +799,23 @@ export declare const packages: import("drizzle-orm/sqlite-core").SQLiteTableWith
799
799
  }, {}, {
800
800
  length: number | undefined;
801
801
  }>;
802
+ is_manual_upload: import("drizzle-orm/sqlite-core").SQLiteColumn<{
803
+ name: "is_manual_upload";
804
+ tableName: "packages";
805
+ dataType: "number";
806
+ columnType: "SQLiteInteger";
807
+ data: number;
808
+ driverParam: number;
809
+ notNull: true;
810
+ hasDefault: true;
811
+ isPrimaryKey: false;
812
+ isAutoincrement: false;
813
+ hasRuntimeDefault: false;
814
+ enumValues: undefined;
815
+ baseColumn: never;
816
+ identity: undefined;
817
+ generated: undefined;
818
+ }, {}, {}>;
802
819
  created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
803
820
  name: "created_at";
804
821
  tableName: "packages";
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBxB,CAAC;AAGF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAelB,CAAC;AAGF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BrB,CAAC;AAGF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BpB,CAAC;AAGF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBjB,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBxB,CAAC;AAGF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAelB,CAAC;AAGF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BrB,CAAC;AAGF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BpB,CAAC;AAGF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBjB,CAAC"}
package/dist/db/schema.js CHANGED
@@ -69,10 +69,12 @@ export const packages = sqliteTable('packages', {
69
69
  released_at: integer('released_at'),
70
70
  readme_content: text('readme_content'),
71
71
  metadata: text('metadata'), // Complete upstream package metadata as JSON
72
+ is_manual_upload: integer('is_manual_upload').default(0).notNull(), // Flag for manually uploaded packages
72
73
  created_at: integer('created_at').notNull(),
73
74
  }, (table) => ({
74
75
  repoIdIdx: index('idx_packages_repo_id').on(table.repo_id),
75
76
  nameIdx: index('idx_packages_name').on(table.name),
77
+ manualUploadIdx: index('idx_packages_manual_upload').on(table.is_manual_upload),
76
78
  // Unique constraint to prevent duplicate package+version entries
77
79
  uniquePackageVersionIdx: unique('packages_name_version_unique').on(table.name, table.version),
78
80
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEpF,qBAAqB;AACrB,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CACrC,cAAc,EACd;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;IAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,2DAA2D;IACjG,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE,qDAAqD;IACzG,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE,iDAAiD;IACvG,kBAAkB,EAAE,IAAI,CAAC,oBAAoB,CAAC,EAAE,2DAA2D;IAC3G,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,8EAA8E;IACtH,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,0CAA0C;IACrF,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC,gBAAgB,CAAC;IACzC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CAC5C,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC5D,aAAa,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IAC7E,iBAAiB,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC;IACtF,UAAU,EAAE,KAAK,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;CAClE,CAAC,CACH,CAAC;AAEF,eAAe;AACf,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAC/B,QAAQ,EACR;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAC1C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,uCAAuC;IACjF,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,uBAAuB;IACvF,cAAc,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,yCAAyC;IACpF,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAC3C,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC;CACtC,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,YAAY,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;CAClE,CAAC,CACH,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAClC,WAAW,EACX;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;SACrB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC5C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IAClC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,YAAY;IAClD,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC/B,cAAc,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,sBAAsB;IAC5E,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAC3C,kBAAkB,EAAE,OAAO,CAAC,oBAAoB,CAAC;CAClD,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IAC3D,cAAc,EAAE,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;IAC1E,iBAAiB,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;IACtF,uDAAuD;IACvD,iBAAiB,EAAE,MAAM,CAAC,gCAAgC,CAAC,CAAC,EAAE,CAC5D,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,OAAO,CACd;CACF,CAAC,CACH,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CACjC,UAAU,EACV;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;SACrB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IAClC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IACpC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,yDAAyD;IACnG,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,8FAA8F;IACtI,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;IAChC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,gCAAgC;IAC1D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,qCAAqC;IACzE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC;IACnC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC;IACtC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,6CAA6C;IACzE,gBAAgB,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,sCAAsC;IAC1G,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CAC5C,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IAC1D,OAAO,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;IAClD,eAAe,EAAE,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC;IAC/E,iEAAiE;IACjE,uBAAuB,EAAE,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;CAC9F,CAAC,CACH,CAAC;AAEF,qCAAqC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAC9B,OAAO,EACP;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IACvC,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,wBAAwB;IACxE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,qBAAqB;IACpE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,mCAAmC;IACvF,iBAAiB,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAC5C,kBAAkB,EAAE,OAAO,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACrF,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,yCAAyC;IACjF,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,qCAAqC;IACzE,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC,EAAE,kCAAkC;IACnF,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAC3C,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC;CACxC,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IAClD,cAAc,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;CACvE,CAAC,CACH,CAAC;AAEF,oEAAoE;AACpE,gFAAgF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/packages/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI/D,QAAA,MAAM,cAAc;cAA+B,WAAW;eAAa,YAAY;WAAK,CAAC;AAY7F,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/packages/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI/D,QAAA,MAAM,cAAc;cAA+B,WAAW;eAAa,YAAY;WAAK,CAAC;AAc7F,eAAe,cAAc,CAAC"}
@@ -12,6 +12,8 @@ packagesModule.openapi(routes.listPackagesRouteDef, handlers.listPackages);
12
12
  packagesModule.openapi(routes.getPackageRouteDef, handlers.getPackage);
13
13
  packagesModule.openapi(routes.getPackageReadmeRouteDef, handlers.getPackageReadme);
14
14
  packagesModule.openapi(routes.getPackageChangelogRouteDef, handlers.getPackageChangelog);
15
+ packagesModule.openapi(routes.uploadPackageRouteDef, handlers.uploadPackage);
16
+ packagesModule.openapi(routes.deletePackageVersionRouteDef, handlers.deletePackageVersion);
15
17
  // Non-OpenAPI routes
16
18
  packagesModule.post('/add-from-mirror', handlers.addPackagesFromMirror);
17
19
  packagesModule.post('/cleanup-numeric-versions', handlers.cleanupNumericVersions);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/packages/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAEhD,MAAM,cAAc,GAAG,IAAI,WAAW,EAAsD,CAAC;AAE7F,0FAA0F;AAC1F,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,QAAQ,CAAC,YAAmB,CAAC,CAAC;AAClF,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,UAAiB,CAAC,CAAC;AAC9E,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,QAAQ,CAAC,gBAAuB,CAAC,CAAC;AAC1F,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,QAAQ,CAAC,mBAA0B,CAAC,CAAC;AAEhG,qBAAqB;AACrB,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AACxE,cAAc,CAAC,IAAI,CAAC,2BAA2B,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AAElF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/packages/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAEhD,MAAM,cAAc,GAAG,IAAI,WAAW,EAAsD,CAAC;AAE7F,0FAA0F;AAC1F,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,QAAQ,CAAC,YAAmB,CAAC,CAAC;AAClF,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,UAAiB,CAAC,CAAC;AAC9E,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,QAAQ,CAAC,gBAAuB,CAAC,CAAC;AAC1F,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,QAAQ,CAAC,mBAA0B,CAAC,CAAC;AAChG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,QAAQ,CAAC,aAAoB,CAAC,CAAC;AACpF,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,4BAA4B,EAAE,QAAQ,CAAC,oBAA2B,CAAC,CAAC;AAElG,qBAAqB;AACrB,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AACxE,cAAc,CAAC,IAAI,CAAC,2BAA2B,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AAElF,eAAe,cAAc,CAAC"}
@@ -15,10 +15,13 @@ export interface PackagesRouteEnv {
15
15
  }
16
16
  /**
17
17
  * GET /api/packages
18
- * List all packages (with optional search)
18
+ * List all packages with optional search and pagination
19
+ * Paginates by unique package names (not individual versions)
19
20
  */
20
21
  export declare function listPackages(c: OpenAPIContext<PackagesRouteEnv, any, any, {
21
22
  search?: string;
23
+ page?: number;
24
+ limit?: number;
22
25
  }>): Promise<Response>;
23
26
  /**
24
27
  * GET /api/packages/:name
@@ -42,9 +45,26 @@ export declare function getPackageChangelog(c: OpenAPIContext<PackagesRouteEnv>)
42
45
  * Manually fetch and store packages from a selected mirror repository
43
46
  */
44
47
  export declare function addPackagesFromMirror(c: Context<PackagesRouteEnv>): Promise<Response>;
48
+ /**
49
+ * POST /api/packages/upload
50
+ * Upload a package archive with composer.json metadata
51
+ *
52
+ * Performance optimized for Cloudflare Workers:
53
+ * - Validates archive before storage
54
+ * - Automatically creates "manual" repository if needed
55
+ * - Stores in private storage
56
+ * - Extracts README for better UX
57
+ */
58
+ export declare function uploadPackage(c: OpenAPIContext<PackagesRouteEnv>): Promise<Response>;
45
59
  /**
46
60
  * POST /packages/cleanup-numeric-versions
47
61
  * Temporary utility to fix versioning issues
48
62
  */
49
63
  export declare function cleanupNumericVersions(c: Context<PackagesRouteEnv>): Promise<Response>;
64
+ /**
65
+ * DELETE /api/packages/:name/:version
66
+ * Delete a specific package version
67
+ * Removes: package record, artifact record, and stored files (archive, README, changelog)
68
+ */
69
+ export declare function deletePackageVersion(c: OpenAPIContext<PackagesRouteEnv>): Promise<Response>;
50
70
  //# sourceMappingURL=packages.handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packages.handlers.d.ts","sourceRoot":"","sources":["../../../src/modules/packages/packages.handlers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU,CAAC;QACf,EAAE,EAAE,WAAW,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,EAAE;QACT,QAAQ,EAAE,YAAY,CAAC;QACvB,OAAO,EAAE,aAAa,CAAC;KACxB,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBxH;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoBvF;AA4ED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqR7F;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoRhG;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsF3F;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAI5F"}
1
+ {"version":3,"file":"packages.handlers.d.ts","sourceRoot":"","sources":["../../../src/modules/packages/packages.handlers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU,CAAC;QACf,EAAE,EAAE,WAAW,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,EAAE;QACT,QAAQ,EAAE,YAAY,CAAC;QACvB,OAAO,EAAE,aAAa,CAAC;KACxB,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgEvJ;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoBvF;AA4ED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqR7F;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoRhG;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsF3F;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+O1F;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAI5F;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6GjG"}
@@ -1,6 +1,6 @@
1
1
  // Packages API routes
2
2
  import { packages, artifacts, repositories } from '../../db/schema';
3
- import { eq, like, and } from 'drizzle-orm';
3
+ import { eq, like, and, countDistinct, inArray } from 'drizzle-orm';
4
4
  import { unzipSync, strFromU8 } from 'fflate';
5
5
  import { buildStorageKey, buildReadmeStorageKey, buildChangelogStorageKey } from '../../storage/driver';
6
6
  import { downloadFromSource } from '../../utils/download';
@@ -8,26 +8,67 @@ import { decryptCredentials } from '../../utils/encryption';
8
8
  import { nanoid } from 'nanoid';
9
9
  import { COMPOSER_USER_AGENT } from '@package-broker/shared';
10
10
  import { isPackagistMirroringEnabled } from '../admin';
11
+ import { getLogger } from '../../utils/logger';
11
12
  /**
12
13
  * GET /api/packages
13
- * List all packages (with optional search)
14
+ * List all packages with optional search and pagination
15
+ * Paginates by unique package names (not individual versions)
14
16
  */
15
17
  export async function listPackages(c) {
16
18
  const db = c.get('database');
17
19
  const query = c.req.valid('query');
18
20
  const search = query?.search;
19
- let allPackages;
20
- if (search) {
21
- allPackages = await db
22
- .select()
23
- .from(packages)
24
- .where(like(packages.name, `%${search}%`))
25
- .orderBy(packages.name);
21
+ const page = query?.page ?? 1;
22
+ const limit = query?.limit ?? 20;
23
+ const offset = (page - 1) * limit;
24
+ // Build where clause
25
+ const whereClause = search ? like(packages.name, `%${search}%`) : undefined;
26
+ // Get total count of UNIQUE package names
27
+ const [countResult] = await db
28
+ .select({ count: countDistinct(packages.name) })
29
+ .from(packages)
30
+ .where(whereClause);
31
+ const total = countResult?.count ?? 0;
32
+ const totalPages = Math.ceil(total / limit);
33
+ // Get paginated UNIQUE package names
34
+ let namesQuery = db
35
+ .selectDistinct({ name: packages.name })
36
+ .from(packages)
37
+ .orderBy(packages.name)
38
+ .limit(limit)
39
+ .offset(offset);
40
+ if (whereClause) {
41
+ namesQuery = namesQuery.where(whereClause);
26
42
  }
27
- else {
28
- allPackages = await db.select().from(packages).orderBy(packages.name);
43
+ const packageNames = await namesQuery;
44
+ const names = packageNames.map((p) => p.name);
45
+ // If no packages found, return empty result
46
+ if (names.length === 0) {
47
+ return c.json({
48
+ data: [],
49
+ pagination: {
50
+ page,
51
+ limit,
52
+ total,
53
+ totalPages,
54
+ },
55
+ });
29
56
  }
30
- return c.json(allPackages);
57
+ // Fetch all versions for the paginated package names
58
+ const data = await db
59
+ .select()
60
+ .from(packages)
61
+ .where(inArray(packages.name, names))
62
+ .orderBy(packages.name);
63
+ return c.json({
64
+ data,
65
+ pagination: {
66
+ page,
67
+ limit,
68
+ total,
69
+ totalPages,
70
+ },
71
+ });
31
72
  }
32
73
  /**
33
74
  * GET /api/packages/:name
@@ -658,6 +699,211 @@ export async function addPackagesFromMirror(c) {
658
699
  }
659
700
  return c.json({ results });
660
701
  }
702
+ /**
703
+ * POST /api/packages/upload
704
+ * Upload a package archive with composer.json metadata
705
+ *
706
+ * Performance optimized for Cloudflare Workers:
707
+ * - Validates archive before storage
708
+ * - Automatically creates "manual" repository if needed
709
+ * - Stores in private storage
710
+ * - Extracts README for better UX
711
+ */
712
+ export async function uploadPackage(c) {
713
+ const logger = getLogger();
714
+ const db = c.get('database');
715
+ const storage = c.get('storage');
716
+ const now = Math.floor(Date.now() / 1000);
717
+ // Parse multipart form data
718
+ const body = await c.req.parseBody();
719
+ const file = body.file;
720
+ if (!file || !(file instanceof File)) {
721
+ return c.json({
722
+ error: 'Bad Request',
723
+ message: 'Missing or invalid file upload',
724
+ }, 400);
725
+ }
726
+ // Check file size (max 100MB)
727
+ const MAX_FILE_SIZE = 100 * 1024 * 1024;
728
+ if (file.size > MAX_FILE_SIZE) {
729
+ return c.json({
730
+ error: 'Payload Too Large',
731
+ message: `File too large: ${Math.round(file.size / 1024 / 1024)}MB (max 100MB)`,
732
+ }, 413);
733
+ }
734
+ // Convert file to Uint8Array
735
+ const arrayBuffer = await file.arrayBuffer();
736
+ const archiveData = new Uint8Array(arrayBuffer);
737
+ // Comprehensive debug logging
738
+ const firstBytes = Array.from(archiveData.slice(0, 16)).map(b => b.toString(16).padStart(2, '0')).join(' ');
739
+ logger.info('Package upload received', {
740
+ fileName: file.name,
741
+ fileSize: file.size,
742
+ fileType: file.type,
743
+ arrayBufferSize: arrayBuffer.byteLength,
744
+ archiveDataSize: archiveData.length,
745
+ firstBytes,
746
+ isValidZipMagic: archiveData[0] === 0x50 && archiveData[1] === 0x4B,
747
+ });
748
+ // Validate package archive and extract composer.json
749
+ const { validatePackageArchive, extractReadme: extractReadmeFromValidator } = await import('../../utils/package-validator.js');
750
+ const validation = await validatePackageArchive(archiveData);
751
+ // Log validation result for debugging
752
+ if (!validation.success) {
753
+ logger.warn('Package validation failed', {
754
+ fileName: file.name,
755
+ errors: validation.errors,
756
+ });
757
+ }
758
+ if (!validation.success || !validation.metadata) {
759
+ return c.json({
760
+ error: 'Bad Request',
761
+ message: 'Invalid package archive',
762
+ details: validation.errors || [],
763
+ }, 400);
764
+ }
765
+ const metadata = validation.metadata;
766
+ const { name, version } = metadata;
767
+ // Check if package+version already exists
768
+ const [existing] = await db
769
+ .select()
770
+ .from(packages)
771
+ .where(and(eq(packages.name, name), eq(packages.version, version)))
772
+ .limit(1);
773
+ if (existing) {
774
+ return c.json({
775
+ error: 'Conflict',
776
+ message: `Package ${name}@${version} already exists`,
777
+ }, 409);
778
+ }
779
+ // Ensure "manual" repository exists
780
+ const MANUAL_REPO_ID = 'manual';
781
+ const [manualRepo] = await db
782
+ .select()
783
+ .from(repositories)
784
+ .where(eq(repositories.id, MANUAL_REPO_ID))
785
+ .limit(1);
786
+ if (!manualRepo) {
787
+ // Create manual repository
788
+ try {
789
+ await db.insert(repositories).values({
790
+ id: MANUAL_REPO_ID,
791
+ url: 'manual://uploads',
792
+ vcs_type: 'manual',
793
+ credential_type: 'none',
794
+ auth_credentials: '{}', // Empty credentials
795
+ composer_json_path: null,
796
+ package_filter: null,
797
+ status: 'active',
798
+ error_message: null,
799
+ last_synced_at: now,
800
+ created_at: now,
801
+ });
802
+ logger.info('Created manual repository for uploads');
803
+ }
804
+ catch (error) {
805
+ logger.error('Failed to create manual repository', {}, error instanceof Error ? error : new Error(String(error)));
806
+ return c.json({
807
+ error: 'Internal Server Error',
808
+ message: 'Failed to create manual repository',
809
+ }, 500);
810
+ }
811
+ }
812
+ // Store archive in private storage
813
+ const storageKey = buildStorageKey('private', MANUAL_REPO_ID, name, version);
814
+ try {
815
+ // Convert to ArrayBuffer for storage (avoid SharedArrayBuffer)
816
+ const storageBuffer = archiveData.buffer.slice(archiveData.byteOffset, archiveData.byteOffset + archiveData.byteLength);
817
+ await storage.put(storageKey, storageBuffer);
818
+ logger.info('Stored package archive', { name, version, storageKey, size: archiveData.length });
819
+ }
820
+ catch (error) {
821
+ logger.error('Failed to store package archive', { name, version }, error instanceof Error ? error : new Error(String(error)));
822
+ return c.json({
823
+ error: 'Internal Server Error',
824
+ message: 'Failed to store package archive',
825
+ }, 500);
826
+ }
827
+ // Create artifact record
828
+ const artifactId = nanoid();
829
+ try {
830
+ await db.insert(artifacts).values({
831
+ id: artifactId,
832
+ repo_id: MANUAL_REPO_ID,
833
+ package_name: name,
834
+ version: version,
835
+ file_key: storageKey,
836
+ size: archiveData.length,
837
+ download_count: 0,
838
+ created_at: now,
839
+ last_downloaded_at: null,
840
+ });
841
+ }
842
+ catch (error) {
843
+ logger.error('Failed to create artifact record', { name, version }, error instanceof Error ? error : new Error(String(error)));
844
+ // Continue - package is stored, artifact record is optional
845
+ }
846
+ // Extract README if available (best effort)
847
+ let readmeContent = null;
848
+ try {
849
+ readmeContent = extractReadmeFromValidator(archiveData);
850
+ if (readmeContent) {
851
+ const readmeKey = buildReadmeStorageKey('private', MANUAL_REPO_ID, name, version);
852
+ const readmeBytes = new TextEncoder().encode(readmeContent);
853
+ await storage.put(readmeKey, readmeBytes).catch((err) => {
854
+ logger.warn('Failed to store README', { name, version, error: err instanceof Error ? err.message : String(err) });
855
+ });
856
+ }
857
+ }
858
+ catch (error) {
859
+ logger.warn('Failed to extract README', { name, version, error: error instanceof Error ? error.message : String(error) });
860
+ // Continue - README is optional
861
+ }
862
+ // Build dist URL for Composer
863
+ const url = new URL(c.req.url);
864
+ const baseUrl = `${url.protocol}//${url.host}`;
865
+ const distUrl = `${baseUrl}/dist/${MANUAL_REPO_ID}/${name}/${version}`;
866
+ // Create package record with manual upload flag
867
+ const packageId = nanoid();
868
+ const releasedAt = metadata.time ? Math.floor(new Date(metadata.time).getTime() / 1000) : now;
869
+ try {
870
+ await db.insert(packages).values({
871
+ id: packageId,
872
+ repo_id: MANUAL_REPO_ID,
873
+ name: name,
874
+ version: version,
875
+ dist_url: distUrl,
876
+ source_dist_url: null, // No source for manual uploads
877
+ dist_reference: `manual-${version}`,
878
+ description: metadata.description || null,
879
+ license: metadata.license ? JSON.stringify(metadata.license) : null,
880
+ package_type: metadata.type || 'library',
881
+ homepage: metadata.homepage || null,
882
+ released_at: releasedAt,
883
+ readme_content: readmeContent,
884
+ metadata: JSON.stringify(metadata),
885
+ is_manual_upload: 1, // Mark as manual upload
886
+ created_at: now,
887
+ });
888
+ logger.info('Created package record for manual upload', { name, version, packageId });
889
+ }
890
+ catch (error) {
891
+ logger.error('Failed to create package record', { name, version }, error instanceof Error ? error : new Error(String(error)));
892
+ return c.json({
893
+ error: 'Internal Server Error',
894
+ message: 'Failed to create package record',
895
+ }, 500);
896
+ }
897
+ return c.json({
898
+ message: 'Package uploaded successfully',
899
+ package: {
900
+ id: packageId,
901
+ name: name,
902
+ version: version,
903
+ description: metadata.description || null,
904
+ },
905
+ }, 201);
906
+ }
661
907
  /**
662
908
  * POST /packages/cleanup-numeric-versions
663
909
  * Temporary utility to fix versioning issues
@@ -667,4 +913,101 @@ export async function cleanupNumericVersions(c) {
667
913
  // Real implementation would clean up numeric versions like x.y.z.0
668
914
  return c.json({ message: 'Cleanup not implemented in this adapter version' });
669
915
  }
916
+ /**
917
+ * DELETE /api/packages/:name/:version
918
+ * Delete a specific package version
919
+ * Removes: package record, artifact record, and stored files (archive, README, changelog)
920
+ */
921
+ export async function deletePackageVersion(c) {
922
+ const logger = getLogger();
923
+ const { name: nameParam, version } = c.req.valid('param');
924
+ const name = decodeURIComponent(nameParam);
925
+ const db = c.get('database');
926
+ const storage = c.get('storage');
927
+ // Find the package version
928
+ const [pkg] = await db
929
+ .select()
930
+ .from(packages)
931
+ .where(and(eq(packages.name, name), eq(packages.version, version)))
932
+ .limit(1);
933
+ if (!pkg) {
934
+ return c.json({
935
+ error: 'Not Found',
936
+ message: `Package ${name}@${version} not found`,
937
+ }, 404);
938
+ }
939
+ let filesRemoved = 0;
940
+ const storageType = pkg.repo_id === 'packagist' ? 'public' : 'private';
941
+ // Find and delete artifact
942
+ const [artifact] = await db
943
+ .select()
944
+ .from(artifacts)
945
+ .where(and(eq(artifacts.repo_id, pkg.repo_id), eq(artifacts.package_name, name), eq(artifacts.version, version)))
946
+ .limit(1);
947
+ if (artifact) {
948
+ // Delete archive file from storage
949
+ try {
950
+ await storage.delete(artifact.file_key);
951
+ filesRemoved++;
952
+ logger.info('Deleted package archive from storage', { name, version, key: artifact.file_key });
953
+ }
954
+ catch (error) {
955
+ logger.warn('Failed to delete archive file', {
956
+ name,
957
+ version,
958
+ key: artifact.file_key,
959
+ error: error instanceof Error ? error.message : String(error)
960
+ });
961
+ }
962
+ // Delete artifact record
963
+ try {
964
+ await db.delete(artifacts).where(eq(artifacts.id, artifact.id));
965
+ }
966
+ catch (error) {
967
+ logger.warn('Failed to delete artifact record', {
968
+ name,
969
+ version,
970
+ error: error instanceof Error ? error.message : String(error)
971
+ });
972
+ }
973
+ }
974
+ // Delete README from storage (best effort)
975
+ try {
976
+ const readmeKey = buildReadmeStorageKey(storageType, pkg.repo_id, name, version);
977
+ await storage.delete(readmeKey);
978
+ filesRemoved++;
979
+ }
980
+ catch {
981
+ // README might not exist, ignore error
982
+ }
983
+ // Delete CHANGELOG from storage (best effort)
984
+ try {
985
+ const changelogKey = buildChangelogStorageKey(storageType, pkg.repo_id, name, version);
986
+ await storage.delete(changelogKey);
987
+ filesRemoved++;
988
+ }
989
+ catch {
990
+ // CHANGELOG might not exist, ignore error
991
+ }
992
+ // Delete package record
993
+ try {
994
+ await db.delete(packages).where(eq(packages.id, pkg.id));
995
+ logger.info('Deleted package version', { name, version, packageId: pkg.id, filesRemoved });
996
+ }
997
+ catch (error) {
998
+ logger.error('Failed to delete package record', { name, version }, error instanceof Error ? error : new Error(String(error)));
999
+ return c.json({
1000
+ error: 'Internal Server Error',
1001
+ message: 'Failed to delete package record',
1002
+ }, 500);
1003
+ }
1004
+ return c.json({
1005
+ message: `Package ${name}@${version} deleted successfully`,
1006
+ deleted: {
1007
+ name,
1008
+ version,
1009
+ filesRemoved,
1010
+ },
1011
+ });
1012
+ }
670
1013
  //# sourceMappingURL=packages.handlers.js.map