@cesdk/cesdk-js 1.64.0-nightly.20251104 → 1.64.0-nightly.20251106

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/index.d.ts CHANGED
@@ -3483,6 +3483,182 @@ export declare type ExportSceneAction = (options: {
3483
3483
  * The FeatureAPI allows you to enable or disable specific functionality
3484
3484
  * within the editor based on custom conditions or user permissions.
3485
3485
  *
3486
+ * ## Understanding the Feature System
3487
+ *
3488
+ * The feature system uses a **predicate chain** to determine if a feature is enabled.
3489
+ * There are two types of predicates:
3490
+ *
3491
+ * 1. **Boolean predicates** (e.g., `true` or `false`) - These are **always terminal** and immediately return their value.
3492
+ * 2. **Function predicates** - The implementation decides whether to call `isPreviousEnable()` (continue chain) or return directly (end chain).
3493
+ *
3494
+ * ### Evaluation Order
3495
+ *
3496
+ * Predicates are evaluated in this order:
3497
+ * 1. **`set()` predicates** (most recent first) - Evaluated **FIRST**
3498
+ * 2. **`enable()`/`disable()` state** - Evaluated **LAST**
3499
+ *
3500
+ * This means **`set()` can override `enable()` and `disable()`**.
3501
+ *
3502
+ * ## Common Use Cases and Expected Outcomes
3503
+ *
3504
+ * ### Use Case 1: Simple Enable/Disable
3505
+ *
3506
+ * **Use `enable()` and `disable()` for simple on/off control:**
3507
+ *
3508
+ * ```typescript
3509
+ * // Enable a feature with its default behavior
3510
+ * cesdk.feature.enable('ly.img.delete');
3511
+ * // isEnabled: true
3512
+ *
3513
+ * // Disable it
3514
+ * cesdk.feature.disable('ly.img.delete');
3515
+ * // isEnabled: false
3516
+ *
3517
+ * // Re-enable it
3518
+ * cesdk.feature.enable('ly.img.delete');
3519
+ * // isEnabled: true
3520
+ * ```
3521
+ *
3522
+ * **Expected outcome:** `enable()` and `disable()` work together to toggle features on/off.
3523
+ *
3524
+ * ### Use Case 2: Custom Conditions with `set()`
3525
+ *
3526
+ * **Use `set()` when you need custom logic:**
3527
+ *
3528
+ * ```typescript
3529
+ * // Enable delete only when something is selected
3530
+ * cesdk.feature.set('ly.img.delete', ({ engine }) => {
3531
+ * return engine.block.findAllSelected().length > 0;
3532
+ * });
3533
+ * // isEnabled: depends on selection
3534
+ *
3535
+ * // Now calling disable() won't work because set() is evaluated first!
3536
+ * cesdk.feature.disable('ly.img.delete');
3537
+ * // isEnabled: still depends on selection (disable is ignored)
3538
+ * ```
3539
+ *
3540
+ * **Expected outcome:** `set()` function predicates are evaluated before `disable()`,
3541
+ * so `disable()` has no effect when a `set()` predicate exists.
3542
+ *
3543
+ * ### Use Case 3: Terminal Boolean Predicates
3544
+ *
3545
+ * **Boolean predicates are terminal - they stop the chain:**
3546
+ *
3547
+ * ```typescript
3548
+ * cesdk.feature.enable('ly.img.delete'); // Default predicate: true
3549
+ * cesdk.feature.set('ly.img.delete', false); // Adds false to front
3550
+ * // Chain: [set(false), enable(true)]
3551
+ * // Evaluation: false (stops here, never reaches enable)
3552
+ * // isEnabled: false
3553
+ *
3554
+ * cesdk.feature.set('ly.img.delete', true); // Adds true to front
3555
+ * // Chain: [set(true), set(false), enable(true)]
3556
+ * // Evaluation: true (stops here, never reaches the rest)
3557
+ * // isEnabled: true
3558
+ * ```
3559
+ *
3560
+ * **Expected outcome:** The most recent `set()` call with a boolean wins because
3561
+ * boolean predicates are terminal.
3562
+ *
3563
+ * ### Use Case 4: Layering Conditions with Functions
3564
+ *
3565
+ * **Function predicates can check previous conditions:**
3566
+ *
3567
+ * ```typescript
3568
+ * // Base: Feature enabled by default
3569
+ * cesdk.feature.enable('ly.img.delete');
3570
+ *
3571
+ * // Layer 1: Add selection requirement
3572
+ * cesdk.feature.set('ly.img.delete', ({ isPreviousEnable, engine }) => {
3573
+ * const baseEnabled = isPreviousEnable(); // Checks enable(true)
3574
+ * const hasSelection = engine.block.findAllSelected().length > 0;
3575
+ * return baseEnabled && hasSelection;
3576
+ * });
3577
+ * // isEnabled: true only if enabled AND has selection
3578
+ *
3579
+ * // Layer 2: Add mode requirement
3580
+ * cesdk.feature.set('ly.img.delete', ({ isPreviousEnable, engine }) => {
3581
+ * const previousEnabled = isPreviousEnable(); // Checks Layer 1
3582
+ * const isDesignMode = engine.scene.getMode() === 'Design';
3583
+ * return previousEnabled && isDesignMode;
3584
+ * });
3585
+ * // isEnabled: true only if all conditions met (mode + selection + enabled)
3586
+ * ```
3587
+ *
3588
+ * **Expected outcome:** Each `set()` call with a function can build on previous
3589
+ * conditions by calling `isPreviousEnable()`.
3590
+ *
3591
+ * ### Use Case 5: Overriding with `set()`
3592
+ *
3593
+ * **`set()` can completely override enable/disable:**
3594
+ *
3595
+ * ```typescript
3596
+ * cesdk.feature.enable('ly.img.delete');
3597
+ * cesdk.feature.disable('ly.img.delete');
3598
+ * // isEnabled: false (disable overrides enable)
3599
+ *
3600
+ * // But set() overrides both:
3601
+ * cesdk.feature.set('ly.img.delete', true);
3602
+ * // Chain: [set(true), disable(false)]
3603
+ * // isEnabled: true (set is terminal, disable never evaluated)
3604
+ * ```
3605
+ *
3606
+ * **Expected outcome:** `set()` with a boolean always wins because it's evaluated
3607
+ * first and is terminal.
3608
+ *
3609
+ * ### Use Case 6: Glob Patterns for Bulk Operations
3610
+ *
3611
+ * **Use wildcards to affect multiple features:**
3612
+ *
3613
+ * ```typescript
3614
+ * // Enable all video features at once
3615
+ * cesdk.feature.enable('ly.img.video.*');
3616
+ *
3617
+ * // Disable all crop features
3618
+ * cesdk.feature.disable('ly.img.crop.*');
3619
+ *
3620
+ * // Set custom predicate for all navigation features
3621
+ * cesdk.feature.set('ly.img.navigation.*', ({ engine }) => {
3622
+ * return engine.scene.getMode() === 'Design';
3623
+ * });
3624
+ *
3625
+ * // Check if all video features are enabled
3626
+ * const allVideoEnabled = cesdk.feature.isEnabled('ly.img.video.*');
3627
+ * // Returns true only if ALL matching features are enabled
3628
+ * ```
3629
+ *
3630
+ * **Expected outcome:** Glob patterns match multiple features. `isEnabled()` with
3631
+ * a glob returns `true` only if **all** matching features are enabled.
3632
+ *
3633
+ * ### Use Case 7: Role-Based Access Control
3634
+ *
3635
+ * **Implement permissions using predicates:**
3636
+ *
3637
+ * ```typescript
3638
+ * const userRole = 'editor'; // Could be 'viewer', 'editor', 'admin'
3639
+ *
3640
+ * cesdk.feature.set('ly.img.delete', () => {
3641
+ * return userRole === 'editor' || userRole === 'admin';
3642
+ * });
3643
+ *
3644
+ * cesdk.feature.set('ly.img.settings', () => {
3645
+ * return userRole === 'admin';
3646
+ * });
3647
+ * ```
3648
+ *
3649
+ * **Expected outcome:** Features are enabled based on user roles, with predicates
3650
+ * evaluated on every check.
3651
+ *
3652
+ * ## Key Principles
3653
+ *
3654
+ * 1. **Use `enable()` for simple on/off** - Works with default predicates
3655
+ * 2. **Use `disable()` to turn off enabled features** - Only works if no `set()` predicates exist
3656
+ * 3. **Use `set()` for custom logic** - Overrides `enable()`/`disable()`
3657
+ * 4. **Boolean predicates are terminal** - Stop evaluation immediately
3658
+ * 5. **Function predicates can chain** - Call `isPreviousEnable()` to continue
3659
+ * 6. **Most recent `set()` wins** - Evaluated in LIFO order (most recent first)
3660
+ * 7. **Glob patterns affect multiple features** - Use `*` as wildcard
3661
+ *
3486
3662
  * @categoryDescription Feature Control
3487
3663
  * Methods for enabling and checking the status of editor features based on custom predicates.
3488
3664
  *
@@ -6697,13 +6873,21 @@ export declare class UtilsAPI {
6697
6873
  * accept: 'image/*',
6698
6874
  * returnType: 'blob'
6699
6875
  * });
6876
+ *
6877
+ * // Load a file as object URL (blob URL)
6878
+ * const objectURL = await cesdk.utils.loadFile({
6879
+ * accept: '.zip',
6880
+ * returnType: 'objectURL'
6881
+ * });
6882
+ * // Remember to revoke the object URL when done
6883
+ * URL.revokeObjectURL(objectURL);
6700
6884
  * ```
6701
6885
  * @public
6702
6886
  */
6703
- loadFile<T extends 'dataURL' | 'text' | 'blob' | 'arrayBuffer' | 'File'>({ accept, returnType }: {
6887
+ loadFile<T extends 'dataURL' | 'text' | 'blob' | 'arrayBuffer' | 'File' | 'objectURL'>({ accept, returnType }: {
6704
6888
  accept: string;
6705
6889
  returnType?: T;
6706
- }): Promise<T extends 'dataURL' ? string : T extends 'text' ? string : T extends 'blob' ? Blob : T extends 'arrayBuffer' ? ArrayBuffer : File>;
6890
+ }): Promise<T extends 'dataURL' ? string : T extends 'text' ? string : T extends 'blob' ? Blob : T extends 'arrayBuffer' ? ArrayBuffer : T extends 'objectURL' ? string : File>;
6707
6891
  /**
6708
6892
  * Downloads a blob or string as a file to the user's device
6709
6893
  *