@seedprotocol/sdk 0.7.0 → 0.7.2-next.593.gd5bd4ea

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 (160) hide show
  1. package/dist/{BasePathResolver-ndE8XTpw.js → BasePathResolver-BdxCSIzn.js} +2 -2
  2. package/dist/{BasePathResolver-ndE8XTpw.js.map → BasePathResolver-BdxCSIzn.js.map} +1 -1
  3. package/dist/{ClientManager-DLleL_2e.js → ClientManager-ClCwwhwo.js} +28 -23
  4. package/dist/ClientManager-ClCwwhwo.js.map +1 -0
  5. package/dist/{Item-zBFWQDU9.js → Item-B9Y4VuK1.js} +140 -74
  6. package/dist/Item-B9Y4VuK1.js.map +1 -0
  7. package/dist/{ModelProperty-lth9L37R.js → ModelProperty-BMePcicQ.js} +64 -36
  8. package/dist/ModelProperty-BMePcicQ.js.map +1 -0
  9. package/dist/{Schema-DOhlrQ-N.js → Schema-COsEXXaR.js} +106 -58
  10. package/dist/Schema-COsEXXaR.js.map +1 -0
  11. package/dist/{SchemaValidationService-DDKr5piy.js → SchemaValidationService-DabGMzSE.js} +7 -8
  12. package/dist/{SchemaValidationService-DDKr5piy.js.map → SchemaValidationService-DabGMzSE.js.map} +1 -1
  13. package/dist/{backfillMetadataPropertyIds-fG3ujaSh.js → backfillMetadataPropertyIds-Ck6fumnm.js} +4 -4
  14. package/dist/{backfillMetadataPropertyIds-fG3ujaSh.js.map → backfillMetadataPropertyIds-Ck6fumnm.js.map} +1 -1
  15. package/dist/cjs/{ModelProperty-BEsIHAjk.js → ModelProperty-BT6Un_MB.js} +59 -30
  16. package/dist/cjs/ModelProperty-BT6Un_MB.js.map +1 -0
  17. package/dist/cjs/{Schema-qEp5mH1N.js → Schema-BXhXdUsA.js} +93 -44
  18. package/dist/cjs/Schema-BXhXdUsA.js.map +1 -0
  19. package/dist/cjs/{SchemaValidationService-CWEnZmOH.js → SchemaValidationService-CC18QDfc.js} +2 -2
  20. package/dist/cjs/{SchemaValidationService-CWEnZmOH.js.map → SchemaValidationService-CC18QDfc.js.map} +1 -1
  21. package/dist/cjs/{backfillMetadataPropertyIds-tw8JGMT0.js → backfillMetadataPropertyIds-DEHC9ejq.js} +3 -3
  22. package/dist/cjs/{backfillMetadataPropertyIds-tw8JGMT0.js.map → backfillMetadataPropertyIds-DEHC9ejq.js.map} +1 -1
  23. package/dist/cjs/{eas-CLiV2Hmn.js → eas-C3CL0l7l.js} +3 -3
  24. package/dist/cjs/{eas-CLiV2Hmn.js.map → eas-C3CL0l7l.js.map} +1 -1
  25. package/dist/cjs/{getItem-DSRtx_68.js → getItem-CrwWYCkj.js} +2 -2
  26. package/dist/cjs/{getItem-DSRtx_68.js.map → getItem-CrwWYCkj.js.map} +1 -1
  27. package/dist/cjs/{getPublishPayload-D5-dYtNq.js → getPublishPayload-DRJh7WR0.js} +171 -209
  28. package/dist/cjs/getPublishPayload-DRJh7WR0.js.map +1 -0
  29. package/dist/cjs/{getPublishUploads-B5Lq6q-_.js → getPublishUploads-Bh22D3zJ.js} +49 -10
  30. package/dist/cjs/getPublishUploads-Bh22D3zJ.js.map +1 -0
  31. package/dist/cjs/{index-B3UDbm1C.js → index-BA1RIYFG.js} +3 -3
  32. package/dist/cjs/index-BA1RIYFG.js.map +1 -0
  33. package/dist/cjs/{index-C66AfYDG.js → index-Dls7aMjr.js} +281 -90
  34. package/dist/cjs/index-Dls7aMjr.js.map +1 -0
  35. package/dist/cjs/{property-BVJIP7SX.js → property-ZerTWizX.js} +5 -5
  36. package/dist/cjs/{property-BVJIP7SX.js.map → property-ZerTWizX.js.map} +1 -1
  37. package/dist/cjs/publishDraftGraph-CPOAcQFf.js +403 -0
  38. package/dist/cjs/publishDraftGraph-CPOAcQFf.js.map +1 -0
  39. package/dist/cjs/{resetAmbiguousLegacyItemData-BaZqUui9.js → resetAmbiguousLegacyItemData-adDl4LcT.js} +2 -2
  40. package/dist/cjs/{resetAmbiguousLegacyItemData-BaZqUui9.js.map → resetAmbiguousLegacyItemData-adDl4LcT.js.map} +1 -1
  41. package/dist/cjs/{resolveModelForSyncedSeed-CC6dQctx.js → resolveModelForSyncedSeed-DoNThPdL.js} +2 -2
  42. package/dist/cjs/{resolveModelForSyncedSeed-CC6dQctx.js.map → resolveModelForSyncedSeed-DoNThPdL.js.map} +1 -1
  43. package/dist/cjs/{syncDbWithEas-Dk96sAG-.js → syncDbWithEas-CYfPkus9.js} +20 -7
  44. package/dist/cjs/{syncDbWithEas-Dk96sAG-.js.map → syncDbWithEas-CYfPkus9.js.map} +1 -1
  45. package/dist/{configurePlatform-BMoPG9vY.js → configurePlatform-xU3Hsno3.js} +4 -4
  46. package/dist/{configurePlatform-BMoPG9vY.js.map → configurePlatform-xU3Hsno3.js.map} +1 -1
  47. package/dist/{db-BJZN0a0a.js → db-W1g29qsM.js} +31 -27
  48. package/dist/{db-BJZN0a0a.js.map → db-W1g29qsM.js.map} +1 -1
  49. package/dist/{eas-B0hsMLqt.js → eas-CSwV6MvB.js} +6 -6
  50. package/dist/{eas-B0hsMLqt.js.map → eas-CSwV6MvB.js.map} +1 -1
  51. package/dist/{getItem-DEh4WfHG.js → getItem-BYQeM3DY.js} +5 -6
  52. package/dist/{getItem-DEh4WfHG.js.map → getItem-BYQeM3DY.js.map} +1 -1
  53. package/dist/{getPublishPayload-H032DHC7.js → getPublishPayload-D5CQZd-y.js} +167 -206
  54. package/dist/getPublishPayload-D5CQZd-y.js.map +1 -0
  55. package/dist/{getPublishUploads-CR66RlGJ.js → getPublishUploads-BGpDsrBp.js} +52 -14
  56. package/dist/getPublishUploads-BGpDsrBp.js.map +1 -0
  57. package/dist/{index-6bJuv5Tt.js → index-Bev-hZF-.js} +9 -10
  58. package/dist/index-Bev-hZF-.js.map +1 -0
  59. package/dist/{index-B0LgJblD.js → index-CSOQFAOn.js} +2 -2
  60. package/dist/index-CSOQFAOn.js.map +1 -0
  61. package/dist/{index-DtfjeuxC.js → index-DRXC5Mra.js} +167 -75
  62. package/dist/index-DRXC5Mra.js.map +1 -0
  63. package/dist/{index.browser-CNrqhvEA.js → index.browser-DO20vYuP.js} +9 -9
  64. package/dist/{index.browser-CNrqhvEA.js.map → index.browser-DO20vYuP.js.map} +1 -1
  65. package/dist/{index.node-DrHiTuOr.js → index.node-C4iyOhdo.js} +5 -5
  66. package/dist/{index.node-DrHiTuOr.js.map → index.node-C4iyOhdo.js.map} +1 -1
  67. package/dist/main.cjs +1 -1
  68. package/dist/main.js +258 -183
  69. package/dist/main.js.map +1 -1
  70. package/dist/node.js +14 -15
  71. package/dist/node.js.map +1 -1
  72. package/dist/platform.browser.js +5 -5
  73. package/dist/platform.node.js +3 -3
  74. package/dist/{property-D2Nnsmm1.js → property-BT1zDSkd.js} +10 -11
  75. package/dist/property-BT1zDSkd.js.map +1 -0
  76. package/dist/publishDraftGraph-Bcfrdj7-.js +405 -0
  77. package/dist/publishDraftGraph-Bcfrdj7-.js.map +1 -0
  78. package/dist/{resetAmbiguousLegacyItemData-BqbHNUYk.js → resetAmbiguousLegacyItemData-Ci6PM_vC.js} +2 -2
  79. package/dist/{resetAmbiguousLegacyItemData-BqbHNUYk.js.map → resetAmbiguousLegacyItemData-Ci6PM_vC.js.map} +1 -1
  80. package/dist/{resolveModelForSyncedSeed-DQK6JfXS.js → resolveModelForSyncedSeed-CLlumTBq.js} +2 -2
  81. package/dist/{resolveModelForSyncedSeed-DQK6JfXS.js.map → resolveModelForSyncedSeed-CLlumTBq.js.map} +1 -1
  82. package/dist/src/Item/Item.d.ts +11 -0
  83. package/dist/src/Item/Item.d.ts.map +1 -1
  84. package/dist/src/ItemProperty/ItemProperty.d.ts +10 -0
  85. package/dist/src/ItemProperty/ItemProperty.d.ts.map +1 -1
  86. package/dist/src/Model/Model.d.ts +15 -2
  87. package/dist/src/Model/Model.d.ts.map +1 -1
  88. package/dist/src/Model/service/actors/createModelProperties.d.ts.map +1 -1
  89. package/dist/src/Model/service/actors/loadOrCreateModel.d.ts.map +1 -1
  90. package/dist/src/Model/service/actors/validateModel.d.ts.map +1 -1
  91. package/dist/src/Model/service/modelMachine.d.ts.map +1 -1
  92. package/dist/src/ModelProperty/ModelProperty.d.ts +9 -1
  93. package/dist/src/ModelProperty/ModelProperty.d.ts.map +1 -1
  94. package/dist/src/ModelProperty/service/actors/compareAndMarkDraft.d.ts.map +1 -1
  95. package/dist/src/ModelProperty/service/actors/saveToSchema.d.ts.map +1 -1
  96. package/dist/src/ModelProperty/service/actors/validateProperty.d.ts.map +1 -1
  97. package/dist/src/Schema/Schema.d.ts +7 -0
  98. package/dist/src/Schema/Schema.d.ts.map +1 -1
  99. package/dist/src/Schema/service/actors/checkExistingSchema.d.ts.map +1 -1
  100. package/dist/src/Schema/service/actors/createModelInstances.d.ts.map +1 -1
  101. package/dist/src/Schema/service/actors/loadOrCreateSchema.d.ts.map +1 -1
  102. package/dist/src/db/read/getPublishPayload.d.ts +9 -0
  103. package/dist/src/db/read/getPublishPayload.d.ts.map +1 -1
  104. package/dist/src/db/read/getPublishUploads.d.ts +5 -0
  105. package/dist/src/db/read/getPublishUploads.d.ts.map +1 -1
  106. package/dist/src/db/read/publishDraftGraph.d.ts +57 -0
  107. package/dist/src/db/read/publishDraftGraph.d.ts.map +1 -0
  108. package/dist/src/db/read/summarizePublishWork.d.ts.map +1 -1
  109. package/dist/src/helpers/entity/entityLiveQuery.d.ts.map +1 -1
  110. package/dist/src/helpers/entity/evictionEpoch.d.ts +18 -0
  111. package/dist/src/helpers/entity/evictionEpoch.d.ts.map +1 -0
  112. package/dist/src/helpers/generateId.d.ts +4 -0
  113. package/dist/src/helpers/generateId.d.ts.map +1 -1
  114. package/dist/src/helpers/htmlEmbeddedDataUriPublish.d.ts +28 -6
  115. package/dist/src/helpers/htmlEmbeddedDataUriPublish.d.ts.map +1 -1
  116. package/dist/src/index.d.ts +2 -1
  117. package/dist/src/index.d.ts.map +1 -1
  118. package/dist/src/query/createLocalQueryDataSource.d.ts.map +1 -1
  119. package/dist/src/services/write/actors/validateEntity.d.ts.map +1 -1
  120. package/dist/src/types/item.d.ts +7 -8
  121. package/dist/src/types/item.d.ts.map +1 -1
  122. package/dist/{syncDbWithEas-LRKr_NZF.js → syncDbWithEas-BQsXjGhe.js} +15 -16
  123. package/dist/syncDbWithEas-BQsXjGhe.js.map +1 -0
  124. package/dist/{tabEvents-DYI2GU7i.js → tabEvents-C9qUKx_z.js} +28 -11
  125. package/dist/tabEvents-C9qUKx_z.js.map +1 -0
  126. package/dist/{tolerantWebAccess-CzOBz5M6.js → tolerantWebAccess-B-9bwxbw.js} +6 -6
  127. package/dist/{tolerantWebAccess-CzOBz5M6.js.map → tolerantWebAccess-B-9bwxbw.js.map} +1 -1
  128. package/dist/{updateSeedRevokedAt-B58ORbY3.js → updateSeedRevokedAt-D6q0h7pj.js} +3 -3
  129. package/dist/{updateSeedRevokedAt-B58ORbY3.js.map → updateSeedRevokedAt-D6q0h7pj.js.map} +1 -1
  130. package/package.json +13 -10
  131. package/dist/ClientManager-DLleL_2e.js.map +0 -1
  132. package/dist/Item-zBFWQDU9.js.map +0 -1
  133. package/dist/ModelProperty-lth9L37R.js.map +0 -1
  134. package/dist/Schema-DOhlrQ-N.js.map +0 -1
  135. package/dist/cjs/ModelProperty-BEsIHAjk.js.map +0 -1
  136. package/dist/cjs/Schema-qEp5mH1N.js.map +0 -1
  137. package/dist/cjs/getLatestVersionRow-DVizNNoI.js +0 -59
  138. package/dist/cjs/getLatestVersionRow-DVizNNoI.js.map +0 -1
  139. package/dist/cjs/getPublishPayload-D5-dYtNq.js.map +0 -1
  140. package/dist/cjs/getPublishUploads-B5Lq6q-_.js.map +0 -1
  141. package/dist/cjs/getSegmentedItemProperties-giHO7R3d.js +0 -147
  142. package/dist/cjs/getSegmentedItemProperties-giHO7R3d.js.map +0 -1
  143. package/dist/cjs/index-B3UDbm1C.js.map +0 -1
  144. package/dist/cjs/index-C66AfYDG.js.map +0 -1
  145. package/dist/generateId-BopUwD8F.js +0 -9
  146. package/dist/generateId-BopUwD8F.js.map +0 -1
  147. package/dist/getLatestVersionRow-Brrl1AnW.js +0 -46
  148. package/dist/getLatestVersionRow-Brrl1AnW.js.map +0 -1
  149. package/dist/getPublishPayload-H032DHC7.js.map +0 -1
  150. package/dist/getPublishUploads-CR66RlGJ.js.map +0 -1
  151. package/dist/getSegmentedItemProperties-C2EJ2G0N.js +0 -147
  152. package/dist/getSegmentedItemProperties-C2EJ2G0N.js.map +0 -1
  153. package/dist/index-6bJuv5Tt.js.map +0 -1
  154. package/dist/index-B0LgJblD.js.map +0 -1
  155. package/dist/index-DtfjeuxC.js.map +0 -1
  156. package/dist/property-D2Nnsmm1.js.map +0 -1
  157. package/dist/src/browser/helpers/index.d.ts +0 -4
  158. package/dist/src/browser/helpers/index.d.ts.map +0 -1
  159. package/dist/syncDbWithEas-LRKr_NZF.js.map +0 -1
  160. package/dist/tabEvents-DYI2GU7i.js.map +0 -1
@@ -1,22 +1,22 @@
1
1
  'use strict';
2
2
 
3
- var main_cjs = require('./index-C66AfYDG.js');
3
+ var main_cjs = require('./index-Dls7aMjr.js');
4
4
  var easSdk = require('@ethereum-attestation-service/eas-sdk');
5
5
  var casing = require('drizzle-orm/casing');
6
6
  var eas = require('@seedprotocol/eas');
7
- var drizzleOrm = require('drizzle-orm');
8
- var getSegmentedItemProperties = require('./getSegmentedItemProperties-giHO7R3d.js');
9
- var property = require('./property-BVJIP7SX.js');
7
+ var publishDraftGraph = require('./publishDraftGraph-CPOAcQFf.js');
8
+ var property = require('./property-ZerTWizX.js');
10
9
  var lodashEs = require('lodash-es');
10
+ var drizzleOrm = require('drizzle-orm');
11
11
  var debug = require('debug');
12
12
  require('@noble/hashes/sha3');
13
13
  require('@noble/hashes/utils');
14
14
  require('reflect-metadata');
15
- require('pluralize');
16
15
  require('immer');
17
16
  require('xstate');
18
17
  require('drizzle-orm/sqlite-core');
19
18
  require('@seedprotocol/arweave');
19
+ require('pluralize');
20
20
  require('@sinclair/typebox');
21
21
  require('nanoid');
22
22
  require('nanoid-dictionary');
@@ -35,25 +35,6 @@ require('child_process');
35
35
  require('@seedprotocol/arweave/node');
36
36
  require('@seedprotocol/eas/node');
37
37
 
38
- /**
39
- * True when the item's seed attestation was revoked (`seeds.revoked_at` set, by unpublish or EAS
40
- * sync). Such a seed can't take new versions: publishing again creates a new seed attestation
41
- * (see "Republishing" in docs/ATTESTATION_REVOCATION.md).
42
- */
43
- const isSeedRevoked = async (seedLocalId) => {
44
- if (!seedLocalId)
45
- return false;
46
- const appDb = main_cjs.BaseDb.getAppDb();
47
- if (!appDb)
48
- return false;
49
- const [row] = await appDb
50
- .select({ revokedAt: main_cjs.seeds.revokedAt })
51
- .from(main_cjs.seeds)
52
- .where(drizzleOrm.eq(main_cjs.seeds.localId, seedLocalId))
53
- .limit(1);
54
- return main_cjs.isVersionRevoked(row?.revokedAt);
55
- };
56
-
57
38
  /** UTF-8 string to 0x-prefixed bytes32 hex (right-padded with zeros). */
58
39
  function encodeBytes32String(value) {
59
40
  const bytes = new TextEncoder().encode(value);
@@ -106,91 +87,24 @@ class RelatedItemUnpublishedError extends PublishValidationFailedError {
106
87
  }
107
88
  }
108
89
 
109
- const selectSeed = {
110
- seedLocalId: main_cjs.seeds.localId,
111
- seedUid: main_cjs.seeds.uid,
112
- revokedAt: main_cjs.seeds.revokedAt,
113
- type: main_cjs.seeds.type,
114
- };
115
- /**
116
- * The local seed row a relation/list/image ref points at, by local id or uid. A uid that is no
117
- * seed's current uid can be the old uid of a seed that was unpublished and published again (a new
118
- * seed attestation, same local seed): its old version rows still record it, so it resolves to that
119
- * seed. Null when nothing local matches (e.g. a published uid with no local copy).
120
- */
121
- const findRelatedSeedRow = async ({ seedLocalId, seedUid, }) => {
122
- const appDb = main_cjs.BaseDb.getAppDb();
123
- if (!appDb)
124
- return null;
125
- if (seedLocalId) {
126
- const [row] = await appDb.select(selectSeed).from(main_cjs.seeds).where(drizzleOrm.eq(main_cjs.seeds.localId, seedLocalId)).limit(1);
127
- if (row?.seedLocalId)
128
- return row;
129
- }
130
- if (!seedUid || seedUid === main_cjs.ZERO_BYTES32)
131
- return null;
132
- const [byUid] = await appDb.select(selectSeed).from(main_cjs.seeds).where(drizzleOrm.eq(main_cjs.seeds.uid, seedUid)).limit(1);
133
- if (byUid?.seedLocalId)
134
- return byUid;
135
- const [version] = await appDb
136
- .select({ seedLocalId: main_cjs.versions.seedLocalId })
137
- .from(main_cjs.versions)
138
- .where(drizzleOrm.and(drizzleOrm.eq(main_cjs.versions.seedUid, seedUid), drizzleOrm.isNotNull(main_cjs.versions.seedLocalId)))
139
- .limit(1);
140
- if (!version?.seedLocalId)
141
- return null;
142
- const [republished] = await appDb
143
- .select(selectSeed)
144
- .from(main_cjs.seeds)
145
- .where(drizzleOrm.eq(main_cjs.seeds.localId, version.seedLocalId))
146
- .limit(1);
147
- return republished?.seedLocalId ? republished : null;
148
- };
149
- /** The seed is attested and its attestation is live. */
150
- const isLivePublishedSeed = (row) => !!row?.seedUid && row.seedUid !== main_cjs.ZERO_BYTES32 && !main_cjs.isVersionRevoked(row.revokedAt);
151
- /** The seed was attested and that attestation was revoked (unpublished). */
152
- const isUnpublishedSeed = (row) => !!row?.seedUid && row.seedUid !== main_cjs.ZERO_BYTES32 && main_cjs.isVersionRevoked(row.revokedAt);
153
- /** Model a relation/list/image property points at, from its definition. */
154
- function relatedModelNameFromDef(propertyDef) {
155
- const def = propertyDef;
156
- if (!def)
157
- return undefined;
158
- const dataType = main_cjs.normalizeDataType(def.dataType);
159
- if (dataType === main_cjs.ModelPropertyDataTypes.Image)
160
- return 'Image';
161
- if (dataType === main_cjs.ModelPropertyDataTypes.File)
162
- return 'File';
163
- if (dataType === main_cjs.ModelPropertyDataTypes.Html)
164
- return 'Html';
165
- return def.ref ?? def.refModelName;
166
- }
167
- /**
168
- * Name of the item's Html property whose value is the Html seed `htmlSeedLocalId`: the property
169
- * that refers to the images embedded in that Html (htmlEmbeddedImageCoPublish rows).
170
- */
171
- function htmlPropertyNameForHtmlSeed(item, htmlSeedLocalId) {
172
- const want = htmlSeedLocalId.trim();
173
- for (const p of item.properties ?? []) {
174
- if (main_cjs.normalizeDataType(p.propertyDef?.dataType) !== main_cjs.ModelPropertyDataTypes.Html)
175
- continue;
176
- const snap = p.getService().getSnapshot();
177
- const value = 'context' in snap ? snap.context.propertyValue : undefined;
178
- if (typeof value === 'string' && value.trim() === want)
179
- return p.propertyName;
180
- }
181
- return 'html';
182
- }
183
-
184
90
  debug('seedSdk:db:getPublishPayload');
185
91
  /** Case-insensitive dataType match (schema JSON may use "text" vs "Text"). */
186
92
  const matchesDataType = (actual, expected) => main_cjs.normalizeDataType(actual) === expected;
93
+ /** True (and the property is deferred) when `targetSeedLocalId` is an item still in progress. */
94
+ function deferIfBackEdge(ctx, property, targetSeedLocalIds) {
95
+ if (!targetSeedLocalIds.some((id) => !!id && ctx.newSeedsInProgress?.has(id)))
96
+ return false;
97
+ ctx.deferredProperties ?? (ctx.deferredProperties = new Set());
98
+ ctx.deferredProperties.add(property);
99
+ return true;
100
+ }
187
101
  /**
188
102
  * Checks the seed a relation/list/image ref points at. A revoked (unpublished) seed is recorded in
189
103
  * `ctx.unpublishedRelatedItems`; a live published one maps the ref to its current uid. Returns
190
104
  * true when the caller must not walk into the related item (it is published, live or revoked).
191
105
  */
192
106
  function noteRelatedSeed(ctx, ref, row, propertyName, modelName) {
193
- if (isUnpublishedSeed(row)) {
107
+ if (publishDraftGraph.isUnpublishedSeed(row)) {
194
108
  ctx.unpublishedRelatedItems ?? (ctx.unpublishedRelatedItems = []);
195
109
  if (!ctx.unpublishedRelatedItems.some((r) => r.propertyName === propertyName && r.seedLocalId === row.seedLocalId)) {
196
110
  ctx.unpublishedRelatedItems.push({
@@ -202,7 +116,7 @@ function noteRelatedSeed(ctx, ref, row, propertyName, modelName) {
202
116
  }
203
117
  return true;
204
118
  }
205
- if (isLivePublishedSeed(row)) {
119
+ if (publishDraftGraph.isLivePublishedSeed(row)) {
206
120
  if (ref !== row.seedUid) {
207
121
  ctx.relatedRefUids ?? (ctx.relatedRefUids = new Map());
208
122
  ctx.relatedRefUids.set(ref, row.seedUid);
@@ -215,6 +129,13 @@ function noteRelatedSeed(ctx, ref, row, propertyName, modelName) {
215
129
  function currentRelatedRef(ctx, ref) {
216
130
  return ctx.relatedRefUids?.get(ref.trim()) ?? ref;
217
131
  }
132
+ /**
133
+ * An EAS uid (0x + 64 hex), as opposed to a local id. A "0x" prefix alone doesn't tell them apart:
134
+ * local ids are random alphanumerics, and about 1 in 3,844 starts with "0x".
135
+ */
136
+ function isUidRef(ref) {
137
+ return ref.length === 66 && ref.startsWith('0x');
138
+ }
218
139
  function addValidationError(ctx, message, field, code = 'publish_validation') {
219
140
  // A property can be validated on more than one path (List of Relation: list + basic); report once.
220
141
  if (ctx.errors.some((e) => e.message === message && e.field === (field ?? '')))
@@ -296,7 +217,7 @@ async function resolveVersionUid(seedLocalId, seedUid) {
296
217
  if (published?.uid)
297
218
  return published.uid;
298
219
  try {
299
- const { getItemVersionsFromEas } = await Promise.resolve().then(function () { return require('./eas-CLiV2Hmn.js'); });
220
+ const { getItemVersionsFromEas } = await Promise.resolve().then(function () { return require('./eas-C3CL0l7l.js'); });
300
221
  const attestations = await getItemVersionsFromEas({ seedUids: [seedUid] });
301
222
  const latest = attestations?.[0];
302
223
  if (latest?.id)
@@ -363,7 +284,7 @@ const ensurePropertyDefs = async (targetItem) => {
363
284
  schema = await property.getPropertySchema(targetItem.modelName, itemProperty.propertyName, targetScope);
364
285
  if (!schema) {
365
286
  try {
366
- const { Model } = await Promise.resolve().then(function () { return require('./index-C66AfYDG.js'); }).then(function (n) { return n.Model$1; });
287
+ const { Model } = await Promise.resolve().then(function () { return require('./index-Dls7aMjr.js'); }).then(function (n) { return n.Model$1; });
367
288
  const normalizedModelName = lodashEs.upperFirst(lodashEs.camelCase(targetItem.modelName));
368
289
  let model = Model.resolve(normalizedModelName, targetScope);
369
290
  if (!model?.properties?.length && !targetScope.modelFileId) {
@@ -439,6 +360,9 @@ const processBasicProperties = async (itemBasicProperties, itemPublishData, ctx,
439
360
  if (main_cjs.INTERNAL_PROPERTY_NAMES.includes(basicProperty.propertyName)) {
440
361
  continue;
441
362
  }
363
+ if (ctx.deferredProperties?.has(basicProperty)) {
364
+ continue;
365
+ }
442
366
  const snapshot = basicProperty.getService().getSnapshot();
443
367
  const context = 'context' in snapshot ? snapshot.context : null;
444
368
  const propertyDef = basicProperty.propertyDef ?? (context ? context.propertyRecordSchema : undefined);
@@ -529,7 +453,7 @@ const processBasicProperties = async (itemBasicProperties, itemPublishData, ctx,
529
453
  }
530
454
  // Validate against property validation rules (enum, pattern, minLength, maxLength) before encoding
531
455
  if (propertyDef?.validation) {
532
- const { SchemaValidationService } = await Promise.resolve().then(function () { return require('./SchemaValidationService-CWEnZmOH.js'); });
456
+ const { SchemaValidationService } = await Promise.resolve().then(function () { return require('./SchemaValidationService-CC18QDfc.js'); });
533
457
  const validationService = new SchemaValidationService();
534
458
  const validationResult = validationService.validatePropertyValue(value, main_cjs.normalizeDataType(propertyDef.dataType), propertyDef.validation, propertyDef.refValueType
535
459
  ? main_cjs.normalizeDataType(propertyDef.refValueType)
@@ -564,7 +488,7 @@ const processBasicProperties = async (itemBasicProperties, itemPublishData, ctx,
564
488
  if (!trimmed)
565
489
  continue;
566
490
  rawIds.push(trimmed);
567
- if (trimmed.length !== 66 && !trimmed.startsWith('0x')) {
491
+ if (!isUidRef(trimmed)) {
568
492
  newValues.push(encodeBytes32String(trimmed));
569
493
  }
570
494
  else {
@@ -572,7 +496,7 @@ const processBasicProperties = async (itemBasicProperties, itemPublishData, ctx,
572
496
  }
573
497
  }
574
498
  value = newValues;
575
- const needsUidResolve = rawIds.some((id) => id.length !== 66 || !id.startsWith('0x'));
499
+ const needsUidResolve = rawIds.some((id) => !isUidRef(id));
576
500
  if (needsUidResolve && rawIds.length > 0) {
577
501
  rawListIdsForResolve = rawIds;
578
502
  }
@@ -616,8 +540,7 @@ const processBasicProperties = async (itemBasicProperties, itemPublishData, ctx,
616
540
  };
617
541
  // For relation/image properties with seedLocalId, store resolution hints for resolvePublishPayloadValues
618
542
  const looksLikeLocalSeedRef = typeof value === 'string' &&
619
- !value.startsWith('0x') &&
620
- value.length !== 66 &&
543
+ !isUidRef(value) &&
621
544
  /^[a-zA-Z0-9_-]{10,21}$/.test(value.trim());
622
545
  if (looksLikeLocalSeedRef &&
623
546
  (easDataType === 'bytes32' || easDataType === 'string')) {
@@ -669,7 +592,7 @@ const processRelationOrImageProperty = async (relationOrImageProperty, multiPubl
669
592
  matchesDataType(relationOrImageProperty.propertyDef?.refValueType, main_cjs.ModelPropertyDataTypes.Html) ||
670
593
  matchesDataType(relationOrImageProperty.propertyDef?.refValueType, main_cjs.ModelPropertyDataTypes.Json)));
671
594
  if (isStorageSeed && (context.seedLocalId || context.seedUid)) {
672
- const { getPropertyData: getPropertyDataFromDb } = await Promise.resolve().then(function () { return require('./index-C66AfYDG.js'); }).then(function (n) { return n.getPropertyData; });
595
+ const { getPropertyData: getPropertyDataFromDb } = await Promise.resolve().then(function () { return require('./index-Dls7aMjr.js'); }).then(function (n) { return n.getPropertyData; });
673
596
  const metaRow = await getPropertyDataFromDb({
674
597
  propertyName: relationOrImageProperty.propertyName,
675
598
  seedLocalId: context.seedLocalId,
@@ -753,12 +676,15 @@ const processRelationOrImageProperty = async (relationOrImageProperty, multiPubl
753
676
  return multiPublishPayload;
754
677
  }
755
678
  // The local seed, also when the ref is the old uid of a seed published again since.
756
- const relatedSeed = await findRelatedSeedRow({ seedLocalId, seedUid });
679
+ const relatedSeed = await publishDraftGraph.findRelatedSeedRow({ seedLocalId, seedUid });
680
+ if (!isStorageSeed && deferIfBackEdge(ctx, relationOrImageProperty, [relatedSeed?.seedLocalId ?? seedLocalId])) {
681
+ return multiPublishPayload;
682
+ }
757
683
  // Use dynamic import to break circular dependency
758
- const getItemMod = await Promise.resolve().then(function () { return require('./getItem-DSRtx_68.js'); });
684
+ const getItemMod = await Promise.resolve().then(function () { return require('./getItem-CrwWYCkj.js'); });
759
685
  const { getItem } = getItemMod;
760
686
  const relatedItem = await getItem(relatedSeed ? { seedLocalId: relatedSeed.seedLocalId } : { seedLocalId, seedUid });
761
- if (noteRelatedSeed(ctx, normalizedRef, relatedSeed, relationOrImageProperty.propertyName, relatedItem?.modelName ?? relatedModelNameFromDef(relationOrImageProperty.propertyDef))) {
687
+ if (noteRelatedSeed(ctx, normalizedRef, relatedSeed, relationOrImageProperty.propertyName, relatedItem?.modelName ?? publishDraftGraph.relatedModelNameFromDef(relationOrImageProperty.propertyDef))) {
762
688
  return multiPublishPayload;
763
689
  }
764
690
  // When related item not found (e.g. different DB, not yet created)
@@ -775,7 +701,6 @@ const processRelationOrImageProperty = async (relationOrImageProperty, multiPubl
775
701
  if (relatedItem.seedUid && relatedItem.seedUid !== main_cjs.ZERO_BYTES32) {
776
702
  return multiPublishPayload;
777
703
  }
778
- const versionUid = getVersionUid(relatedItem);
779
704
  let modelName;
780
705
  if (matchesDataType(relationOrImageProperty.propertyDef?.dataType, main_cjs.ModelPropertyDataTypes.Image)) {
781
706
  modelName = 'Image';
@@ -794,68 +719,106 @@ const processRelationOrImageProperty = async (relationOrImageProperty, multiPubl
794
719
  addValidationError(ctx, `Model name not found for relation or image property: ${relationOrImageProperty.propertyName}`, relationOrImageProperty.propertyName);
795
720
  return multiPublishPayload;
796
721
  }
722
+ return processRelatedDraftItem({
723
+ relatedItem,
724
+ modelName,
725
+ // A storage seed (Image/File/Html/Json item) attests its own basic properties; a related model
726
+ // item is published with its full property set and the draft items it reaches in turn.
727
+ fullDraft: !isStorageSeed,
728
+ link: { publishLocalId: originalSeedLocalId, propertySchemaUid: relationOrImageSchemaUid },
729
+ reportPropertyName: relationOrImageProperty.propertyName,
730
+ multiPublishPayload,
731
+ uploadedTransactions,
732
+ ctx,
733
+ buildOpts,
734
+ });
735
+ };
736
+ /**
737
+ * The payload of a draft item (no seed uid) a published item refers to, published with it. Its
738
+ * request fills the referring property (`link`) through propertiesToUpdate. With `fullDraft`, the
739
+ * item's whole property set is attested: its storage seeds and Html-embedded images, and its own
740
+ * relation and list properties, whose draft targets are published with it in turn (depth first,
741
+ * see publishDraftGraph.ts). A draft already in the batch only gains the link.
742
+ */
743
+ async function processRelatedDraftItem({ relatedItem, modelName, fullDraft, link, reportPropertyName, multiPublishPayload, uploadedTransactions, ctx, buildOpts, }) {
744
+ const forceFullSnapshot = buildOpts?.forceFullSnapshot === true;
797
745
  const seedSchemaUid = await main_cjs.getEasSchemaUidForModel(modelName);
798
746
  if (!seedSchemaUid) {
799
- addValidationError(ctx, `Schema UID not found for model: ${modelName}`, relationOrImageProperty.propertyName);
747
+ addValidationError(ctx, `Schema UID not found for model: ${modelName}`, reportPropertyName);
800
748
  return multiPublishPayload;
801
749
  }
802
- if (mergeChildPublishPayloadIfDuplicateInBatch(multiPublishPayload, relatedItem.seedLocalId, originalSeedLocalId, relationOrImageSchemaUid)) {
750
+ if (multiPublishPayload.some((p) => p.localId === relatedItem.seedLocalId)) {
751
+ if (link) {
752
+ mergeChildPublishPayloadIfDuplicateInBatch(multiPublishPayload, relatedItem.seedLocalId, link.publishLocalId, link.propertySchemaUid);
753
+ }
803
754
  return multiPublishPayload;
804
755
  }
805
756
  let publishPayload = {
806
757
  localId: relatedItem.seedLocalId,
807
758
  seedIsRevocable: true,
808
759
  versionSchemaUid: main_cjs.VERSION_SCHEMA_UID,
809
- seedUid: seedUid || main_cjs.ZERO_BYTES32,
760
+ seedUid: main_cjs.ZERO_BYTES32,
810
761
  seedSchemaUid,
811
- versionUid,
762
+ versionUid: getVersionUid(relatedItem),
812
763
  listOfAttestations: [],
813
- propertiesToUpdate: [
814
- {
815
- publishLocalId: originalSeedLocalId,
816
- propertySchemaUid: relationOrImageSchemaUid,
817
- },
818
- ],
764
+ propertiesToUpdate: link ? [{ ...link }] : [],
819
765
  };
820
- await ensurePropertyDefs(relatedItem);
821
- const { itemBasicProperties, itemUploadProperties, itemImageProperties: relatedStorageSeedProperties } = await getSegmentedItemProperties.getSegmentedItemProperties(relatedItem);
822
- // A draft item related to the published one is published with it, including its own
823
- // Image/File/Html/Json properties and the images embedded in its Html (as for the item itself).
824
- if (!isStorageSeed) {
825
- multiPublishPayload = await processRelatedDraftStorageSeeds(relatedItem, relatedStorageSeedProperties, itemBasicProperties, multiPublishPayload, uploadedTransactions, ctx, buildOpts);
826
- }
827
- const relatedStorageUpload = resolveStorageTransactionUploadSlot(relatedItem, itemUploadProperties);
828
- if (relatedStorageUpload) {
829
- const transactionData = findUploadedTxForSeedLocalId(uploadedTransactions, relatedItem.seedLocalId);
830
- if (transactionData) {
831
- const itemProperty = relatedStorageUpload.itemProperty;
832
- // Publish encoding reads context.propertyValue; do not await ItemProperty.save() here — it
833
- // uses xstate waitFor(10s) for idle and can time out while the machine is busy or still loading.
834
- itemProperty.getService().send({
835
- type: 'updateContext',
836
- propertyValue: transactionData.txId,
837
- renderValue: transactionData.txId,
838
- });
839
- replaceStorageTransactionInBasicProperties(itemBasicProperties, itemProperty);
766
+ ctx.newSeedsInProgress ?? (ctx.newSeedsInProgress = new Set());
767
+ ctx.newSeedsInProgress.add(relatedItem.seedLocalId);
768
+ try {
769
+ await ensurePropertyDefs(relatedItem);
770
+ const segmented = await publishDraftGraph.getSegmentedItemProperties(relatedItem);
771
+ const { itemBasicProperties, itemUploadProperties, itemImageProperties: relatedStorageSeedProperties } = segmented;
772
+ if (fullDraft) {
773
+ // Its own Image/File/Html/Json properties and the images embedded in its Html (as for the item itself).
774
+ multiPublishPayload = await processRelatedDraftStorageSeeds(relatedItem, relatedStorageSeedProperties, itemBasicProperties, multiPublishPayload, uploadedTransactions, ctx, buildOpts);
775
+ // Its relations and lists: their draft targets are published too (same walk as publishDraftGraph).
776
+ const { relationProperties, listProperties } = publishDraftGraph.draftWalkProperties(segmented);
777
+ for (const relationProperty of relationProperties) {
778
+ multiPublishPayload = await processRelationOrImageProperty(relationProperty, multiPublishPayload, uploadedTransactions, relatedItem.seedLocalId, ctx, buildOpts);
779
+ itemBasicProperties.push(relationProperty);
780
+ }
781
+ for (const listProperty of listProperties) {
782
+ multiPublishPayload = await processListProperty(listProperty, multiPublishPayload, uploadedTransactions, relatedItem.seedLocalId, ctx, buildOpts);
783
+ itemBasicProperties.push(listProperty);
784
+ }
840
785
  }
841
- }
842
- for (const p of itemBasicProperties) {
843
- if (isStorageTransactionPropertyName(p.propertyName) &&
844
- !p.propertyDef &&
845
- relatedItem.modelName) {
846
- const schema = await property.getPropertySchema(relatedItem.modelName, 'storageTransactionId', await main_cjs.getItemModelScope(relatedItem));
847
- if (schema) {
848
- p.getService().send({ type: 'updateContext', propertyRecordSchema: schema });
786
+ const relatedStorageUpload = resolveStorageTransactionUploadSlot(relatedItem, itemUploadProperties);
787
+ if (relatedStorageUpload) {
788
+ const transactionData = findUploadedTxForSeedLocalId(uploadedTransactions, relatedItem.seedLocalId);
789
+ if (transactionData) {
790
+ const itemProperty = relatedStorageUpload.itemProperty;
791
+ // Publish encoding reads context.propertyValue; do not await ItemProperty.save() here — it
792
+ // uses xstate waitFor(10s) for idle and can time out while the machine is busy or still loading.
793
+ itemProperty.getService().send({
794
+ type: 'updateContext',
795
+ propertyValue: transactionData.txId,
796
+ renderValue: transactionData.txId,
797
+ });
798
+ replaceStorageTransactionInBasicProperties(itemBasicProperties, itemProperty);
849
799
  }
850
800
  }
801
+ for (const p of itemBasicProperties) {
802
+ if (isStorageTransactionPropertyName(p.propertyName) &&
803
+ !p.propertyDef &&
804
+ relatedItem.modelName) {
805
+ const schema = await property.getPropertySchema(relatedItem.modelName, 'storageTransactionId', await main_cjs.getItemModelScope(relatedItem));
806
+ if (schema) {
807
+ p.getService().send({ type: 'updateContext', propertyRecordSchema: schema });
808
+ }
809
+ }
810
+ }
811
+ dedupeOneStorageTransactionPropertyInList(itemBasicProperties);
812
+ publishPayload = await processBasicProperties(itemBasicProperties, publishPayload, ctx, {
813
+ forceFullSnapshot,
814
+ });
815
+ }
816
+ finally {
817
+ ctx.newSeedsInProgress.delete(relatedItem.seedLocalId);
851
818
  }
852
- dedupeOneStorageTransactionPropertyInList(itemBasicProperties);
853
- publishPayload = await processBasicProperties(itemBasicProperties, publishPayload, ctx, {
854
- forceFullSnapshot,
855
- });
856
819
  multiPublishPayload.push(publishPayload);
857
820
  return multiPublishPayload;
858
- };
821
+ }
859
822
  /**
860
823
  * Storage-seed properties (Image/File/Html/Json) of a draft item related to the published one, and
861
824
  * the images embedded in its Html (htmlEmbeddedImageCoPublish rows it owns): payloads for their seeds,
@@ -867,7 +830,7 @@ async function processRelatedDraftStorageSeeds(relatedItem, storageSeedPropertie
867
830
  multiPublishPayload = await processRelationOrImageProperty(storageSeedProperty, multiPublishPayload, uploadedTransactions, relatedItem.seedLocalId, ctx, buildOpts);
868
831
  itemBasicProperties.push(storageSeedProperty);
869
832
  }
870
- return processHtmlEmbeddedCoPublishImagePayloads(relatedItem, multiPublishPayload, uploadedTransactions, relatedItem.seedLocalId, ctx, buildOpts);
833
+ return processHtmlEmbeddedCoPublishImagePayloads(relatedItem, multiPublishPayload, uploadedTransactions, ctx, buildOpts);
871
834
  }
872
835
  async function resolveHtmlPropertySchemaUidByHtmlSeed(item, htmlSeedLocalId, ctx) {
873
836
  const want = htmlSeedLocalId.trim();
@@ -889,7 +852,7 @@ async function resolveHtmlPropertySchemaUidByHtmlSeed(item, htmlSeedLocalId, ctx
889
852
  addValidationError(ctx, `Could not find Html property for embedded image rewrite (html seed ${want}).`, 'html', 'html_embed_schema');
890
853
  return undefined;
891
854
  }
892
- async function processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPayload, uploadedTransactions, originalSeedLocalId, ctx, buildOpts) {
855
+ async function processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPayload, uploadedTransactions, ctx, buildOpts) {
893
856
  const appDb = main_cjs.BaseDb.getAppDb();
894
857
  if (!appDb)
895
858
  return multiPublishPayload;
@@ -900,7 +863,7 @@ async function processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPaylo
900
863
  if (rows.length === 0)
901
864
  return multiPublishPayload;
902
865
  const forceFullSnapshot = buildOpts?.forceFullSnapshot === true;
903
- const getItemMod = await Promise.resolve().then(function () { return require('./getItem-DSRtx_68.js'); });
866
+ const getItemMod = await Promise.resolve().then(function () { return require('./getItem-CrwWYCkj.js'); });
904
867
  const { getItem } = getItemMod;
905
868
  const doneImages = new Set();
906
869
  for (const row of rows) {
@@ -909,10 +872,11 @@ async function processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPaylo
909
872
  doneImages.add(row.imageSeedLocalId);
910
873
  // An embedded image that is already published is not co-published; one whose seed was revoked
911
874
  // (unpublished) blocks the publish like an image property pointing at it would.
912
- const imageSeed = await findRelatedSeedRow({ seedLocalId: row.imageSeedLocalId });
913
- if (noteRelatedSeed(ctx, row.imageSeedLocalId, imageSeed, htmlPropertyNameForHtmlSeed(item, row.htmlSeedLocalId), 'Image')) {
875
+ const imageSeed = await publishDraftGraph.findRelatedSeedRow({ seedLocalId: row.imageSeedLocalId });
876
+ if (noteRelatedSeed(ctx, row.imageSeedLocalId, imageSeed, publishDraftGraph.htmlPropertyNameForHtmlSeed(item, row.htmlSeedLocalId), 'Image')) {
914
877
  continue;
915
878
  }
879
+ // The row's Html seed must still be the value of one of the item's Html properties.
916
880
  const htmlSchemaUid = await resolveHtmlPropertySchemaUidByHtmlSeed(item, row.htmlSeedLocalId, ctx);
917
881
  if (!htmlSchemaUid)
918
882
  continue;
@@ -929,10 +893,16 @@ async function processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPaylo
929
893
  addValidationError(ctx, `Schema UID not found for model: Image`, 'html');
930
894
  continue;
931
895
  }
932
- if (mergeChildPublishPayloadIfDuplicateInBatch(multiPublishPayload, relatedItem.seedLocalId, originalSeedLocalId, htmlSchemaUid)) {
896
+ // Already in the batch (e.g. also the value of an Image property): its payload is there.
897
+ if (multiPublishPayload.some((p) => p.localId === relatedItem.seedLocalId)) {
933
898
  continue;
934
899
  }
935
900
  const versionUid = getVersionUid(relatedItem);
901
+ // No propertiesToUpdate: the Html refers to the image by its Arweave URL (the data URI is
902
+ // rewritten to it before the Html is uploaded), not by seed uid. The Html property holds the Html
903
+ // storage seed's uid, which the Html seed's own request writes into it; the contract writes each
904
+ // updater's seed uid into the same data[0] (SeedPublishLib.setSeedReference), so an image
905
+ // targeting the Html property too would overwrite that reference with the image's seed uid.
936
906
  let publishPayload = {
937
907
  localId: relatedItem.seedLocalId,
938
908
  seedIsRevocable: true,
@@ -941,15 +911,10 @@ async function processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPaylo
941
911
  seedSchemaUid,
942
912
  versionUid,
943
913
  listOfAttestations: [],
944
- propertiesToUpdate: [
945
- {
946
- publishLocalId: originalSeedLocalId,
947
- propertySchemaUid: htmlSchemaUid,
948
- },
949
- ],
914
+ propertiesToUpdate: [],
950
915
  };
951
916
  await ensurePropertyDefs(relatedItem);
952
- const { itemBasicProperties, itemUploadProperties } = await getSegmentedItemProperties.getSegmentedItemProperties(relatedItem);
917
+ const { itemBasicProperties, itemUploadProperties } = await publishDraftGraph.getSegmentedItemProperties(relatedItem);
953
918
  const relatedStorageUpload = resolveStorageTransactionUploadSlot(relatedItem, itemUploadProperties);
954
919
  if (relatedStorageUpload) {
955
920
  const transactionData = findUploadedTxForSeedLocalId(uploadedTransactions, relatedItem.seedLocalId);
@@ -981,7 +946,7 @@ async function processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPaylo
981
946
  }
982
947
  return multiPublishPayload;
983
948
  }
984
- const processListProperty = async (listProperty, multiPublishPayload, originalSeedLocalId, ctx, buildOpts) => {
949
+ const processListProperty = async (listProperty, multiPublishPayload, uploadedTransactions, originalSeedLocalId, ctx, buildOpts) => {
985
950
  const forceFullSnapshot = buildOpts?.forceFullSnapshot === true;
986
951
  // processListProperty only handles list-of-relations; list-of-primitives go to itemBasicProperties
987
952
  if (!listProperty.propertyDef?.ref) {
@@ -1014,6 +979,7 @@ const processListProperty = async (listProperty, multiPublishPayload, originalSe
1014
979
  : value != null
1015
980
  ? [value]
1016
981
  : [];
982
+ const members = [];
1017
983
  for (const seedId of iterableValue) {
1018
984
  const idStr = typeof seedId === 'string'
1019
985
  ? seedId
@@ -1025,12 +991,23 @@ const processListProperty = async (listProperty, multiPublishPayload, originalSe
1025
991
  const { localId: seedLocalId, uid: seedUid } = main_cjs.getCorrectId(idStr);
1026
992
  if (!seedLocalId && !seedUid)
1027
993
  continue;
1028
- const relatedSeed = await findRelatedSeedRow({ seedLocalId, seedUid });
994
+ members.push({ idStr, seedLocalId, seedUid });
995
+ }
996
+ // A member that is an item still in progress (a cycle back to it) can't be attested in this
997
+ // publish, so the list is deferred; its other draft members are still published, unlinked.
998
+ const memberSeeds = await Promise.all(members.map((m) => publishDraftGraph.findRelatedSeedRow({ seedLocalId: m.seedLocalId, seedUid: m.seedUid })));
999
+ const deferred = deferIfBackEdge(ctx, listProperty, members.map((m, i) => memberSeeds[i]?.seedLocalId ?? m.seedLocalId));
1000
+ for (let i = 0; i < members.length; i++) {
1001
+ const { idStr, seedLocalId, seedUid } = members[i];
1002
+ const relatedSeed = memberSeeds[i] ?? null;
1003
+ const memberLocalId = relatedSeed?.seedLocalId ?? seedLocalId;
1004
+ if (memberLocalId && ctx.newSeedsInProgress?.has(memberLocalId))
1005
+ continue;
1029
1006
  // Use dynamic import to break circular dependency
1030
- const getItemMod = await Promise.resolve().then(function () { return require('./getItem-DSRtx_68.js'); });
1007
+ const getItemMod = await Promise.resolve().then(function () { return require('./getItem-CrwWYCkj.js'); });
1031
1008
  const { getItem } = getItemMod;
1032
1009
  const relatedItem = await getItem(relatedSeed ? { seedLocalId: relatedSeed.seedLocalId } : { seedLocalId, seedUid });
1033
- if (noteRelatedSeed(ctx, idStr.trim(), relatedSeed, listProperty.propertyName, relatedItem?.modelName ?? relatedModelNameFromDef(listProperty.propertyDef))) {
1010
+ if (noteRelatedSeed(ctx, idStr.trim(), relatedSeed, listProperty.propertyName, relatedItem?.modelName ?? publishDraftGraph.relatedModelNameFromDef(listProperty.propertyDef))) {
1034
1011
  continue;
1035
1012
  }
1036
1013
  if (!relatedItem) {
@@ -1043,7 +1020,6 @@ const processListProperty = async (listProperty, multiPublishPayload, originalSe
1043
1020
  if (relatedItem.seedUid && relatedItem.seedUid !== main_cjs.ZERO_BYTES32) {
1044
1021
  continue;
1045
1022
  }
1046
- const versionUid = getVersionUid(relatedItem);
1047
1023
  let modelName;
1048
1024
  if (listProperty.propertyDef?.ref || listProperty.propertyDef.refModelName) {
1049
1025
  const def = listProperty.propertyDef;
@@ -1062,36 +1038,17 @@ const processListProperty = async (listProperty, multiPublishPayload, originalSe
1062
1038
  addValidationError(ctx, `Model name not found for list property: ${listProperty.propertyName}`, listProperty.propertyName);
1063
1039
  continue;
1064
1040
  }
1065
- const seedSchemaUid = await main_cjs.getEasSchemaUidForModel(modelName);
1066
- if (!seedSchemaUid) {
1067
- addValidationError(ctx, `Schema UID not found for model: ${modelName}`, listProperty.propertyName);
1068
- continue;
1069
- }
1070
- if (mergeChildPublishPayloadIfDuplicateInBatch(multiPublishPayload, relatedItem.seedLocalId, originalSeedLocalId, listPropertySchemaUid)) {
1071
- continue;
1072
- }
1073
- let publishPayload = {
1074
- localId: relatedItem.seedLocalId,
1075
- seedIsRevocable: true,
1076
- versionSchemaUid: main_cjs.VERSION_SCHEMA_UID,
1077
- seedUid: seedUid || main_cjs.ZERO_BYTES32,
1078
- seedSchemaUid,
1079
- versionUid,
1080
- listOfAttestations: [],
1081
- propertiesToUpdate: [
1082
- {
1083
- publishLocalId: originalSeedLocalId,
1084
- propertySchemaUid: listPropertySchemaUid,
1085
- },
1086
- ],
1087
- };
1088
- await ensurePropertyDefs(relatedItem);
1089
- const { itemBasicProperties } = await getSegmentedItemProperties.getSegmentedItemProperties(relatedItem);
1090
- dedupeOneStorageTransactionPropertyInList(itemBasicProperties);
1091
- publishPayload = await processBasicProperties(itemBasicProperties, publishPayload, ctx, {
1092
- forceFullSnapshot,
1041
+ multiPublishPayload = await processRelatedDraftItem({
1042
+ relatedItem,
1043
+ modelName,
1044
+ fullDraft: true,
1045
+ link: deferred ? null : { publishLocalId: originalSeedLocalId, propertySchemaUid: listPropertySchemaUid },
1046
+ reportPropertyName: listProperty.propertyName,
1047
+ multiPublishPayload,
1048
+ uploadedTransactions,
1049
+ ctx,
1050
+ buildOpts,
1093
1051
  });
1094
- multiPublishPayload.push(publishPayload);
1095
1052
  }
1096
1053
  return multiPublishPayload;
1097
1054
  };
@@ -1228,13 +1185,18 @@ const getPublishPayload = async (item, uploadedTransactions, options) => {
1228
1185
  // A revoked seed can't be published under again: republishing creates a new seed attestation
1229
1186
  // (new seedUid) and a new version carrying every property (see docs/ATTESTATION_REVOCATION.md).
1230
1187
  const hasSeedUid = !!item.seedUid && item.seedUid !== main_cjs.ZERO_BYTES32;
1231
- const republishRevokedSeed = hasSeedUid && (await isSeedRevoked(item.seedLocalId));
1188
+ const republishRevokedSeed = hasSeedUid && (await publishDraftGraph.isSeedRevoked(item.seedLocalId));
1232
1189
  const rootSeedUid = republishRevokedSeed ? main_cjs.ZERO_BYTES32 : item.seedUid || main_cjs.ZERO_BYTES32;
1233
1190
  const forceFullSnapshot = publishMode === 'new_version' || republishRevokedSeed;
1234
1191
  if (publishMode === 'new_version' && (!item.seedUid || item.seedUid === main_cjs.ZERO_BYTES32)) {
1235
1192
  addValidationError(validationCtx, 'Publishing as a new version requires the item to already have a published Seed attestation (seed UID).', 'seedUid', 'publish_new_version_requires_seed');
1236
1193
  }
1237
1194
  let multiPublishPayload = [];
1195
+ // The root gets a new seed (draft, or revoked seed published again): related drafts referring
1196
+ // back to it can't attest its uid in this publish (see publishDraftGraph.ts).
1197
+ if (rootSeedUid === main_cjs.ZERO_BYTES32) {
1198
+ validationCtx.newSeedsInProgress = new Set([item.seedLocalId]);
1199
+ }
1238
1200
  // Each PublishPayload is generated from a Seed that needs publishing
1239
1201
  // First we need to determine all Seeds to publish
1240
1202
  // That means the Seed of the Item, plus any Seeds pointed to by Relations
@@ -1268,7 +1230,7 @@ const getPublishPayload = async (item, uploadedTransactions, options) => {
1268
1230
  propertiesToUpdate: [],
1269
1231
  };
1270
1232
  await ensurePropertyDefs(item);
1271
- const { itemBasicProperties, itemListProperties, itemUploadProperties, itemImageProperties, itemRelationProperties, } = await getSegmentedItemProperties.getSegmentedItemProperties(item);
1233
+ const { itemBasicProperties, itemListProperties, itemUploadProperties, itemImageProperties, itemRelationProperties, } = await publishDraftGraph.getSegmentedItemProperties(item);
1272
1234
  const relationAndImageProperties = [...itemRelationProperties, ...itemImageProperties];
1273
1235
  // Validate required relations have values before processing
1274
1236
  for (const relProp of itemRelationProperties) {
@@ -1317,9 +1279,9 @@ const getPublishPayload = async (item, uploadedTransactions, options) => {
1317
1279
  multiPublishPayload = await processRelationOrImageProperty(relationProperty, multiPublishPayload, uploadedTransactions, item.seedLocalId, validationCtx, { forceFullSnapshot });
1318
1280
  itemBasicProperties.push(relationProperty);
1319
1281
  }
1320
- multiPublishPayload = await processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPayload, uploadedTransactions, item.seedLocalId, validationCtx, { forceFullSnapshot });
1282
+ multiPublishPayload = await processHtmlEmbeddedCoPublishImagePayloads(item, multiPublishPayload, uploadedTransactions, validationCtx, { forceFullSnapshot });
1321
1283
  for (const listProperty of itemListProperties) {
1322
- multiPublishPayload = await processListProperty(listProperty, multiPublishPayload, item.seedLocalId, validationCtx, { forceFullSnapshot });
1284
+ multiPublishPayload = await processListProperty(listProperty, multiPublishPayload, uploadedTransactions, item.seedLocalId, validationCtx, { forceFullSnapshot });
1323
1285
  itemBasicProperties.push(listProperty);
1324
1286
  }
1325
1287
  for (const p of itemBasicProperties) {
@@ -1550,7 +1512,7 @@ const resolvePublishPayloadValues = async (multiPayload, resolvedUids) => {
1550
1512
  let allSlotsResolved = true;
1551
1513
  for (const id of rawList) {
1552
1514
  const trimmed = id.trim();
1553
- if (trimmed.length === 66 && trimmed.startsWith('0x')) {
1515
+ if (isUidRef(trimmed)) {
1554
1516
  resolvedValues.push(padUidForBytes32Schema(trimmed));
1555
1517
  continue;
1556
1518
  }
@@ -1638,4 +1600,4 @@ exports.PublishValidationFailedError = PublishValidationFailedError;
1638
1600
  exports.getPublishPayload = getPublishPayload;
1639
1601
  exports.resolvePublishPayloadValues = resolvePublishPayloadValues;
1640
1602
  exports.validateItemForPublish = validateItemForPublish;
1641
- //# sourceMappingURL=getPublishPayload-D5-dYtNq.js.map
1603
+ //# sourceMappingURL=getPublishPayload-DRJh7WR0.js.map