@axiom-core/css-bridge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/css-text.d.ts +2 -0
- package/dist/css-text.js +12 -0
- package/dist/css-text.js.map +1 -0
- package/dist/emitter.d.ts +2 -0
- package/dist/emitter.js +26 -0
- package/dist/emitter.js.map +1 -0
- package/dist/flatten.d.ts +2 -0
- package/dist/flatten.js +36 -0
- package/dist/flatten.js.map +1 -0
- package/dist/hash.d.ts +6 -0
- package/dist/hash.js +15 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/naming.d.ts +2 -0
- package/dist/naming.js +41 -0
- package/dist/naming.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
package/dist/css-text.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function generateCssText(variables, selector = ':root') {
|
|
2
|
+
const keys = Object.keys(variables).sort();
|
|
3
|
+
const parts = [];
|
|
4
|
+
parts.push(`${selector} {`);
|
|
5
|
+
for (const k of keys) {
|
|
6
|
+
const v = variables[k];
|
|
7
|
+
parts.push(` ${k}: ${v};`);
|
|
8
|
+
}
|
|
9
|
+
parts.push('}');
|
|
10
|
+
return parts.join('\n');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=css-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-text.js","sourceRoot":"","sources":["../src/css-text.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,SAAyB,EAAE,QAAQ,GAAG,OAAO;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/emitter.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { flattenResolvedTheme } from './flatten.js';
|
|
2
|
+
import { devName, prodName } from './naming.js';
|
|
3
|
+
export function emitCssVariables(resolvedTheme, options) {
|
|
4
|
+
const mode = options.mode;
|
|
5
|
+
const prefix = options.prefix ?? 'ax';
|
|
6
|
+
const scopeId = options.scopeId;
|
|
7
|
+
const flat = flattenResolvedTheme(resolvedTheme);
|
|
8
|
+
const entries = [];
|
|
9
|
+
// iterate sorted paths to ensure deterministic order
|
|
10
|
+
const paths = Object.keys(flat).sort();
|
|
11
|
+
for (const path of paths) {
|
|
12
|
+
const value = flat[path];
|
|
13
|
+
const stringValue = String(value);
|
|
14
|
+
const varName = mode === 'dev'
|
|
15
|
+
? devName(prefix, path)
|
|
16
|
+
: prodName(prefix, path, stringValue, scopeId);
|
|
17
|
+
entries.push([varName, stringValue]);
|
|
18
|
+
}
|
|
19
|
+
// sort final variable keys alphabetically as required
|
|
20
|
+
entries.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));
|
|
21
|
+
const out = Object.create(null);
|
|
22
|
+
for (const [k, v] of entries)
|
|
23
|
+
out[k] = v;
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,UAAU,gBAAgB,CAAC,aAA4B,EAAE,OAAoB;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,MAAM,IAAI,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAEjD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAE5C,qDAAqD;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,KAAK,KAAK;YAC5B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;YACvB,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,sDAAsD;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAmB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEzC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/flatten.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Flatten resolved theme to map of dot.path -> primitive (string|number)
|
|
2
|
+
export function flattenResolvedTheme(theme) {
|
|
3
|
+
const out = Object.create(null);
|
|
4
|
+
const root = theme;
|
|
5
|
+
const stack = [];
|
|
6
|
+
if (root && typeof root === 'object') {
|
|
7
|
+
stack.push({ node: root, keys: Object.keys(root).sort(), idx: 0, path: [] });
|
|
8
|
+
}
|
|
9
|
+
while (stack.length) {
|
|
10
|
+
const frame = stack[stack.length - 1];
|
|
11
|
+
if (frame.idx >= frame.keys.length) {
|
|
12
|
+
stack.pop();
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const key = frame.keys[frame.idx++];
|
|
16
|
+
const val = frame.node[key];
|
|
17
|
+
const curPath = frame.path.concat(key);
|
|
18
|
+
if (val === null || val === undefined) {
|
|
19
|
+
// skip
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (typeof val === 'string' || typeof val === 'number') {
|
|
23
|
+
out[curPath.join('.')] = val;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (typeof val === 'object' && !Array.isArray(val)) {
|
|
27
|
+
const child = val;
|
|
28
|
+
const keys = Object.keys(child).sort();
|
|
29
|
+
stack.push({ node: child, keys, idx: 0, path: curPath });
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
// other types are not expected by contract; ignore defensively
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=flatten.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten.js","sourceRoot":"","sources":["../src/flatten.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,KAAoB;IACvD,MAAM,GAAG,GAAoC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKjE,MAAM,IAAI,GAAG,KAA2C,CAAC;IACzD,MAAM,KAAK,GAAY,EAAE,CAAC;IAE1B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO;YACP,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACvD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,GAA8B,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QAED,+DAA+D;IACjE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/hash.d.ts
ADDED
package/dist/hash.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FNV-1a 64-bit hash function.
|
|
3
|
+
* Deterministic across platforms using BigInt.
|
|
4
|
+
* Returns 16-character lowercase hexadecimal string (zero-padded).
|
|
5
|
+
*/
|
|
6
|
+
export function fnv1a(str) {
|
|
7
|
+
let hash = 0xcbf29ce484222325n; // FNV-1a 64-bit offset basis
|
|
8
|
+
const prime = 0x100000001b3n; // FNV-1a 64-bit prime
|
|
9
|
+
for (let i = 0; i < str.length; i++) {
|
|
10
|
+
hash ^= BigInt(str.charCodeAt(i));
|
|
11
|
+
hash = (hash * prime) & 0xffffffffffffffffn; // Mask to 64-bit
|
|
12
|
+
}
|
|
13
|
+
return hash.toString(16).padStart(16, '0'); // Zero-pad to 16 hex digits
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=hash.js.map
|
package/dist/hash.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,IAAI,IAAI,GAAG,mBAAmB,CAAC,CAAC,6BAA6B;IAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,CAAK,sBAAsB;IAExD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,mBAAmB,CAAC,CAAC,iBAAiB;IAChE,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,4BAA4B;AAC1E,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/naming.d.ts
ADDED
package/dist/naming.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { fnv1a } from './hash.js';
|
|
2
|
+
function collapseDashes(s) {
|
|
3
|
+
// Preserve leading -- for CSS variables, only collapse internal sequences
|
|
4
|
+
if (s.startsWith('--')) {
|
|
5
|
+
return '--' + s.slice(2).replace(/-{2,}/g, '-');
|
|
6
|
+
}
|
|
7
|
+
return s.replace(/-{2,}/g, '-');
|
|
8
|
+
}
|
|
9
|
+
function camelToKebab(part) {
|
|
10
|
+
// convert camelCase and PascalCase to kebab-case
|
|
11
|
+
return part
|
|
12
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
13
|
+
.replace(/([A-Z])([A-Z][a-z0-9])/g, '$1-$2')
|
|
14
|
+
.replace(/\./g, '-')
|
|
15
|
+
.replace(/_/g, '-')
|
|
16
|
+
.toLowerCase();
|
|
17
|
+
}
|
|
18
|
+
export function devName(prefix, path) {
|
|
19
|
+
// path: dot-separated (e.g., "typography.body.md.fontSize")
|
|
20
|
+
const parts = path.split('.');
|
|
21
|
+
const kebab = parts.map(camelToKebab).join('-');
|
|
22
|
+
const raw = `--${prefix}-${kebab}`;
|
|
23
|
+
return collapseDashes(raw.toLowerCase());
|
|
24
|
+
}
|
|
25
|
+
export function prodName(prefix, path, value, scopeId) {
|
|
26
|
+
// Canonical deterministic input:
|
|
27
|
+
// scopeId (if present) | tokenPath | value (if present)
|
|
28
|
+
// This ensures identical semantic content produces identical hashes
|
|
29
|
+
// regardless of provider creation order
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (scopeId)
|
|
32
|
+
parts.push(scopeId);
|
|
33
|
+
parts.push(path);
|
|
34
|
+
if (value)
|
|
35
|
+
parts.push(value);
|
|
36
|
+
const canonicalInput = parts.join('|');
|
|
37
|
+
const hash = fnv1a(canonicalInput);
|
|
38
|
+
const raw = `--${prefix}-${hash}`;
|
|
39
|
+
return collapseDashes(raw.toLowerCase());
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,SAAS,cAAc,CAAC,CAAS;IAC/B,0EAA0E;IAC1E,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,iDAAiD;IACjD,OAAO,IAAI;SACR,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,yBAAyB,EAAE,OAAO,CAAC;SAC3C,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,IAAY;IAClD,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,KAAc,EAAE,OAAgB;IACrF,iCAAiC;IACjC,wDAAwD;IACxD,oEAAoE;IACpE,wCAAwC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE7B,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;IAClC,OAAO,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ResolvedSemanticTokens } from '@axiom-core/core-engine';
|
|
2
|
+
export type ResolvedTheme = ResolvedSemanticTokens;
|
|
3
|
+
export type CssBridgeMode = 'dev' | 'prod';
|
|
4
|
+
export interface EmitOptions {
|
|
5
|
+
mode: CssBridgeMode;
|
|
6
|
+
prefix?: string;
|
|
7
|
+
scopeId?: string;
|
|
8
|
+
}
|
|
9
|
+
export type CssVariableMap = Record<string, string>;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@axiom-core/css-bridge",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Axiom Core — CSS variable emission bridge",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"sideEffects": false,
|
|
13
|
+
"exports": {
|
|
14
|
+
"./package.json": "./package.json",
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/Haneefe/Axiom-Core.git"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/Haneefe/Axiom-Core",
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://github.com/Haneefe/Axiom-Core/issues"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
}
|
|
32
|
+
}
|