@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.
- package/dist/db/schema.d.ts +17 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +2 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/modules/packages/index.d.ts.map +1 -1
- package/dist/modules/packages/index.js +2 -0
- package/dist/modules/packages/index.js.map +1 -1
- package/dist/modules/packages/packages.handlers.d.ts +21 -1
- package/dist/modules/packages/packages.handlers.d.ts.map +1 -1
- package/dist/modules/packages/packages.handlers.js +355 -12
- package/dist/modules/packages/packages.handlers.js.map +1 -1
- package/dist/modules/packages/packages.routes.d.ts +147 -10
- package/dist/modules/packages/packages.routes.d.ts.map +1 -1
- package/dist/modules/packages/packages.routes.js +148 -4
- package/dist/modules/packages/packages.routes.js.map +1 -1
- package/dist/routes/composer.d.ts.map +1 -1
- package/dist/routes/composer.js +6 -2
- package/dist/routes/composer.js.map +1 -1
- package/dist/sync/strategies/composer-repo.js +7 -4
- package/dist/sync/strategies/composer-repo.js.map +1 -1
- package/dist/utils/package-validator.d.ts +77 -0
- package/dist/utils/package-validator.d.ts.map +1 -0
- package/dist/utils/package-validator.js +217 -0
- package/dist/utils/package-validator.js.map +1 -0
- package/package.json +2 -2
package/dist/db/schema.d.ts
CHANGED
|
@@ -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";
|
package/dist/db/schema.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
}));
|
package/dist/db/schema.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|