@memberjunction/record-cloning 0.0.0 → 6.2.0-edge.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.
Files changed (51) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +97 -43
  3. package/dist/CloneAuthorization.d.ts +50 -0
  4. package/dist/CloneAuthorization.d.ts.map +1 -0
  5. package/dist/CloneAuthorization.js +75 -0
  6. package/dist/CloneAuthorization.js.map +1 -0
  7. package/dist/CloneExecutor.d.ts +50 -0
  8. package/dist/CloneExecutor.d.ts.map +1 -0
  9. package/dist/CloneExecutor.js +350 -0
  10. package/dist/CloneExecutor.js.map +1 -0
  11. package/dist/CloneKeys.d.ts +65 -0
  12. package/dist/CloneKeys.d.ts.map +1 -0
  13. package/dist/CloneKeys.js +118 -0
  14. package/dist/CloneKeys.js.map +1 -0
  15. package/dist/CloneMaterializer.d.ts +52 -0
  16. package/dist/CloneMaterializer.d.ts.map +1 -0
  17. package/dist/CloneMaterializer.js +267 -0
  18. package/dist/CloneMaterializer.js.map +1 -0
  19. package/dist/ClonePlanHash.d.ts +11 -0
  20. package/dist/ClonePlanHash.d.ts.map +1 -0
  21. package/dist/ClonePlanHash.js +16 -0
  22. package/dist/ClonePlanHash.js.map +1 -0
  23. package/dist/ClonePlanner.d.ts +33 -0
  24. package/dist/ClonePlanner.d.ts.map +1 -0
  25. package/dist/ClonePlanner.js +870 -0
  26. package/dist/ClonePlanner.js.map +1 -0
  27. package/dist/CloneRecordProcessor.d.ts +28 -0
  28. package/dist/CloneRecordProcessor.d.ts.map +1 -0
  29. package/dist/CloneRecordProcessor.js +101 -0
  30. package/dist/CloneRecordProcessor.js.map +1 -0
  31. package/dist/RecordCloneEngine.d.ts +35 -0
  32. package/dist/RecordCloneEngine.d.ts.map +1 -0
  33. package/dist/RecordCloneEngine.js +60 -0
  34. package/dist/RecordCloneEngine.js.map +1 -0
  35. package/dist/RecordCloningStartup.d.ts +14 -0
  36. package/dist/RecordCloningStartup.d.ts.map +1 -0
  37. package/dist/RecordCloningStartup.js +32 -0
  38. package/dist/RecordCloningStartup.js.map +1 -0
  39. package/dist/__tests__/helpers/cloneAuthorizations.d.ts +7 -0
  40. package/dist/__tests__/helpers/cloneAuthorizations.d.ts.map +1 -0
  41. package/dist/__tests__/helpers/cloneAuthorizations.js +17 -0
  42. package/dist/__tests__/helpers/cloneAuthorizations.js.map +1 -0
  43. package/dist/index.d.ts +15 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +15 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/operations.d.ts +64 -0
  48. package/dist/operations.d.ts.map +1 -0
  49. package/dist/operations.js +390 -0
  50. package/dist/operations.js.map +1 -0
  51. package/package.json +32 -8
@@ -0,0 +1,390 @@
1
+ /**
2
+ * @file operations.ts
3
+ * Server implementations of the four RecordClone remote operations:
4
+ * - RecordClone.Describe
5
+ * - RecordClone.Plan
6
+ * - RecordClone.Execute
7
+ * - RecordClone.GetLineage
8
+ *
9
+ * Each server class extends the operation class CodeGen emits into `@memberjunction/core-entities`
10
+ * from the `MJ: Remote Operations` metadata, and returns exactly the input/output types defined in
11
+ * `metadata/remote-operations/types/record-clone-*.ts`. Those types are the contract clients see;
12
+ * the engine's richer internal types (`ClonePlan`, `RecordCloneResult`) are mapped onto them here.
13
+ *
14
+ * @see plans/record-cloning/README.md §9, §11.1
15
+ */
16
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
17
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
18
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
19
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
20
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
21
+ };
22
+ import { BaseRemotableOperation, KeyValuePair, Metadata, RunView, } from '@memberjunction/core';
23
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
24
+ import { RecordCloneDescribeOperation, RecordClonePlanOperation, RecordCloneExecuteOperation, RecordCloneGetLineageOperation, } from '@memberjunction/core-entities';
25
+ import { MaskSensitiveFieldChange, NormalizeClonePresets, ResolveEdgePolicy } from '@memberjunction/record-cloning-base';
26
+ import { SqlEquals } from '@memberjunction/record-graph';
27
+ import { ClonePlanner } from './ClonePlanner.js';
28
+ import { CloneExecutor } from './CloneExecutor.js';
29
+ import { CloneAuthorizer } from './CloneAuthorization.js';
30
+ import { KeyFromPairs, ToRecordKeyString } from './CloneKeys.js';
31
+ /** Builds a CompositeKey from a wire key, keeping every primary key column. */
32
+ function toCompositeKey(entity, key) {
33
+ const pairs = key?.KeyValuePairs?.filter((p) => typeof p.FieldName === 'string' && p.FieldName.length > 0) ?? [];
34
+ if (pairs.length === 0) {
35
+ throw new Error(`A record key with at least one field is required for entity '${entity.Name}'.`);
36
+ }
37
+ return KeyFromPairs(pairs.map((p) => new KeyValuePair(p.FieldName, p.Value)));
38
+ }
39
+ /** Plan values are free-form in the engine; the contract carries primitives only. */
40
+ function toPlanValue(value) {
41
+ if (value === null || value === undefined)
42
+ return null;
43
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')
44
+ return value;
45
+ if (value instanceof Date)
46
+ return value.toISOString();
47
+ return JSON.stringify(value);
48
+ }
49
+ /** Maps the engine's plan onto the `RecordClonePlanDetails` contract. */
50
+ export function ToPlanDetails(plan) {
51
+ return {
52
+ PlanVersion: 1,
53
+ Hash: plan.Hash || plan.PlanHash || '',
54
+ Roots: plan.Roots ?? [],
55
+ Nodes: plan.Nodes.map((n) => ({
56
+ Key: n.Key ?? n.NodeKey ?? '',
57
+ EntityName: n.EntityName,
58
+ SourceKey: ToRecordKeyString(n.SourceKey),
59
+ TargetKey: n.TargetKey ? ToRecordKeyString(n.TargetKey) : null,
60
+ Action: n.Action,
61
+ Reason: n.Reason,
62
+ Depth: n.Depth,
63
+ ParentKey: n.ParentKey,
64
+ DisplayName: n.DisplayName,
65
+ IsSubtypeRow: n.IsSubtypeRow,
66
+ // Encrypted values never leave the server; the Plan output is what the browser sees.
67
+ FieldChanges: (n.FieldChanges ?? []).map(MaskSensitiveFieldChange).map((fc) => ({
68
+ Field: fc.Field,
69
+ Kind: fc.Kind,
70
+ OldValue: toPlanValue(fc.OldValue),
71
+ NewValue: toPlanValue(fc.NewValue),
72
+ Reason: fc.Reason ?? '',
73
+ })),
74
+ Warnings: n.Warnings ?? [],
75
+ Route: n.Route,
76
+ })),
77
+ Edges: plan.Edges.map((e) => ({
78
+ FromKey: e.FromKey,
79
+ ToKey: e.ToKey,
80
+ Kind: e.Kind,
81
+ RelatedEntityName: e.RelatedEntityName,
82
+ JoinField: e.JoinField,
83
+ RelationshipID: e.RelationshipID,
84
+ CollectionName: e.CollectionName,
85
+ IsSoftLink: e.IsSoftLink,
86
+ Policy: e.Policy,
87
+ Locked: e.Locked,
88
+ PolicySource: e.PolicySource,
89
+ })),
90
+ Counts: plan.Counts,
91
+ Warnings: plan.Warnings,
92
+ Blocked: plan.Blocked,
93
+ EffectiveOptions: plan.EffectiveOptions,
94
+ };
95
+ }
96
+ /** The empty-result shape every refused Execute returns. */
97
+ function refusedExecute(resultCode, message, plan, cloneLogId = null) {
98
+ return {
99
+ Success: false,
100
+ ResultCode: resultCode,
101
+ ErrorMessage: message,
102
+ CloneLogID: cloneLogId,
103
+ Roots: [],
104
+ Created: [],
105
+ Skipped: [],
106
+ Counts: plan?.Counts ?? { ByEntity: {}, Create: 0, Total: 0 },
107
+ Warnings: plan?.Warnings ?? [],
108
+ Plan: plan ? ToPlanDetails(plan) : undefined,
109
+ };
110
+ }
111
+ /** Reads the clone log ID the executor stores in a Record Link's `Metadata` JSON. */
112
+ function cloneLogIdFromLinkMetadata(metadata) {
113
+ if (typeof metadata !== 'string' || metadata.length === 0)
114
+ return undefined;
115
+ try {
116
+ const parsed = JSON.parse(metadata);
117
+ return typeof parsed.CloneLogID === 'string' ? parsed.CloneLogID : undefined;
118
+ }
119
+ catch {
120
+ return undefined;
121
+ }
122
+ }
123
+ /**
124
+ * The logic behind the four operations. Also usable directly on the server (see
125
+ * `RecordCloneEngine`); every method takes the acting user and uses the handler's provider.
126
+ */
127
+ export class RecordCloneOperationsHandler {
128
+ constructor(provider) {
129
+ this._provider = provider;
130
+ }
131
+ get Provider() {
132
+ return this._provider ?? Metadata.Provider;
133
+ }
134
+ /**
135
+ * Whether `user` may clone records of the entity, and what the UI may offer. Refuses when the
136
+ * entity is missing, not enabled as a clone root, lacks CanCreate for the user, needs another
137
+ * user type, or the user lacks the entity's clone authorization.
138
+ */
139
+ async Describe(input, contextUser) {
140
+ const md = this.Provider;
141
+ const entity = md.EntityByName(input.EntityName);
142
+ if (!entity) {
143
+ return { CanClone: false, Reason: `Entity '${input.EntityName}' not found.`, Relationships: [] };
144
+ }
145
+ const config = entity.CloneConfig;
146
+ const authorizer = new CloneAuthorizer(md);
147
+ const authorization = authorizer.CanCloneEntity(entity, contextUser);
148
+ const base = {
149
+ Authorization: authorization,
150
+ CanFireHooks: authorizer.CanFireHooks(contextUser),
151
+ CanOverrideScope: authorizer.CanOverrideScope(contextUser),
152
+ Relationships: [],
153
+ };
154
+ if (config?.Enabled !== true || config.NotCloneable === true) {
155
+ return {
156
+ ...base,
157
+ CanClone: false,
158
+ Reason: config?.NotCloneableReason || `Cloning is not enabled for '${entity.Name}'.`,
159
+ };
160
+ }
161
+ if (!entity.GetUserPermisions(contextUser).CanCreate) {
162
+ return { ...base, CanClone: false, Reason: `You don't have permission to create '${entity.Name}' records.` };
163
+ }
164
+ if (config.RequiredUserType && contextUser.Type?.trim() !== config.RequiredUserType.trim()) {
165
+ return {
166
+ ...base,
167
+ CanClone: false,
168
+ Reason: `Cloning '${entity.Name}' requires user type '${config.RequiredUserType}'.`,
169
+ };
170
+ }
171
+ if (!authorization.Granted) {
172
+ return { ...base, CanClone: false, Reason: `Cloning '${entity.Name}' requires the '${authorization.Name}' authorization.` };
173
+ }
174
+ // The same resolution the planner applies to a root's direct children, so the UI shows what
175
+ // a plan will do: unlisted relationships Skip, NotCloneable children Skip, a unique FK Deep.
176
+ const relationships = (entity.RelatedEntities ?? []).map((r) => {
177
+ const child = md.EntityByName(r.RelatedEntity);
178
+ const childConfig = child?.CloneConfig;
179
+ const joinField = child?.Fields.find((f) => f.Name.toLowerCase() === (r.RelatedEntityJoinField ?? '').toLowerCase());
180
+ // Classified as the walker does: a self-relationship is a hierarchy, a declared
181
+ // related-record collection a collection; both have their own defaults.
182
+ const kind = UUIDsEqual(r.RelatedEntityID, entity.ID) ? 'Hierarchy' : r.RelatedRecordCollection ? 'Collection' : 'Relationship';
183
+ const resolved = ResolveEdgePolicy({
184
+ FromKey: entity.Name,
185
+ ToKey: r.RelatedEntity,
186
+ Kind: kind,
187
+ ParentEntityName: entity.Name,
188
+ ChildEntityName: r.RelatedEntity,
189
+ JoinField: r.RelatedEntityJoinField,
190
+ RelationshipID: r.ID,
191
+ RelationshipConfig: r.CloneConfig ?? undefined,
192
+ ChildEntityConfig: {
193
+ NotCloneable: childConfig?.NotCloneable === true,
194
+ NotCloneableReason: childConfig?.NotCloneableReason,
195
+ AllowCreateAPI: child?.AllowCreateAPI,
196
+ },
197
+ RootEntityConfig: { Relationships: config.Relationships },
198
+ IsUniqueFK: joinField?.IsUnique,
199
+ IsHierarchyField: joinField?.IsHierarchy === true,
200
+ CurrentDepth: 1,
201
+ MaxDepth: config.MaxDepth ?? 3,
202
+ });
203
+ return {
204
+ Name: r.DisplayName || r.RelatedEntity,
205
+ RelatedEntity: r.RelatedEntity,
206
+ DefaultPolicy: resolved.Policy,
207
+ Locked: resolved.Locked,
208
+ };
209
+ });
210
+ return {
211
+ ...base,
212
+ CanClone: true,
213
+ Presets: NormalizeClonePresets(config.Presets).map((p) => p.Key),
214
+ UserEditable: config.UserEditable ?? 'all',
215
+ Relationships: relationships,
216
+ };
217
+ }
218
+ /** Computes a dry-run plan. Writes nothing. */
219
+ async Plan(input, contextUser) {
220
+ const { request } = this.buildRequest(input);
221
+ const plan = await new ClonePlanner({ Provider: this.Provider }).Plan(request, contextUser);
222
+ return { Plan: ToPlanDetails(plan) };
223
+ }
224
+ /**
225
+ * Re-plans, refuses with `PLAN_CHANGED` when the plan differs from the reviewed one, then
226
+ * executes. A blocked plan returns `FORBIDDEN` when an authorization caused it, else `BLOCKED`.
227
+ */
228
+ async Execute(input, contextUser) {
229
+ let built;
230
+ try {
231
+ built = this.buildRequest(input);
232
+ }
233
+ catch (err) {
234
+ return refusedExecute('EXECUTION_ERROR', err instanceof Error ? err.message : String(err));
235
+ }
236
+ const plan = await new ClonePlanner({ Provider: this.Provider }).Plan(built.request, contextUser);
237
+ // Blocked first: a plan the user can no longer run is FORBIDDEN/BLOCKED, not merely changed.
238
+ const executor = new CloneExecutor({ Provider: this.Provider });
239
+ if (plan.Blocked) {
240
+ const forbidden = plan.Warnings.some((w) => w.Code === 'FORBIDDEN');
241
+ const reasons = plan.Warnings.filter((w) => w.Severity === 'Error').map((w) => w.Message).join('; ');
242
+ const logId = input.Options?.DryRun !== true ? await executor.WriteRefusalLog(plan, contextUser, `${forbidden ? 'FORBIDDEN' : 'BLOCKED'}: ${reasons}`) : null;
243
+ return refusedExecute(forbidden ? 'FORBIDDEN' : 'BLOCKED', reasons || 'The clone plan is blocked.', plan, logId);
244
+ }
245
+ // A dry run stops after planning: nothing is written, and the plan is the result.
246
+ if (input.Options?.DryRun === true) {
247
+ return {
248
+ Success: true,
249
+ ResultCode: 'SUCCESS',
250
+ CloneLogID: null,
251
+ Roots: [],
252
+ Created: [],
253
+ Skipped: [],
254
+ Counts: plan.Counts,
255
+ Warnings: plan.Warnings,
256
+ Plan: ToPlanDetails(plan),
257
+ };
258
+ }
259
+ if (input.ExpectedPlanHash && (plan.Hash || plan.PlanHash) !== input.ExpectedPlanHash) {
260
+ const logId = await executor.WriteRefusalLog(plan, contextUser, 'PLAN_CHANGED: the records changed since the plan was reviewed.');
261
+ const changed = refusedExecute('PLAN_CHANGED', 'The records changed since the plan was reviewed. Review the new plan and confirm again.', plan, logId);
262
+ changed.Warnings = [
263
+ ...changed.Warnings,
264
+ { Code: 'PLAN_CHANGED', Severity: 'Error', Message: 'Plan hash mismatch between review and execution.' },
265
+ ];
266
+ return changed;
267
+ }
268
+ const result = await executor.Execute(plan, contextUser);
269
+ const toMapping = (m) => ({
270
+ EntityName: m.EntityName,
271
+ SourceKey: ToRecordKeyString(m.SourceKey),
272
+ TargetKey: ToRecordKeyString(m.TargetKey),
273
+ Depth: m.Depth,
274
+ });
275
+ return {
276
+ Success: result.Success,
277
+ ResultCode: result.ResultCode ?? (result.Success ? 'SUCCESS' : 'EXECUTION_ERROR'),
278
+ CloneLogID: result.CloneLogID ?? null,
279
+ Roots: (result.Roots ?? []).map(toMapping),
280
+ Created: (result.Created ?? []).map(toMapping),
281
+ Skipped: (result.Skipped ?? []).map((s) => ({ EntityName: s.EntityName, SourceKey: ToRecordKeyString(s.SourceKey), Reason: s.Reason })),
282
+ Counts: result.Counts ?? plan.Counts,
283
+ Warnings: result.Warnings ?? plan.Warnings,
284
+ Plan: result.Success ? undefined : ToPlanDetails(plan),
285
+ ErrorMessage: result.ErrorMessage,
286
+ };
287
+ }
288
+ /**
289
+ * Ancestors (records this one was cloned from) and direct clones, read from `MJ: Record Links`
290
+ * rows of type `ClonedFrom`, where Source is the clone and Target is its original.
291
+ */
292
+ async GetLineage(input, contextUser) {
293
+ const md = this.Provider;
294
+ const entity = md.EntityByName(input.EntityName);
295
+ if (!entity) {
296
+ throw new Error(`Entity '${input.EntityName}' not found.`);
297
+ }
298
+ const recordId = ToRecordKeyString(toCompositeKey(entity, input.Key));
299
+ const direction = input.Direction ?? 'both';
300
+ const rv = RunView.FromMetadataProvider(md);
301
+ const load = async (side) => {
302
+ const res = await rv.RunView({
303
+ EntityName: 'MJ: Record Links',
304
+ ExtraFilter: [
305
+ SqlEquals(`${side}EntityID`, entity.ID),
306
+ SqlEquals(`${side}RecordID`, recordId),
307
+ SqlEquals('LinkType', 'ClonedFrom'),
308
+ ].join(' AND '),
309
+ ResultType: 'simple',
310
+ }, contextUser);
311
+ return res.Success ? res.Results ?? [] : [];
312
+ };
313
+ const toItem = (row, side) => ({
314
+ RecordID: String(row[`${side}RecordID`]),
315
+ EntityName: md.EntityByID(String(row[`${side}EntityID`]))?.Name ?? 'Unknown',
316
+ ClonedAt: row.__mj_CreatedAt ? String(row.__mj_CreatedAt) : undefined,
317
+ CloneLogID: cloneLogIdFromLinkMetadata(row.Metadata),
318
+ });
319
+ const ancestors = direction === 'down' ? [] : (await load('Source')).map((row) => toItem(row, 'Target'));
320
+ const clones = direction === 'up' ? [] : (await load('Target')).map((row) => toItem(row, 'Source'));
321
+ return { Ancestors: ancestors, Clones: clones, TotalClones: clones.length };
322
+ }
323
+ /** Turns a Plan/Execute input into the engine's request. */
324
+ buildRequest(input) {
325
+ const entityName = input.EntityName || input.Roots?.[0]?.EntityName;
326
+ if (!entityName) {
327
+ throw new Error('EntityName or Roots is required.');
328
+ }
329
+ const entity = this.Provider.EntityByName(entityName);
330
+ if (!entity) {
331
+ throw new Error(`Entity '${entityName}' not found.`);
332
+ }
333
+ const key = toCompositeKey(entity, input.SourceRecordKey ?? input.Roots?.[0]?.Key);
334
+ return {
335
+ entityName,
336
+ request: {
337
+ EntityName: entityName,
338
+ SourceRecordKey: key,
339
+ Roots: [{ EntityName: entityName, Key: key }],
340
+ Options: input.Options,
341
+ EdgeOverrides: input.EdgeOverrides,
342
+ ExpectedPlanHash: input.ExpectedPlanHash,
343
+ },
344
+ };
345
+ }
346
+ }
347
+ // ---------------------------------------------------------------------------
348
+ // Server remote operations (extend the CodeGen'd client classes)
349
+ // ---------------------------------------------------------------------------
350
+ let RecordCloneDescribeServerOperation = class RecordCloneDescribeServerOperation extends RecordCloneDescribeOperation {
351
+ async InternalExecute(input, provider, user) {
352
+ return new RecordCloneOperationsHandler(provider).Describe(input, user);
353
+ }
354
+ };
355
+ RecordCloneDescribeServerOperation = __decorate([
356
+ RegisterClass(BaseRemotableOperation, 'RecordClone.Describe')
357
+ ], RecordCloneDescribeServerOperation);
358
+ export { RecordCloneDescribeServerOperation };
359
+ let RecordClonePlanServerOperation = class RecordClonePlanServerOperation extends RecordClonePlanOperation {
360
+ async InternalExecute(input, provider, user) {
361
+ return new RecordCloneOperationsHandler(provider).Plan(input, user);
362
+ }
363
+ };
364
+ RecordClonePlanServerOperation = __decorate([
365
+ RegisterClass(BaseRemotableOperation, 'RecordClone.Plan')
366
+ ], RecordClonePlanServerOperation);
367
+ export { RecordClonePlanServerOperation };
368
+ let RecordCloneExecuteServerOperation = class RecordCloneExecuteServerOperation extends RecordCloneExecuteOperation {
369
+ async InternalExecute(input, provider, user) {
370
+ return new RecordCloneOperationsHandler(provider).Execute(input, user);
371
+ }
372
+ };
373
+ RecordCloneExecuteServerOperation = __decorate([
374
+ RegisterClass(BaseRemotableOperation, 'RecordClone.Execute')
375
+ ], RecordCloneExecuteServerOperation);
376
+ export { RecordCloneExecuteServerOperation };
377
+ let RecordCloneGetLineageServerOperation = class RecordCloneGetLineageServerOperation extends RecordCloneGetLineageOperation {
378
+ async InternalExecute(input, provider, user) {
379
+ return new RecordCloneOperationsHandler(provider).GetLineage(input, user);
380
+ }
381
+ };
382
+ RecordCloneGetLineageServerOperation = __decorate([
383
+ RegisterClass(BaseRemotableOperation, 'RecordClone.GetLineage')
384
+ ], RecordCloneGetLineageServerOperation);
385
+ export { RecordCloneGetLineageServerOperation };
386
+ /** Tree-shaking anchor — call from a server bootstrap to retain these operation registrations. */
387
+ export function LoadRecordCloneOperations() {
388
+ // intentionally empty
389
+ }
390
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,34 @@
1
1
  {
2
2
  "name": "@memberjunction/record-cloning",
3
- "version": "0.0.0",
4
- "description": "OIDC trusted publishing setup package for @memberjunction/record-cloning",
5
- "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
9
- ]
10
- }
3
+ "type": "module",
4
+ "version": "6.2.0-edge.2",
5
+ "description": "Engine for MemberJunction record cloning: planning, materialization, and composite execution",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "/dist"
10
+ ],
11
+ "author": "MemberJunction.com",
12
+ "license": "BUSL-1.1",
13
+ "dependencies": {
14
+ "@memberjunction/core": "6.2.0-edge.2",
15
+ "@memberjunction/core-entities": "6.2.0-edge.2",
16
+ "@memberjunction/global": "6.2.0-edge.2",
17
+ "@memberjunction/record-graph": "6.2.0-edge.2",
18
+ "@memberjunction/record-cloning-base": "6.2.0-edge.2",
19
+ "@memberjunction/record-set-processor-base": "6.2.0-edge.2"
20
+ },
21
+ "devDependencies": {
22
+ "typescript": "^5.9.3",
23
+ "tsc-alias": "^1.8.16",
24
+ "vitest": "^4.0.18"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/MemberJunction/MJ"
29
+ },
30
+ "scripts": {
31
+ "build": "tsc && tsc-alias -f",
32
+ "test": "vitest run"
33
+ }
34
+ }