strapi-plugin-publish-media-validation 1.0.0 → 1.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,gBAAgB,CAAC;;2BAGlB;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;uBAqC3B;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;qBACzB;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;;AAE/C,wBAAgD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,gBAAgB,CAAC;;2BAgClB;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;uBAqC3B;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;qBACzB;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;;AAE/C,wBAAgD"}
@@ -1,7 +1,37 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const utils_1 = require("@strapi/utils");
6
+ const path_1 = __importDefault(require("path"));
7
+ /**
8
+ * Resolve @strapi/utils from the already-running Strapi process instead of
9
+ * requiring consumers to add it as a direct dependency. Strapi always loads
10
+ * @strapi/utils early, so it is in require.cache by the time register() runs.
11
+ * This keeps the instanceof check in Strapi's Koa error middleware working.
12
+ */
13
+ function resolveValidationError() {
14
+ var _a, _b, _c;
15
+ const sep = path_1.default.sep;
16
+ for (const [filename, mod] of Object.entries((_a = require.cache) !== null && _a !== void 0 ? _a : {})) {
17
+ if (filename.includes(`@strapi${sep}utils`) &&
18
+ filename.endsWith('index.js') &&
19
+ ((_c = (_b = mod === null || mod === void 0 ? void 0 : mod.exports) === null || _b === void 0 ? void 0 : _b.errors) === null || _c === void 0 ? void 0 : _c.ValidationError)) {
20
+ return mod.exports.errors.ValidationError;
21
+ }
22
+ }
23
+ // Fallback: plain Error with status 400 so Strapi's formatInternalError
24
+ // still returns a 400 with the message visible in the admin panel.
25
+ return class extends Error {
26
+ constructor(message) {
27
+ super(message);
28
+ this.name = 'ValidationError';
29
+ this.status = 400;
30
+ }
31
+ };
32
+ }
4
33
  const register = ({ strapi }) => {
34
+ const ValidationError = resolveValidationError();
5
35
  strapi.documents.use(async (ctx, next) => {
6
36
  var _a;
7
37
  if (ctx.action !== 'publish')
@@ -27,7 +57,7 @@ const register = ({ strapi }) => {
27
57
  const labels = missing
28
58
  .map((f) => f.charAt(0).toUpperCase() + f.slice(1).replace(/([A-Z])/g, ' $1'))
29
59
  .join(', ');
30
- throw new utils_1.errors.ValidationError(`The following required media fields are empty: ${labels}`);
60
+ throw new ValidationError(`The following required media fields are empty: ${labels}`);
31
61
  }
32
62
  return next();
33
63
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;AACA,yCAAuC;AAEvC,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAA2B,EAAE,EAAE;IACvD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;;QACvC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,EAAE,CAAC;QAE5C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAsB,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,CAAA;YAAE,OAAO,IAAI,EAAE,CAAC;QAEtC,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;aACzD,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAE,IAAY,CAAC,IAAI,KAAK,OAAO,IAAK,IAAY,CAAC,QAAQ,KAAK,IAAI,CAAC;aACvF,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAEvB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QAEpD,MAAM,UAAU,GAAG,MAAC,GAAG,CAAC,MAAkC,0CAAE,UAAU,CAAC;QACvE,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAsB,CAAC,CAAC,OAAO,CAAC;YACrE,UAAU;YACV,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAW,aAAX,GAAG,uBAAH,GAAG,CAAW,CAAC,CAAC,CAAA,CAAC,CAAC;QAEtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,OAAO;iBACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;iBAC7E,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,cAAM,CAAC,eAAe,CAC9B,kDAAkD,MAAM,EAAE,CAC3D,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAA8B,EAAE,EAAE,GAAE,CAAC,CAAC;AACzD,MAAM,OAAO,GAAG,CAAC,KAA8B,EAAE,EAAE,GAAE,CAAC,CAAC;AAEvD,kBAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AAKxB;;;;;GAKG;AACH,SAAS,sBAAsB;;IAC7B,MAAM,GAAG,GAAG,cAAI,CAAC,GAAG,CAAC;IACrB,KAAK,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,OAAO,CAAC,KAAK,mCAAI,EAAE,CAAC,EAAE,CAAC;QAClE,IACE,QAAQ,CAAC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC;YACvC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;aAC7B,MAAA,MAAC,GAAW,aAAX,GAAG,uBAAH,GAAG,CAAU,OAAO,0CAAE,MAAM,0CAAE,eAAe,CAAA,EAC9C,CAAC;YACD,OAAQ,GAAW,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;QACrD,CAAC;IACH,CAAC;IACD,wEAAwE;IACxE,mEAAmE;IACnE,OAAO,KAAM,SAAQ,KAAK;QACxB,YAAY,OAAe;YACzB,KAAK,CAAC,OAAO,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;YAC7B,IAAY,CAAC,MAAM,GAAG,GAAG,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAA2B,EAAE,EAAE;IACvD,MAAM,eAAe,GAAG,sBAAsB,EAAE,CAAC;IAEjD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;;QACvC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,EAAE,CAAC;QAE5C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAsB,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,CAAA;YAAE,OAAO,IAAI,EAAE,CAAC;QAEtC,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;aACzD,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAE,IAAY,CAAC,IAAI,KAAK,OAAO,IAAK,IAAY,CAAC,QAAQ,KAAK,IAAI,CAAC;aACvF,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAEvB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QAEpD,MAAM,UAAU,GAAG,MAAC,GAAG,CAAC,MAAkC,0CAAE,UAAU,CAAC;QACvE,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,EAAE,CAAC;QAE/B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAsB,CAAC,CAAC,OAAO,CAAC;YACrE,UAAU;YACV,QAAQ;SACT,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAW,aAAX,GAAG,uBAAH,GAAG,CAAW,CAAC,CAAC,CAAA,CAAC,CAAC;QAEtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,OAAO;iBACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;iBAC7E,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,eAAe,CAAC,kDAAkD,MAAM,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAA8B,EAAE,EAAE,GAAE,CAAC,CAAC;AACzD,MAAM,OAAO,GAAG,CAAC,KAA8B,EAAE,EAAE,GAAE,CAAC,CAAC;AAEvD,kBAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strapi-plugin-publish-media-validation",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Strapi v5 plugin that enforces required media fields at publish time — works around the known limitation where required: true on media fields is not validated on publish.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -13,7 +13,8 @@
13
13
  ],
14
14
  "main": "./dist/server/index.js",
15
15
  "exports": {
16
- "./strapi-server": "./dist/server/index.js"
16
+ "./strapi-server": "./dist/server/index.js",
17
+ "./package.json": "./package.json"
17
18
  },
18
19
  "files": [
19
20
  "dist",
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "types": ["jest"],
5
+ "noEmit": true
6
+ },
7
+ "include": ["./**/*.ts"],
8
+ "exclude": ["../../../node_modules"]
9
+ }
@@ -1,7 +1,39 @@
1
+ import path from 'path';
1
2
  import type { Core, UID } from '@strapi/strapi';
2
- import { errors } from '@strapi/utils';
3
+
4
+ type ValidationErrorCtor = new (message: string) => Error;
5
+
6
+ /**
7
+ * Resolve @strapi/utils from the already-running Strapi process instead of
8
+ * requiring consumers to add it as a direct dependency. Strapi always loads
9
+ * @strapi/utils early, so it is in require.cache by the time register() runs.
10
+ * This keeps the instanceof check in Strapi's Koa error middleware working.
11
+ */
12
+ function resolveValidationError(): ValidationErrorCtor {
13
+ const sep = path.sep;
14
+ for (const [filename, mod] of Object.entries(require.cache ?? {})) {
15
+ if (
16
+ filename.includes(`@strapi${sep}utils`) &&
17
+ filename.endsWith('index.js') &&
18
+ (mod as any)?.exports?.errors?.ValidationError
19
+ ) {
20
+ return (mod as any).exports.errors.ValidationError;
21
+ }
22
+ }
23
+ // Fallback: plain Error with status 400 so Strapi's formatInternalError
24
+ // still returns a 400 with the message visible in the admin panel.
25
+ return class extends Error {
26
+ constructor(message: string) {
27
+ super(message);
28
+ this.name = 'ValidationError';
29
+ (this as any).status = 400;
30
+ }
31
+ };
32
+ }
3
33
 
4
34
  const register = ({ strapi }: { strapi: Core.Strapi }) => {
35
+ const ValidationError = resolveValidationError();
36
+
5
37
  strapi.documents.use(async (ctx, next) => {
6
38
  if (ctx.action !== 'publish') return next();
7
39
 
@@ -29,9 +61,7 @@ const register = ({ strapi }: { strapi: Core.Strapi }) => {
29
61
  const labels = missing
30
62
  .map((f) => f.charAt(0).toUpperCase() + f.slice(1).replace(/([A-Z])/g, ' $1'))
31
63
  .join(', ');
32
- throw new errors.ValidationError(
33
- `The following required media fields are empty: ${labels}`
34
- );
64
+ throw new ValidationError(`The following required media fields are empty: ${labels}`);
35
65
  }
36
66
 
37
67
  return next();