@kustomizer/visual-editor 0.0.1 → 0.2.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/LICENSE +12 -0
- package/README.md +25 -15
- package/fesm2022/kustomizer-visual-editor.mjs +1000 -2074
- package/fesm2022/kustomizer-visual-editor.mjs.map +1 -1
- package/package.json +22 -13
- package/types/kustomizer-visual-editor.d.ts +285 -447
|
@@ -3,9 +3,7 @@ import { InjectionToken, Type, EnvironmentProviders, OnInit, OnDestroy } from '@
|
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import * as _ngrx_store from '@ngrx/store';
|
|
5
5
|
import * as _kustomizer_visual_editor from '@kustomizer/visual-editor';
|
|
6
|
-
import {
|
|
7
|
-
import { Session, User, SupabaseClient } from '@supabase/supabase-js';
|
|
8
|
-
import { CanActivateFn } from '@angular/router';
|
|
6
|
+
import { SafeResourceUrl } from '@angular/platform-browser';
|
|
9
7
|
|
|
10
8
|
/**
|
|
11
9
|
* Navigation target for the visual editor
|
|
@@ -18,6 +16,8 @@ type VisualEditorNavigationTarget = {
|
|
|
18
16
|
} | {
|
|
19
17
|
type: 'page-preview';
|
|
20
18
|
pageId: string;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'setup';
|
|
21
21
|
};
|
|
22
22
|
/**
|
|
23
23
|
* Confirmation dialog options
|
|
@@ -84,12 +84,20 @@ interface VisualEditorState {
|
|
|
84
84
|
declare const initialVisualEditorState: VisualEditorState;
|
|
85
85
|
declare const VISUAL_EDITOR_FEATURE_KEY = "visualEditor";
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Shopify configuration for GraphQL API access
|
|
89
|
+
*/
|
|
88
90
|
interface ShopifyConfig {
|
|
89
91
|
shopDomain: string;
|
|
90
92
|
accessToken: string;
|
|
91
93
|
apiVersion: string;
|
|
94
|
+
/** Optional proxy URL for development (bypasses CORS) */
|
|
95
|
+
proxyUrl?: string;
|
|
92
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Injection token for Shopify configuration
|
|
99
|
+
* Can be provided as a static object or as an Observable for dynamic config
|
|
100
|
+
*/
|
|
93
101
|
declare const SHOPIFY_CONFIG: InjectionToken<ShopifyConfig | Observable<ShopifyConfig>>;
|
|
94
102
|
/**
|
|
95
103
|
* Metafield representation from Shopify
|
|
@@ -118,6 +126,8 @@ interface PageIndexEntry {
|
|
|
118
126
|
updatedAt: string;
|
|
119
127
|
publishedAt?: string;
|
|
120
128
|
size: number;
|
|
129
|
+
/** MetafieldDefinition ID for this page's metafield (enables Storefront API access) */
|
|
130
|
+
definitionId?: string;
|
|
121
131
|
}
|
|
122
132
|
/**
|
|
123
133
|
* Index of all pages stored in a single metafield
|
|
@@ -187,6 +197,28 @@ interface UpdatePageRequest {
|
|
|
187
197
|
interface PublishPageRequest {
|
|
188
198
|
version: number;
|
|
189
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Shopify Storefront API configuration (read-only, public access)
|
|
202
|
+
*/
|
|
203
|
+
interface StorefrontConfig {
|
|
204
|
+
shopDomain: string;
|
|
205
|
+
storefrontAccessToken: string;
|
|
206
|
+
apiVersion: string;
|
|
207
|
+
/** Optional proxy URL for SSR (avoids CORS) */
|
|
208
|
+
proxyUrl?: string;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Injection token for Storefront API configuration.
|
|
212
|
+
* Used by the public-storefront to read metafields via the Storefront API.
|
|
213
|
+
*/
|
|
214
|
+
declare const STOREFRONT_CONFIG: InjectionToken<StorefrontConfig>;
|
|
215
|
+
/**
|
|
216
|
+
* Injection token for the client storefront URL.
|
|
217
|
+
* The editor uses this to:
|
|
218
|
+
* 1. Fetch the component manifest (`{url}/kustomizer/manifest.json`)
|
|
219
|
+
* 2. Embed the live preview iframe (`{url}/kustomizer/editor`)
|
|
220
|
+
*/
|
|
221
|
+
declare const STOREFRONT_URL: InjectionToken<string>;
|
|
190
222
|
|
|
191
223
|
/**
|
|
192
224
|
* Abstract strategy for loading pages into the editor
|
|
@@ -784,9 +816,11 @@ interface ComponentDefinition<TProps extends Record<string, unknown> = Record<st
|
|
|
784
816
|
*/
|
|
785
817
|
icon?: string;
|
|
786
818
|
/**
|
|
787
|
-
* Angular component class to render
|
|
819
|
+
* Angular component class to render.
|
|
820
|
+
* Optional for manifest-loaded definitions where the component is rendered
|
|
821
|
+
* in a remote iframe and the editor only needs metadata.
|
|
788
822
|
*/
|
|
789
|
-
component
|
|
823
|
+
component?: Type<unknown>;
|
|
790
824
|
/**
|
|
791
825
|
* Schema of editable properties
|
|
792
826
|
*/
|
|
@@ -1343,7 +1377,6 @@ interface BlockPickerTarget {
|
|
|
1343
1377
|
declare class BlockTreeItemComponent {
|
|
1344
1378
|
readonly facade: VisualEditorFacade;
|
|
1345
1379
|
private readonly dndService;
|
|
1346
|
-
private readonly sanitizer;
|
|
1347
1380
|
private readonly treeBlock;
|
|
1348
1381
|
readonly block: _angular_core.InputSignal<EditorElement>;
|
|
1349
1382
|
readonly context: _angular_core.InputSignal<BlockTreeContext>;
|
|
@@ -1375,7 +1408,7 @@ declare class BlockTreeItemComponent {
|
|
|
1375
1408
|
readonly blockSlots: _angular_core.Signal<SlotDefinition[]>;
|
|
1376
1409
|
readonly children: _angular_core.Signal<EditorElement[]>;
|
|
1377
1410
|
readonly childContext: _angular_core.Signal<BlockTreeContext>;
|
|
1378
|
-
readonly blockIcon: _angular_core.Signal<
|
|
1411
|
+
readonly blockIcon: _angular_core.Signal<string>;
|
|
1379
1412
|
readonly blockName: _angular_core.Signal<string>;
|
|
1380
1413
|
readonly duplicable: _angular_core.Signal<boolean>;
|
|
1381
1414
|
readonly canAddMore: _angular_core.Signal<boolean>;
|
|
@@ -1414,6 +1447,8 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
|
|
|
1414
1447
|
private readonly loadingStrategy;
|
|
1415
1448
|
private readonly config;
|
|
1416
1449
|
private readonly dndService;
|
|
1450
|
+
private readonly iframeBridge;
|
|
1451
|
+
private readonly storefrontUrlService;
|
|
1417
1452
|
private readonly sanitizer;
|
|
1418
1453
|
private readonly destroy$;
|
|
1419
1454
|
readonly showBackButton: _angular_core.Signal<boolean>;
|
|
@@ -1424,6 +1459,9 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
|
|
|
1424
1459
|
isEditor: boolean;
|
|
1425
1460
|
}>;
|
|
1426
1461
|
private readonly canvasEl;
|
|
1462
|
+
private readonly previewFrame;
|
|
1463
|
+
readonly previewUrl: _angular_core.Signal<SafeResourceUrl | null>;
|
|
1464
|
+
private iframeReady;
|
|
1427
1465
|
readonly propertiesTab: _angular_core.WritableSignal<"props" | "blocks">;
|
|
1428
1466
|
readonly expandedGroups: _angular_core.WritableSignal<Set<string>>;
|
|
1429
1467
|
readonly expandedSections: _angular_core.WritableSignal<Set<string>>;
|
|
@@ -1465,19 +1503,18 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
|
|
|
1465
1503
|
startEditingName(): void;
|
|
1466
1504
|
saveEditingName(event: Event): void;
|
|
1467
1505
|
cancelEditingName(): void;
|
|
1506
|
+
constructor();
|
|
1468
1507
|
ngOnInit(): void;
|
|
1469
1508
|
ngOnDestroy(): void;
|
|
1509
|
+
onIframeLoad(): void;
|
|
1470
1510
|
goBack(): void;
|
|
1471
1511
|
savePage(): void;
|
|
1472
1512
|
publishPage(): void;
|
|
1473
1513
|
unpublishPage(): void;
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
getBlockIcon(def: ComponentDefinition): SafeHtml;
|
|
1479
|
-
getBlockIconByType(type: string): SafeHtml;
|
|
1480
|
-
getSectionIcon(type: string): SafeHtml;
|
|
1514
|
+
getIcon(def: ComponentDefinition): string;
|
|
1515
|
+
getBlockIcon(def: ComponentDefinition): string;
|
|
1516
|
+
getBlockIconByType(type: string): string;
|
|
1517
|
+
getSectionIcon(type: string): string;
|
|
1481
1518
|
isSectionExpanded(sectionId: string): boolean;
|
|
1482
1519
|
isAllBlocksExpanded(sectionId: string): boolean;
|
|
1483
1520
|
toggleSectionExpand(sectionId: string, event: Event): void;
|
|
@@ -1540,8 +1577,8 @@ declare class VisualEditorComponent implements OnInit, OnDestroy {
|
|
|
1540
1577
|
addSectionFromPreset(rp: ResolvedPreset): void;
|
|
1541
1578
|
addBlockToSectionFromPreset(section: EditorSection, rp: ResolvedPreset): void;
|
|
1542
1579
|
addNestedBlockFromPreset(rp: ResolvedPreset): void;
|
|
1543
|
-
getSectionPresetIcon(rp: ResolvedPreset):
|
|
1544
|
-
getBlockPresetIcon(rp: ResolvedPreset):
|
|
1580
|
+
getSectionPresetIcon(rp: ResolvedPreset): string;
|
|
1581
|
+
getBlockPresetIcon(rp: ResolvedPreset): string;
|
|
1545
1582
|
selectSection(section: EditorSection, event: Event): void;
|
|
1546
1583
|
selectBlock(block: EditorElement): void;
|
|
1547
1584
|
deleteSection(sectionId: string, event: Event): void;
|
|
@@ -1658,6 +1695,7 @@ declare class PageManagerComponent implements OnInit {
|
|
|
1658
1695
|
readonly isDeleting: _angular_core.WritableSignal<boolean>;
|
|
1659
1696
|
ngOnInit(): void;
|
|
1660
1697
|
loadPages(): void;
|
|
1698
|
+
openSetup(): void;
|
|
1661
1699
|
openCreateDialog(): void;
|
|
1662
1700
|
closeCreateDialog(): void;
|
|
1663
1701
|
onTitleInput(event: Event): void;
|
|
@@ -1673,345 +1711,63 @@ declare class PageManagerComponent implements OnInit {
|
|
|
1673
1711
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageManagerComponent, "lib-page-manager", never, {}, {}, never, never, true, never>;
|
|
1674
1712
|
}
|
|
1675
1713
|
|
|
1676
|
-
/**
|
|
1677
|
-
* Token para inyectar el dominio de la tienda.
|
|
1678
|
-
* Debe ser configurado por la aplicación que instala el editor.
|
|
1679
|
-
*
|
|
1680
|
-
* Ejemplo de uso:
|
|
1681
|
-
* ```typescript
|
|
1682
|
-
* providers: [
|
|
1683
|
-
* { provide: STORE_DOMAIN, useValue: 'nike.com' }
|
|
1684
|
-
* ]
|
|
1685
|
-
* ```
|
|
1686
|
-
*
|
|
1687
|
-
* Si no se provee, el servicio intentará detectar el dominio desde window.location.hostname
|
|
1688
|
-
*/
|
|
1689
|
-
declare const STORE_DOMAIN: InjectionToken<string>;
|
|
1690
|
-
interface Shop {
|
|
1691
|
-
id: string;
|
|
1692
|
-
name: string;
|
|
1693
|
-
shopify_domain: string;
|
|
1694
|
-
}
|
|
1695
|
-
interface ShopUser {
|
|
1696
|
-
email: string;
|
|
1697
|
-
role: 'owner' | 'admin' | 'reader';
|
|
1698
|
-
}
|
|
1699
|
-
interface ShopLicense {
|
|
1700
|
-
tier: 'starter' | 'growth' | 'enterprise';
|
|
1701
|
-
expires_at: string | null;
|
|
1702
|
-
active: boolean;
|
|
1703
|
-
}
|
|
1704
|
-
interface ShopAuthData {
|
|
1705
|
-
shop: Shop | null;
|
|
1706
|
-
user: ShopUser | null;
|
|
1707
|
-
license: ShopLicense | null;
|
|
1708
|
-
}
|
|
1709
|
-
interface ShopAuthError {
|
|
1710
|
-
code: string;
|
|
1711
|
-
message: string;
|
|
1712
|
-
}
|
|
1713
|
-
declare class ShopAuthService {
|
|
1714
|
-
private http;
|
|
1715
|
-
private config;
|
|
1716
|
-
private authService;
|
|
1717
|
-
private storeDomainConfig;
|
|
1718
|
-
private _shop;
|
|
1719
|
-
private _user;
|
|
1720
|
-
private _license;
|
|
1721
|
-
private _loading;
|
|
1722
|
-
private _error;
|
|
1723
|
-
private _initialized;
|
|
1724
|
-
readonly shop: _angular_core.Signal<Shop | null>;
|
|
1725
|
-
readonly user: _angular_core.Signal<ShopUser | null>;
|
|
1726
|
-
readonly license: _angular_core.Signal<ShopLicense | null>;
|
|
1727
|
-
readonly loading: _angular_core.Signal<boolean>;
|
|
1728
|
-
readonly error: _angular_core.Signal<ShopAuthError | null>;
|
|
1729
|
-
readonly initialized: _angular_core.Signal<boolean>;
|
|
1730
|
-
readonly shopId: _angular_core.Signal<string | null>;
|
|
1731
|
-
readonly shopName: _angular_core.Signal<string | null>;
|
|
1732
|
-
readonly shopifyDomain: _angular_core.Signal<string | null>;
|
|
1733
|
-
readonly userEmail: _angular_core.Signal<string | null>;
|
|
1734
|
-
readonly userRole: _angular_core.Signal<"owner" | "admin" | "reader" | null>;
|
|
1735
|
-
readonly isOwner: _angular_core.Signal<boolean>;
|
|
1736
|
-
readonly isAdmin: _angular_core.Signal<boolean>;
|
|
1737
|
-
readonly canEdit: _angular_core.Signal<boolean>;
|
|
1738
|
-
readonly licenseTier: _angular_core.Signal<"starter" | "growth" | "enterprise" | null>;
|
|
1739
|
-
readonly licenseActive: _angular_core.Signal<boolean>;
|
|
1740
|
-
readonly licenseExpiresAt: _angular_core.Signal<string | null>;
|
|
1741
|
-
readonly hasAccess: _angular_core.Signal<boolean>;
|
|
1742
|
-
readonly daysRemaining: _angular_core.Signal<number | null>;
|
|
1743
|
-
readonly isLicenseExpiringSoon: _angular_core.Signal<boolean>;
|
|
1744
|
-
/**
|
|
1745
|
-
* Obtiene el dominio actual.
|
|
1746
|
-
* Prioridad:
|
|
1747
|
-
* 1. STORE_DOMAIN token (inyectado)
|
|
1748
|
-
* 2. Query param ?shop= (solo en localhost)
|
|
1749
|
-
* 3. window.location.hostname
|
|
1750
|
-
*/
|
|
1751
|
-
getCurrentDomain(): string;
|
|
1752
|
-
/**
|
|
1753
|
-
* Autentica al usuario para el dominio actual.
|
|
1754
|
-
* Esta es la función principal que debe llamarse al cargar la app.
|
|
1755
|
-
*/
|
|
1756
|
-
authenticate(): Promise<ShopAuthData>;
|
|
1757
|
-
/**
|
|
1758
|
-
* Limpia el estado (para logout)
|
|
1759
|
-
*/
|
|
1760
|
-
clear(): void;
|
|
1761
|
-
/**
|
|
1762
|
-
* Refresca la autenticación
|
|
1763
|
-
*/
|
|
1764
|
-
refresh(): Promise<ShopAuthData>;
|
|
1765
|
-
/**
|
|
1766
|
-
* Verifica si el error actual indica que el usuario no tiene acceso
|
|
1767
|
-
*/
|
|
1768
|
-
isNoAccessError(): boolean;
|
|
1769
|
-
/**
|
|
1770
|
-
* Verifica si el error actual indica que la licencia expiró
|
|
1771
|
-
*/
|
|
1772
|
-
isLicenseExpiredError(): boolean;
|
|
1773
|
-
/**
|
|
1774
|
-
* Verifica si el usuario está inactivo
|
|
1775
|
-
*/
|
|
1776
|
-
isUserInactiveError(): boolean;
|
|
1777
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopAuthService, never>;
|
|
1778
|
-
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopAuthService>;
|
|
1779
|
-
}
|
|
1780
|
-
|
|
1781
|
-
declare class LicenseGuardComponent {
|
|
1782
|
-
shopAuthService: ShopAuthService;
|
|
1783
|
-
showExpirationWarning: _angular_core.InputSignal<boolean>;
|
|
1784
|
-
subscribe: _angular_core.OutputEmitterRef<void>;
|
|
1785
|
-
renew: _angular_core.OutputEmitterRef<void>;
|
|
1786
|
-
reauth: _angular_core.OutputEmitterRef<void>;
|
|
1787
|
-
retry: _angular_core.OutputEmitterRef<void>;
|
|
1788
|
-
onSubscribe(): void;
|
|
1789
|
-
onRenew(): void;
|
|
1790
|
-
onReauth(): void;
|
|
1791
|
-
onRetry(): void;
|
|
1792
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LicenseGuardComponent, never>;
|
|
1793
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LicenseGuardComponent, "lib-license-guard", never, { "showExpirationWarning": { "alias": "showExpirationWarning"; "required": false; "isSignal": true; }; }, { "subscribe": "subscribe"; "renew": "renew"; "reauth": "reauth"; "retry": "retry"; }, never, ["*"], true, never>;
|
|
1794
|
-
}
|
|
1795
|
-
|
|
1796
|
-
declare class LoginComponent {
|
|
1797
|
-
private authService;
|
|
1798
|
-
private router;
|
|
1799
|
-
loginSuccess: _angular_core.OutputEmitterRef<void>;
|
|
1800
|
-
email: _angular_core.WritableSignal<string>;
|
|
1801
|
-
password: _angular_core.WritableSignal<string>;
|
|
1802
|
-
error: _angular_core.WritableSignal<string | null>;
|
|
1803
|
-
loading: _angular_core.WritableSignal<boolean>;
|
|
1804
|
-
isSignUp: _angular_core.WritableSignal<boolean>;
|
|
1805
|
-
showPassword: _angular_core.WritableSignal<boolean>;
|
|
1806
|
-
toggleMode(): void;
|
|
1807
|
-
togglePassword(): void;
|
|
1808
|
-
onSubmit(): Promise<void>;
|
|
1809
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoginComponent, never>;
|
|
1810
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoginComponent, "lib-login", never, {}, { "loginSuccess": "loginSuccess"; }, never, never, true, never>;
|
|
1811
|
-
}
|
|
1812
|
-
|
|
1813
|
-
type ViewState = 'loading' | 'no-store' | 'license-expired';
|
|
1814
|
-
declare class ActivateLicenseComponent implements OnInit {
|
|
1815
|
-
shopAuthService: ShopAuthService;
|
|
1816
|
-
viewState: _angular_core.Signal<ViewState>;
|
|
1817
|
-
ngOnInit(): void;
|
|
1818
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActivateLicenseComponent, never>;
|
|
1819
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<ActivateLicenseComponent, "lib-activate-license", never, {}, {}, never, never, true, never>;
|
|
1820
|
-
}
|
|
1821
|
-
|
|
1822
|
-
interface SupabaseConfig {
|
|
1823
|
-
supabaseUrl: string;
|
|
1824
|
-
supabaseAnonKey: string;
|
|
1825
|
-
}
|
|
1826
|
-
declare const SUPABASE_CONFIG: InjectionToken<SupabaseConfig>;
|
|
1827
|
-
declare class SupabaseAuthService implements OnDestroy {
|
|
1828
|
-
private config;
|
|
1829
|
-
private supabase;
|
|
1830
|
-
private supabasePromise;
|
|
1831
|
-
private authSubscription;
|
|
1832
|
-
private _session;
|
|
1833
|
-
private _user;
|
|
1834
|
-
private _loading;
|
|
1835
|
-
private _error;
|
|
1836
|
-
private _initialized;
|
|
1837
|
-
readonly session: _angular_core.Signal<Session | null>;
|
|
1838
|
-
readonly user: _angular_core.Signal<User | null>;
|
|
1839
|
-
readonly loading: _angular_core.Signal<boolean>;
|
|
1840
|
-
readonly error: _angular_core.Signal<string | null>;
|
|
1841
|
-
readonly initialized: _angular_core.Signal<boolean>;
|
|
1842
|
-
readonly isAuthenticated: _angular_core.Signal<boolean>;
|
|
1843
|
-
readonly accessToken: _angular_core.Signal<string | null>;
|
|
1844
|
-
readonly userEmail: _angular_core.Signal<string | null>;
|
|
1845
|
-
private getSupabaseClient;
|
|
1846
|
-
private initializeClient;
|
|
1847
|
-
ensureInitialized(): Promise<void>;
|
|
1848
|
-
signInWithPassword(email: string, password: string): Promise<{
|
|
1849
|
-
success: boolean;
|
|
1850
|
-
error?: string;
|
|
1851
|
-
}>;
|
|
1852
|
-
signUp(email: string, password: string): Promise<{
|
|
1853
|
-
success: boolean;
|
|
1854
|
-
error?: string;
|
|
1855
|
-
}>;
|
|
1856
|
-
signOut(): Promise<void>;
|
|
1857
|
-
resetPassword(email: string): Promise<{
|
|
1858
|
-
success: boolean;
|
|
1859
|
-
error?: string;
|
|
1860
|
-
}>;
|
|
1861
|
-
getClient(): Promise<SupabaseClient | null>;
|
|
1862
|
-
ngOnDestroy(): void;
|
|
1863
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SupabaseAuthService, never>;
|
|
1864
|
-
static ɵprov: _angular_core.ɵɵInjectableDeclaration<SupabaseAuthService>;
|
|
1865
|
-
}
|
|
1866
|
-
|
|
1867
|
-
declare class AppShellComponent {
|
|
1868
|
-
authService: SupabaseAuthService;
|
|
1869
|
-
shopAuthService: ShopAuthService;
|
|
1870
|
-
loggedOut: _angular_core.OutputEmitterRef<void>;
|
|
1871
|
-
logout(): Promise<void>;
|
|
1872
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppShellComponent, never>;
|
|
1873
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppShellComponent, "lib-app-shell", never, {}, { "loggedOut": "loggedOut"; }, never, ["*"], true, never>;
|
|
1874
|
-
}
|
|
1875
|
-
|
|
1876
|
-
declare class NoAccessComponent {
|
|
1877
|
-
backToLogin: _angular_core.OutputEmitterRef<void>;
|
|
1878
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<NoAccessComponent, never>;
|
|
1879
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<NoAccessComponent, "ke-no-access", never, {}, { "backToLogin": "backToLogin"; }, never, never, true, never>;
|
|
1880
|
-
}
|
|
1881
|
-
|
|
1882
|
-
declare class LicenseExpiredComponent {
|
|
1883
|
-
backToLogin: _angular_core.OutputEmitterRef<void>;
|
|
1884
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<LicenseExpiredComponent, never>;
|
|
1885
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<LicenseExpiredComponent, "ke-license-expired", never, {}, { "backToLogin": "backToLogin"; }, never, never, true, never>;
|
|
1886
|
-
}
|
|
1887
|
-
|
|
1888
1714
|
/**
|
|
1889
1715
|
* Injection token to enable in-memory page storage (for development)
|
|
1890
1716
|
* When false (default), uses Shopify metafields via GraphQL API
|
|
1891
1717
|
*/
|
|
1892
1718
|
declare const USE_IN_MEMORY_PAGES: InjectionToken<boolean>;
|
|
1893
|
-
/**
|
|
1894
|
-
* Injection token for page environment (metafield key prefix).
|
|
1895
|
-
* Default is 'production'.
|
|
1896
|
-
*/
|
|
1897
|
-
declare const PAGE_ENVIRONMENT: InjectionToken<string>;
|
|
1898
1719
|
declare class PageService {
|
|
1899
1720
|
private readonly useInMemory;
|
|
1900
|
-
private readonly pageEnvironment;
|
|
1901
1721
|
private readonly memoryRepo;
|
|
1902
1722
|
private readonly shopifyRepo;
|
|
1903
|
-
private resolveEnvironment;
|
|
1904
1723
|
/**
|
|
1905
1724
|
* Get all pages (summaries only for listing)
|
|
1906
1725
|
*/
|
|
1907
|
-
getPages(
|
|
1726
|
+
getPages(): Observable<PageSummary[]>;
|
|
1908
1727
|
/**
|
|
1909
1728
|
* Get a single page by ID (full content)
|
|
1910
1729
|
*/
|
|
1911
|
-
getPage(id: string
|
|
1730
|
+
getPage(id: string): Observable<Page>;
|
|
1912
1731
|
/**
|
|
1913
1732
|
* Get a published page by slug (for public rendering)
|
|
1914
1733
|
*/
|
|
1915
|
-
getPublishedPageBySlug(slug: string
|
|
1734
|
+
getPublishedPageBySlug(slug: string): Observable<Page>;
|
|
1916
1735
|
/**
|
|
1917
1736
|
* Create a new page
|
|
1918
1737
|
*/
|
|
1919
|
-
createPage(request: CreatePageRequest
|
|
1738
|
+
createPage(request: CreatePageRequest): Observable<Page>;
|
|
1920
1739
|
/**
|
|
1921
1740
|
* Update an existing page
|
|
1922
1741
|
*/
|
|
1923
|
-
updatePage(id: string, request: UpdatePageRequest
|
|
1742
|
+
updatePage(id: string, request: UpdatePageRequest): Observable<Page>;
|
|
1924
1743
|
/**
|
|
1925
1744
|
* Delete a page
|
|
1926
1745
|
*/
|
|
1927
|
-
deletePage(id: string
|
|
1746
|
+
deletePage(id: string): Observable<void>;
|
|
1928
1747
|
/**
|
|
1929
1748
|
* Publish a page (changes status to 'published')
|
|
1930
1749
|
*/
|
|
1931
|
-
publishPage(id: string, request: PublishPageRequest
|
|
1750
|
+
publishPage(id: string, request: PublishPageRequest): Observable<Page>;
|
|
1932
1751
|
/**
|
|
1933
1752
|
* Unpublish a page (changes status to 'draft')
|
|
1934
1753
|
*/
|
|
1935
|
-
unpublishPage(id: string, request: PublishPageRequest
|
|
1754
|
+
unpublishPage(id: string, request: PublishPageRequest): Observable<Page>;
|
|
1936
1755
|
/**
|
|
1937
1756
|
* Duplicate an existing page
|
|
1938
1757
|
*/
|
|
1939
|
-
duplicatePage(id: string
|
|
1940
|
-
/**
|
|
1941
|
-
* Delete all pages for a given environment
|
|
1942
|
-
*/
|
|
1943
|
-
deletePagesByEnvironment(environment?: string): Observable<void>;
|
|
1758
|
+
duplicatePage(id: string): Observable<Page>;
|
|
1944
1759
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageService, never>;
|
|
1945
1760
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageService>;
|
|
1946
1761
|
}
|
|
1947
1762
|
|
|
1948
|
-
interface ShopifyAppConfig {
|
|
1949
|
-
appUrl: string;
|
|
1950
|
-
}
|
|
1951
|
-
interface ShopifyTokenResponse {
|
|
1952
|
-
accessToken: string;
|
|
1953
|
-
shopifyDomain: string;
|
|
1954
|
-
}
|
|
1955
|
-
type TokenErrorCode = 'NOT_AUTHENTICATED' | 'NO_ACTIVE_STORE' | 'TOKEN_FETCH_FAILED' | 'SESSION_EXPIRED' | 'NO_STORE_ACCESS' | 'NETWORK_ERROR' | 'UNKNOWN_ERROR';
|
|
1956
|
-
interface TokenError {
|
|
1957
|
-
code: TokenErrorCode;
|
|
1958
|
-
message: string;
|
|
1959
|
-
status?: number;
|
|
1960
|
-
}
|
|
1961
|
-
declare const SHOPIFY_APP_CONFIG: InjectionToken<ShopifyAppConfig>;
|
|
1962
|
-
declare class ShopifyTokenService {
|
|
1963
|
-
private readonly http;
|
|
1964
|
-
private readonly config;
|
|
1965
|
-
private readonly authService;
|
|
1966
|
-
private readonly shopAuthService;
|
|
1967
|
-
private readonly CACHE_TTL_MS;
|
|
1968
|
-
private readonly tokenCache;
|
|
1969
|
-
private readonly _currentToken;
|
|
1970
|
-
private readonly _currentDomain;
|
|
1971
|
-
private readonly _loading;
|
|
1972
|
-
private readonly _error;
|
|
1973
|
-
private pendingRequest;
|
|
1974
|
-
readonly currentToken: _angular_core.Signal<string | null>;
|
|
1975
|
-
readonly currentDomain: _angular_core.Signal<string | null>;
|
|
1976
|
-
readonly loading: _angular_core.Signal<boolean>;
|
|
1977
|
-
readonly error: _angular_core.Signal<TokenError | null>;
|
|
1978
|
-
readonly hasToken: _angular_core.Signal<boolean>;
|
|
1979
|
-
readonly isReady: _angular_core.Signal<boolean>;
|
|
1980
|
-
getToken(): Observable<ShopifyTokenResponse>;
|
|
1981
|
-
getTokenForDomain(shopifyDomain: string): Observable<ShopifyTokenResponse>;
|
|
1982
|
-
refreshToken(): Observable<ShopifyTokenResponse>;
|
|
1983
|
-
invalidateCache(shopifyDomain?: string): void;
|
|
1984
|
-
clear(): void;
|
|
1985
|
-
private fetchToken;
|
|
1986
|
-
private getCachedToken;
|
|
1987
|
-
private setCachedToken;
|
|
1988
|
-
private handleHttpError;
|
|
1989
|
-
private createError;
|
|
1990
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopifyTokenService, never>;
|
|
1991
|
-
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopifyTokenService>;
|
|
1992
|
-
}
|
|
1993
|
-
|
|
1994
|
-
type GraphQLErrorCode = 'GRAPHQL_ERROR' | 'EMPTY_RESPONSE' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'RATE_LIMIT' | 'SERVER_ERROR' | 'NETWORK_ERROR' | 'HTTP_ERROR' | 'TOKEN_ERROR' | 'UNKNOWN_ERROR';
|
|
1995
|
-
interface GraphQLError {
|
|
1996
|
-
code: GraphQLErrorCode;
|
|
1997
|
-
message: string;
|
|
1998
|
-
status?: number;
|
|
1999
|
-
errors?: Array<{
|
|
2000
|
-
message: string;
|
|
2001
|
-
}>;
|
|
2002
|
-
original?: unknown;
|
|
2003
|
-
}
|
|
2004
1763
|
declare class ShopifyGraphQLClient {
|
|
2005
1764
|
private readonly http;
|
|
2006
|
-
private readonly authService;
|
|
2007
|
-
private readonly shopAuthService;
|
|
2008
1765
|
private readonly config;
|
|
2009
|
-
query<T>(query: string, variables?: Record<string,
|
|
2010
|
-
mutate<T>(mutation: string, variables?: Record<string,
|
|
1766
|
+
query<T>(query: string, variables?: Record<string, any>): Observable<T>;
|
|
1767
|
+
mutate<T>(mutation: string, variables?: Record<string, any>): Observable<T>;
|
|
2011
1768
|
private executeOperation;
|
|
2012
1769
|
private handleResponse;
|
|
2013
|
-
private
|
|
2014
|
-
private createError;
|
|
1770
|
+
private handleError;
|
|
2015
1771
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShopifyGraphQLClient, never>;
|
|
2016
1772
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShopifyGraphQLClient>;
|
|
2017
1773
|
}
|
|
@@ -2022,22 +1778,34 @@ declare const MAX_METAFIELD_SIZE: number;
|
|
|
2022
1778
|
declare const GET_SHOP_METAFIELD_QUERY = "\n query GetShopMetafield($namespace: String!, $key: String!) {\n shop {\n id\n metafield(namespace: $namespace, key: $key) {\n id\n value\n createdAt\n updatedAt\n }\n }\n }\n";
|
|
2023
1779
|
declare const SET_METAFIELD_MUTATION = "\n mutation SetMetafield($metafields: [MetafieldsSetInput!]!) {\n metafieldsSet(metafields: $metafields) {\n metafields {\n id\n namespace\n key\n value\n }\n userErrors {\n field\n message\n }\n }\n }\n";
|
|
2024
1780
|
declare const DELETE_METAFIELDS_MUTATION = "\n mutation DeleteMetafields($metafields: [MetafieldIdentifierInput!]!) {\n metafieldsDelete(metafields: $metafields) {\n deletedMetafields {\n key\n namespace\n }\n userErrors {\n field\n message\n }\n }\n }\n";
|
|
1781
|
+
declare const CREATE_METAFIELD_DEFINITION_MUTATION = "\n mutation CreateMetafieldDefinition($definition: MetafieldDefinitionInput!) {\n metafieldDefinitionCreate(definition: $definition) {\n createdDefinition {\n id\n }\n userErrors {\n field\n message\n code\n }\n }\n }\n";
|
|
1782
|
+
declare const DELETE_METAFIELD_DEFINITION_MUTATION = "\n mutation DeleteMetafieldDefinition($id: ID!) {\n metafieldDefinitionDelete(id: $id) {\n deletedDefinitionId\n userErrors {\n field\n message\n code\n }\n }\n }\n";
|
|
1783
|
+
declare const GET_METAFIELD_DEFINITION_QUERY = "\n query GetMetafieldDefinition($ownerType: MetafieldOwnerType!, $namespace: String, $key: String!) {\n metafieldDefinition(identifier: { ownerType: $ownerType, namespace: $namespace, key: $key }) {\n id\n }\n }\n";
|
|
2025
1784
|
declare const GET_SHOP_ID_QUERY = "\n query GetShopId {\n shop {\n id\n }\n }\n";
|
|
2026
1785
|
declare class ShopifyMetafieldRepository {
|
|
2027
1786
|
private readonly client;
|
|
2028
|
-
private resolveEnvironment;
|
|
2029
|
-
private buildIndexKey;
|
|
2030
|
-
private buildPageKey;
|
|
2031
1787
|
getMetafield(namespace: string, key: string): Observable<Metafield | null>;
|
|
2032
1788
|
setMetafield(namespace: string, key: string, value: any, ownerId: string): Observable<Metafield>;
|
|
2033
1789
|
deleteMetafield(namespace: string, key: string): Observable<void>;
|
|
2034
1790
|
getShopId(): Observable<string>;
|
|
2035
|
-
getPageIndex(
|
|
2036
|
-
updatePageIndex(index: PagesIndex
|
|
2037
|
-
getPageMetafield(pageId: string
|
|
2038
|
-
setPageMetafield(pageId: string, page: Page
|
|
2039
|
-
deletePageMetafield(pageId: string
|
|
2040
|
-
|
|
1791
|
+
getPageIndex(): Observable<PagesIndex>;
|
|
1792
|
+
updatePageIndex(index: PagesIndex): Observable<PagesIndex>;
|
|
1793
|
+
getPageMetafield(pageId: string): Observable<Page | null>;
|
|
1794
|
+
setPageMetafield(pageId: string, page: Page): Observable<Page>;
|
|
1795
|
+
deletePageMetafield(pageId: string): Observable<void>;
|
|
1796
|
+
/**
|
|
1797
|
+
* Create a MetafieldDefinition with PUBLIC_READ storefront access.
|
|
1798
|
+
* Idempotent: if definition already exists, returns the existing ID.
|
|
1799
|
+
*/
|
|
1800
|
+
createMetafieldDefinition(namespace: string, key: string, name: string): Observable<string>;
|
|
1801
|
+
/**
|
|
1802
|
+
* Delete a MetafieldDefinition by ID. Does not delete associated metafields.
|
|
1803
|
+
*/
|
|
1804
|
+
deleteMetafieldDefinition(definitionId: string): Observable<void>;
|
|
1805
|
+
/**
|
|
1806
|
+
* Look up a MetafieldDefinition ID by namespace and key.
|
|
1807
|
+
*/
|
|
1808
|
+
getMetafieldDefinitionId(namespace: string, key: string): Observable<string>;
|
|
2041
1809
|
validateSize(data: any): {
|
|
2042
1810
|
valid: boolean;
|
|
2043
1811
|
size: number;
|
|
@@ -2050,17 +1818,23 @@ declare class ShopifyMetafieldRepository {
|
|
|
2050
1818
|
|
|
2051
1819
|
declare class PageShopifyRepository {
|
|
2052
1820
|
private readonly metafieldRepo;
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
1821
|
+
getPages(): Observable<PageSummary[]>;
|
|
1822
|
+
getPage(id: string): Observable<Page>;
|
|
1823
|
+
getPublishedPageBySlug(slug: string): Observable<Page>;
|
|
1824
|
+
createPage(request: CreatePageRequest): Observable<Page>;
|
|
1825
|
+
updatePage(id: string, request: UpdatePageRequest): Observable<Page>;
|
|
1826
|
+
deletePage(id: string): Observable<void>;
|
|
1827
|
+
publishPage(id: string, request: PublishPageRequest): Observable<Page>;
|
|
1828
|
+
unpublishPage(id: string, request: PublishPageRequest): Observable<Page>;
|
|
1829
|
+
duplicatePage(id: string): Observable<Page>;
|
|
1830
|
+
/**
|
|
1831
|
+
* Backfill MetafieldDefinitions for existing pages that don't have one.
|
|
1832
|
+
* Creates definitions with PUBLIC_READ storefront access.
|
|
1833
|
+
*/
|
|
1834
|
+
ensureDefinitionsExist(): Observable<{
|
|
1835
|
+
created: number;
|
|
1836
|
+
skipped: number;
|
|
1837
|
+
}>;
|
|
2064
1838
|
private validateUniqueSlug;
|
|
2065
1839
|
private generateUniqueSlug;
|
|
2066
1840
|
private addPageToIndex;
|
|
@@ -2071,135 +1845,199 @@ declare class PageShopifyRepository {
|
|
|
2071
1845
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageShopifyRepository>;
|
|
2072
1846
|
}
|
|
2073
1847
|
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
invited_by: string;
|
|
2087
|
-
created_at: string;
|
|
2088
|
-
expires_at: string;
|
|
2089
|
-
is_expired: boolean;
|
|
2090
|
-
}
|
|
2091
|
-
interface CurrentUser {
|
|
2092
|
-
email: string;
|
|
2093
|
-
role: string;
|
|
2094
|
-
can_invite: boolean;
|
|
2095
|
-
can_remove_members: boolean;
|
|
2096
|
-
}
|
|
2097
|
-
interface TeamData {
|
|
2098
|
-
shop: {
|
|
2099
|
-
id: string;
|
|
2100
|
-
name: string;
|
|
2101
|
-
shopify_domain: string;
|
|
2102
|
-
allowed_domains: string[];
|
|
2103
|
-
};
|
|
2104
|
-
members: TeamMember[];
|
|
2105
|
-
invitations: PendingInvitation[];
|
|
2106
|
-
current_user: CurrentUser;
|
|
2107
|
-
summary: {
|
|
2108
|
-
total_members: number;
|
|
2109
|
-
pending_invitations: number;
|
|
2110
|
-
};
|
|
1848
|
+
/**
|
|
1849
|
+
* Read-only GraphQL client for the Shopify Storefront API.
|
|
1850
|
+
* Uses a Storefront Access Token (public, non-secret) instead of Admin API credentials.
|
|
1851
|
+
*/
|
|
1852
|
+
declare class StorefrontGraphQLClient {
|
|
1853
|
+
private readonly http;
|
|
1854
|
+
private readonly config;
|
|
1855
|
+
query<T>(query: string, variables?: Record<string, any>): Observable<T>;
|
|
1856
|
+
private handleResponse;
|
|
1857
|
+
private handleError;
|
|
1858
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StorefrontGraphQLClient, never>;
|
|
1859
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<StorefrontGraphQLClient>;
|
|
2111
1860
|
}
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
1861
|
+
|
|
1862
|
+
/**
|
|
1863
|
+
* Read-only metafield repository using the Shopify Storefront API.
|
|
1864
|
+
* Only works for metafields with MetafieldDefinitions that have `access.storefront: PUBLIC_READ`.
|
|
1865
|
+
*/
|
|
1866
|
+
declare class StorefrontMetafieldRepository {
|
|
1867
|
+
private readonly client;
|
|
1868
|
+
getMetafield(namespace: string, key: string): Observable<{
|
|
1869
|
+
value: string;
|
|
1870
|
+
type: string;
|
|
1871
|
+
} | null>;
|
|
1872
|
+
getPageIndex(): Observable<PagesIndex>;
|
|
1873
|
+
getPageMetafield(pageId: string): Observable<Page | null>;
|
|
1874
|
+
private getDefaultIndex;
|
|
1875
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StorefrontMetafieldRepository, never>;
|
|
1876
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<StorefrontMetafieldRepository>;
|
|
2128
1877
|
}
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
private
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
1878
|
+
|
|
1879
|
+
/**
|
|
1880
|
+
* Read-only page repository using the Shopify Storefront API.
|
|
1881
|
+
* Used by the public-storefront to read published pages without Admin API access.
|
|
1882
|
+
*/
|
|
1883
|
+
declare class PageStorefrontRepository {
|
|
1884
|
+
private readonly metafieldRepo;
|
|
1885
|
+
getPages(): Observable<PageSummary[]>;
|
|
1886
|
+
getPublishedPages(): Observable<PageSummary[]>;
|
|
1887
|
+
getPage(id: string): Observable<Page>;
|
|
1888
|
+
getPublishedPageBySlug(slug: string): Observable<Page>;
|
|
1889
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageStorefrontRepository, never>;
|
|
1890
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PageStorefrontRepository>;
|
|
1891
|
+
}
|
|
1892
|
+
|
|
1893
|
+
/**
|
|
1894
|
+
* A manifest describing all available components from a client's storefront.
|
|
1895
|
+
* Fetched at runtime by the editor via HTTP.
|
|
1896
|
+
*/
|
|
1897
|
+
interface ComponentManifest {
|
|
1898
|
+
version: string;
|
|
1899
|
+
components: ComponentManifestEntry[];
|
|
1900
|
+
}
|
|
1901
|
+
/**
|
|
1902
|
+
* A single component entry in the manifest — same shape as ComponentDefinition
|
|
1903
|
+
* but without the Angular `component` class reference.
|
|
1904
|
+
*/
|
|
1905
|
+
interface ComponentManifestEntry {
|
|
1906
|
+
type: string;
|
|
1907
|
+
name: string;
|
|
1908
|
+
description?: string;
|
|
1909
|
+
category: ComponentCategory;
|
|
1910
|
+
icon?: string;
|
|
1911
|
+
isSection?: boolean;
|
|
1912
|
+
isBlock?: boolean;
|
|
1913
|
+
blockScope?: 'section' | 'theme';
|
|
1914
|
+
sectionTypes?: string[];
|
|
1915
|
+
draggable?: boolean;
|
|
1916
|
+
deletable?: boolean;
|
|
1917
|
+
duplicable?: boolean;
|
|
1918
|
+
tags?: string[];
|
|
1919
|
+
order?: number;
|
|
1920
|
+
slots?: SlotDefinition[];
|
|
1921
|
+
props: PropSchemaMap;
|
|
1922
|
+
}
|
|
1923
|
+
|
|
1924
|
+
/**
|
|
1925
|
+
* Loads a component manifest from a remote storefront URL and registers
|
|
1926
|
+
* the entries in the ComponentRegistryService as "virtual" definitions
|
|
1927
|
+
* (no Angular component class — only metadata for palette and property panel).
|
|
1928
|
+
*/
|
|
1929
|
+
declare class ManifestLoaderService {
|
|
1930
|
+
private readonly http;
|
|
1931
|
+
private readonly registry;
|
|
2150
1932
|
/**
|
|
2151
|
-
*
|
|
1933
|
+
* Fetch the manifest from the given URL and register all components.
|
|
2152
1934
|
*/
|
|
2153
|
-
|
|
1935
|
+
loadManifest(url: string): Observable<ComponentManifest>;
|
|
2154
1936
|
/**
|
|
2155
|
-
*
|
|
1937
|
+
* Register manifest entries in the ComponentRegistryService.
|
|
1938
|
+
* Each entry becomes a ComponentDefinition without a `component` field.
|
|
2156
1939
|
*/
|
|
2157
|
-
|
|
1940
|
+
registerManifestComponents(manifest: ComponentManifest): void;
|
|
1941
|
+
private manifestEntryToDefinition;
|
|
1942
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ManifestLoaderService, never>;
|
|
1943
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ManifestLoaderService>;
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1946
|
+
/** Parent → Iframe */
|
|
1947
|
+
interface PageUpdateMessage {
|
|
1948
|
+
type: 'kustomizer:page-update';
|
|
1949
|
+
sections: EditorSection[];
|
|
1950
|
+
}
|
|
1951
|
+
interface SelectElementMessage {
|
|
1952
|
+
type: 'kustomizer:select-element';
|
|
1953
|
+
elementId: string;
|
|
1954
|
+
}
|
|
1955
|
+
interface DeselectMessage {
|
|
1956
|
+
type: 'kustomizer:deselect';
|
|
1957
|
+
}
|
|
1958
|
+
/** Iframe → Parent */
|
|
1959
|
+
interface ReadyMessage {
|
|
1960
|
+
type: 'kustomizer:ready';
|
|
1961
|
+
}
|
|
1962
|
+
interface ElementClickedMessage {
|
|
1963
|
+
type: 'kustomizer:element-clicked';
|
|
1964
|
+
elementId: string;
|
|
1965
|
+
sectionId: string;
|
|
1966
|
+
}
|
|
1967
|
+
interface ElementHoverMessage {
|
|
1968
|
+
type: 'kustomizer:element-hover';
|
|
1969
|
+
elementId: string | null;
|
|
1970
|
+
}
|
|
1971
|
+
interface ElementMovedMessage {
|
|
1972
|
+
type: 'kustomizer:element-moved';
|
|
1973
|
+
elementId: string;
|
|
1974
|
+
newIndex: number;
|
|
1975
|
+
targetSectionId?: string;
|
|
1976
|
+
}
|
|
1977
|
+
/**
|
|
1978
|
+
* Manages postMessage communication between the editor (parent) and the
|
|
1979
|
+
* storefront preview (iframe).
|
|
1980
|
+
*/
|
|
1981
|
+
declare class IframeBridgeService implements OnDestroy {
|
|
1982
|
+
private readonly zone;
|
|
1983
|
+
private iframe;
|
|
1984
|
+
private origin;
|
|
1985
|
+
private readonly messages$;
|
|
1986
|
+
private readonly messageHandler;
|
|
1987
|
+
constructor();
|
|
1988
|
+
ngOnDestroy(): void;
|
|
2158
1989
|
/**
|
|
2159
|
-
*
|
|
1990
|
+
* Connect to an iframe element. Must be called after the iframe loads.
|
|
2160
1991
|
*/
|
|
2161
|
-
|
|
1992
|
+
connect(iframe: HTMLIFrameElement, origin: string): void;
|
|
2162
1993
|
/**
|
|
2163
|
-
*
|
|
1994
|
+
* Disconnect from the current iframe.
|
|
2164
1995
|
*/
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
1996
|
+
disconnect(): void;
|
|
1997
|
+
sendPageUpdate(sections: EditorSection[]): void;
|
|
1998
|
+
sendSelectElement(elementId: string): void;
|
|
1999
|
+
sendDeselect(): void;
|
|
2000
|
+
onReady(): Observable<void>;
|
|
2001
|
+
onElementClicked(): Observable<{
|
|
2002
|
+
elementId: string;
|
|
2003
|
+
sectionId: string;
|
|
2004
|
+
}>;
|
|
2005
|
+
onElementHover(): Observable<string | null>;
|
|
2006
|
+
onElementMoved(): Observable<{
|
|
2007
|
+
elementId: string;
|
|
2008
|
+
newIndex: number;
|
|
2009
|
+
targetSectionId?: string;
|
|
2010
|
+
}>;
|
|
2011
|
+
private send;
|
|
2012
|
+
private handleMessage;
|
|
2013
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<IframeBridgeService, never>;
|
|
2014
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<IframeBridgeService>;
|
|
2168
2015
|
}
|
|
2169
2016
|
|
|
2170
|
-
declare const authGuard: CanActivateFn;
|
|
2171
|
-
declare const noAuthGuard: CanActivateFn;
|
|
2172
|
-
|
|
2173
|
-
declare const licenseGuard: CanActivateFn;
|
|
2174
|
-
declare const noLicenseGuard: CanActivateFn;
|
|
2175
|
-
|
|
2176
2017
|
/**
|
|
2177
|
-
*
|
|
2178
|
-
* 1. Usuario autenticado
|
|
2179
|
-
* 2. Usuario tiene acceso a la shop del dominio actual
|
|
2180
|
-
* 3. Licencia activa
|
|
2018
|
+
* Service that holds and dynamically loads the per-merchant storefront URL.
|
|
2181
2019
|
*
|
|
2182
|
-
*
|
|
2183
|
-
*
|
|
2184
|
-
*
|
|
2185
|
-
*
|
|
2186
|
-
*/
|
|
2187
|
-
declare const shopAuthGuard: CanActivateFn;
|
|
2188
|
-
/**
|
|
2189
|
-
* Guard que solo permite acceso si el usuario NO tiene acceso a una shop.
|
|
2190
|
-
* Útil para páginas como /login que no deberían ser accesibles si ya tienes acceso.
|
|
2191
|
-
*/
|
|
2192
|
-
declare const noShopAuthGuard: CanActivateFn;
|
|
2193
|
-
/**
|
|
2194
|
-
* Guard que verifica que el usuario tenga rol de admin o owner.
|
|
2195
|
-
* Requiere que shopAuthGuard se haya ejecutado primero.
|
|
2020
|
+
* Resolution order:
|
|
2021
|
+
* 1. Metafield value loaded from GET /api/storefront-url (per-shop)
|
|
2022
|
+
* 2. Static STOREFRONT_URL injection token (env var / window global fallback)
|
|
2023
|
+
* 3. Empty string (editor works with local components only)
|
|
2196
2024
|
*/
|
|
2197
|
-
declare
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2025
|
+
declare class StorefrontUrlService {
|
|
2026
|
+
private readonly http;
|
|
2027
|
+
private readonly staticUrl;
|
|
2028
|
+
/** Current storefront URL — reactive signal used by the editor and iframe. */
|
|
2029
|
+
readonly url: _angular_core.WritableSignal<string>;
|
|
2030
|
+
/**
|
|
2031
|
+
* Load the storefront URL from the backend metafield.
|
|
2032
|
+
* Falls back to the static STOREFRONT_URL token if the endpoint
|
|
2033
|
+
* returns no value or fails.
|
|
2034
|
+
*
|
|
2035
|
+
* Called during APP_INITIALIZER.
|
|
2036
|
+
*/
|
|
2037
|
+
load(): Promise<void>;
|
|
2038
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<StorefrontUrlService, never>;
|
|
2039
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<StorefrontUrlService>;
|
|
2040
|
+
}
|
|
2203
2041
|
|
|
2204
2042
|
declare class DragDropService {
|
|
2205
2043
|
private readonly store;
|
|
@@ -2231,5 +2069,5 @@ declare class VisualEditor {
|
|
|
2231
2069
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<VisualEditor, "lib-visual-editor", never, {}, {}, never, never, true, never>;
|
|
2232
2070
|
}
|
|
2233
2071
|
|
|
2234
|
-
export {
|
|
2235
|
-
export type {
|
|
2072
|
+
export { BlockTreeItemComponent, CREATE_METAFIELD_DEFINITION_MUTATION, ComponentRegistryService, DEFAULT_ROUTER_NAVIGATION_CONFIG, DEFAULT_VISUAL_EDITOR_CONFIG, DELETE_METAFIELDS_MUTATION, DELETE_METAFIELD_DEFINITION_MUTATION, DefaultRouterNavigationService, DragDropService, DynamicRendererComponent, EDITOR_COMPONENT_DEFINITIONS, FILES_QUERY, GET_METAFIELD_DEFINITION_QUERY, GET_SHOP_ID_QUERY, GET_SHOP_METAFIELD_QUERY, INDEX_KEY, IframeBridgeService, InputPageLoadingStrategy, MAX_METAFIELD_SIZE, ManifestLoaderService, NAMESPACE, PageLoadingStrategy, PageManagerComponent, PageService, PageShopifyRepository, PageStorefrontRepository, ROUTER_NAVIGATION_CONFIG, RoutePageLoadingStrategy, SET_METAFIELD_MUTATION, SHOPIFY_CONFIG, STOREFRONT_CONFIG, STOREFRONT_URL, ShopifyFilePickerComponent, ShopifyFilesService, ShopifyGraphQLClient, ShopifyMetafieldRepository, SlotRendererComponent, StorefrontGraphQLClient, StorefrontMetafieldRepository, StorefrontUrlService, USE_IN_MEMORY_PAGES, VISUAL_EDITOR_CONFIG, VISUAL_EDITOR_FEATURE_KEY, VisualEditor, VisualEditorActions, VisualEditorComponent, VisualEditorFacade, VisualEditorNavigation, initialVisualEditorState, provideEditorComponents, provideVisualEditor, provideVisualEditorStore, selectBlocksForSection, selectBlocksForSlot, selectCanRedo, selectCanUndo, selectCurrentPage, selectCurrentPageId, selectCurrentPageSlug, selectCurrentPageStatus, selectCurrentPageTitle, selectCurrentPageVersion, selectDraggedElementId, selectElementById, selectHistory, selectHistoryIndex, selectHistoryLength, selectIsDirty, selectIsDragging, selectIsPageLoaded, selectLastAction, selectSectionById, selectSections, selectSelectedBlock, selectSelectedBlockSlotName, selectSelectedElement, selectSelectedElementId, selectSelectedElementType, selectSelectedSection, selectSelectedSectionId, selectSelectedSectionType, selectVisualEditorState, visualEditorReducer };
|
|
2073
|
+
export type { BlockPickerTarget, BlockTreeContext, ComponentCategory, ComponentDefinition, ComponentManifest, ComponentManifestEntry, ComponentPreset, ConfirmDialogOptions, CreatePageRequest, DeselectMessage, DragItem, DragItemKind, DropTarget, DropZone, EditorElement, EditorSection, ElementClickedMessage, ElementHoverMessage, ElementMovedMessage, HistoryEntry, Metafield, Page, PageContext, PageIndexEntry, PageStatus, PageSummary, PageUpdateMessage, PagesIndex, PresetBlockConfig, PropCondition, PropSchema, PropSchemaMap, PropType, PropValidation, PublishPageRequest, ReadyMessage, ResolvedPreset, RouterNavigationConfig, SelectElementMessage, SelectOption, ShopifyConfig, ShopifyFile, ShopifyFilesPage, SlotConstraints, SlotDefinition, StorefrontConfig, UpdatePageRequest, VisualEditorConfig, VisualEditorNavigationTarget, VisualEditorState };
|