@murumets-ee/content 0.1.1 → 0.1.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.
package/package.json CHANGED
@@ -1,38 +1,32 @@
1
1
  {
2
2
  "name": "@murumets-ee/content",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "license": "Elastic-2.0",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
8
8
  "types": "./dist/index.d.ts",
9
- "import": "./dist/index.js",
10
- "require": "./dist/index.cjs"
9
+ "import": "./dist/index.js"
11
10
  },
12
11
  "./client": {
13
12
  "types": "./dist/client.d.ts",
14
- "import": "./dist/client.js",
15
- "require": "./dist/client.cjs"
13
+ "import": "./dist/client.js"
16
14
  },
17
15
  "./query": {
18
16
  "types": "./dist/query-client.d.ts",
19
- "import": "./dist/query-client.js",
20
- "require": "./dist/query-client.cjs"
17
+ "import": "./dist/query-client.js"
21
18
  },
22
19
  "./plugin": {
23
20
  "types": "./dist/plugin.d.ts",
24
- "import": "./dist/plugin.js",
25
- "require": "./dist/plugin.cjs"
21
+ "import": "./dist/plugin.js"
26
22
  },
27
23
  "./blocks": {
28
24
  "types": "./dist/blocks/index.d.ts",
29
- "import": "./dist/blocks/index.js",
30
- "require": "./dist/blocks/index.cjs"
25
+ "import": "./dist/blocks/index.js"
31
26
  },
32
27
  "./lock": {
33
28
  "types": "./dist/lock-service.d.ts",
34
- "import": "./dist/lock-service.js",
35
- "require": "./dist/lock-service.cjs"
29
+ "import": "./dist/lock-service.js"
36
30
  }
37
31
  },
38
32
  "files": [
@@ -42,10 +36,10 @@
42
36
  "drizzle-orm": "^0.45.1",
43
37
  "server-only": "^0.0.1",
44
38
  "zod": "^3.24.1",
45
- "@murumets-ee/core": "0.1.1",
46
- "@murumets-ee/logging": "0.1.1",
47
- "@murumets-ee/entity": "0.1.1",
48
- "@murumets-ee/db": "0.1.1"
39
+ "@murumets-ee/core": "0.1.3",
40
+ "@murumets-ee/logging": "0.1.3",
41
+ "@murumets-ee/db": "0.1.2",
42
+ "@murumets-ee/entity": "0.1.2"
49
43
  },
50
44
  "devDependencies": {
51
45
  "@types/node": "^22.10.5",
@@ -1 +0,0 @@
1
- "use strict";var x=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var F=(e,o)=>{for(var a in o)x(e,a,{get:o[a],enumerable:!0})},R=(e,o,a,y)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of w(o))!T.call(e,r)&&r!==a&&x(e,r,{get:()=>o[r],enumerable:!(y=C(o,r))||y.enumerable});return e};var j=e=>R(x({},"__esModule",{value:!0}),e);var G={};F(G,{CTABlock:()=>s,CodeBlock:()=>c,GalleryBlock:()=>m,HeroBlock:()=>u,ImageBlock:()=>p,QuoteBlock:()=>n,RichTextBlock:()=>d,VideoBlock:()=>k,commonBlocks:()=>A});module.exports=j(G);var B=require("@murumets-ee/entity");function t(e){if(!e.slug||!e.slug.match(/^[a-z][a-z0-9-]*$/))throw new Error(`Block slug must be lowercase alphanumeric with hyphens, got: "${e.slug}"`);if(!e.label)throw new Error(`Block label is required for slug: "${e.slug}"`);if(!e.fields||Object.keys(e.fields).length===0)throw new Error(`Block "${e.slug}" must have at least one field`);return{slug:e.slug,label:e.label,fields:e.fields}}var c=t({slug:"code",label:"Code",fields:{code:B.field.text({required:!0}),language:B.field.select({options:["javascript","typescript","python","html","css","json","bash","sql","other"]})}});var l=require("@murumets-ee/entity");var s=t({slug:"cta",label:"Call to Action",fields:{heading:l.field.text({required:!0,translatable:!0}),description:l.field.text({translatable:!0}),buttonText:l.field.text({required:!0,translatable:!0}),buttonLink:l.field.text({required:!0})}});var b=require("@murumets-ee/entity");var m=t({slug:"gallery",label:"Gallery",fields:{images:b.field.reference({entity:"media",cardinality:"many"}),columns:b.field.select({options:["2","3","4"]})}});var i=require("@murumets-ee/entity");var u=t({slug:"hero",label:"Hero Section",fields:{heading:i.field.text({required:!0,translatable:!0}),subheading:i.field.text({translatable:!0}),background:i.field.media({accept:["image/*"]}),alignment:i.field.select({options:["left","center","right"]})}});var f=require("@murumets-ee/entity");var p=t({slug:"image",label:"Image",fields:{image:f.field.media({accept:["image/*"],required:!0}),alt:f.field.text({translatable:!0}),caption:f.field.text({translatable:!0})}});var h=require("@murumets-ee/entity");var n=t({slug:"quote",label:"Quote",fields:{quote:h.field.text({required:!0,translatable:!0}),attribution:h.field.text({translatable:!0})}});var q=require("@murumets-ee/entity");var d=t({slug:"richtext",label:"Rich Text",fields:{content:q.field.richtext({translatable:!0})}});var g=require("@murumets-ee/entity");var k=t({slug:"video",label:"Video",fields:{url:g.field.text({required:!0}),poster:g.field.media({accept:["image/*"]}),caption:g.field.text({translatable:!0})}});var A=[d,p,u,m,s,k,n,c];0&&(module.exports={CTABlock,CodeBlock,GalleryBlock,HeroBlock,ImageBlock,QuoteBlock,RichTextBlock,VideoBlock,commonBlocks});
@@ -1,187 +0,0 @@
1
- import { B as BlockDefinition } from '../types-BYeiE1ie.cjs';
2
- import * as _murumets_ee_entity from '@murumets-ee/entity';
3
-
4
- declare const CodeBlock: BlockDefinition<{
5
- readonly code: _murumets_ee_entity.TextField & {
6
- readonly required: true;
7
- };
8
- readonly language: _murumets_ee_entity.SelectField & {
9
- options: readonly ["javascript", "typescript", "python", "html", "css", "json", "bash", "sql", "other"];
10
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
11
- }>;
12
-
13
- declare const CTABlock: BlockDefinition<{
14
- readonly heading: _murumets_ee_entity.TextField & {
15
- readonly required: true;
16
- readonly translatable: true;
17
- };
18
- readonly description: _murumets_ee_entity.TextField & {
19
- readonly translatable: true;
20
- };
21
- readonly buttonText: _murumets_ee_entity.TextField & {
22
- readonly required: true;
23
- readonly translatable: true;
24
- };
25
- readonly buttonLink: _murumets_ee_entity.TextField & {
26
- readonly required: true;
27
- };
28
- }>;
29
-
30
- declare const GalleryBlock: BlockDefinition<{
31
- readonly images: _murumets_ee_entity.ReferenceField & {
32
- cardinality: "many";
33
- } & Partial<Omit<_murumets_ee_entity.ReferenceField, "entity" | "cardinality">>;
34
- readonly columns: _murumets_ee_entity.SelectField & {
35
- options: readonly ["2", "3", "4"];
36
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
37
- }>;
38
-
39
- declare const HeroBlock: BlockDefinition<{
40
- readonly heading: _murumets_ee_entity.TextField & {
41
- readonly required: true;
42
- readonly translatable: true;
43
- };
44
- readonly subheading: _murumets_ee_entity.TextField & {
45
- readonly translatable: true;
46
- };
47
- readonly background: _murumets_ee_entity.MediaField & {
48
- readonly accept: ["image/*"];
49
- };
50
- readonly alignment: _murumets_ee_entity.SelectField & {
51
- options: readonly ["left", "center", "right"];
52
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
53
- }>;
54
-
55
- declare const ImageBlock: BlockDefinition<{
56
- readonly image: _murumets_ee_entity.MediaField & {
57
- readonly accept: ["image/*"];
58
- readonly required: true;
59
- };
60
- readonly alt: _murumets_ee_entity.TextField & {
61
- readonly translatable: true;
62
- };
63
- readonly caption: _murumets_ee_entity.TextField & {
64
- readonly translatable: true;
65
- };
66
- }>;
67
-
68
- declare const QuoteBlock: BlockDefinition<{
69
- readonly quote: _murumets_ee_entity.TextField & {
70
- readonly required: true;
71
- readonly translatable: true;
72
- };
73
- readonly attribution: _murumets_ee_entity.TextField & {
74
- readonly translatable: true;
75
- };
76
- }>;
77
-
78
- declare const RichTextBlock: BlockDefinition<{
79
- readonly content: _murumets_ee_entity.RichTextField & {
80
- readonly translatable: true;
81
- };
82
- }>;
83
-
84
- declare const VideoBlock: BlockDefinition<{
85
- readonly url: _murumets_ee_entity.TextField & {
86
- readonly required: true;
87
- };
88
- readonly poster: _murumets_ee_entity.MediaField & {
89
- readonly accept: ["image/*"];
90
- };
91
- readonly caption: _murumets_ee_entity.TextField & {
92
- readonly translatable: true;
93
- };
94
- }>;
95
-
96
- /**
97
- * All common blocks shipped with the toolkit.
98
- * Use as-is or pick individual blocks from the named exports.
99
- *
100
- * @example
101
- * import { commonBlocks } from '@murumets-ee/content/blocks'
102
- * const Page = defineEntity({
103
- * name: 'page',
104
- * fields: {
105
- * layout: field.blocks({ blocks: [...commonBlocks] }),
106
- * },
107
- * })
108
- */
109
- declare const commonBlocks: readonly [BlockDefinition<{
110
- readonly content: _murumets_ee_entity.RichTextField & {
111
- readonly translatable: true;
112
- };
113
- }>, BlockDefinition<{
114
- readonly image: _murumets_ee_entity.MediaField & {
115
- readonly accept: ["image/*"];
116
- readonly required: true;
117
- };
118
- readonly alt: _murumets_ee_entity.TextField & {
119
- readonly translatable: true;
120
- };
121
- readonly caption: _murumets_ee_entity.TextField & {
122
- readonly translatable: true;
123
- };
124
- }>, BlockDefinition<{
125
- readonly heading: _murumets_ee_entity.TextField & {
126
- readonly required: true;
127
- readonly translatable: true;
128
- };
129
- readonly subheading: _murumets_ee_entity.TextField & {
130
- readonly translatable: true;
131
- };
132
- readonly background: _murumets_ee_entity.MediaField & {
133
- readonly accept: ["image/*"];
134
- };
135
- readonly alignment: _murumets_ee_entity.SelectField & {
136
- options: readonly ["left", "center", "right"];
137
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
138
- }>, BlockDefinition<{
139
- readonly images: _murumets_ee_entity.ReferenceField & {
140
- cardinality: "many";
141
- } & Partial<Omit<_murumets_ee_entity.ReferenceField, "entity" | "cardinality">>;
142
- readonly columns: _murumets_ee_entity.SelectField & {
143
- options: readonly ["2", "3", "4"];
144
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
145
- }>, BlockDefinition<{
146
- readonly heading: _murumets_ee_entity.TextField & {
147
- readonly required: true;
148
- readonly translatable: true;
149
- };
150
- readonly description: _murumets_ee_entity.TextField & {
151
- readonly translatable: true;
152
- };
153
- readonly buttonText: _murumets_ee_entity.TextField & {
154
- readonly required: true;
155
- readonly translatable: true;
156
- };
157
- readonly buttonLink: _murumets_ee_entity.TextField & {
158
- readonly required: true;
159
- };
160
- }>, BlockDefinition<{
161
- readonly url: _murumets_ee_entity.TextField & {
162
- readonly required: true;
163
- };
164
- readonly poster: _murumets_ee_entity.MediaField & {
165
- readonly accept: ["image/*"];
166
- };
167
- readonly caption: _murumets_ee_entity.TextField & {
168
- readonly translatable: true;
169
- };
170
- }>, BlockDefinition<{
171
- readonly quote: _murumets_ee_entity.TextField & {
172
- readonly required: true;
173
- readonly translatable: true;
174
- };
175
- readonly attribution: _murumets_ee_entity.TextField & {
176
- readonly translatable: true;
177
- };
178
- }>, BlockDefinition<{
179
- readonly code: _murumets_ee_entity.TextField & {
180
- readonly required: true;
181
- };
182
- readonly language: _murumets_ee_entity.SelectField & {
183
- options: readonly ["javascript", "typescript", "python", "html", "css", "json", "bash", "sql", "other"];
184
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
185
- }>];
186
-
187
- export { CTABlock, CodeBlock, GalleryBlock, HeroBlock, ImageBlock, QuoteBlock, RichTextBlock, VideoBlock, commonBlocks };
@@ -1,187 +0,0 @@
1
- import { B as BlockDefinition } from '../types-BYeiE1ie.js';
2
- import * as _murumets_ee_entity from '@murumets-ee/entity';
3
-
4
- declare const CodeBlock: BlockDefinition<{
5
- readonly code: _murumets_ee_entity.TextField & {
6
- readonly required: true;
7
- };
8
- readonly language: _murumets_ee_entity.SelectField & {
9
- options: readonly ["javascript", "typescript", "python", "html", "css", "json", "bash", "sql", "other"];
10
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
11
- }>;
12
-
13
- declare const CTABlock: BlockDefinition<{
14
- readonly heading: _murumets_ee_entity.TextField & {
15
- readonly required: true;
16
- readonly translatable: true;
17
- };
18
- readonly description: _murumets_ee_entity.TextField & {
19
- readonly translatable: true;
20
- };
21
- readonly buttonText: _murumets_ee_entity.TextField & {
22
- readonly required: true;
23
- readonly translatable: true;
24
- };
25
- readonly buttonLink: _murumets_ee_entity.TextField & {
26
- readonly required: true;
27
- };
28
- }>;
29
-
30
- declare const GalleryBlock: BlockDefinition<{
31
- readonly images: _murumets_ee_entity.ReferenceField & {
32
- cardinality: "many";
33
- } & Partial<Omit<_murumets_ee_entity.ReferenceField, "entity" | "cardinality">>;
34
- readonly columns: _murumets_ee_entity.SelectField & {
35
- options: readonly ["2", "3", "4"];
36
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
37
- }>;
38
-
39
- declare const HeroBlock: BlockDefinition<{
40
- readonly heading: _murumets_ee_entity.TextField & {
41
- readonly required: true;
42
- readonly translatable: true;
43
- };
44
- readonly subheading: _murumets_ee_entity.TextField & {
45
- readonly translatable: true;
46
- };
47
- readonly background: _murumets_ee_entity.MediaField & {
48
- readonly accept: ["image/*"];
49
- };
50
- readonly alignment: _murumets_ee_entity.SelectField & {
51
- options: readonly ["left", "center", "right"];
52
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
53
- }>;
54
-
55
- declare const ImageBlock: BlockDefinition<{
56
- readonly image: _murumets_ee_entity.MediaField & {
57
- readonly accept: ["image/*"];
58
- readonly required: true;
59
- };
60
- readonly alt: _murumets_ee_entity.TextField & {
61
- readonly translatable: true;
62
- };
63
- readonly caption: _murumets_ee_entity.TextField & {
64
- readonly translatable: true;
65
- };
66
- }>;
67
-
68
- declare const QuoteBlock: BlockDefinition<{
69
- readonly quote: _murumets_ee_entity.TextField & {
70
- readonly required: true;
71
- readonly translatable: true;
72
- };
73
- readonly attribution: _murumets_ee_entity.TextField & {
74
- readonly translatable: true;
75
- };
76
- }>;
77
-
78
- declare const RichTextBlock: BlockDefinition<{
79
- readonly content: _murumets_ee_entity.RichTextField & {
80
- readonly translatable: true;
81
- };
82
- }>;
83
-
84
- declare const VideoBlock: BlockDefinition<{
85
- readonly url: _murumets_ee_entity.TextField & {
86
- readonly required: true;
87
- };
88
- readonly poster: _murumets_ee_entity.MediaField & {
89
- readonly accept: ["image/*"];
90
- };
91
- readonly caption: _murumets_ee_entity.TextField & {
92
- readonly translatable: true;
93
- };
94
- }>;
95
-
96
- /**
97
- * All common blocks shipped with the toolkit.
98
- * Use as-is or pick individual blocks from the named exports.
99
- *
100
- * @example
101
- * import { commonBlocks } from '@murumets-ee/content/blocks'
102
- * const Page = defineEntity({
103
- * name: 'page',
104
- * fields: {
105
- * layout: field.blocks({ blocks: [...commonBlocks] }),
106
- * },
107
- * })
108
- */
109
- declare const commonBlocks: readonly [BlockDefinition<{
110
- readonly content: _murumets_ee_entity.RichTextField & {
111
- readonly translatable: true;
112
- };
113
- }>, BlockDefinition<{
114
- readonly image: _murumets_ee_entity.MediaField & {
115
- readonly accept: ["image/*"];
116
- readonly required: true;
117
- };
118
- readonly alt: _murumets_ee_entity.TextField & {
119
- readonly translatable: true;
120
- };
121
- readonly caption: _murumets_ee_entity.TextField & {
122
- readonly translatable: true;
123
- };
124
- }>, BlockDefinition<{
125
- readonly heading: _murumets_ee_entity.TextField & {
126
- readonly required: true;
127
- readonly translatable: true;
128
- };
129
- readonly subheading: _murumets_ee_entity.TextField & {
130
- readonly translatable: true;
131
- };
132
- readonly background: _murumets_ee_entity.MediaField & {
133
- readonly accept: ["image/*"];
134
- };
135
- readonly alignment: _murumets_ee_entity.SelectField & {
136
- options: readonly ["left", "center", "right"];
137
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
138
- }>, BlockDefinition<{
139
- readonly images: _murumets_ee_entity.ReferenceField & {
140
- cardinality: "many";
141
- } & Partial<Omit<_murumets_ee_entity.ReferenceField, "entity" | "cardinality">>;
142
- readonly columns: _murumets_ee_entity.SelectField & {
143
- options: readonly ["2", "3", "4"];
144
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
145
- }>, BlockDefinition<{
146
- readonly heading: _murumets_ee_entity.TextField & {
147
- readonly required: true;
148
- readonly translatable: true;
149
- };
150
- readonly description: _murumets_ee_entity.TextField & {
151
- readonly translatable: true;
152
- };
153
- readonly buttonText: _murumets_ee_entity.TextField & {
154
- readonly required: true;
155
- readonly translatable: true;
156
- };
157
- readonly buttonLink: _murumets_ee_entity.TextField & {
158
- readonly required: true;
159
- };
160
- }>, BlockDefinition<{
161
- readonly url: _murumets_ee_entity.TextField & {
162
- readonly required: true;
163
- };
164
- readonly poster: _murumets_ee_entity.MediaField & {
165
- readonly accept: ["image/*"];
166
- };
167
- readonly caption: _murumets_ee_entity.TextField & {
168
- readonly translatable: true;
169
- };
170
- }>, BlockDefinition<{
171
- readonly quote: _murumets_ee_entity.TextField & {
172
- readonly required: true;
173
- readonly translatable: true;
174
- };
175
- readonly attribution: _murumets_ee_entity.TextField & {
176
- readonly translatable: true;
177
- };
178
- }>, BlockDefinition<{
179
- readonly code: _murumets_ee_entity.TextField & {
180
- readonly required: true;
181
- };
182
- readonly language: _murumets_ee_entity.SelectField & {
183
- options: readonly ["javascript", "typescript", "python", "html", "css", "json", "bash", "sql", "other"];
184
- } & Omit<Partial<_murumets_ee_entity.SelectField>, "options">;
185
- }>];
186
-
187
- export { CTABlock, CodeBlock, GalleryBlock, HeroBlock, ImageBlock, QuoteBlock, RichTextBlock, VideoBlock, commonBlocks };
package/dist/client.cjs DELETED
@@ -1 +0,0 @@
1
- "use strict";var tt=Object.create;var N=Object.defineProperty;var et=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var it=Object.getPrototypeOf,st=Object.prototype.hasOwnProperty;var E=(r,e)=>()=>(r&&(e=r(r=0)),e);var D=(r,e)=>{for(var t in e)N(r,t,{get:e[t],enumerable:!0})},P=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of nt(e))!st.call(r,i)&&i!==t&&N(r,i,{get:()=>e[i],enumerable:!(n=et(e,i))||n.enumerable});return r};var g=(r,e,t)=>(t=r!=null?tt(it(r)):{},P(e||!r||!r.__esModule?N(t,"default",{value:r,enumerable:!0}):t,r)),rt=r=>P(N({},"__esModule",{value:!0}),r);var K={};D(K,{generateVersionsSchema:()=>dt});function dt(r){let e=`${r.name}_versions`;return(0,h.pgTable)(e,{id:(0,h.uuid)("id").primaryKey().defaultRandom(),entityId:(0,h.uuid)("entity_id").notNull(),version:(0,h.integer)("version").notNull(),locale:(0,h.varchar)("locale",{length:10}).notNull().default("_"),data:(0,h.jsonb)("data").notNull(),delta:(0,h.jsonb)("delta"),status:(0,h.varchar)("status",{length:20}),createdBy:(0,h.varchar)("created_by",{length:255}),createdByName:(0,h.varchar)("created_by_name",{length:255}),createdAt:(0,h.timestamp)("created_at",{withTimezone:!0}).notNull().defaultNow(),isAutosave:(0,h.boolean)("is_autosave").notNull().default(!1)},t=>({uniqueEntityVersionLocale:(0,h.unique)().on(t.entityId,t.version,t.locale)}))}var h,W=E(()=>{"use strict";h=require("drizzle-orm/pg-core")});var U={};D(U,{generateLocaleStatusSchema:()=>ut});function ut(r){let e=`${r.name}_locale_status`;return(0,_.pgTable)(e,{id:(0,_.uuid)("id").primaryKey().defaultRandom(),entityId:(0,_.uuid)("entity_id").notNull(),locale:(0,_.varchar)("locale",{length:10}).notNull(),status:(0,_.varchar)("status",{length:20}).notNull().default("draft"),publishedAt:(0,_.timestamp)("published_at",{withTimezone:!0})},t=>({uniqueEntityLocale:(0,_.unique)().on(t.entityId,t.locale)}))}var _,H=E(()=>{"use strict";_=require("drizzle-orm/pg-core")});var G={};D(G,{generateDraftsSchema:()=>ft});function ft(r){let e=`${r.name}_drafts`;return(0,b.pgTable)(e,{id:(0,b.uuid)("id").primaryKey().defaultRandom(),entityId:(0,b.uuid)("entity_id").notNull(),locale:(0,b.varchar)("locale",{length:10}).notNull().default("_"),data:(0,b.jsonb)("data").notNull(),createdBy:(0,b.varchar)("created_by",{length:255}).notNull(),createdByName:(0,b.varchar)("created_by_name",{length:255}),createdAt:(0,b.timestamp)("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:(0,b.timestamp)("updated_at",{withTimezone:!0}).notNull().defaultNow()},t=>({uniqueEntityLocale:(0,b.unique)().on(t.entityId,t.locale)}))}var b,Q=E(()=>{"use strict";b=require("drizzle-orm/pg-core")});var X={};D(X,{toolkitContentLocks:()=>mt});var k,mt,Y=E(()=>{"use strict";k=require("drizzle-orm/pg-core"),mt=(0,k.pgTable)("toolkit_content_locks",{id:(0,k.uuid)("id").primaryKey().defaultRandom(),entityType:(0,k.varchar)("entity_type",{length:100}).notNull(),entityId:(0,k.varchar)("entity_id",{length:255}).notNull(),locale:(0,k.varchar)("locale",{length:10}).notNull().default("_"),lockedBy:(0,k.varchar)("locked_by",{length:255}).notNull(),lockedByName:(0,k.varchar)("locked_by_name",{length:255}),lockedAt:(0,k.timestamp)("locked_at",{withTimezone:!0}).notNull().defaultNow(),expiresAt:(0,k.timestamp)("expires_at",{withTimezone:!0}).notNull()},r=>({uniqueEntityLock:(0,k.unique)().on(r.entityType,r.entityId,r.locale)}))});var S={};D(S,{content:()=>yt,getContentConfig:()=>gt});function gt(){if(!$)throw new Error("@murumets-ee/content plugin not initialized. Add content() to your plugins array.");return $}function yt(r){if(!r.locales||r.locales.length===0)throw new Error("content() requires at least one locale");if(!r.defaultLocale)throw new Error("content() requires a defaultLocale");if(!r.locales.some(t=>t.code===r.defaultLocale))throw new Error(`defaultLocale "${r.defaultLocale}" not found in locales: [${r.locales.map(t=>t.code).join(", ")}]`);return{name:"@murumets-ee/content",init:async t=>{$=r;let{schemaRegistry:n}=await import("@murumets-ee/db"),{generateVersionsSchema:i}=await Promise.resolve().then(()=>(W(),K)),{generateLocaleStatusSchema:a}=await Promise.resolve().then(()=>(H(),U)),{generateDraftsSchema:o}=await Promise.resolve().then(()=>(Q(),G)),{toolkitContentLocks:c}=await Promise.resolve().then(()=>(Y(),X)),{generateLayoutSchema:s,generateLayoutTranslationSchema:d}=await import("@murumets-ee/entity"),u=0,l=0,f=0,m=0;n.has("toolkit_content_locks")||n.register("toolkit_content_locks",c);for(let[y,p]of t.entities){if(p.behaviors?.some(w=>w.name==="versionable")){let w=`${y}_versions`;if(!n.has(w)){let R=i(p);n.register(w,R)}u++}let B=p.allFields;if(Object.values(B).some(w=>w.type==="blocks")){let w=`${y}_layout`;if(!n.has(w)){let V=s(p);V&&n.register(w,V)}let R=`${y}_layout_translations`;if(!n.has(R)){let V=d(p);V&&n.register(R,V)}l++}let q=p.behaviors?.some(w=>w.name==="publishable"),Z=Object.values(B).some(w=>w.translatable);if(q&&Z){let w=`${y}_locale_status`;if(!n.has(w)){let R=a(p);n.register(w,R)}f++}if(q){let w=`${y}_drafts`;if(!n.has(w)){let R=o(p);n.register(w,R)}m++}}t.logger.info({locales:r.locales.map(y=>y.code),defaultLocale:r.defaultLocale,versionableEntities:u,blockEntities:l,localeStatusEntities:f,draftEntities:m},"Content plugin initialized")}}}var $,A=E(()=>{"use strict";$=null});var ht={};D(ht,{ContentClient:()=>x,createContentClient:()=>pt});module.exports=rt(ht);var Tt=require("server-only");var ot=require("@murumets-ee/entity");function I(r){return r?r.find(t=>t.name==="versionable")?._versionableOptions??null:null}function j(r){return r.match(/\S+|\s+/g)??[]}function O(r,e){if(r===e)return r?[{type:"equal",value:r}]:[];if(!r)return[{type:"add",value:e}];if(!e)return[{type:"remove",value:r}];let t=j(r),n=j(e),i=t.length,a=n.length,o=Array.from({length:i+1},()=>new Array(a+1).fill(0));for(let l=1;l<=i;l++)for(let f=1;f<=a;f++)t[l-1]===n[f-1]?o[l][f]=o[l-1][f-1]+1:o[l][f]=Math.max(o[l-1][f],o[l][f-1]);let c=[],s=i,d=a,u=[];for(;s>0||d>0;)s>0&&d>0&&t[s-1]===n[d-1]?(u.push({type:"equal",value:t[s-1]}),s--,d--):d>0&&(s===0||o[s][d-1]>=o[s-1][d])?(u.push({type:"add",value:n[d-1]}),d--):(u.push({type:"remove",value:t[s-1]}),s--);u.reverse();for(let l of u){let f=c[c.length-1];f&&f.type===l.type?f.value+=l.value:c.push({...l})}return c}function M(r){return r.replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim()}function T(r){return r==null?"":r instanceof Date?r.toISOString():typeof r=="object"?JSON.stringify(r):String(r)}function at(r,e,t,n){if(JSON.stringify(e)===JSON.stringify(t))return null;switch(n?.type??lt(e,t)){case"text":case"slug":{let a=O(T(e),T(t));return{field:r,type:"text",from:e,to:t,segments:a}}case"richtext":{let a=O(M(T(e)),M(T(t)));return{field:r,type:"richtext",from:e,to:t,segments:a}}case"number":return{field:r,type:"number",from:e,to:t};case"boolean":return{field:r,type:"boolean",from:e,to:t};case"date":return{field:r,type:"date",from:e,to:t};case"select":return{field:r,type:"select",from:e,to:t};case"media":return{field:r,type:"media",from:e,to:t};case"json":return{field:r,type:"json",from:e,to:t};case"blocks":return{field:r,type:"blocks",from:e,to:t};default:return{field:r,type:"unknown",from:e,to:t}}}function F(r,e,t){let n=new Set([...Object.keys(r),...Object.keys(e)]),i=[];for(let a of n){if(a==="id"||a==="createdAt"||a==="updatedAt")continue;let o=at(a,r[a],e[a],t?.[a]);o&&i.push(o)}return i}function lt(r,e){let t=r??e;return typeof t=="number"?"number":typeof t=="boolean"?"boolean":t instanceof Date?"date":typeof t=="string"?/^\d{4}-\d{2}-\d{2}/.test(t)?"date":"text":Array.isArray(t)?t.length>0&&typeof t[0]=="object"&&t[0]!==null&&"_block"in t[0]?"blocks":"json":typeof t=="object"?"json":"unknown"}function z(r,e){if(typeof r=="string"||typeof e=="string")return O(T(r),T(e))}function J(r){return typeof r=="object"&&r!==null&&"_block"in r&&"_id"in r&&typeof r._block=="string"&&typeof r._id=="string"}function ct(r,e){let t=new Set([...Object.keys(r),...Object.keys(e)]),n=[];for(let i of t){if(i==="_block"||i==="_id")continue;let a=r[i],o=e[i];JSON.stringify(a)!==JSON.stringify(o)&&n.push({field:i,from:a,to:o,segments:z(a,o)})}return n}function L(r,e){let t=r.filter(J),n=e.filter(J),i=new Map,a=new Map;for(let s=0;s<t.length;s++)i.set(t[s]._id,{block:t[s],index:s});for(let s=0;s<n.length;s++)a.set(n[s]._id,{block:n[s],index:s});let o=[],c=new Set;for(let[s,{block:d,index:u}]of a){c.add(s);let l=i.get(s);if(!l){o.push({blockId:s,blockType:d._block,status:"added",toIndex:u});continue}let f=l.block,m=l.index,y=ct(f,d),p=m!==u;y.length===0&&!p?o.push({blockId:s,blockType:d._block,status:"unchanged",fromIndex:m,toIndex:u}):y.length>0?o.push({blockId:s,blockType:d._block,status:"changed",fromIndex:m,toIndex:u,propDiffs:y}):o.push({blockId:s,blockType:d._block,status:"moved",fromIndex:m,toIndex:u})}for(let[s,{block:d,index:u}]of i)c.has(s)||o.push({blockId:s,blockType:d._block,status:"removed",fromIndex:u});return o}var x=class{entity;db;logger;admin=null;versionableOptions;constructor(e){this.entity=e.entity,this.db=e.db,this.logger=e.logger,this.versionableOptions=I(e.entity.behaviors)}async getAdmin(){if(!this.admin){let{AdminClient:e}=await import("@murumets-ee/entity/admin");this.admin=new e({entity:this.entity,db:this.db,logger:this.logger})}return this.admin}async create(e){let n=await(await this.getAdmin()).create(e);return this.versionableOptions&&await this.saveVersionSnapshot(n.id,n,null,!1),n}async findById(e,t){return(await this.getAdmin()).findById(e,t)}async findMany(e){return(await this.getAdmin()).findMany(e)}async update(e,t){let n=await this.getAdmin(),i=null;this.versionableOptions&&(i=await n.findById(e));let a=await n.update(e,t);if(this.versionableOptions&&i){let o=this.calculateDelta(i,a),c=await this.saveVersionSnapshot(e,a,o,!1);if(c!==void 0){let{schemaRegistry:s}=await import("@murumets-ee/db"),{eq:d}=await import("drizzle-orm"),u=s.get(this.entity.name);u&&(await this.db.update(u).set({_version:c}).where(d(u.id,e)),a._version=c)}await this.pruneVersions(e)}return a}async delete(e){return(await this.getAdmin()).delete(e)}async saveTranslation(e,t,n){return(await this.getAdmin()).saveTranslation(e,t,n)}async deleteTranslation(e,t){return(await this.getAdmin()).deleteTranslation(e,t)}async copyLayout(e,t){let{schemaRegistry:n}=await import("@murumets-ee/db"),{eq:i,and:a}=await import("drizzle-orm"),o=n.get(`${this.entity.name}_layout`);if(!o)return;let c=Array.isArray(t.to)?t.to:[t.to],s=await this.db.select().from(o).where(a(i(o.entityId,e),i(o.locale,t.from))).orderBy(o.sortOrder);if(s.length!==0){for(let d of c){await this.db.delete(o).where(a(i(o.entityId,e),i(o.locale,d)));for(let u of s)await this.db.insert(o).values({entityId:u.entityId,fieldName:u.fieldName,blockType:u.blockType,sortOrder:u.sortOrder,data:u.data,locale:d})}this.logger?.debug({entityId:e,from:t.from,to:c},"Layout copied between locales")}}async getVersions(e,t){let{schemaRegistry:n}=await import("@murumets-ee/db"),{eq:i,and:a,desc:o}=await import("drizzle-orm"),c=n.get(`${this.entity.name}_versions`);if(!c)return[];let s=t?.locale??"_",d=this.db.select().from(c).where(a(i(c.entityId,e),i(c.locale,s))).orderBy(o(c.version)).$dynamic();return t?.limit&&(d=d.limit(t.limit)),t?.offset&&(d=d.offset(t.offset)),d}async getVersion(e,t,n="_"){let{schemaRegistry:i}=await import("@murumets-ee/db"),{eq:a,and:o}=await import("drizzle-orm"),c=i.get(`${this.entity.name}_versions`);return c?(await this.db.select().from(c).where(o(a(c.entityId,e),a(c.version,t),a(c.locale,n))).limit(1))[0]??null:null}async compareVersions(e,t,n,i="_"){let[a,o]=await Promise.all([this.getVersion(e,t,i),this.getVersion(e,n,i)]);if(!a||!o)return null;let c=a.data,s=o.data,d=this.entity.allFields,u=F(c,s,d);for(let l of u)l.type==="blocks"&&Array.isArray(l.from)&&Array.isArray(l.to)&&(l.blockDiffs=L(l.from,l.to));return{diffs:u,fromVersion:a,toVersion:o}}async compareDraftWithCurrent(e,t="_"){let n=await this.getDraft(e,t);if(!n)return null;let i=await this.getAdmin(),{getContentConfig:a}=await Promise.resolve().then(()=>(A(),S)),c=a().defaultLocale,s=t==="_"?{defaultLocale:c}:{locale:t,defaultLocale:c},d=await i.findById(e,s);if(!d)return null;let u=this.entity.allFields,l={};for(let m of Object.keys(n.data))l[m]=d[m];let f=F(l,n.data,u);for(let m of f)m.type==="blocks"&&Array.isArray(m.from)&&Array.isArray(m.to)&&(m.blockDiffs=L(m.from,m.to));return{diffs:f,current:d,draft:n}}async restoreVersion(e,t){let n=await this.getVersion(e,t);if(!n)throw new Error(`Version ${t} not found for entity ${e}`);let i=n.data,{id:a,createdAt:o,createdBy:c,_version:s,_versionedAt:d,...u}=i;return(await this.getAdmin()).update(e,u)}async pruneVersions(e,t="_"){if(!this.versionableOptions)return;let{schemaRegistry:n}=await import("@murumets-ee/db"),{eq:i,and:a,desc:o,sql:c}=await import("drizzle-orm"),s=n.get(`${this.entity.name}_versions`);if(!s)return;let d=this.versionableOptions.maxPerDoc,u=await this.db.select({id:s.id}).from(s).where(a(i(s.entityId,e),i(s.locale,t))).orderBy(o(s.version)).limit(d);if(u.length<d)return;let l=u.map(f=>f.id);await this.db.delete(s).where(c`${s.entityId} = ${e} AND ${s.locale} = ${t} AND ${s.id} NOT IN (${c.join(l.map(f=>c`${f}`),c`, `)})`)}async getTranslationStatus(e){let{getContentConfig:t}=await Promise.resolve().then(()=>(A(),S)),n=t(),i=Object.entries(this.entity.allFields).filter(([l,f])=>f.translatable).map(([l])=>l);if(i.length===0)return{};let{schemaRegistry:a}=await import("@murumets-ee/db"),{eq:o}=await import("drizzle-orm"),c=a.get(`${this.entity.name}_translations`);if(!c)return{};let s=await this.db.select().from(c).where(o(c.entityId,e)),d=new Map;for(let l of s){let f=l,m={};for(let y of i)m[y]=f[y];d.set(f.locale,m)}let u={};for(let l of n.locales){if(l.code===n.defaultLocale)continue;let f=d.get(l.code)??{},m=[];for(let p of i)(f[p]===void 0||f[p]===null)&&m.push(p);let y=i.length-m.length;u[l.code]={complete:m.length===0,total:i.length,translated:y,missing:m}}return u}async getTranslationStatusBatch(e){let t=new Map;if(e.length===0)return t;let{getContentConfig:n}=await Promise.resolve().then(()=>(A(),S)),i=n(),a=Object.entries(this.entity.allFields).filter(([l,f])=>f.translatable).map(([l])=>l);if(a.length===0)return t;let{schemaRegistry:o}=await import("@murumets-ee/db"),{inArray:c}=await import("drizzle-orm"),s=o.get(`${this.entity.name}_translations`);if(!s)return t;let d=await this.db.select().from(s).where(c(s.entityId,e)),u=new Map;for(let l of d){let f=l,m=f.entityId,y=f.locale,p={};for(let v of a)p[v]=f[v];u.has(m)||u.set(m,new Map),u.get(m).set(y,p)}for(let l of e){let f=u.get(l),m={};for(let y of i.locales){if(y.code===i.defaultLocale)continue;let p=f?.get(y.code)??{},v=[];for(let C of a)(p[C]===void 0||p[C]===null)&&v.push(C);let B=a.length-v.length;m[y.code]={complete:v.length===0,total:a.length,translated:B,missing:v}}t.set(l,m)}return t}async getTranslationReport(e){let{getContentConfig:t}=await Promise.resolve().then(()=>(A(),S)),n=t(),i=e?.locale??n.locales.find(u=>u.code!==n.defaultLocale)?.code;if(!i)return{total:0,complete:0,partial:0,missing:0};let o=await(await this.getAdmin()).findMany(),c=0,s=0,d=0;for(let u of o){let f=(await this.getTranslationStatus(u.id))[i];!f||f.translated===0?d++:f.complete?c++:s++}return{total:o.length,complete:c,partial:s,missing:d}}async getLocaleStatus(e){let{schemaRegistry:t}=await import("@murumets-ee/db"),{eq:n}=await import("drizzle-orm"),i=t.get(`${this.entity.name}_locale_status`);return i?(await this.db.select().from(i).where(n(i.entityId,e))).map(o=>({locale:o.locale,status:o.status,publishedAt:o.publishedAt??null})):[]}async setLocaleStatus(e,t,n){let{getContentConfig:i}=await Promise.resolve().then(()=>(A(),S)),a=i();if(t===a.defaultLocale){let f=await this.getAdmin(),m={status:n};n==="published"&&(m.publishedAt=new Date),await f.update(e,m);return}let{schemaRegistry:o}=await import("@murumets-ee/db"),{eq:c,and:s}=await import("drizzle-orm"),d=o.get(`${this.entity.name}_locale_status`);if(!d)return;let u=n==="published"?new Date:null,[l]=await this.db.select({id:d.id}).from(d).where(s(c(d.entityId,e),c(d.locale,t))).limit(1);l?await this.db.update(d).set({status:n,publishedAt:u}).where(c(d.id,l.id)):await this.db.insert(d).values({entityId:e,locale:t,status:n,publishedAt:u})}async getLocaleStatusBatch(e){let t=new Map;if(e.length===0)return t;let{schemaRegistry:n}=await import("@murumets-ee/db"),{inArray:i}=await import("drizzle-orm"),a=n.get(`${this.entity.name}_locale_status`);if(!a)return t;let o=await this.db.select().from(a).where(i(a.entityId,e));for(let c of o){let s=c.entityId,d=c.locale;t.has(s)||t.set(s,{}),t.get(s)[d]={locale:d,status:c.status,publishedAt:c.publishedAt??null}}return t}async saveDraft(e,t,n="_",i){let{schemaRegistry:a}=await import("@murumets-ee/db"),{eq:o,and:c}=await import("drizzle-orm"),s=a.get(`${this.entity.name}_drafts`);if(!s)throw new Error(`Drafts table not found for entity "${this.entity.name}". Is the content plugin initialized?`);let d=new Date,u=i?.id??"",l=i?.name??null,[f]=await this.db.select().from(s).where(c(o(s.entityId,e),o(s.locale,n))).limit(1);if(f){let[y]=await this.db.update(s).set({data:t,updatedAt:d}).where(o(s.id,f.id)).returning();return this.toDraftEntry(y)}let[m]=await this.db.insert(s).values({entityId:e,locale:n,data:t,createdBy:u,createdByName:l,createdAt:d,updatedAt:d}).returning();return this.toDraftEntry(m)}async getDraft(e,t="_"){let{schemaRegistry:n}=await import("@murumets-ee/db"),{eq:i,and:a}=await import("drizzle-orm"),o=n.get(`${this.entity.name}_drafts`);if(!o)return null;let[c]=await this.db.select().from(o).where(a(i(o.entityId,e),i(o.locale,t))).limit(1);return c?this.toDraftEntry(c):null}async deleteDraft(e,t="_"){let{schemaRegistry:n}=await import("@murumets-ee/db"),{eq:i,and:a}=await import("drizzle-orm"),o=n.get(`${this.entity.name}_drafts`);return o?(await this.db.delete(o).where(a(i(o.entityId,e),i(o.locale,t))).returning({id:o.id})).length>0:!1}async publishDraft(e,t="_",n){let i=await this.getDraft(e,t);if(!i)throw new Error(`No draft found for entity ${e} locale ${t}`);let a=await this.getAdmin(),o=null;this.versionableOptions&&(o=await a.findById(e));let c=i.data,{id:s,createdAt:d,createdBy:u,_version:l,_versionedAt:f,...m}=c,y=await a.update(e,m);return await this.deleteDraft(e,t),this.versionableOptions&&await this.createVersionSnapshot(e,y,o,t,n),y}async hasDraft(e,t="_"){let{schemaRegistry:n}=await import("@murumets-ee/db"),{eq:i,and:a}=await import("drizzle-orm"),o=n.get(`${this.entity.name}_drafts`);if(!o)return!1;let[c]=await this.db.select({id:o.id}).from(o).where(a(i(o.entityId,e),i(o.locale,t))).limit(1);return!!c}async hasDraftBatch(e,t="_"){let n=new Set;if(e.length===0)return n;let{schemaRegistry:i}=await import("@murumets-ee/db"),{inArray:a,eq:o,and:c}=await import("drizzle-orm"),s=i.get(`${this.entity.name}_drafts`);if(!s)return n;let d=await this.db.select({entityId:s.entityId}).from(s).where(c(a(s.entityId,e),o(s.locale,t)));for(let u of d)n.add(u.entityId);return n}async createVersionSnapshot(e,t,n,i,a){if(!this.versionableOptions)return;let o=i??"_",c=n?this.calculateDelta(n,t):null,s=await this.saveVersionSnapshot(e,t,c,!1,o,a);if(s!==void 0&&o==="_"){let{schemaRegistry:d}=await import("@murumets-ee/db"),{eq:u}=await import("drizzle-orm"),l=d.get(this.entity.name);l&&await this.db.update(l).set({_version:s}).where(u(l.id,e))}await this.pruneVersions(e,o)}async saveVersionSnapshot(e,t,n,i,a="_",o){let{schemaRegistry:c}=await import("@murumets-ee/db"),{eq:s,and:d,sql:u}=await import("drizzle-orm"),l=c.get(`${this.entity.name}_versions`);if(!l)return;let[f]=await this.db.select({maxVersion:u`coalesce(max(${l.version}), 0)`}).from(l).where(d(s(l.entityId,e),s(l.locale,a))),m=(f?.maxVersion??0)+1,y=t.status??null;if(i){let[p]=await this.db.select().from(l).where(d(s(l.entityId,e),s(l.isAutosave,!0),s(l.version,m),s(l.locale,a))).limit(1);if(p)return await this.db.update(l).set({data:t,delta:n,status:y,createdAt:new Date}).where(s(l.id,p.id)),m}return await this.db.insert(l).values({entityId:e,version:m,locale:a,data:t,delta:n,status:y,createdBy:o?.id??t.updatedBy??t.createdBy??null,createdByName:o?.name??null,isAutosave:i}),m}toDraftEntry(e){return{id:e.id,entityId:e.entityId,locale:e.locale,data:e.data,createdBy:e.createdBy,createdByName:e.createdByName??null,createdAt:e.createdAt,updatedAt:e.updatedAt}}calculateDelta(e,t){let n={};for(let i of Object.keys(t))i==="id"||i.startsWith("_")||JSON.stringify(e[i])!==JSON.stringify(t[i])&&(n[i]=t[i]);return n}};async function pt(r){let{getApp:e}=await import("@murumets-ee/core"),t=e();return new x({entity:r,db:t.db.readWrite,logger:t.logger.child({content:r.name})})}0&&(module.exports={ContentClient,createContentClient});