@vibesdotdev/integrations-penpot 0.0.0-stage → 1.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +126 -0
- package/README.md +46 -2
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/penpot-api.d.ts +70 -0
- package/dist/client/penpot-api.d.ts.map +1 -0
- package/dist/client/penpot-api.js +241 -0
- package/dist/client/penpot-api.js.map +1 -0
- package/dist/client/penpot-client.d.ts +50 -0
- package/dist/client/penpot-client.d.ts.map +1 -0
- package/dist/client/penpot-client.descriptor.d.ts +4 -0
- package/dist/client/penpot-client.descriptor.d.ts.map +1 -0
- package/dist/client/penpot-client.descriptor.js +6 -0
- package/dist/client/penpot-client.descriptor.js.map +1 -0
- package/dist/client/penpot-client.js +52 -0
- package/dist/client/penpot-client.js.map +1 -0
- package/dist/config/penpot.config.descriptor.d.ts +50 -0
- package/dist/config/penpot.config.descriptor.d.ts.map +1 -0
- package/dist/config/penpot.config.descriptor.js +56 -0
- package/dist/config/penpot.config.descriptor.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +18 -0
- package/dist/plugin.js.map +1 -0
- package/dist/schemas/board.d.ts +37 -0
- package/dist/schemas/board.d.ts.map +1 -0
- package/dist/schemas/board.js +20 -0
- package/dist/schemas/board.js.map +1 -0
- package/dist/schemas/catalog.d.ts +129 -0
- package/dist/schemas/catalog.d.ts.map +1 -0
- package/dist/schemas/catalog.js +82 -0
- package/dist/schemas/catalog.js.map +1 -0
- package/dist/schemas/sync.d.ts +212 -0
- package/dist/schemas/sync.d.ts.map +1 -0
- package/dist/schemas/sync.js +23 -0
- package/dist/schemas/sync.js.map +1 -0
- package/dist/schemas/transport.d.ts +169 -0
- package/dist/schemas/transport.d.ts.map +1 -0
- package/dist/schemas/transport.js +93 -0
- package/dist/schemas/transport.js.map +1 -0
- package/dist/sync/penpot.sync-endpoint.descriptor.d.ts +14 -0
- package/dist/sync/penpot.sync-endpoint.descriptor.d.ts.map +1 -0
- package/dist/sync/penpot.sync-endpoint.descriptor.js +10 -0
- package/dist/sync/penpot.sync-endpoint.descriptor.js.map +1 -0
- package/dist/sync/penpot.sync-endpoint.impl.d.ts +31 -0
- package/dist/sync/penpot.sync-endpoint.impl.d.ts.map +1 -0
- package/dist/sync/penpot.sync-endpoint.impl.js +98 -0
- package/dist/sync/penpot.sync-endpoint.impl.js.map +1 -0
- package/dist/tokens/apply-penpot-catalog.d.ts +7 -0
- package/dist/tokens/apply-penpot-catalog.d.ts.map +1 -0
- package/dist/tokens/apply-penpot-catalog.js +40 -0
- package/dist/tokens/apply-penpot-catalog.js.map +1 -0
- package/dist/tokens/plugin.d.ts +4 -0
- package/dist/tokens/plugin.d.ts.map +1 -0
- package/dist/tokens/plugin.js +13 -0
- package/dist/tokens/plugin.js.map +1 -0
- package/package.json +73 -4
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
2
|
+
import { BoardFileSchema, BoardUpdateInputSchema, GetFileInputSchema, RenameFileInputSchema, RenamedFileSchema } from "../schemas/board.js";
|
|
3
|
+
import { parseBoundary } from "../schemas/transport.js";
|
|
4
|
+
import { PenpotApiClient } from "./penpot-api.js";
|
|
5
|
+
import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
|
|
6
|
+
import { RpcPenpotTokensClient } from "./penpot-api.js";
|
|
7
|
+
/** Runtime-owned Penpot transport and credential/configuration context. */
|
|
8
|
+
export class PenpotClient extends BaseRuntimeClient {
|
|
9
|
+
async getFile(input) {
|
|
10
|
+
const value = parseBoundary(GetFileInputSchema, input);
|
|
11
|
+
await this.ensureLoaded();
|
|
12
|
+
const api = new PenpotApiClient({ runtime: this.runtime, baseUrl: this.descriptor.baseUrl });
|
|
13
|
+
const file = parseBoundary(BoardFileSchema, await api.rpc('get-file', value), 'penpot-response-invalid');
|
|
14
|
+
if (file.id !== value.id) {
|
|
15
|
+
throw new CapabilityError('Penpot returned a different file.', 'CONFLICT', {
|
|
16
|
+
reason: 'penpot-destination-mismatch'
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return file;
|
|
20
|
+
}
|
|
21
|
+
async updateFile(input) {
|
|
22
|
+
const value = parseBoundary(BoardUpdateInputSchema, input);
|
|
23
|
+
const file = await this.getFile({ id: value.id });
|
|
24
|
+
const api = new PenpotApiClient({ runtime: this.runtime, baseUrl: this.descriptor.baseUrl });
|
|
25
|
+
return api.updateFile({
|
|
26
|
+
fileId: file.id, revn: file.revn, vern: file.vern,
|
|
27
|
+
features: file.features, changes: value.changes
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async renameFile(input) {
|
|
31
|
+
const value = parseBoundary(RenameFileInputSchema, input);
|
|
32
|
+
await this.ensureLoaded();
|
|
33
|
+
const api = new PenpotApiClient({ runtime: this.runtime, baseUrl: this.descriptor.baseUrl });
|
|
34
|
+
const file = parseBoundary(RenamedFileSchema, await api.rpc('rename-file', value), 'penpot-response-invalid');
|
|
35
|
+
if (file.id !== value.id || file.name !== value.name) {
|
|
36
|
+
throw new CapabilityError('Penpot acknowledged a different file or name.', 'CONFLICT', {
|
|
37
|
+
reason: 'penpot-destination-mismatch'
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return file;
|
|
41
|
+
}
|
|
42
|
+
async pullTokens(input) {
|
|
43
|
+
await this.ensureLoaded();
|
|
44
|
+
return new RpcPenpotTokensClient({ runtime: this.runtime, baseUrl: this.descriptor.baseUrl }).pullTokens(input);
|
|
45
|
+
}
|
|
46
|
+
async pushTokens(input) {
|
|
47
|
+
await this.ensureLoaded();
|
|
48
|
+
return new RpcPenpotTokensClient({ runtime: this.runtime, baseUrl: this.descriptor.baseUrl }).pushTokens(input);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export default PenpotClient;
|
|
52
|
+
//# sourceMappingURL=penpot-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"penpot-client.js","sourceRoot":"","sources":["../../src/client/penpot-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Penpot settings — the `integrations.penpot` config manifest.
|
|
3
|
+
*/
|
|
4
|
+
import type { PenpotSettings } from '../schemas/transport.ts';
|
|
5
|
+
export { PenpotSettingsSchema } from '../schemas/transport.ts';
|
|
6
|
+
export type { PenpotSettings } from '../schemas/transport.ts';
|
|
7
|
+
import { type RuntimeRef } from '@vibesdotdev/kernel';
|
|
8
|
+
export declare const PENPOT_DEFAULT_BASE_URL = "https://design.vibes.dev";
|
|
9
|
+
export declare const PENPOT_SETTINGS_MANIFEST_ID = "integrations.penpot";
|
|
10
|
+
export type PenpotSettingsRuntime = RuntimeRef;
|
|
11
|
+
export declare function loadPenpotSettings(runtime?: PenpotSettingsRuntime): Promise<PenpotSettings>;
|
|
12
|
+
export declare function resolvePenpotBaseUrl(runtime?: PenpotSettingsRuntime, declared?: string): Promise<string>;
|
|
13
|
+
export declare const penpotSettingsDescriptor: {
|
|
14
|
+
kind: "config/manifest";
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
namespace: string;
|
|
18
|
+
description: string;
|
|
19
|
+
tier: string;
|
|
20
|
+
category: string;
|
|
21
|
+
schema: import("zod/v4").ZodObject<{
|
|
22
|
+
baseUrl: import("zod/v4").ZodDefault<import("zod/v4").ZodURL>;
|
|
23
|
+
tokensPath: import("zod/v4").ZodDefault<import("zod/v4").ZodString>;
|
|
24
|
+
}, import("zod/v4/core").$strip>;
|
|
25
|
+
fields: {
|
|
26
|
+
baseUrl: {
|
|
27
|
+
ui: {
|
|
28
|
+
label: string;
|
|
29
|
+
component: string;
|
|
30
|
+
group: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
groups: {
|
|
35
|
+
id: string;
|
|
36
|
+
label: string;
|
|
37
|
+
}[];
|
|
38
|
+
allowedAdapters: string[];
|
|
39
|
+
defaultAdapter: string;
|
|
40
|
+
scope: string;
|
|
41
|
+
customTables: boolean;
|
|
42
|
+
version: number;
|
|
43
|
+
internal: boolean;
|
|
44
|
+
context: {
|
|
45
|
+
surfaces: string[];
|
|
46
|
+
};
|
|
47
|
+
enabled: true;
|
|
48
|
+
};
|
|
49
|
+
export default penpotSettingsDescriptor;
|
|
50
|
+
//# sourceMappingURL=penpot.config.descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"penpot.config.descriptor.d.ts","sourceRoot":"","sources":["../../src/config/penpot.config.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE3F,eAAO,MAAM,uBAAuB,6BAA6B,CAAC;AAQlE,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AAEjE,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAE/C,wBAAsB,kBAAkB,CACvC,OAAO,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,CAAC,EAAE,qBAAqB,EAC/B,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBnC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Penpot settings — the `integrations.penpot` config manifest.
|
|
3
|
+
*/
|
|
4
|
+
import { PenpotSettingsSchema, parseBoundary } from "../schemas/transport.js";
|
|
5
|
+
export { PenpotSettingsSchema } from "../schemas/transport.js";
|
|
6
|
+
import { ConfigManifest } from '@vibesdotdev/config';
|
|
7
|
+
import { CapabilityError, createRuntimeAsset } from '@vibesdotdev/kernel';
|
|
8
|
+
export const PENPOT_DEFAULT_BASE_URL = 'https://design.vibes.dev';
|
|
9
|
+
const settingsWithDefaults = PenpotSettingsSchema.extend({
|
|
10
|
+
baseUrl: PenpotSettingsSchema.shape.baseUrl.default(PENPOT_DEFAULT_BASE_URL),
|
|
11
|
+
tokensPath: PenpotSettingsSchema.shape.tokensPath.default('/api/rpc/command/get-file')
|
|
12
|
+
});
|
|
13
|
+
export const PENPOT_SETTINGS_MANIFEST_ID = 'integrations.penpot';
|
|
14
|
+
export async function loadPenpotSettings(runtime) {
|
|
15
|
+
if (runtime?.hasKind('config/manifest')) {
|
|
16
|
+
try {
|
|
17
|
+
return await ConfigManifest.forRuntime(runtime, PENPOT_SETTINGS_MANIFEST_ID).load();
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error instanceof CapabilityError && error.reason === 'config-manifest-unregistered') {
|
|
21
|
+
return settingsWithDefaults.parse({});
|
|
22
|
+
}
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return settingsWithDefaults.parse({});
|
|
27
|
+
}
|
|
28
|
+
export async function resolvePenpotBaseUrl(runtime, declared) {
|
|
29
|
+
if (declared)
|
|
30
|
+
return parseBoundary(settingsWithDefaults, { baseUrl: declared }, 'penpot-config-invalid').baseUrl.replace(/\/+$/, '');
|
|
31
|
+
return (await loadPenpotSettings(runtime)).baseUrl.replace(/\/+$/, '');
|
|
32
|
+
}
|
|
33
|
+
export const penpotSettingsDescriptor = createRuntimeAsset({
|
|
34
|
+
kind: 'config/manifest',
|
|
35
|
+
id: PENPOT_SETTINGS_MANIFEST_ID,
|
|
36
|
+
name: 'Penpot',
|
|
37
|
+
namespace: 'integrations',
|
|
38
|
+
description: 'Penpot design origin',
|
|
39
|
+
tier: 'user',
|
|
40
|
+
category: 'integrations',
|
|
41
|
+
schema: settingsWithDefaults,
|
|
42
|
+
fields: {
|
|
43
|
+
baseUrl: { ui: { label: 'Penpot origin', component: 'text', group: 'penpot' } }
|
|
44
|
+
},
|
|
45
|
+
groups: [{ id: 'penpot', label: 'Penpot' }],
|
|
46
|
+
allowedAdapters: ['storage.localdb', 'storage.json'],
|
|
47
|
+
defaultAdapter: 'storage.localdb',
|
|
48
|
+
scope: 'auto',
|
|
49
|
+
customTables: false,
|
|
50
|
+
version: 1,
|
|
51
|
+
internal: false,
|
|
52
|
+
context: { surfaces: ['cli', 'tui'] },
|
|
53
|
+
enabled: true
|
|
54
|
+
});
|
|
55
|
+
export default penpotSettingsDescriptor;
|
|
56
|
+
//# sourceMappingURL=penpot.config.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"penpot.config.descriptor.js","sourceRoot":"","sources":["../../src/config/penpot.config.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAmB,MAAM,qBAAqB,CAAC;AAE3F,MAAM,CAAC,MAAM,uBAAuB,GAAG,0BAA0B,CAAC;AAClE,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,MAAM,CAAC;IACxD,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;IAC5E,UAAU,EAAE,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,2BAA2B,CAAC;CACtF,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,2BAA2B,GAAG,qBAAqB,CAAC;AAIjE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,OAA+B;IAE/B,IAAI,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC;YACJ,OAAO,MAAM,cAAc,CAAC,UAAU,CACrC,OAAO,EACP,2BAA2B,CAC3B,CAAC,IAAI,EAAE,CAAC;QACV,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,CAAC,MAAM,KAAK,8BAA8B,EAAE,CAAC;gBACzF,OAAO,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IACD,OAAO,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,OAA+B,EAC/B,QAAiB;IAEjB,IAAI,QAAQ;QAAE,OAAO,aAAa,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,uBAAuB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrI,OAAO,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;IAC1D,IAAI,EAAE,iBAAiB;IACvB,EAAE,EAAE,2BAA2B;IAC/B,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,cAAc;IACzB,WAAW,EAAE,sBAAsB;IACnC,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,oBAAoB;IAC5B,MAAM,EAAE;QACP,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;KAC/E;IACD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3C,eAAe,EAAE,CAAC,iBAAiB,EAAE,cAAc,CAAC;IACpD,cAAc,EAAE,iBAAiB;IACjC,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;IACrC,OAAO,EAAE,IAAI;CACb,CAAC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default, integrationsPenpotPlugin } from './plugin.ts';
|
|
2
|
+
export { HttpPenpotTokensClient, MemoryPenpotTokensStore, PenpotApiClient, RpcPenpotTokensClient, PENPOT_TOKENS_PLUGIN_KEY, PENPOT_TOKENS_PLUGIN_NAMESPACE, type HttpPenpotTokensClientConfig, type PenpotApiClientConfig, type PenpotFileRef, type PenpotTokenCatalog, type PenpotTokensPullInput, type PenpotTokensPushInput, type PenpotTokensTransport } from './client/index.ts';
|
|
3
|
+
export { default as penpotDesignTokensSyncEndpoint } from './sync/penpot.sync-endpoint.descriptor.ts';
|
|
4
|
+
export { PenpotClient } from './client/penpot-client.ts';
|
|
5
|
+
export type { ResolvePenpotTokensTransport } from './schemas/transport.ts';
|
|
6
|
+
export { DEFAULT_ACTIVE_THEME_GROUP, DEFAULT_ACTIVE_THEME_NAME, applyPenpotCatalog, type ApplyPenpotCatalogResult, type PenpotApplyTokenType, type PenpotCatalogTheme, type PenpotCatalogTokenSet, type PenpotTokenCatalogHost, type TokensStudioMetadata, type TokensStudioTheme } from './tokens/apply-penpot-catalog.ts';
|
|
7
|
+
export { applyHousePluginCatalog } from './tokens/plugin.ts';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EACN,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,8BAA8B,EAC9B,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EACN,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { default, integrationsPenpotPlugin } from "./plugin.js";
|
|
2
|
+
export { HttpPenpotTokensClient, MemoryPenpotTokensStore, PenpotApiClient, RpcPenpotTokensClient, PENPOT_TOKENS_PLUGIN_KEY, PENPOT_TOKENS_PLUGIN_NAMESPACE } from "./client/index.js";
|
|
3
|
+
export { default as penpotDesignTokensSyncEndpoint } from "./sync/penpot.sync-endpoint.descriptor.js";
|
|
4
|
+
export { PenpotClient } from "./client/penpot-client.js";
|
|
5
|
+
export { DEFAULT_ACTIVE_THEME_GROUP, DEFAULT_ACTIVE_THEME_NAME, applyPenpotCatalog } from "./tokens/apply-penpot-catalog.js";
|
|
6
|
+
export { applyHousePluginCatalog } from "./tokens/plugin.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EACN,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,8BAA8B,EAQ9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EACN,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAQlB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAKA,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,6CAcnC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createRuntimePlugin, loader } from '@vibesdotdev/kernel/factory';
|
|
2
|
+
import penpotClientDescriptor from "./client/penpot-client.descriptor.js";
|
|
3
|
+
import penpotSettingsDescriptor from "./config/penpot.config.descriptor.js";
|
|
4
|
+
import penpotSyncEndpoint from "./sync/penpot.sync-endpoint.descriptor.js";
|
|
5
|
+
/** Host plugin: Penpot design-tokens sync endpoint for house Penpot. */
|
|
6
|
+
export const integrationsPenpotPlugin = createRuntimePlugin({
|
|
7
|
+
id: 'integrations-penpot',
|
|
8
|
+
name: 'Integrations Penpot Plugin',
|
|
9
|
+
description: 'Penpot design-tokens sync endpoint for design.vibes.dev',
|
|
10
|
+
dependencies: ['sync', 'runtime-client', 'config'],
|
|
11
|
+
descriptors: [penpotSettingsDescriptor, penpotSyncEndpoint, penpotClientDescriptor],
|
|
12
|
+
loaders: [
|
|
13
|
+
loader(penpotClientDescriptor.id, { kind: 'runtime/client' }, () => import("./client/penpot-client.js")),
|
|
14
|
+
loader(penpotSyncEndpoint.id, { kind: 'sync/endpoint' }, () => import("./sync/penpot.sync-endpoint.impl.js"))
|
|
15
|
+
]
|
|
16
|
+
});
|
|
17
|
+
export default integrationsPenpotPlugin;
|
|
18
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,sBAAsB,MAAM,sCAAsC,CAAC;AAC1E,OAAO,wBAAwB,MAAM,sCAAsC,CAAC;AAC5E,OAAO,kBAAkB,MAAM,2CAA2C,CAAC;AAE3E,wEAAwE;AACxE,MAAM,CAAC,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;IAC3D,EAAE,EAAE,qBAAqB;IACzB,IAAI,EAAE,4BAA4B;IAClC,WAAW,EAAE,yDAAyD;IACtE,YAAY,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,CAAC;IAClD,WAAW,EAAE,CAAC,wBAAwB,EAAE,kBAAkB,EAAE,sBAAsB,CAAC;IACnF,OAAO,EAAE;QACR,MAAM,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACxG,MAAM,CACL,kBAAkB,CAAC,EAAE,EACrB,EAAE,IAAI,EAAE,eAAe,EAAE,EACzB,GAAG,EAAE,CAAC,MAAM,CAAC,qCAAqC,CAAC,CACnD;KACD;CACD,CAAC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
export declare const GetFileInputSchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
export declare const BoardFileSchema: z.ZodObject<{
|
|
6
|
+
id: z.ZodString;
|
|
7
|
+
name: z.ZodOptional<z.ZodString>;
|
|
8
|
+
revn: z.ZodNumber;
|
|
9
|
+
vern: z.ZodNumber;
|
|
10
|
+
features: z.ZodArray<z.ZodString>;
|
|
11
|
+
data: z.ZodObject<{
|
|
12
|
+
pages: z.ZodArray<z.ZodString>;
|
|
13
|
+
pagesIndex: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>>;
|
|
14
|
+
}, z.core.$catchall<z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>>;
|
|
15
|
+
}, z.core.$catchall<z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>>;
|
|
16
|
+
export declare const BoardUpdateInputSchema: z.ZodObject<{
|
|
17
|
+
id: z.ZodString;
|
|
18
|
+
changes: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>>;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export declare const RenameFileInputSchema: z.ZodObject<{
|
|
21
|
+
id: z.ZodString;
|
|
22
|
+
name: z.ZodString;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export declare const RenamedFileSchema: z.ZodObject<{
|
|
25
|
+
id: z.ZodString;
|
|
26
|
+
revn: z.ZodOptional<z.ZodNumber>;
|
|
27
|
+
vern: z.ZodOptional<z.ZodNumber>;
|
|
28
|
+
features: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
29
|
+
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>>;
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
}, z.core.$catchall<z.ZodType<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue, z.core.$ZodTypeInternals<import("@vibesdotdev/kernel/bootstrap").JsonValue, import("@vibesdotdev/kernel/bootstrap").JsonValue>>>>;
|
|
32
|
+
export type GetFileInput = z.infer<typeof GetFileInputSchema>;
|
|
33
|
+
export type BoardFile = z.infer<typeof BoardFileSchema>;
|
|
34
|
+
export type BoardUpdateInput = z.infer<typeof BoardUpdateInputSchema>;
|
|
35
|
+
export type RenameFileInput = z.infer<typeof RenameFileInputSchema>;
|
|
36
|
+
export type RenamedFile = z.infer<typeof RenamedFileSchema>;
|
|
37
|
+
//# sourceMappingURL=board.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../src/schemas/board.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,eAAO,MAAM,kBAAkB;;iBAA6C,CAAC;AAC7E,eAAO,MAAM,eAAe;;;;;;;;;;qQAQ1B,CAAC;AACH,eAAO,MAAM,sBAAsB;;;iBAEjC,CAAC;AACH,eAAO,MAAM,qBAAqB;;;iBAEhC,CAAC;AACH,eAAO,MAAM,iBAAiB;;;;;;;qQAAuD,CAAC;AAEtF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { JsonObjectSchema, JsonSchema, PenpotFileSchema } from "./transport.js";
|
|
3
|
+
export const GetFileInputSchema = z.object({ id: z.string().trim().min(1) });
|
|
4
|
+
export const BoardFileSchema = PenpotFileSchema.extend({
|
|
5
|
+
revn: z.number().int().nonnegative(),
|
|
6
|
+
vern: z.number().int().nonnegative(),
|
|
7
|
+
features: z.array(z.string()),
|
|
8
|
+
data: z.object({
|
|
9
|
+
pages: z.array(z.string().min(1)),
|
|
10
|
+
pagesIndex: z.record(z.string(), JsonObjectSchema)
|
|
11
|
+
}).catchall(JsonSchema)
|
|
12
|
+
});
|
|
13
|
+
export const BoardUpdateInputSchema = GetFileInputSchema.extend({
|
|
14
|
+
changes: z.array(JsonObjectSchema)
|
|
15
|
+
});
|
|
16
|
+
export const RenameFileInputSchema = GetFileInputSchema.extend({
|
|
17
|
+
name: z.string().trim().min(1)
|
|
18
|
+
});
|
|
19
|
+
export const RenamedFileSchema = PenpotFileSchema.extend({ name: z.string().min(1) });
|
|
20
|
+
//# sourceMappingURL=board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/schemas/board.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACtD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACpC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC;KAClD,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;CACvB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CAClC,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAC9D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC9B,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
export declare const TokenSchema: z.ZodObject<{
|
|
3
|
+
type: z.ZodEnum<{
|
|
4
|
+
color: "color";
|
|
5
|
+
borderRadius: "borderRadius";
|
|
6
|
+
}>;
|
|
7
|
+
name: z.ZodString;
|
|
8
|
+
value: z.ZodString;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type PenpotApplyTokenType = z.infer<typeof TokenSchema>['type'];
|
|
11
|
+
export declare const ThemeRefSchema: z.ZodObject<{
|
|
12
|
+
group: z.ZodOptional<z.ZodString>;
|
|
13
|
+
name: z.ZodString;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export declare const TokensStudioThemeSchema: z.ZodObject<{
|
|
16
|
+
group: z.ZodOptional<z.ZodString>;
|
|
17
|
+
name: z.ZodString;
|
|
18
|
+
selectedTokenSets: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
19
|
+
enabled: "enabled";
|
|
20
|
+
source: "source";
|
|
21
|
+
disabled: "disabled";
|
|
22
|
+
}>>>;
|
|
23
|
+
id: z.ZodOptional<z.ZodString>;
|
|
24
|
+
$figmaStyleReferences: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
25
|
+
}, z.core.$strict>;
|
|
26
|
+
export type TokensStudioTheme = z.infer<typeof TokensStudioThemeSchema>;
|
|
27
|
+
export declare const TokensStudioMetadataSchema: z.ZodObject<{
|
|
28
|
+
tokenSetOrder: z.ZodArray<z.ZodString>;
|
|
29
|
+
activeThemes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
|
+
}, z.core.$strict>;
|
|
31
|
+
export type TokensStudioMetadata = z.infer<typeof TokensStudioMetadataSchema>;
|
|
32
|
+
declare const TokenLeafSchema: z.ZodObject<{
|
|
33
|
+
$type: z.ZodEnum<{
|
|
34
|
+
color: "color";
|
|
35
|
+
borderRadius: "borderRadius";
|
|
36
|
+
}>;
|
|
37
|
+
$value: z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>, z.ZodTransform<string, string | number>>;
|
|
38
|
+
$description: z.ZodOptional<z.ZodNever>;
|
|
39
|
+
}, z.core.$strict>;
|
|
40
|
+
type TokenTree = {
|
|
41
|
+
[key: string]: z.output<typeof TokenLeafSchema> | TokenTree;
|
|
42
|
+
};
|
|
43
|
+
export declare const ApplyResultSchema: z.ZodObject<{
|
|
44
|
+
setCount: z.ZodNumber;
|
|
45
|
+
themeCount: z.ZodNumber;
|
|
46
|
+
tokenCount: z.ZodNumber;
|
|
47
|
+
activeThemes: z.ZodArray<z.ZodObject<{
|
|
48
|
+
group: z.ZodOptional<z.ZodString>;
|
|
49
|
+
name: z.ZodString;
|
|
50
|
+
}, z.core.$strip>>;
|
|
51
|
+
}, z.core.$strip>;
|
|
52
|
+
export type ApplyPenpotCatalogResult = z.infer<typeof ApplyResultSchema>;
|
|
53
|
+
export interface PenpotCatalogTokenSet {
|
|
54
|
+
name: string;
|
|
55
|
+
addToken(input: z.infer<typeof TokenSchema>): void;
|
|
56
|
+
remove(): void;
|
|
57
|
+
}
|
|
58
|
+
export interface PenpotCatalogTheme {
|
|
59
|
+
name: string;
|
|
60
|
+
group?: string;
|
|
61
|
+
addSet(setName: string): void;
|
|
62
|
+
remove(): void;
|
|
63
|
+
}
|
|
64
|
+
export interface PenpotTokenCatalogHost {
|
|
65
|
+
readonly sets: Iterable<PenpotCatalogTokenSet>;
|
|
66
|
+
readonly themes: Iterable<PenpotCatalogTheme>;
|
|
67
|
+
addSet(input: {
|
|
68
|
+
name: string;
|
|
69
|
+
active: boolean;
|
|
70
|
+
}): PenpotCatalogTokenSet;
|
|
71
|
+
addTheme(input: z.infer<typeof ThemeRefSchema>): PenpotCatalogTheme;
|
|
72
|
+
activateTheme(input: z.infer<typeof ThemeRefSchema>): void;
|
|
73
|
+
}
|
|
74
|
+
export declare const CatalogApplicationSchema: z.ZodPipe<z.ZodObject<{
|
|
75
|
+
$themes: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
76
|
+
group: z.ZodOptional<z.ZodString>;
|
|
77
|
+
name: z.ZodString;
|
|
78
|
+
selectedTokenSets: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
79
|
+
enabled: "enabled";
|
|
80
|
+
source: "source";
|
|
81
|
+
disabled: "disabled";
|
|
82
|
+
}>>>;
|
|
83
|
+
id: z.ZodOptional<z.ZodString>;
|
|
84
|
+
$figmaStyleReferences: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
85
|
+
}, z.core.$strict>>>;
|
|
86
|
+
$metadata: z.ZodObject<{
|
|
87
|
+
tokenSetOrder: z.ZodArray<z.ZodString>;
|
|
88
|
+
activeThemes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
89
|
+
}, z.core.$strict>;
|
|
90
|
+
}, z.core.$catchall<z.ZodType<TokenTree, unknown, z.core.$ZodTypeInternals<TokenTree, unknown>>>>, z.ZodTransform<{
|
|
91
|
+
sets: Map<string, {
|
|
92
|
+
type: "color" | "borderRadius";
|
|
93
|
+
name: string;
|
|
94
|
+
value: string;
|
|
95
|
+
}[]>;
|
|
96
|
+
themes: {
|
|
97
|
+
name: string;
|
|
98
|
+
group?: string | undefined;
|
|
99
|
+
selectedTokenSets?: Record<string, "enabled" | "source" | "disabled"> | undefined;
|
|
100
|
+
id?: string | undefined;
|
|
101
|
+
$figmaStyleReferences?: Record<string, string> | undefined;
|
|
102
|
+
}[];
|
|
103
|
+
metadata: {
|
|
104
|
+
tokenSetOrder: string[];
|
|
105
|
+
activeThemes?: string[] | undefined;
|
|
106
|
+
};
|
|
107
|
+
activeThemes: ({
|
|
108
|
+
group: string;
|
|
109
|
+
name: string;
|
|
110
|
+
} | {
|
|
111
|
+
name: string;
|
|
112
|
+
group?: undefined;
|
|
113
|
+
})[];
|
|
114
|
+
}, {
|
|
115
|
+
[x: string]: TokenTree;
|
|
116
|
+
$themes: {
|
|
117
|
+
name: string;
|
|
118
|
+
group?: string | undefined;
|
|
119
|
+
selectedTokenSets?: Record<string, "enabled" | "source" | "disabled"> | undefined;
|
|
120
|
+
id?: string | undefined;
|
|
121
|
+
$figmaStyleReferences?: Record<string, string> | undefined;
|
|
122
|
+
}[];
|
|
123
|
+
$metadata: {
|
|
124
|
+
tokenSetOrder: string[];
|
|
125
|
+
activeThemes?: string[] | undefined;
|
|
126
|
+
};
|
|
127
|
+
}>>;
|
|
128
|
+
export {};
|
|
129
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/schemas/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAG5B,eAAO,MAAM,WAAW;;;;;;;iBAEtB,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AACvE,eAAO,MAAM,cAAc;;;iBAAsE,CAAC;AAClG,eAAO,MAAM,uBAAuB;;;;;;;;;;kBAGzB,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,eAAO,MAAM,0BAA0B;;;kBAG5B,CAAC;AACZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,QAAA,MAAM,eAAe;;;;;;;kBAIV,CAAC;AAEZ,KAAK,SAAS,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,GAAG,SAAS,CAAA;CAAE,CAAC;AAMjF,eAAO,MAAM,iBAAiB;;;;;;;;iBAG5B,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACzE,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC;IACnD,MAAM,IAAI,IAAI,CAAC;CACf;AACD,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,IAAI,IAAI,CAAC;CACf;AACD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG,qBAAqB,CAAC;IACxE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,GAAG,kBAAkB,CAAC;IACpE,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,GAAG,IAAI,CAAC;CAC3D;AAaD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CnC,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { parseBoundary } from "./transport.js";
|
|
3
|
+
export const TokenSchema = z.object({
|
|
4
|
+
type: z.enum(['color', 'borderRadius']), name: z.string().min(1), value: z.string().min(1)
|
|
5
|
+
});
|
|
6
|
+
export const ThemeRefSchema = z.object({ group: z.string().optional(), name: z.string().min(1) });
|
|
7
|
+
export const TokensStudioThemeSchema = ThemeRefSchema.extend({
|
|
8
|
+
selectedTokenSets: z.record(z.string(), z.enum(['enabled', 'disabled', 'source'])).optional(),
|
|
9
|
+
id: z.string().optional(), $figmaStyleReferences: z.record(z.string(), z.string()).optional()
|
|
10
|
+
}).strict();
|
|
11
|
+
export const TokensStudioMetadataSchema = z.object({
|
|
12
|
+
tokenSetOrder: z.array(z.string().min(1)),
|
|
13
|
+
activeThemes: z.array(z.string().min(1)).optional()
|
|
14
|
+
}).strict();
|
|
15
|
+
const TokenLeafSchema = z.object({
|
|
16
|
+
$type: z.enum(['color', 'borderRadius']),
|
|
17
|
+
$value: z.union([z.string().min(1), z.number().finite()]).transform(String),
|
|
18
|
+
$description: z.never().optional()
|
|
19
|
+
}).strict();
|
|
20
|
+
const TokenTreeSchema = z.lazy(() => z.record(z.string(), z.union([TokenLeafSchema, TokenTreeSchema])));
|
|
21
|
+
const DocumentSchema = z.object({
|
|
22
|
+
$themes: z.array(TokensStudioThemeSchema).default([]),
|
|
23
|
+
$metadata: TokensStudioMetadataSchema
|
|
24
|
+
}).catchall(TokenTreeSchema);
|
|
25
|
+
export const ApplyResultSchema = z.object({
|
|
26
|
+
setCount: z.number(), themeCount: z.number(), tokenCount: z.number(),
|
|
27
|
+
activeThemes: z.array(ThemeRefSchema)
|
|
28
|
+
});
|
|
29
|
+
function tokens(tree, prefix = '') {
|
|
30
|
+
const result = [];
|
|
31
|
+
for (const [key, child] of Object.entries(tree)) {
|
|
32
|
+
const name = prefix ? `${prefix}.${key}` : key;
|
|
33
|
+
const leaf = TokenLeafSchema.safeParse(child);
|
|
34
|
+
if (leaf.success)
|
|
35
|
+
result.push({ type: leaf.data.$type, name, value: leaf.data.$value });
|
|
36
|
+
else
|
|
37
|
+
result.push(...tokens(parseBoundary(TokenTreeSchema, child, 'penpot-catalog-invalid'), name));
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
export const CatalogApplicationSchema = DocumentSchema.transform((document, ctx) => {
|
|
42
|
+
const sets = new Map();
|
|
43
|
+
const { $themes: themes, $metadata: metadata, ...rawSets } = document;
|
|
44
|
+
const names = Object.keys(rawSets);
|
|
45
|
+
if (new Set(metadata.tokenSetOrder).size !== metadata.tokenSetOrder.length ||
|
|
46
|
+
names.length !== metadata.tokenSetOrder.length ||
|
|
47
|
+
names.some(name => !metadata.tokenSetOrder.includes(name))) {
|
|
48
|
+
ctx.addIssue({ code: 'custom', message: 'Set order must name every set exactly once' });
|
|
49
|
+
return z.NEVER;
|
|
50
|
+
}
|
|
51
|
+
for (const name of metadata.tokenSetOrder) {
|
|
52
|
+
const tree = rawSets[name];
|
|
53
|
+
if (!tree) {
|
|
54
|
+
ctx.addIssue({ code: 'custom', message: 'Set is missing' });
|
|
55
|
+
return z.NEVER;
|
|
56
|
+
}
|
|
57
|
+
sets.set(name, tokens(tree));
|
|
58
|
+
}
|
|
59
|
+
const identities = new Set();
|
|
60
|
+
for (const theme of themes) {
|
|
61
|
+
if (Object.values(theme.selectedTokenSets ?? {}).includes('source')) {
|
|
62
|
+
ctx.addIssue({ code: 'custom', message: 'The native catalog cannot represent source-only sets' });
|
|
63
|
+
return z.NEVER;
|
|
64
|
+
}
|
|
65
|
+
const identity = `${theme.group ?? ''}/${theme.name}`;
|
|
66
|
+
if (identities.has(identity) || Object.keys(theme.selectedTokenSets ?? {}).some(name => !sets.has(name))) {
|
|
67
|
+
ctx.addIssue({ code: 'custom', message: 'Theme identity or selected set is invalid' });
|
|
68
|
+
return z.NEVER;
|
|
69
|
+
}
|
|
70
|
+
identities.add(identity);
|
|
71
|
+
}
|
|
72
|
+
const activeThemes = (metadata.activeThemes ?? (identities.has('Appearance/Vibes · Dark') ? ['Appearance/Vibes · Dark'] : [])).map(ref => {
|
|
73
|
+
const slash = ref.indexOf('/');
|
|
74
|
+
return slash > 0 ? { group: ref.slice(0, slash), name: ref.slice(slash + 1) } : { name: ref };
|
|
75
|
+
});
|
|
76
|
+
if (activeThemes.some(theme => !identities.has(`${theme.group ?? ''}/${theme.name}`))) {
|
|
77
|
+
ctx.addIssue({ code: 'custom', message: 'Active theme is missing' });
|
|
78
|
+
return z.NEVER;
|
|
79
|
+
}
|
|
80
|
+
return { sets, themes, metadata, activeThemes };
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/schemas/catalog.ts"],"names":[],"mappings":"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"}
|