@contentful/experience-design-system-cli 2.32.1-dev-build-26a2030.0 → 2.33.1-dev-build-9dba4a6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.32.1-dev-build-26a2030.0",
3
+ "version": "2.33.1-dev-build-9dba4a6.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/dist/src/index.js CHANGED
@@ -9211,6 +9211,419 @@ var init_replace_raw_prop_token_paths = __esm({
9211
9211
  }
9212
9212
  });
9213
9213
 
9214
+ // packages/experience-design-system-cli/src/session/repositories/components/raw/read.ts
9215
+ function mapRawComponentRow(row) {
9216
+ return {
9217
+ component_id: String(row.component_id),
9218
+ name: String(row.name),
9219
+ source: String(row.source),
9220
+ framework: String(row.framework),
9221
+ extraction_confidence: row.extraction_confidence === null ? null : Number(row.extraction_confidence),
9222
+ review_reasons: String(row.review_reasons ?? "[]"),
9223
+ needs_review: Number(row.needs_review ?? 0),
9224
+ source_path: row.source_path === null ? null : String(row.source_path)
9225
+ };
9226
+ }
9227
+ function mapRawPropRow(row) {
9228
+ return {
9229
+ component_id: String(row.component_id),
9230
+ name: String(row.name),
9231
+ type: String(row.type),
9232
+ required: Number(row.required),
9233
+ category: row.category === null ? null : String(row.category),
9234
+ default_value: row.default_value === null ? null : String(row.default_value),
9235
+ description: row.description === null ? null : String(row.description),
9236
+ token_reference: row.token_reference === null ? null : String(row.token_reference),
9237
+ position: Number(row.position),
9238
+ rationale: row.rationale === null ? null : String(row.rationale),
9239
+ source_start_line: row.source_start_line === null ? null : Number(row.source_start_line),
9240
+ source_end_line: row.source_end_line === null ? null : Number(row.source_end_line)
9241
+ };
9242
+ }
9243
+ function mapAllowedValueSnapshotRow(row) {
9244
+ return {
9245
+ component_id: String(row.component_id),
9246
+ prop_name: String(row.prop_name),
9247
+ position: Number(row.position),
9248
+ value: String(row.value)
9249
+ };
9250
+ }
9251
+ function mapRawSlotRow(row) {
9252
+ return {
9253
+ component_id: String(row.component_id),
9254
+ name: String(row.name),
9255
+ is_default: Number(row.is_default),
9256
+ description: row.description === null ? null : String(row.description),
9257
+ position: Number(row.position)
9258
+ };
9259
+ }
9260
+ function mapRawSlotAllowedComponentRow(row) {
9261
+ return {
9262
+ component_id: String(row.component_id),
9263
+ slot_name: String(row.slot_name),
9264
+ position: Number(row.position),
9265
+ allowed_component: String(row.allowed_component)
9266
+ };
9267
+ }
9268
+ function parseReviewReasons(raw) {
9269
+ try {
9270
+ const parsed = JSON.parse(raw);
9271
+ return Array.isArray(parsed) ? parsed.filter((v) => typeof v === "string") : [];
9272
+ } catch {
9273
+ return [];
9274
+ }
9275
+ }
9276
+ function getRawComponents(db, sessionId2, allowedNames) {
9277
+ const all = db.prepare(
9278
+ "SELECT component_id, name, source, framework, extraction_confidence, review_reasons, needs_review, source_path FROM raw_components WHERE session_id = ? ORDER BY rowid"
9279
+ ).all(sessionId2).map(mapRawComponentRow);
9280
+ const components = allowedNames ? all.filter((c2) => allowedNames.has(c2.name)) : all;
9281
+ if (components.length === 0) return [];
9282
+ const props = db.prepare(
9283
+ `SELECT component_id, name, type, required, category, default_value, description, token_reference, position,
9284
+ rationale, source_start_line, source_end_line
9285
+ FROM raw_props WHERE session_id = ? ORDER BY component_id, position`
9286
+ ).all(sessionId2).map(mapRawPropRow);
9287
+ const allowedValues = db.prepare(
9288
+ `SELECT component_id, prop_name, position, value
9289
+ FROM raw_prop_allowed_values WHERE session_id = ? ORDER BY component_id, prop_name, position`
9290
+ ).all(sessionId2).map(mapAllowedValueSnapshotRow);
9291
+ const slots = db.prepare(
9292
+ `SELECT component_id, name, is_default, description, position
9293
+ FROM raw_slots WHERE session_id = ? ORDER BY component_id, position`
9294
+ ).all(sessionId2).map(mapRawSlotRow);
9295
+ const allowedComponents = db.prepare(
9296
+ `SELECT component_id, slot_name, position, allowed_component
9297
+ FROM raw_slot_allowed_components WHERE session_id = ? ORDER BY component_id, slot_name, position`
9298
+ ).all(sessionId2).map(mapRawSlotAllowedComponentRow);
9299
+ const propsByComponent = indexRowsByKey(props, (p) => p.component_id);
9300
+ const allowedValuesByProp = indexRowsByKey(allowedValues, (av) => `${av.component_id}::${av.prop_name}`);
9301
+ const slotsByComponent = indexRowsByKey(slots, (s) => s.component_id);
9302
+ const allowedComponentsBySlot = indexRowsByKey(allowedComponents, (ac) => `${ac.component_id}::${ac.slot_name}`);
9303
+ return components.map(
9304
+ (c2) => ({
9305
+ component_id: c2.component_id,
9306
+ name: c2.name,
9307
+ source: c2.source,
9308
+ framework: c2.framework,
9309
+ extractionConfidence: c2.extraction_confidence ?? null,
9310
+ reviewReasons: parseReviewReasons(c2.review_reasons),
9311
+ needsReview: Boolean(c2.needs_review),
9312
+ sourcePath: c2.source_path ?? void 0,
9313
+ props: (propsByComponent.get(c2.component_id) ?? []).map((p) => {
9314
+ const av = allowedValuesByProp.get(`${c2.component_id}::${p.name}`);
9315
+ const prop = {
9316
+ name: p.name,
9317
+ type: p.type,
9318
+ required: Boolean(p.required)
9319
+ };
9320
+ if (p.category !== null) prop.category = p.category;
9321
+ if (p.default_value !== null) prop.defaultValue = p.default_value;
9322
+ if (p.description !== null) prop.description = p.description;
9323
+ if (p.token_reference !== null) prop.tokenReference = p.token_reference;
9324
+ if (av && av.length > 0) prop.allowedValues = av.map((v) => v.value);
9325
+ if (p.source_start_line !== null) prop.sourceStartLine = p.source_start_line;
9326
+ if (p.source_end_line !== null) prop.sourceEndLine = p.source_end_line;
9327
+ return prop;
9328
+ }),
9329
+ slots: (slotsByComponent.get(c2.component_id) ?? []).map((s) => {
9330
+ const ac = allowedComponentsBySlot.get(`${c2.component_id}::${s.name}`);
9331
+ const slot = {
9332
+ name: s.name,
9333
+ isDefault: Boolean(s.is_default)
9334
+ };
9335
+ if (s.description !== null) slot.description = s.description;
9336
+ if (ac && ac.length > 0) slot.allowedComponents = ac.map((v) => v.allowed_component);
9337
+ return slot;
9338
+ })
9339
+ })
9340
+ );
9341
+ }
9342
+ function getClassifiedProps(db, sessionId2) {
9343
+ return db.prepare(
9344
+ `SELECT component_id, name, position, cdf_type, cdf_category, cdf_token_kind
9345
+ FROM raw_props WHERE session_id = ? AND cdf_type IS NOT NULL`
9346
+ ).all(sessionId2).map((row) => ({
9347
+ component_id: String(row.component_id),
9348
+ name: String(row.name),
9349
+ position: Number(row.position),
9350
+ cdf_type: String(row.cdf_type),
9351
+ cdf_category: String(row.cdf_category),
9352
+ cdf_token_kind: row.cdf_token_kind === null ? null : String(row.cdf_token_kind)
9353
+ }));
9354
+ }
9355
+ function getComponentDescriptions(db, sessionId2) {
9356
+ return db.prepare(
9357
+ `SELECT component_id, description
9358
+ FROM raw_components WHERE session_id = ? AND description IS NOT NULL`
9359
+ ).all(sessionId2).map((row) => ({
9360
+ component_id: String(row.component_id),
9361
+ description: String(row.description)
9362
+ }));
9363
+ }
9364
+ function getRawPropAllowedValues(db, sessionId2) {
9365
+ return db.prepare(`SELECT component_id, prop_name, position, value FROM raw_prop_allowed_values WHERE session_id = ?`).all(sessionId2).map(mapAllowedValueSnapshotRow);
9366
+ }
9367
+ function getRawPropNameAtPosition(db, sessionId2, componentId, position) {
9368
+ const row = db.prepare(`SELECT name FROM raw_props WHERE session_id = ? AND component_id = ? AND position = ?`).get(sessionId2, componentId, position);
9369
+ return row ? String(row.name) : null;
9370
+ }
9371
+ var init_read4 = __esm({
9372
+ "packages/experience-design-system-cli/src/session/repositories/components/raw/read.ts"() {
9373
+ "use strict";
9374
+ init_index_rows_by_key();
9375
+ }
9376
+ });
9377
+
9378
+ // packages/experience-design-system-cli/src/session/repositories/components/raw/write.ts
9379
+ function deleteRawComponentsForSession(db, sessionId2) {
9380
+ db.prepare("DELETE FROM raw_components WHERE session_id = ?").run(sessionId2);
9381
+ }
9382
+ function createRawComponent(db, sessionId2, comp, extractedAt) {
9383
+ const componentId = deriveComponentId(comp.name, comp.source);
9384
+ db.prepare(
9385
+ `INSERT INTO raw_components (session_id, component_id, name, source, framework, extracted_at, extraction_confidence, review_reasons, needs_review, source_path)
9386
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
9387
+ ).run(
9388
+ sessionId2,
9389
+ componentId,
9390
+ comp.name,
9391
+ comp.source,
9392
+ comp.framework,
9393
+ extractedAt,
9394
+ comp.extractionConfidence ?? null,
9395
+ JSON.stringify(comp.reviewReasons ?? []),
9396
+ comp.needsReview ? 1 : 0,
9397
+ comp.sourcePath ?? null
9398
+ );
9399
+ return componentId;
9400
+ }
9401
+ function createRawProps(db, sessionId2, componentId, props) {
9402
+ const insertProp = db.prepare(
9403
+ `INSERT INTO raw_props
9404
+ (session_id, component_id, name, type, required, category, default_value, description, token_reference, position, source_start_line, source_end_line)
9405
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
9406
+ );
9407
+ const insertAllowedValue = db.prepare(
9408
+ `INSERT INTO raw_prop_allowed_values (session_id, component_id, prop_name, position, value)
9409
+ VALUES (?, ?, ?, ?, ?)`
9410
+ );
9411
+ for (let i = 0; i < props.length; i++) {
9412
+ const prop = props[i];
9413
+ insertProp.run(
9414
+ sessionId2,
9415
+ componentId,
9416
+ prop.name,
9417
+ prop.type,
9418
+ prop.required ? 1 : 0,
9419
+ prop.category ?? null,
9420
+ prop.defaultValue ?? null,
9421
+ prop.description ?? null,
9422
+ prop.tokenReference ?? null,
9423
+ i,
9424
+ prop.sourceStartLine ?? null,
9425
+ prop.sourceEndLine ?? null
9426
+ );
9427
+ if (prop.allowedValues) {
9428
+ prop.allowedValues.forEach((v, j) => insertAllowedValue.run(sessionId2, componentId, prop.name, j, v));
9429
+ }
9430
+ }
9431
+ }
9432
+ function createRawSlots(db, sessionId2, componentId, slots) {
9433
+ const insertSlot = db.prepare(
9434
+ `INSERT INTO raw_slots (session_id, component_id, name, is_default, description, position)
9435
+ VALUES (?, ?, ?, ?, ?, ?)`
9436
+ );
9437
+ const insertAllowedComponent = db.prepare(
9438
+ `INSERT INTO raw_slot_allowed_components (session_id, component_id, slot_name, position, allowed_component)
9439
+ VALUES (?, ?, ?, ?, ?)`
9440
+ );
9441
+ for (let i = 0; i < slots.length; i++) {
9442
+ const slot = slots[i];
9443
+ insertSlot.run(sessionId2, componentId, slot.name, slot.isDefault ? 1 : 0, slot.description ?? null, i);
9444
+ if (slot.allowedComponents) {
9445
+ slot.allowedComponents.forEach((ac, j) => insertAllowedComponent.run(sessionId2, componentId, slot.name, j, ac));
9446
+ }
9447
+ }
9448
+ }
9449
+ function updateRawComponentsStatus(db, sessionId2, status) {
9450
+ db.prepare("UPDATE raw_components SET status = ? WHERE session_id = ?").run(status, sessionId2);
9451
+ }
9452
+ function updateRawPropCdfByName(db, sessionId2, componentId, propName, cdfType, cdfCategory, cdfTokenKind) {
9453
+ const result = db.prepare(
9454
+ `UPDATE raw_props SET cdf_type = ?, cdf_category = ?, cdf_token_kind = ?
9455
+ WHERE session_id = ? AND component_id = ? AND name = ?`
9456
+ ).run(cdfType, cdfCategory, cdfTokenKind, sessionId2, componentId, propName);
9457
+ return Number(result.changes);
9458
+ }
9459
+ function updateRawPropCdfByPosition(db, sessionId2, componentId, position, cdfType, cdfCategory, cdfTokenKind) {
9460
+ const result = db.prepare(
9461
+ `UPDATE raw_props SET cdf_type = ?, cdf_category = ?, cdf_token_kind = ?
9462
+ WHERE session_id = ? AND component_id = ? AND position = ? AND cdf_type IS NULL`
9463
+ ).run(cdfType, cdfCategory, cdfTokenKind, sessionId2, componentId, position);
9464
+ return Number(result.changes);
9465
+ }
9466
+ function updateRawComponentDescription(db, sessionId2, componentId, description) {
9467
+ db.prepare("UPDATE raw_components SET description = ? WHERE session_id = ? AND component_id = ?").run(
9468
+ description,
9469
+ sessionId2,
9470
+ componentId
9471
+ );
9472
+ }
9473
+ function deleteRawPropAllowedValuesForProp(db, sessionId2, componentId, propName) {
9474
+ db.prepare("DELETE FROM raw_prop_allowed_values WHERE session_id = ? AND component_id = ? AND prop_name = ?").run(
9475
+ sessionId2,
9476
+ componentId,
9477
+ propName
9478
+ );
9479
+ }
9480
+ function createRawPropAllowedValue(db, sessionId2, componentId, propName, position, value) {
9481
+ db.prepare(
9482
+ `INSERT OR IGNORE INTO raw_prop_allowed_values (session_id, component_id, prop_name, position, value)
9483
+ VALUES (?, ?, ?, ?, ?)`
9484
+ ).run(sessionId2, componentId, propName, position, value);
9485
+ }
9486
+ var init_write4 = __esm({
9487
+ "packages/experience-design-system-cli/src/session/repositories/components/raw/write.ts"() {
9488
+ "use strict";
9489
+ init_derive_component_id();
9490
+ }
9491
+ });
9492
+
9493
+ // packages/experience-design-system-cli/src/session/core/components/plan-cdf-restore.ts
9494
+ function planCdfRestore(cdfSnapshot, descSnapshot, avSnapshot, currentProps) {
9495
+ const byName = [];
9496
+ const byPosition = [];
9497
+ const nameMatchedKeys = /* @__PURE__ */ new Set();
9498
+ for (const snap of cdfSnapshot) {
9499
+ if (currentProps.hasPropNamed(snap.component_id, snap.name)) {
9500
+ byName.push(snap);
9501
+ nameMatchedKeys.add(propKey(snap.component_id, snap.name));
9502
+ continue;
9503
+ }
9504
+ if (currentProps.propNameAtPosition(snap.component_id, snap.position) !== null) {
9505
+ byPosition.push(snap);
9506
+ }
9507
+ }
9508
+ const buckets = /* @__PURE__ */ new Map();
9509
+ for (const av of avSnapshot) {
9510
+ const key = propKey(av.component_id, av.prop_name);
9511
+ if (!nameMatchedKeys.has(key)) continue;
9512
+ const bucket = buckets.get(key) ?? { componentId: av.component_id, propName: av.prop_name, values: [] };
9513
+ bucket.values.push(av);
9514
+ buckets.set(key, bucket);
9515
+ }
9516
+ return {
9517
+ byName,
9518
+ byPosition,
9519
+ descriptions: descSnapshot,
9520
+ allowedValues: [...buckets.values()]
9521
+ };
9522
+ }
9523
+ function propKey(componentId, propName) {
9524
+ return `${componentId}::${propName}`;
9525
+ }
9526
+ var init_plan_cdf_restore = __esm({
9527
+ "packages/experience-design-system-cli/src/session/core/components/plan-cdf-restore.ts"() {
9528
+ "use strict";
9529
+ }
9530
+ });
9531
+
9532
+ // packages/experience-design-system-cli/src/session/services/components/apply-cdf-restore.ts
9533
+ function applyCdfRestore(db, sessionId2, plan) {
9534
+ for (const snap of plan.byName) {
9535
+ updateRawPropCdfByName(
9536
+ db,
9537
+ sessionId2,
9538
+ snap.component_id,
9539
+ snap.name,
9540
+ snap.cdf_type,
9541
+ snap.cdf_category,
9542
+ snap.cdf_token_kind
9543
+ );
9544
+ }
9545
+ for (const snap of plan.byPosition) {
9546
+ updateRawPropCdfByPosition(
9547
+ db,
9548
+ sessionId2,
9549
+ snap.component_id,
9550
+ snap.position,
9551
+ snap.cdf_type,
9552
+ snap.cdf_category,
9553
+ snap.cdf_token_kind
9554
+ );
9555
+ }
9556
+ for (const snap of plan.descriptions) {
9557
+ updateRawComponentDescription(db, sessionId2, snap.component_id, snap.description);
9558
+ }
9559
+ for (const bucket of plan.allowedValues) {
9560
+ deleteRawPropAllowedValuesForProp(db, sessionId2, bucket.componentId, bucket.propName);
9561
+ for (const av of bucket.values) {
9562
+ createRawPropAllowedValue(db, sessionId2, bucket.componentId, bucket.propName, av.position, av.value);
9563
+ }
9564
+ }
9565
+ }
9566
+ var init_apply_cdf_restore = __esm({
9567
+ "packages/experience-design-system-cli/src/session/services/components/apply-cdf-restore.ts"() {
9568
+ "use strict";
9569
+ init_write4();
9570
+ }
9571
+ });
9572
+
9573
+ // packages/experience-design-system-cli/src/session/services/components/store-raw-components.ts
9574
+ function storeRawComponents(db, sessionId2, components, options) {
9575
+ const now = (/* @__PURE__ */ new Date()).toISOString();
9576
+ withTransaction(db, () => {
9577
+ const cdfSnapshot = options?.preserveCDF ? getClassifiedProps(db, sessionId2) : [];
9578
+ const descSnapshot = options?.preserveCDF ? getComponentDescriptions(db, sessionId2) : [];
9579
+ const avSnapshot = options?.preserveCDF && cdfSnapshot.length > 0 ? getRawPropAllowedValues(db, sessionId2) : [];
9580
+ deleteRawComponentsForSession(db, sessionId2);
9581
+ for (const comp of components) {
9582
+ const componentId = createRawComponent(db, sessionId2, comp, now);
9583
+ createRawProps(db, sessionId2, componentId, comp.props);
9584
+ createRawSlots(db, sessionId2, componentId, comp.slots);
9585
+ }
9586
+ if (options?.preserveCDF && cdfSnapshot.length > 0) {
9587
+ const plan = planCdfRestore(cdfSnapshot, descSnapshot, avSnapshot, {
9588
+ hasPropNamed: (componentId, propName) => hasPropByName(db, sessionId2, componentId, propName),
9589
+ propNameAtPosition: memoize(
9590
+ (componentId, position) => getRawPropNameAtPosition(db, sessionId2, componentId, position)
9591
+ )
9592
+ });
9593
+ applyCdfRestore(db, sessionId2, plan);
9594
+ }
9595
+ if (options?.status) {
9596
+ updateRawComponentsStatus(db, sessionId2, options.status);
9597
+ }
9598
+ updateSessionTimestamp(db, sessionId2, now);
9599
+ });
9600
+ }
9601
+ function hasPropByName(db, sessionId2, componentId, propName) {
9602
+ const row = db.prepare("SELECT 1 as one FROM raw_props WHERE session_id = ? AND component_id = ? AND name = ?").get(sessionId2, componentId, propName);
9603
+ return row !== void 0;
9604
+ }
9605
+ function memoize(lookup) {
9606
+ const cache = /* @__PURE__ */ new Map();
9607
+ return (componentId, position) => {
9608
+ const key = `${componentId}::${position}`;
9609
+ if (cache.has(key)) return cache.get(key);
9610
+ const value = lookup(componentId, position);
9611
+ cache.set(key, value);
9612
+ return value;
9613
+ };
9614
+ }
9615
+ var init_store_raw_components = __esm({
9616
+ "packages/experience-design-system-cli/src/session/services/components/store-raw-components.ts"() {
9617
+ "use strict";
9618
+ init_with_transaction();
9619
+ init_write();
9620
+ init_read4();
9621
+ init_write4();
9622
+ init_plan_cdf_restore();
9623
+ init_apply_cdf_restore();
9624
+ }
9625
+ });
9626
+
9214
9627
  // packages/experience-design-system-cli/src/session/cache-keys.ts
9215
9628
  var cache_keys_exports = {};
9216
9629
  __export(cache_keys_exports, {
@@ -9756,239 +10169,6 @@ function updateStep(db, stepId, status, outputs, error) {
9756
10169
  throw e;
9757
10170
  }
9758
10171
  }
9759
- function storeRawComponents(db, sessionId2, components, options) {
9760
- const now = (/* @__PURE__ */ new Date()).toISOString();
9761
- const insertComp = db.prepare(
9762
- `INSERT INTO raw_components (session_id, component_id, name, source, framework, extracted_at, extraction_confidence, review_reasons, needs_review, source_path)
9763
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
9764
- );
9765
- const insertProp = db.prepare(
9766
- `INSERT INTO raw_props
9767
- (session_id, component_id, name, type, required, category, default_value, description, token_reference, position, source_start_line, source_end_line)
9768
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
9769
- );
9770
- const insertAllowedValue = db.prepare(
9771
- `INSERT INTO raw_prop_allowed_values (session_id, component_id, prop_name, position, value)
9772
- VALUES (?, ?, ?, ?, ?)`
9773
- );
9774
- const insertSlot = db.prepare(
9775
- `INSERT INTO raw_slots (session_id, component_id, name, is_default, description, position)
9776
- VALUES (?, ?, ?, ?, ?, ?)`
9777
- );
9778
- const insertAllowedComponent = db.prepare(
9779
- `INSERT INTO raw_slot_allowed_components (session_id, component_id, slot_name, position, allowed_component)
9780
- VALUES (?, ?, ?, ?, ?)`
9781
- );
9782
- db.exec("BEGIN");
9783
- try {
9784
- let cdfSnapshot = [];
9785
- let descSnapshot = [];
9786
- let avSnapshot = [];
9787
- if (options?.preserveCDF) {
9788
- cdfSnapshot = db.prepare(
9789
- `SELECT component_id, name, position, cdf_type, cdf_category, cdf_token_kind
9790
- FROM raw_props WHERE session_id = ? AND cdf_type IS NOT NULL`
9791
- ).all(sessionId2);
9792
- descSnapshot = db.prepare(
9793
- `SELECT component_id, description
9794
- FROM raw_components WHERE session_id = ? AND description IS NOT NULL`
9795
- ).all(sessionId2);
9796
- if (cdfSnapshot.length > 0) {
9797
- avSnapshot = db.prepare(
9798
- `SELECT component_id, prop_name, position, value
9799
- FROM raw_prop_allowed_values WHERE session_id = ?`
9800
- ).all(sessionId2);
9801
- }
9802
- }
9803
- db.prepare("DELETE FROM raw_components WHERE session_id = ?").run(sessionId2);
9804
- for (const comp of components) {
9805
- const componentId = deriveComponentId(comp.name, comp.source);
9806
- insertComp.run(
9807
- sessionId2,
9808
- componentId,
9809
- comp.name,
9810
- comp.source,
9811
- comp.framework,
9812
- now,
9813
- comp.extractionConfidence ?? null,
9814
- JSON.stringify(comp.reviewReasons ?? []),
9815
- comp.needsReview ? 1 : 0,
9816
- comp.sourcePath ?? null
9817
- );
9818
- for (let i = 0; i < comp.props.length; i++) {
9819
- const prop = comp.props[i];
9820
- insertProp.run(
9821
- sessionId2,
9822
- componentId,
9823
- prop.name,
9824
- prop.type,
9825
- prop.required ? 1 : 0,
9826
- prop.category ?? null,
9827
- prop.defaultValue ?? null,
9828
- prop.description ?? null,
9829
- prop.tokenReference ?? null,
9830
- i,
9831
- prop.sourceStartLine ?? null,
9832
- prop.sourceEndLine ?? null
9833
- );
9834
- if (prop.allowedValues) {
9835
- prop.allowedValues.forEach((v, j) => insertAllowedValue.run(sessionId2, componentId, prop.name, j, v));
9836
- }
9837
- }
9838
- for (let i = 0; i < comp.slots.length; i++) {
9839
- const slot = comp.slots[i];
9840
- insertSlot.run(sessionId2, componentId, slot.name, slot.isDefault ? 1 : 0, slot.description ?? null, i);
9841
- if (slot.allowedComponents) {
9842
- slot.allowedComponents.forEach(
9843
- (ac, j) => insertAllowedComponent.run(sessionId2, componentId, slot.name, j, ac)
9844
- );
9845
- }
9846
- }
9847
- }
9848
- if (options?.preserveCDF && cdfSnapshot.length > 0) {
9849
- const updateCDFByName = db.prepare(
9850
- `UPDATE raw_props SET cdf_type = ?, cdf_category = ?, cdf_token_kind = ?
9851
- WHERE session_id = ? AND component_id = ? AND name = ?`
9852
- );
9853
- const updateCDFByPosition = db.prepare(
9854
- `UPDATE raw_props SET cdf_type = ?, cdf_category = ?, cdf_token_kind = ?
9855
- WHERE session_id = ? AND component_id = ? AND position = ? AND cdf_type IS NULL`
9856
- );
9857
- const restoredPropKeys = /* @__PURE__ */ new Set();
9858
- const unmatchedSnaps = [];
9859
- for (const snap of cdfSnapshot) {
9860
- const result = updateCDFByName.run(
9861
- snap.cdf_type,
9862
- snap.cdf_category,
9863
- snap.cdf_token_kind,
9864
- sessionId2,
9865
- snap.component_id,
9866
- snap.name
9867
- );
9868
- if (Number(result.changes) > 0) {
9869
- restoredPropKeys.add(`${snap.component_id}::${snap.name}`);
9870
- } else {
9871
- unmatchedSnaps.push(snap);
9872
- }
9873
- }
9874
- for (const snap of unmatchedSnaps) {
9875
- const result = updateCDFByPosition.run(
9876
- snap.cdf_type,
9877
- snap.cdf_category,
9878
- snap.cdf_token_kind,
9879
- sessionId2,
9880
- snap.component_id,
9881
- snap.position
9882
- );
9883
- if (Number(result.changes) > 0) {
9884
- const matched = db.prepare(`SELECT name FROM raw_props WHERE session_id = ? AND component_id = ? AND position = ?`).get(sessionId2, snap.component_id, snap.position);
9885
- if (matched) {
9886
- restoredPropKeys.add(`${snap.component_id}::${matched.name}`);
9887
- }
9888
- }
9889
- }
9890
- const updateDesc = db.prepare(
9891
- `UPDATE raw_components SET description = ? WHERE session_id = ? AND component_id = ?`
9892
- );
9893
- for (const snap of descSnapshot) {
9894
- updateDesc.run(snap.description, sessionId2, snap.component_id);
9895
- }
9896
- const relevantAV = avSnapshot.filter((av) => restoredPropKeys.has(`${av.component_id}::${av.prop_name}`));
9897
- if (relevantAV.length > 0) {
9898
- const deleteAV = db.prepare(
9899
- `DELETE FROM raw_prop_allowed_values WHERE session_id = ? AND component_id = ? AND prop_name = ?`
9900
- );
9901
- const insertAV = db.prepare(
9902
- `INSERT OR IGNORE INTO raw_prop_allowed_values (session_id, component_id, prop_name, position, value)
9903
- VALUES (?, ?, ?, ?, ?)`
9904
- );
9905
- const deletedKeys = /* @__PURE__ */ new Set();
9906
- for (const av of relevantAV) {
9907
- const key = `${av.component_id}::${av.prop_name}`;
9908
- if (!deletedKeys.has(key)) {
9909
- deleteAV.run(sessionId2, av.component_id, av.prop_name);
9910
- deletedKeys.add(key);
9911
- }
9912
- insertAV.run(sessionId2, av.component_id, av.prop_name, av.position, av.value);
9913
- }
9914
- }
9915
- }
9916
- if (options?.status) {
9917
- db.prepare("UPDATE raw_components SET status = ? WHERE session_id = ?").run(options.status, sessionId2);
9918
- }
9919
- db.prepare("UPDATE sessions SET updated_at = ? WHERE id = ?").run(now, sessionId2);
9920
- db.exec("COMMIT");
9921
- } catch (e) {
9922
- db.exec("ROLLBACK");
9923
- throw e;
9924
- }
9925
- }
9926
- function loadRawComponents(db, sessionId2, allowedNames) {
9927
- const all = db.prepare(
9928
- "SELECT component_id, name, source, framework, extraction_confidence, review_reasons, needs_review, source_path FROM raw_components WHERE session_id = ? ORDER BY rowid"
9929
- ).all(sessionId2);
9930
- const components = allowedNames ? all.filter((c2) => allowedNames.has(c2.name)) : all;
9931
- if (components.length === 0) return [];
9932
- const props = db.prepare(
9933
- `SELECT component_id, name, type, required, category, default_value, description, token_reference, position,
9934
- rationale, source_start_line, source_end_line
9935
- FROM raw_props WHERE session_id = ? ORDER BY component_id, position`
9936
- ).all(sessionId2);
9937
- const allowedValues = db.prepare(
9938
- `SELECT component_id, prop_name, position, value
9939
- FROM raw_prop_allowed_values WHERE session_id = ? ORDER BY component_id, prop_name, position`
9940
- ).all(sessionId2);
9941
- const slots = db.prepare(
9942
- `SELECT component_id, name, is_default, description, position
9943
- FROM raw_slots WHERE session_id = ? ORDER BY component_id, position`
9944
- ).all(sessionId2);
9945
- const allowedComponents = db.prepare(
9946
- `SELECT component_id, slot_name, position, allowed_component
9947
- FROM raw_slot_allowed_components WHERE session_id = ? ORDER BY component_id, slot_name, position`
9948
- ).all(sessionId2);
9949
- const propsByComponent = indexRowsByKey(props, (p) => p.component_id);
9950
- const allowedValuesByProp = indexRowsByKey(allowedValues, (av) => `${av.component_id}::${av.prop_name}`);
9951
- const slotsByComponent = indexRowsByKey(slots, (s) => s.component_id);
9952
- const allowedComponentsBySlot = indexRowsByKey(allowedComponents, (ac) => `${ac.component_id}::${ac.slot_name}`);
9953
- return components.map(
9954
- (c2) => ({
9955
- component_id: c2.component_id,
9956
- name: c2.name,
9957
- source: c2.source,
9958
- framework: c2.framework,
9959
- extractionConfidence: c2.extraction_confidence ?? null,
9960
- reviewReasons: parseReviewReasons(c2.review_reasons),
9961
- needsReview: Boolean(c2.needs_review),
9962
- sourcePath: c2.source_path ?? void 0,
9963
- props: (propsByComponent.get(c2.component_id) ?? []).map((p) => {
9964
- const av = allowedValuesByProp.get(`${c2.component_id}::${p.name}`);
9965
- const prop = {
9966
- name: p.name,
9967
- type: p.type,
9968
- required: Boolean(p.required)
9969
- };
9970
- if (p.category !== null) prop.category = p.category;
9971
- if (p.default_value !== null) prop.defaultValue = p.default_value;
9972
- if (p.description !== null) prop.description = p.description;
9973
- if (p.token_reference !== null) prop.tokenReference = p.token_reference;
9974
- if (av && av.length > 0) prop.allowedValues = av.map((v) => v.value);
9975
- if (p.source_start_line !== null) prop.sourceStartLine = p.source_start_line;
9976
- if (p.source_end_line !== null) prop.sourceEndLine = p.source_end_line;
9977
- return prop;
9978
- }),
9979
- slots: (slotsByComponent.get(c2.component_id) ?? []).map((s) => {
9980
- const ac = allowedComponentsBySlot.get(`${c2.component_id}::${s.name}`);
9981
- const slot = {
9982
- name: s.name,
9983
- isDefault: Boolean(s.is_default)
9984
- };
9985
- if (s.description !== null) slot.description = s.description;
9986
- if (ac && ac.length > 0) slot.allowedComponents = ac.map((v) => v.allowed_component);
9987
- return slot;
9988
- })
9989
- })
9990
- );
9991
- }
9992
10172
  function rewrittenSourcePaths(basePath) {
9993
10173
  for (const [emitted, sources] of TS_ESM_EXTENSION_REWRITES) {
9994
10174
  if (!basePath.endsWith(emitted)) continue;
@@ -10167,7 +10347,7 @@ function renameEmptySlots(db, sessionId2, componentId, componentName, slotCount)
10167
10347
  }
10168
10348
  return { renames, warnings };
10169
10349
  }
10170
- function parseReviewReasons(raw) {
10350
+ function parseReviewReasons2(raw) {
10171
10351
  try {
10172
10352
  const parsed = JSON.parse(raw ?? "[]");
10173
10353
  return Array.isArray(parsed) ? parsed.filter((reason) => typeof reason === "string") : [];
@@ -10421,7 +10601,7 @@ function loadScopeComponents(db, sessionId2) {
10421
10601
  const slotsByComponent = indexRowsByKey(slotRows, (s) => s.component_id);
10422
10602
  const allowedBySlot = indexRowsByKey(allowedRows, (a) => `${a.component_id}::${a.slot_name}`);
10423
10603
  return rows.map((r) => {
10424
- const reviewReasons = parseReviewReasons(r.review_reasons);
10604
+ const reviewReasons = parseReviewReasons2(r.review_reasons);
10425
10605
  const nonAuthorableReason = reviewReasons.find((reason) => reason.startsWith("non-authorable:"));
10426
10606
  return {
10427
10607
  name: r.name,
@@ -10779,9 +10959,9 @@ function copyMapTokensFromCache(db, sourceSessionId, targetSessionId) {
10779
10959
  const targetComponentId = targetIdByName.get(row.component_name);
10780
10960
  if (!targetComponentId) continue;
10781
10961
  if (!targetProps.has(`${targetComponentId}::${row.prop_name}`)) continue;
10782
- const propKey = `${targetComponentId}::${row.prop_name}`;
10783
- if (!clearedProps.has(propKey)) {
10784
- clearedProps.add(propKey);
10962
+ const propKey2 = `${targetComponentId}::${row.prop_name}`;
10963
+ if (!clearedProps.has(propKey2)) {
10964
+ clearedProps.add(propKey2);
10785
10965
  db.prepare(`DELETE FROM raw_prop_token_paths WHERE session_id = ? AND component_id = ? AND prop_name = ?`).run(
10786
10966
  targetSessionId,
10787
10967
  targetComponentId,
@@ -10789,7 +10969,7 @@ function copyMapTokensFromCache(db, sourceSessionId, targetSessionId) {
10789
10969
  );
10790
10970
  }
10791
10971
  insertPath.run(targetSessionId, targetComponentId, row.prop_name, row.source, row.position, row.path);
10792
- copiedProps.add(propKey);
10972
+ copiedProps.add(propKey2);
10793
10973
  }
10794
10974
  copiedCount = copiedProps.size;
10795
10975
  db.prepare("UPDATE sessions SET updated_at = ? WHERE id = ?").run(now, targetSessionId);
@@ -10887,6 +11067,8 @@ var init_db = __esm({
10887
11067
  init_apply_tool_calls();
10888
11068
  init_replace_raw_token_name_paths();
10889
11069
  init_replace_raw_prop_token_paths();
11070
+ init_read4();
11071
+ init_store_raw_components();
10890
11072
  SCHEMA = `
10891
11073
  PRAGMA journal_mode = WAL;
10892
11074
  PRAGMA foreign_keys = ON;
@@ -11128,7 +11310,7 @@ async function ensureRefineSession(sessionId2, artifactsRoot, initialSnapshot) {
11128
11310
  }
11129
11311
  async function writeScopeDecisionsSnapshot(db, sessionId2, decisions) {
11130
11312
  const acceptedSet = new Set(decisions.accepted);
11131
- const rawComponents = loadRawComponents(db, sessionId2);
11313
+ const rawComponents = getRawComponents(db, sessionId2);
11132
11314
  const records = rawComponents.map((c2) => {
11133
11315
  const status = acceptedSet.has(c2.name) ? "accepted" : "rejected";
11134
11316
  const proposal = {
@@ -12183,7 +12365,7 @@ function useSession({ sessionId: sessionId2, artifactsRoot, reviewRoot }) {
12183
12365
  const db = openPipelineDb();
12184
12366
  let rawComponents;
12185
12367
  try {
12186
- rawComponents = loadRawComponents(db, sessionId2);
12368
+ rawComponents = getRawComponents(db, sessionId2);
12187
12369
  } finally {
12188
12370
  db.close();
12189
12371
  }
@@ -16578,7 +16760,7 @@ async function loadAndValidateForReview(sessionId2, projectRoot) {
16578
16760
  const db = openPipelineDb();
16579
16761
  let rawComponents;
16580
16762
  try {
16581
- rawComponents = loadRawComponents(db, sessionId2);
16763
+ rawComponents = getRawComponents(db, sessionId2);
16582
16764
  } finally {
16583
16765
  db.close();
16584
16766
  }
@@ -16697,7 +16879,7 @@ function registerAnalyzeEditCommand(program) {
16697
16879
  const db = openPipelineDb();
16698
16880
  let rawComponentCount = 0;
16699
16881
  try {
16700
- rawComponentCount = loadRawComponents(db, sessionId2).length;
16882
+ rawComponentCount = getRawComponents(db, sessionId2).length;
16701
16883
  } finally {
16702
16884
  db.close();
16703
16885
  }
@@ -31118,7 +31300,7 @@ function registerAnalyzeSelectAgentCommand(program) {
31118
31300
  let rawComponents;
31119
31301
  let scannedFiles = [];
31120
31302
  try {
31121
- rawComponents = loadRawComponents(db, sessionId2);
31303
+ rawComponents = getRawComponents(db, sessionId2);
31122
31304
  scannedFiles = loadScannedFiles(db, sessionId2);
31123
31305
  } finally {
31124
31306
  db.close();
@@ -33260,7 +33442,7 @@ async function runGenerateSkill(skill, opts, verbose = false) {
33260
33442
  const acceptedNames = await loadAcceptedNames(sessionId2);
33261
33443
  const db = openPipelineDb();
33262
33444
  try {
33263
- allComponents = loadRawComponents(db, sessionId2, acceptedNames ?? void 0);
33445
+ allComponents = getRawComponents(db, sessionId2, acceptedNames ?? void 0);
33264
33446
  } finally {
33265
33447
  db.close();
33266
33448
  }
@@ -0,0 +1,34 @@
1
+ export interface CdfSnapshotEntry {
2
+ component_id: string;
3
+ name: string;
4
+ position: number;
5
+ cdf_type: string;
6
+ cdf_category: string;
7
+ cdf_token_kind: string | null;
8
+ }
9
+ export interface DescriptionSnapshotEntry {
10
+ component_id: string;
11
+ description: string;
12
+ }
13
+ export interface AllowedValueSnapshotEntry {
14
+ component_id: string;
15
+ prop_name: string;
16
+ position: number;
17
+ value: string;
18
+ }
19
+ export interface RestoredAllowedValues {
20
+ componentId: string;
21
+ propName: string;
22
+ values: AllowedValueSnapshotEntry[];
23
+ }
24
+ export interface CdfRestorePlan {
25
+ byName: CdfSnapshotEntry[];
26
+ byPosition: CdfSnapshotEntry[];
27
+ descriptions: DescriptionSnapshotEntry[];
28
+ allowedValues: RestoredAllowedValues[];
29
+ }
30
+ export interface CurrentPropsQuery {
31
+ hasPropNamed: (componentId: string, propName: string) => boolean;
32
+ propNameAtPosition: (componentId: string, position: number) => string | null;
33
+ }
34
+ export declare function planCdfRestore(cdfSnapshot: CdfSnapshotEntry[], descSnapshot: DescriptionSnapshotEntry[], avSnapshot: AllowedValueSnapshotEntry[], currentProps: CurrentPropsQuery): CdfRestorePlan;
@@ -16,6 +16,8 @@ export { storeDtcgTokens as storeDTCGTokens } from './services/tokens/store-dtcg
16
16
  export { applyTokenToolCalls, type ApplyTokenToolCallsResult } from './services/tokens/apply-tool-calls.js';
17
17
  export { replaceRawTokenNamePaths } from './services/tokens/replace-raw-token-name-paths.js';
18
18
  export { replaceRawPropTokenPaths } from './services/tokens/replace-raw-prop-token-paths.js';
19
+ export { getRawComponents as loadRawComponents, type RawComponentWithId } from './repositories/components/raw/read.js';
20
+ export { storeRawComponents } from './services/components/store-raw-components.js';
19
21
  export type StepStatus = 'pending' | 'complete' | 'failed' | 'interrupted';
20
22
  export type CommandName = 'analyze extract' | 'analyze select' | 'generate components' | 'generate tokens' | 'generate edit' | 'apply preview' | 'apply select' | 'apply push' | 'print components' | 'print tokens' | 'map tokens' | 'fetch existing entities' | 'import';
21
23
  export interface SessionRow {
@@ -79,14 +81,6 @@ export type { SessionResolution };
79
81
  export declare function getOrCreateSession(db: DatabaseSync, sessionFlag: string | undefined, sessionName: string | undefined, hints: MatchHints): SessionResolution;
80
82
  export declare function createStep(db: DatabaseSync, sessionId: string, command: CommandName, inputs: Record<string, string>): number;
81
83
  export declare function updateStep(db: DatabaseSync, stepId: number, status: 'complete' | 'failed', outputs: Record<string, string>, error?: string): void;
82
- export declare function storeRawComponents(db: DatabaseSync, sessionId: string, components: RawComponentDefinition[], options?: {
83
- status?: string;
84
- preserveCDF?: boolean;
85
- }): void;
86
- export type RawComponentWithId = RawComponentDefinition & {
87
- component_id: string;
88
- };
89
- export declare function loadRawComponents(db: DatabaseSync, sessionId: string, allowedNames?: Set<string>): RawComponentWithId[];
90
84
  export declare function loadComponentSourceRef(name: string, sourcePath: string, propNames?: string[], propTypes?: string[]): Promise<ComponentSourceRef>;
91
85
  export declare function loadComponentSourceRefs(db: DatabaseSync, sessionId: string): Promise<ComponentSourceRef[]>;
92
86
  export declare function renameEmptySlots(db: DatabaseSync, sessionId: string, componentId: string, componentName: string, slotCount: number): {
@@ -0,0 +1,11 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { RawComponentDefinition } from '../../../../types.js';
3
+ import type { AllowedValueSnapshotEntry, CdfSnapshotEntry, DescriptionSnapshotEntry } from '../../../core/components/plan-cdf-restore.js';
4
+ export type RawComponentWithId = RawComponentDefinition & {
5
+ component_id: string;
6
+ };
7
+ export declare function getRawComponents(db: DatabaseSync, sessionId: string, allowedNames?: Set<string>): RawComponentWithId[];
8
+ export declare function getClassifiedProps(db: DatabaseSync, sessionId: string): CdfSnapshotEntry[];
9
+ export declare function getComponentDescriptions(db: DatabaseSync, sessionId: string): DescriptionSnapshotEntry[];
10
+ export declare function getRawPropAllowedValues(db: DatabaseSync, sessionId: string): AllowedValueSnapshotEntry[];
11
+ export declare function getRawPropNameAtPosition(db: DatabaseSync, sessionId: string, componentId: string, position: number): string | null;
@@ -0,0 +1,12 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { RawComponentDefinition } from '../../../../types.js';
3
+ export declare function deleteRawComponentsForSession(db: DatabaseSync, sessionId: string): void;
4
+ export declare function createRawComponent(db: DatabaseSync, sessionId: string, comp: RawComponentDefinition, extractedAt: string): string;
5
+ export declare function createRawProps(db: DatabaseSync, sessionId: string, componentId: string, props: RawComponentDefinition['props']): void;
6
+ export declare function createRawSlots(db: DatabaseSync, sessionId: string, componentId: string, slots: RawComponentDefinition['slots']): void;
7
+ export declare function updateRawComponentsStatus(db: DatabaseSync, sessionId: string, status: string): void;
8
+ export declare function updateRawPropCdfByName(db: DatabaseSync, sessionId: string, componentId: string, propName: string, cdfType: string, cdfCategory: string, cdfTokenKind: string | null): number;
9
+ export declare function updateRawPropCdfByPosition(db: DatabaseSync, sessionId: string, componentId: string, position: number, cdfType: string, cdfCategory: string, cdfTokenKind: string | null): number;
10
+ export declare function updateRawComponentDescription(db: DatabaseSync, sessionId: string, componentId: string, description: string): void;
11
+ export declare function deleteRawPropAllowedValuesForProp(db: DatabaseSync, sessionId: string, componentId: string, propName: string): void;
12
+ export declare function createRawPropAllowedValue(db: DatabaseSync, sessionId: string, componentId: string, propName: string, position: number, value: string): void;
@@ -0,0 +1,3 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { CdfRestorePlan } from '../../core/components/plan-cdf-restore.js';
3
+ export declare function applyCdfRestore(db: DatabaseSync, sessionId: string, plan: CdfRestorePlan): void;
@@ -0,0 +1,6 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import type { RawComponentDefinition } from '../../../types.js';
3
+ export declare function storeRawComponents(db: DatabaseSync, sessionId: string, components: RawComponentDefinition[], options?: {
4
+ status?: string;
5
+ preserveCDF?: boolean;
6
+ }): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.32.1-dev-build-26a2030.0",
3
+ "version": "2.33.1-dev-build-9dba4a6.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -40,8 +40,8 @@
40
40
  "svelte": "^5.56.4",
41
41
  "ts-morph": "^27.0.2",
42
42
  "typescript": "^5.9.3",
43
- "@contentful/experience-design-system-types": "2.32.1-dev-build-26a2030.0",
44
- "@contentful/experience-design-system-cli-v2": "2.32.1-dev-build-26a2030.0"
43
+ "@contentful/experience-design-system-cli-v2": "2.33.1-dev-build-9dba4a6.0",
44
+ "@contentful/experience-design-system-types": "2.33.1-dev-build-9dba4a6.0"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@tsconfig/node24": "^24.0.4",
@@ -53,9 +53,9 @@
53
53
  "ink-testing-library": "^4.0.0",
54
54
  "typescript-eslint": "^8.67.0",
55
55
  "vitest": "^4.0.16",
56
- "@contentful/experience-design-system-client": "2.32.1-dev-build-26a2030.0",
57
- "@contentful/experience-design-system-extraction": "2.32.1-dev-build-26a2030.0",
58
- "@contentful/experience-design-system-generation": "2.32.1-dev-build-26a2030.0"
56
+ "@contentful/experience-design-system-client": "2.33.1-dev-build-9dba4a6.0",
57
+ "@contentful/experience-design-system-generation": "2.33.1-dev-build-9dba4a6.0",
58
+ "@contentful/experience-design-system-extraction": "2.33.1-dev-build-9dba4a6.0"
59
59
  },
60
60
  "repository": {
61
61
  "type": "git",