@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,98 @@
|
|
|
1
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
2
|
+
import { getVibesClient } from '@vibesdotdev/kernel/client';
|
|
3
|
+
import { createRuntimeImplementation } from '@vibesdotdev/kernel/factory';
|
|
4
|
+
import { hashSyncMappingData } from '@vibesdotdev/sync/mapping';
|
|
5
|
+
import * as z from 'zod/v4';
|
|
6
|
+
import { PenpotCatalogSchema, parseBoundary } from "../schemas/transport.js";
|
|
7
|
+
import { PenpotPresetMetadataSchema, PenpotProjectionDataSchema, PenpotProjectionRecordSchema, PenpotSyncApplySchema, PenpotSyncPullSchema } from "../schemas/sync.js";
|
|
8
|
+
const ENDPOINT_ID = 'sync.endpoint.vibes.design-tokens.penpot';
|
|
9
|
+
function canonicalKey(presetId) { return `design-tokens:penpot:${presetId}`; }
|
|
10
|
+
/** Standalone compatibility entrypoint; hosts normally resolve sync/endpoint. */
|
|
11
|
+
export class PenpotDesignTokensSyncEndpoint {
|
|
12
|
+
resolveTransport;
|
|
13
|
+
constructor(resolveTransport) {
|
|
14
|
+
this.resolveTransport = resolveTransport;
|
|
15
|
+
}
|
|
16
|
+
async pull(input) {
|
|
17
|
+
const value = parseBoundary(PenpotSyncPullSchema, input, 'penpot-sync-input-invalid');
|
|
18
|
+
const transport = await this.resolveTransport();
|
|
19
|
+
const catalogs = parseBoundary(z.array(PenpotCatalogSchema), await transport.pullTokens({ fileId: value.containerId }));
|
|
20
|
+
const identities = new Set();
|
|
21
|
+
for (const catalog of catalogs) {
|
|
22
|
+
if (identities.has(catalog.presetId))
|
|
23
|
+
throw new CapabilityError('Penpot returned duplicate catalog identities.', 'CONFLICT', {
|
|
24
|
+
reason: 'penpot-catalog-duplicate'
|
|
25
|
+
});
|
|
26
|
+
identities.add(catalog.presetId);
|
|
27
|
+
}
|
|
28
|
+
const offset = value.cursor ?? 0;
|
|
29
|
+
if (offset > catalogs.length)
|
|
30
|
+
throw new CapabilityError('Penpot sync cursor is outside the catalog.', 'INVALID_INPUT', {
|
|
31
|
+
reason: 'penpot-sync-cursor-invalid'
|
|
32
|
+
});
|
|
33
|
+
const page = catalogs.slice(offset, offset + value.limit);
|
|
34
|
+
const records = [];
|
|
35
|
+
for (const catalog of page) {
|
|
36
|
+
const data = { dtcg: catalog.dtcg };
|
|
37
|
+
records.push({
|
|
38
|
+
id: catalog.presetId, canonicalKey: canonicalKey(catalog.presetId),
|
|
39
|
+
revision: catalog.updatedAt, updatedAt: catalog.updatedAt,
|
|
40
|
+
contentHash: await hashSyncMappingData(data), deleted: false, data,
|
|
41
|
+
metadata: { endpointId: ENDPOINT_ID, provider: 'penpot', fileId: value.containerId, presetId: catalog.presetId }
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const nextOffset = offset + page.length;
|
|
45
|
+
const hasMore = nextOffset < catalogs.length;
|
|
46
|
+
return { records, cursor: hasMore ? String(nextOffset) : undefined, hasMore };
|
|
47
|
+
}
|
|
48
|
+
async apply(input) {
|
|
49
|
+
const value = parseBoundary(PenpotSyncApplySchema, input, 'penpot-sync-input-invalid');
|
|
50
|
+
// Prepare every operation before the first remote write.
|
|
51
|
+
const writes = value.operations.map(operation => {
|
|
52
|
+
if (operation.type !== 'upsert')
|
|
53
|
+
throw new CapabilityError('Penpot supports catalog upserts only.', 'INVALID_INPUT', {
|
|
54
|
+
reason: 'penpot-operation-unsupported'
|
|
55
|
+
});
|
|
56
|
+
const record = parseBoundary(PenpotProjectionRecordSchema, operation.record, 'penpot-sync-record-invalid');
|
|
57
|
+
const metadata = parseBoundary(PenpotPresetMetadataSchema, record.metadata);
|
|
58
|
+
const projection = PenpotProjectionDataSchema.safeParse(record.data);
|
|
59
|
+
return {
|
|
60
|
+
canonicalKey: operation.canonicalKey,
|
|
61
|
+
presetId: operation.destinationRecord?.id ?? metadata.presetId ?? record.id,
|
|
62
|
+
dtcg: projection.success ? projection.data.dtcg : record.data,
|
|
63
|
+
updatedAt: record.updatedAt
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
const transport = await this.resolveTransport();
|
|
67
|
+
const results = [];
|
|
68
|
+
for (const write of writes) {
|
|
69
|
+
let catalog;
|
|
70
|
+
try {
|
|
71
|
+
catalog = parseBoundary(PenpotCatalogSchema, await transport.pushTokens({
|
|
72
|
+
fileId: value.containerId, presetId: write.presetId, dtcg: write.dtcg, updatedAt: write.updatedAt
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
catch (cause) {
|
|
76
|
+
throw new CapabilityError('Penpot catalog write failed.', 'UNAVAILABLE', { reason: 'penpot-sync-write-failed', cause });
|
|
77
|
+
}
|
|
78
|
+
if (catalog.presetId !== write.presetId)
|
|
79
|
+
throw new CapabilityError('Penpot acknowledged a different catalog.', 'CONFLICT', {
|
|
80
|
+
reason: 'penpot-destination-mismatch'
|
|
81
|
+
});
|
|
82
|
+
results.push({
|
|
83
|
+
canonicalKey: write.canonicalKey, success: true, outcome: 'applied',
|
|
84
|
+
recordId: catalog.presetId, revision: catalog.updatedAt
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
class RuntimePenpotDesignTokensSyncEndpoint extends PenpotDesignTokensSyncEndpoint {
|
|
91
|
+
constructor(_descriptor, context) {
|
|
92
|
+
super(() => getVibesClient('integrations-penpot', context.runtime));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export default createRuntimeImplementation({
|
|
96
|
+
kind: 'sync/endpoint', id: ENDPOINT_ID, implementation: RuntimePenpotDesignTokensSyncEndpoint
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=penpot.sync-endpoint.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"penpot.sync-endpoint.impl.js","sourceRoot":"","sources":["../../src/sync/penpot.sync-endpoint.impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ApplyPenpotCatalogResult, PenpotTokenCatalogHost } from '../schemas/catalog.ts';
|
|
2
|
+
export type { ApplyPenpotCatalogResult, PenpotApplyTokenType, PenpotCatalogTheme, PenpotCatalogTokenSet, PenpotTokenCatalogHost, TokensStudioMetadata, TokensStudioTheme } from '../schemas/catalog.ts';
|
|
3
|
+
export declare const DEFAULT_ACTIVE_THEME_GROUP = "Appearance";
|
|
4
|
+
export declare const DEFAULT_ACTIVE_THEME_NAME = "Vibes \u00B7 Dark";
|
|
5
|
+
/** Validate the complete replacement before touching mutable host collections. */
|
|
6
|
+
export declare function applyPenpotCatalog(json: unknown, catalog: PenpotTokenCatalogHost): ApplyPenpotCatalogResult;
|
|
7
|
+
//# sourceMappingURL=apply-penpot-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-penpot-catalog.d.ts","sourceRoot":"","sources":["../../src/tokens/apply-penpot-catalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE9F,YAAY,EACX,wBAAwB,EAAE,oBAAoB,EAAE,kBAAkB,EAClE,qBAAqB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,iBAAiB,EACtF,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,0BAA0B,eAAe,CAAC;AACvD,eAAO,MAAM,yBAAyB,sBAAiB,CAAC;AAExD,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,wBAAwB,CA8B3G"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { CatalogApplicationSchema } from "../schemas/catalog.js";
|
|
2
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
3
|
+
export const DEFAULT_ACTIVE_THEME_GROUP = 'Appearance';
|
|
4
|
+
export const DEFAULT_ACTIVE_THEME_NAME = 'Vibes · Dark';
|
|
5
|
+
/** Validate the complete replacement before touching mutable host collections. */
|
|
6
|
+
export function applyPenpotCatalog(json, catalog) {
|
|
7
|
+
const parsed = CatalogApplicationSchema.safeParse(json);
|
|
8
|
+
if (!parsed.success)
|
|
9
|
+
throw new CapabilityError('Penpot catalog replacement is invalid.', 'INVALID_INPUT', {
|
|
10
|
+
reason: 'penpot-catalog-invalid', cause: parsed.error
|
|
11
|
+
});
|
|
12
|
+
const document = parsed.data;
|
|
13
|
+
// Host remove() mutates these collections; snapshot both before removal.
|
|
14
|
+
const themes = Array.from(catalog.themes);
|
|
15
|
+
const sets = Array.from(catalog.sets);
|
|
16
|
+
for (const theme of themes)
|
|
17
|
+
theme.remove();
|
|
18
|
+
for (const set of sets)
|
|
19
|
+
set.remove();
|
|
20
|
+
let tokenCount = 0;
|
|
21
|
+
for (const [name, tokens] of document.sets) {
|
|
22
|
+
const set = catalog.addSet({ name, active: false });
|
|
23
|
+
for (const token of tokens) {
|
|
24
|
+
set.addToken(token);
|
|
25
|
+
tokenCount += 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const theme of document.themes) {
|
|
29
|
+
const created = catalog.addTheme({ group: theme.group, name: theme.name });
|
|
30
|
+
for (const [name, state] of Object.entries(theme.selectedTokenSets ?? {})) {
|
|
31
|
+
if (state === 'enabled')
|
|
32
|
+
created.addSet(name);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const activeThemes = document.activeThemes;
|
|
36
|
+
for (const theme of activeThemes)
|
|
37
|
+
catalog.activateTheme(theme);
|
|
38
|
+
return { setCount: document.sets.size, themeCount: document.themes.length, tokenCount, activeThemes };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=apply-penpot-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-penpot-catalog.js","sourceRoot":"","sources":["../../src/tokens/apply-penpot-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMtD,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC;AACvD,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAExD,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,IAAa,EAAE,OAA+B;IAChF,MAAM,MAAM,GAAG,wBAAwB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,eAAe,CAAC,wCAAwC,EAAE,eAAe,EAAE;YACzG,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;SACrD,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IAE7B,yEAAyE;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAErC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,IAAI,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3E,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;IACF,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,YAAY;QAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACvG,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ApplyPenpotCatalogResult, type PenpotTokenCatalogHost } from './apply-penpot-catalog.ts';
|
|
2
|
+
/** Thin house-plugin entry: apply Tokens Studio JSON to a TokenCatalog host. */
|
|
3
|
+
export declare function applyHousePluginCatalog(catalog: PenpotTokenCatalogHost, tokensStudioJson: unknown): ApplyPenpotCatalogResult;
|
|
4
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/tokens/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,MAAM,2BAA2B,CAAC;AAEnC,gFAAgF;AAChF,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,sBAAsB,EAC/B,gBAAgB,EAAE,OAAO,GACvB,wBAAwB,CAM1B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
2
|
+
import { JsonSchema } from "../schemas/transport.js";
|
|
3
|
+
import { applyPenpotCatalog } from "./apply-penpot-catalog.js";
|
|
4
|
+
/** Thin house-plugin entry: apply Tokens Studio JSON to a TokenCatalog host. */
|
|
5
|
+
export function applyHousePluginCatalog(catalog, tokensStudioJson) {
|
|
6
|
+
const parsed = JsonSchema.safeParse(tokensStudioJson);
|
|
7
|
+
if (!parsed.success)
|
|
8
|
+
throw new CapabilityError('Tokens Studio input is invalid.', 'INVALID_INPUT', {
|
|
9
|
+
reason: 'penpot-catalog-invalid', cause: parsed.error
|
|
10
|
+
});
|
|
11
|
+
return applyPenpotCatalog(parsed.data, catalog);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/tokens/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACN,kBAAkB,EAGlB,MAAM,2BAA2B,CAAC;AAEnC,gFAAgF;AAChF,MAAM,UAAU,uBAAuB,CACtC,OAA+B,EAC/B,gBAAyB;IAEzB,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,eAAe,CAAC,iCAAiC,EAAE,eAAe,EAAE;YAClG,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;SACrD,CAAC,CAAC;IACH,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,75 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibesdotdev/integrations-penpot",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
"version": "1.0.0-rc.2",
|
|
4
|
+
"dependencies": {
|
|
5
|
+
"@vibesdotdev/config": "^1.0.0-rc.5",
|
|
6
|
+
"@vibesdotdev/kernel": "^1.0.0-rc.8",
|
|
7
|
+
"zod": "^4.6.7"
|
|
8
|
+
},
|
|
9
|
+
"peerDependencies": {
|
|
10
|
+
"@vibesdotdev/sync": "^1.0.0-rc.0"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"bun": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./plugin": {
|
|
21
|
+
"bun": "./dist/plugin.js",
|
|
22
|
+
"types": "./dist/plugin.d.ts",
|
|
23
|
+
"import": "./dist/plugin.js",
|
|
24
|
+
"default": "./dist/plugin.js"
|
|
25
|
+
},
|
|
26
|
+
"./sync": {
|
|
27
|
+
"bun": "./dist/sync/penpot.sync-endpoint.impl.js",
|
|
28
|
+
"types": "./dist/sync/penpot.sync-endpoint.impl.d.ts",
|
|
29
|
+
"import": "./dist/sync/penpot.sync-endpoint.impl.js",
|
|
30
|
+
"default": "./dist/sync/penpot.sync-endpoint.impl.js"
|
|
31
|
+
},
|
|
32
|
+
"./client": {
|
|
33
|
+
"bun": "./dist/client/index.js",
|
|
34
|
+
"types": "./dist/client/index.d.ts",
|
|
35
|
+
"import": "./dist/client/index.js",
|
|
36
|
+
"default": "./dist/client/index.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"lint": "node ../../node_modules/@vibesdotdev/internal-oxlint-toolchain/ratchet.mjs .",
|
|
41
|
+
"test": "${BUN:-bun} test src",
|
|
42
|
+
"check": "${BUN:-bun} --bun tsc -p tsconfig.json --noEmit",
|
|
43
|
+
"build": "tsc -p tsconfig.build.json"
|
|
44
|
+
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "ssh://git@git.vibes.dev/vibesdotdev/integrations.git",
|
|
48
|
+
"directory": "integrations/penpot"
|
|
49
|
+
},
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"registry": "https://packages.vibes.dev",
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
54
|
+
"vibes": {
|
|
55
|
+
"visibility": "public",
|
|
56
|
+
"registry": {
|
|
57
|
+
"repositoryId": "70be51c9-5ab7-4d7e-9f47-801cb17720d8",
|
|
58
|
+
"directory": "integrations/penpot"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"type": "module",
|
|
62
|
+
"types": "./dist/index.d.ts",
|
|
63
|
+
"license": "BUSL-1.1",
|
|
64
|
+
"files": [
|
|
65
|
+
"dist",
|
|
66
|
+
"README.md",
|
|
67
|
+
"LICENSE"
|
|
68
|
+
],
|
|
69
|
+
"gitHead": "fd24c5c4d0c5ae2a7b0af8a7714675b55cac1368",
|
|
70
|
+
"_vibes_source": {
|
|
71
|
+
"repo": "ssh://git@git.vibes.dev/vibesdotdev/integrations.git",
|
|
72
|
+
"sha": "fd24c5c4d0c5ae2a7b0af8a7714675b55cac1368",
|
|
73
|
+
"workspaceDigest": "sha256:e67aee5c8f9c861cbab377ca3b1dd6ade9345a74bff14ebb246ef27c526a1d8e"
|
|
74
|
+
}
|
|
75
|
+
}
|