@dani-builder/strapi-plugin-builder 0.9.0 → 0.11.0

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 (61) hide show
  1. package/AGENTS.md +4 -3
  2. package/README.md +10 -2
  3. package/dist/server/src/components/blocks/inquiry-form.json +7 -0
  4. package/dist/server/src/config/builder.d.ts +4 -2
  5. package/dist/server/src/config/builder.d.ts.map +1 -1
  6. package/dist/server/src/config/builder.js.map +1 -1
  7. package/dist/server/src/config/index.d.ts +25 -0
  8. package/dist/server/src/config/index.d.ts.map +1 -1
  9. package/dist/server/src/config/index.js +95 -1
  10. package/dist/server/src/config/index.js.map +1 -1
  11. package/dist/server/src/content-type-availability.d.ts +19 -0
  12. package/dist/server/src/content-type-availability.d.ts.map +1 -0
  13. package/dist/server/src/content-type-availability.js +61 -0
  14. package/dist/server/src/content-type-availability.js.map +1 -0
  15. package/dist/server/src/content-type-config.d.ts +6 -0
  16. package/dist/server/src/content-type-config.d.ts.map +1 -0
  17. package/dist/server/src/content-type-config.js +13 -0
  18. package/dist/server/src/content-type-config.js.map +1 -0
  19. package/dist/server/src/content-types/category/index.d.ts +6 -0
  20. package/dist/server/src/content-types/category/index.d.ts.map +1 -1
  21. package/dist/server/src/content-types/category/schema.json +6 -0
  22. package/dist/server/src/content-types/faq/index.d.ts +1 -0
  23. package/dist/server/src/content-types/faq/index.d.ts.map +1 -1
  24. package/dist/server/src/content-types/faq/schema.json +3 -2
  25. package/dist/server/src/content-types/index.d.ts +104 -0
  26. package/dist/server/src/content-types/index.d.ts.map +1 -1
  27. package/dist/server/src/content-types/index.js +2 -0
  28. package/dist/server/src/content-types/index.js.map +1 -1
  29. package/dist/server/src/content-types/inquiry/index.d.ts +25 -0
  30. package/dist/server/src/content-types/inquiry/index.d.ts.map +1 -1
  31. package/dist/server/src/content-types/inquiry/schema.json +34 -3
  32. package/dist/server/src/content-types/legal-document/index.d.ts +74 -0
  33. package/dist/server/src/content-types/legal-document/index.d.ts.map +1 -0
  34. package/dist/server/src/content-types/legal-document/index.js +8 -0
  35. package/dist/server/src/content-types/legal-document/index.js.map +1 -0
  36. package/dist/server/src/content-types/legal-document/schema.json +70 -0
  37. package/dist/server/src/controllers/index.d.ts.map +1 -1
  38. package/dist/server/src/controllers/index.js +3 -1
  39. package/dist/server/src/controllers/index.js.map +1 -1
  40. package/dist/server/src/controllers/inquiry.d.ts +8 -0
  41. package/dist/server/src/controllers/inquiry.d.ts.map +1 -0
  42. package/dist/server/src/controllers/inquiry.js +27 -0
  43. package/dist/server/src/controllers/inquiry.js.map +1 -0
  44. package/dist/server/src/preview/handler.d.ts +1 -1
  45. package/dist/server/src/preview/handler.d.ts.map +1 -1
  46. package/dist/server/src/preview/handler.js +8 -4
  47. package/dist/server/src/preview/handler.js.map +1 -1
  48. package/dist/server/src/register.d.ts.map +1 -1
  49. package/dist/server/src/register.js +23 -0
  50. package/dist/server/src/register.js.map +1 -1
  51. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  52. package/dist/server/src/routes/content-api.js +16 -6
  53. package/dist/server/src/routes/content-api.js.map +1 -1
  54. package/dist/server/src/services/index.d.ts.map +1 -1
  55. package/dist/server/src/services/index.js +3 -1
  56. package/dist/server/src/services/index.js.map +1 -1
  57. package/dist/server/src/services/inquiry.d.ts +15 -0
  58. package/dist/server/src/services/inquiry.d.ts.map +1 -0
  59. package/dist/server/src/services/inquiry.js +137 -0
  60. package/dist/server/src/services/inquiry.js.map +1 -0
  61. package/package.json +1 -1
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InquiryValidationError = void 0;
4
+ exports.isIdempotencyCollision = isIdempotencyCollision;
5
+ const UID = 'plugin::builder.inquiry';
6
+ const LIMITS = {
7
+ name: 120,
8
+ email: 254,
9
+ phone: 40,
10
+ subject: 200,
11
+ message: 5000,
12
+ };
13
+ class InquiryValidationError extends Error {
14
+ constructor() {
15
+ super('Invalid inquiry submission');
16
+ }
17
+ }
18
+ exports.InquiryValidationError = InquiryValidationError;
19
+ function isRecord(value) {
20
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
21
+ }
22
+ function text(value, limit, required = false) {
23
+ if (value === undefined || value === null) {
24
+ if (required)
25
+ throw new InquiryValidationError();
26
+ return undefined;
27
+ }
28
+ if (typeof value !== 'string')
29
+ throw new InquiryValidationError();
30
+ const result = value.trim();
31
+ if (result.length > limit || (required && !result))
32
+ throw new InquiryValidationError();
33
+ return result || undefined;
34
+ }
35
+ /** Only recover a collision on our unique key, never unrelated DB failures. */
36
+ function isIdempotencyCollision(error) {
37
+ if (!isRecord(error))
38
+ return false;
39
+ if ((error.code === 'SQLITE_CONSTRAINT_UNIQUE' || error.code === '23505') &&
40
+ /idempotency_key/.test(String(error.message ?? error.constraint)))
41
+ return true;
42
+ if (error.name === 'ValidationError' &&
43
+ isRecord(error.details) &&
44
+ Array.isArray(error.details.errors)) {
45
+ return (error.details.errors.length > 0 &&
46
+ error.details.errors.every((item) => isRecord(item) &&
47
+ Array.isArray(item.path) &&
48
+ item.path.length === 1 &&
49
+ item.path[0] === 'idempotencyKey' &&
50
+ item.message === 'This attribute must be unique'));
51
+ }
52
+ return error.cause !== undefined && isIdempotencyCollision(error.cause);
53
+ }
54
+ const inquiry = ({ strapi }) => ({
55
+ async submit(input) {
56
+ if (!isRecord(input) || input.consent !== true)
57
+ throw new InquiryValidationError();
58
+ const config = strapi.config.get('plugin::builder')
59
+ .inquiry;
60
+ const name = text(input.name, LIMITS.name, true);
61
+ const consentVersion = text(input.consentVersion, 120, true);
62
+ // Printable version identifiers are recorded verbatim after normalization.
63
+ if (!/^[\x21-\x7e]+$/.test(consentVersion))
64
+ throw new InquiryValidationError();
65
+ const idempotencyKey = text(input.idempotencyKey, 128);
66
+ if (input.idempotencyKey !== undefined &&
67
+ (!idempotencyKey || !/^[a-zA-Z0-9][a-zA-Z0-9._:-]*$/.test(idempotencyKey)))
68
+ throw new InquiryValidationError();
69
+ const data = {
70
+ name,
71
+ consent: true,
72
+ consentVersion,
73
+ };
74
+ for (const [field, limit] of Object.entries(LIMITS)) {
75
+ if (field !== 'name')
76
+ data[field] = text(input[field], limit);
77
+ }
78
+ if (data.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(data.email)))
79
+ throw new InquiryValidationError();
80
+ for (const [field, attribute] of Object.entries(config?.attributes ?? {})) {
81
+ const value = input[field];
82
+ if (value === undefined || value === null)
83
+ continue;
84
+ if (attribute.type === 'boolean') {
85
+ if (typeof value !== 'boolean')
86
+ throw new InquiryValidationError();
87
+ data[field] = value;
88
+ }
89
+ else if (attribute.type === 'integer') {
90
+ if (typeof value !== 'number' || !Number.isSafeInteger(value))
91
+ throw new InquiryValidationError();
92
+ data[field] = value;
93
+ }
94
+ else {
95
+ data[field] = text(value, attribute.maxLength ?? (attribute.type === 'text' ? 5000 : 255));
96
+ if (attribute.type === 'enumeration' &&
97
+ data[field] !== undefined &&
98
+ !attribute.enum?.includes(String(data[field])))
99
+ throw new InquiryValidationError();
100
+ if (attribute.type === 'email' &&
101
+ data[field] &&
102
+ !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(data[field])))
103
+ throw new InquiryValidationError();
104
+ }
105
+ }
106
+ if (idempotencyKey)
107
+ data.idempotencyKey = idempotencyKey;
108
+ // A hook can inspect only the normalized public fields, and cannot mutate
109
+ // consent or supply server audit/status fields through its return value.
110
+ const submission = Object.freeze({ ...data });
111
+ if (config?.validate && (await config.validate(submission)) === false)
112
+ throw new InquiryValidationError();
113
+ const documents = strapi.documents(UID);
114
+ if (idempotencyKey &&
115
+ (await documents.findFirst({ filters: { idempotencyKey } })))
116
+ return { accepted: true };
117
+ try {
118
+ await documents.create({
119
+ data: {
120
+ ...data,
121
+ idempotencyKey: idempotencyKey ?? null,
122
+ consentAt: new Date().toISOString(),
123
+ processingStatus: 'received',
124
+ },
125
+ });
126
+ }
127
+ catch (error) {
128
+ if (!idempotencyKey ||
129
+ !isIdempotencyCollision(error) ||
130
+ !(await documents.findFirst({ filters: { idempotencyKey } })))
131
+ throw error;
132
+ }
133
+ return { accepted: true };
134
+ },
135
+ });
136
+ exports.default = inquiry;
137
+ //# sourceMappingURL=inquiry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inquiry.js","sourceRoot":"","sources":["../../../../server/src/services/inquiry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dani-builder/strapi-plugin-builder",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Daniworks Builder — reusable CMS components, content types, and smart API for Strapi v5",
5
5
  "license": "MIT",
6
6
  "strapi": {