@builder.io/sdk
Advanced tools
Comparing version 5.0.0 to 6.0.0
# @builder.io/sdk | ||
## 6.0.0 | ||
### Major Changes | ||
- 56f9461: - Adds `apiEndpoint` prop to `builder` instance with permitted values being `'content'` or `'query'`. It dictates which API endpoint is used for fetching Builder content | ||
- Breaking Change 🧨: Removes `apiEndpoint` argument from `builder.get()`, `builder.getAll()`, and the `options` prop of `<BuilderContent>` component. NOTE: this argument was not working as expected. | ||
### Patch Changes | ||
- 06b1124: Fix: Content API invocations will have `includeRefs` set to `true` by default. | ||
- 409aec9: Feat: add `meta` type to custom components | ||
- 40d572d: Renders Symbol correctly when apiEndpoint is 'content' | ||
- 2fc9fc5: Fix: `onChange` functions passed to builder inputs can now receive async functions | ||
## 5.0.0 | ||
@@ -4,0 +18,0 @@ |
{ | ||
"name": "@builder.io/sdk", | ||
"version": "5.0.0", | ||
"version": "6.0.0", | ||
"unpkg": "./dist/index.browser.js", | ||
@@ -5,0 +5,0 @@ "main": "./dist/index.cjs.js", |
@@ -119,7 +119,2 @@ /// <reference types="node" /> | ||
/** | ||
* Dictates which API endpoint is used when fetching content. Allows `'content'` and `'query'`. | ||
* Defaults to `'query'`. | ||
*/ | ||
apiEndpoint?: 'content' | 'query'; | ||
/** | ||
* Optional fetch options to be passed as the second argument to the `fetch` function. | ||
@@ -649,2 +644,5 @@ */ | ||
requiredPermissions?: Array<Permission>; | ||
meta?: { | ||
[key: string]: any; | ||
}; | ||
} | ||
@@ -801,2 +799,9 @@ type Permission = 'read' | 'publish' | 'editCode' | 'editDesigns' | 'admin' | 'create'; | ||
set apiVersion(apiVersion: ApiVersion | undefined); | ||
get apiEndpoint(): 'content' | 'query'; | ||
set apiEndpoint(apiEndpoint: 'content' | 'query'); | ||
/** | ||
* Dictates which API endpoint is used when fetching content. Allows `'content'` and `'query'`. | ||
* Defaults to `'query'`. | ||
*/ | ||
private apiEndpoint$; | ||
private apiVersion$; | ||
@@ -803,0 +808,0 @@ private canTrack$; |
@@ -152,2 +152,106 @@ "use strict"; | ||
}); | ||
test('serializes arrow functions with non-parenthesized args in inputs', function () { | ||
// Using eval and template literal to prevent TypeScript from adding parens | ||
var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); | ||
var input = { | ||
name: 'onChangeComponent', | ||
inputs: [ | ||
{ | ||
name: 'number', | ||
type: 'number', | ||
// @ts-expect-error required for this test | ||
onChange: function (value) { return value * 2; }, | ||
showIf: fn, | ||
}, | ||
], | ||
}; | ||
var result = builder_class_1.Builder['serializeIncludingFunctions'](input); | ||
expect(typeof result.inputs[0].onChange).toBe('string'); | ||
expect(result.inputs[0].onChange).toBe("return ((value) => value * 2).apply(this, arguments)"); | ||
}); | ||
test('serializes functions with parenthesized args in inputs', function () { | ||
// Using eval and template literal to prevent TypeScript from adding parens | ||
var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); | ||
var input = { | ||
name: 'onChangeComponent', | ||
inputs: [ | ||
{ | ||
name: 'number', | ||
type: 'number', | ||
onChange: function (value) { | ||
return value * 2; | ||
}, | ||
showIf: fn, | ||
}, | ||
], | ||
}; | ||
var result = builder_class_1.Builder['serializeIncludingFunctions'](input); | ||
expect(typeof result.inputs[0].onChange).toBe('string'); | ||
expect(result.inputs[0].onChange).toBe("return (function(value) {\n return value * 2;\n }).apply(this, arguments)"); | ||
}); | ||
test('serializes async functions with parenthesized args in inputs', function () { | ||
// Using eval and template literal to prevent TypeScript from adding parens | ||
var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); | ||
var input = { | ||
name: 'AsyncOnChangeComponent', | ||
inputs: [ | ||
{ | ||
name: 'number', | ||
type: 'number', | ||
onChange: function (value) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
return [2 /*return*/, value * 2]; | ||
}); | ||
}); | ||
}, | ||
showIf: fn, | ||
}, | ||
], | ||
}; | ||
var result = builder_class_1.Builder['serializeIncludingFunctions'](input); | ||
expect(typeof result.inputs[0].onChange).toBe('string'); | ||
expect(result.inputs[0].onChange).toBe("return (async function(value) {\n return value * 2;\n }).apply(this, arguments)"); | ||
}); | ||
test('serializes async arrow functions with parenthesized args in inputs', function () { | ||
// Using eval and template literal to prevent TypeScript from adding parens | ||
var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); | ||
var input = { | ||
name: 'AsyncOnChangeComponent', | ||
inputs: [ | ||
{ | ||
name: 'number', | ||
type: 'number', | ||
onChange: function (value) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { | ||
return [2 /*return*/, value * 2]; | ||
}); }); }, | ||
showIf: fn, | ||
}, | ||
], | ||
}; | ||
var result = builder_class_1.Builder['serializeIncludingFunctions'](input); | ||
expect(typeof result.inputs[0].onChange).toBe('string'); | ||
expect(result.inputs[0].onChange).toBe('return (async (value) => value * 2).apply(this, arguments)'); | ||
}); | ||
test('serializes async arrow functions without parenthesized args in inputs', function () { | ||
// Using eval and template literal to prevent TypeScript from adding parens | ||
var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); | ||
var input = { | ||
name: 'AsyncOnChangeComponent', | ||
inputs: [ | ||
{ | ||
name: 'number', | ||
type: 'number', | ||
// @ts-expect-error | ||
onChange: function (value) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { | ||
return [2 /*return*/, value * 2]; | ||
}); }); }, | ||
showIf: fn, | ||
}, | ||
], | ||
}; | ||
var result = builder_class_1.Builder['serializeIncludingFunctions'](input); | ||
expect(typeof result.inputs[0].onChange).toBe('string'); | ||
expect(result.inputs[0].onChange).toBe('return (async (value) => value * 2).apply(this, arguments)'); | ||
}); | ||
}); | ||
@@ -563,5 +667,5 @@ describe('prepareComponentSpecToSend', function () { | ||
expectedFormat = 'html'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder['flushGetContentQueue'](true, [ | ||
{ | ||
apiEndpoint: 'content', | ||
model: MODEL, | ||
@@ -584,3 +688,3 @@ format: expectedFormat, | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&limit=10&model=%22").concat(MODEL, "%22&enrich=true"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&includeRefs=true&limit=10&model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
@@ -625,5 +729,5 @@ } | ||
expectedFormat = 'amp'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder['flushGetContentQueue'](true, [ | ||
{ | ||
apiEndpoint: 'content', | ||
model: MODEL, | ||
@@ -646,3 +750,3 @@ format: expectedFormat, | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&limit=10&model=%22").concat(MODEL, "%22&enrich=true"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&includeRefs=true&limit=10&model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
@@ -715,5 +819,5 @@ } | ||
expectedFormat = 'email'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder['flushGetContentQueue'](true, [ | ||
{ | ||
apiEndpoint: 'content', | ||
model: MODEL, | ||
@@ -736,3 +840,3 @@ format: expectedFormat, | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&limit=10&model=%22").concat(MODEL, "%22&enrich=true"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&includeRefs=true&limit=10&model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
@@ -749,5 +853,5 @@ } | ||
expectedFormat = 'email'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder['flushGetContentQueue'](true, [ | ||
{ | ||
apiEndpoint: 'content', | ||
model: MODEL, | ||
@@ -770,3 +874,3 @@ format: expectedFormat, | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22urlPath%22%3A%22%2Ftest-page%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&limit=10&model=%22").concat(MODEL, "%22&enrich=true"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22urlPath%22%3A%22%2Ftest-page%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&limit=10&model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
@@ -776,3 +880,180 @@ } | ||
}); }); | ||
test('hits content url with query.id when id is passed in options.query', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var expectedModel, expectedFormat, expectedEntryId, result; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
expectedModel = 'symbol'; | ||
expectedFormat = 'email'; | ||
expectedEntryId = '123'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder['flushGetContentQueue'](true, [ | ||
{ | ||
model: expectedModel, | ||
format: expectedFormat, | ||
key: expectedModel, | ||
omit: OMIT, | ||
fields: 'data', | ||
limit: 10, | ||
entry: expectedEntryId, | ||
query: { | ||
id: expectedEntryId, | ||
}, | ||
}, | ||
])]; | ||
case 1: | ||
result = _a.sent(); | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&limit=10&model=%22").concat(expectedModel, "%22&entry=%22").concat(expectedEntryId, "%22&query.id=").concat(expectedEntryId), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }); | ||
}); | ||
describe('get', function () { | ||
var API_KEY = '25608a566fbb654ea959c1b1729e370d'; | ||
var MODEL = 'page'; | ||
var AUTH_TOKEN = '82202e99f9fb4ed1da5940f7fa191e72'; | ||
var builder; | ||
beforeEach(function () { | ||
builder = new builder_class_1.Builder(API_KEY, undefined, undefined, false, AUTH_TOKEN, 'v3'); | ||
var builderSubject = new observable_class_1.BehaviorSubject([]); | ||
builderSubject.next = jest.fn(function () { }); | ||
builder.observersByKey[MODEL] = builderSubject; | ||
builder['makeFetchApiCall'] = jest.fn(function (url) { | ||
return Promise.resolve({ | ||
json: function () { | ||
return Promise.resolve({}); | ||
}, | ||
}); | ||
}); | ||
}); | ||
test('hits content url with includeRefs=false when passed in params and noTraverse=false', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var expectedModel, includeRefs; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
expectedModel = 'page'; | ||
includeRefs = false; | ||
builder.apiEndpoint = 'content'; | ||
builder.getLocation = jest.fn(function () { return ({ | ||
search: "?builder.params=includeRefs%3D".concat(includeRefs), | ||
}); }); | ||
return [4 /*yield*/, builder.get(expectedModel, {})]; | ||
case 1: | ||
_a.sent(); | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=false&userAttributes=%7B%22device%22%3A%22desktop%22%7D&includeRefs=").concat(includeRefs, "&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }); | ||
test('hits content url with includeRefs=true and noTraverse=false by default', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var expectedModel; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
expectedModel = 'page'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder.get(expectedModel, {})]; | ||
case 1: | ||
_a.sent(); | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=false&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }); | ||
test('hits content url with includeRefs=false when passed in options and noTraverse=false by default', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var expectedModel; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
expectedModel = 'page'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder.get(expectedModel, { | ||
includeRefs: false, | ||
})]; | ||
case 1: | ||
_a.sent(); | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=false&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=false&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }); | ||
}); | ||
describe('getAll', function () { | ||
var API_KEY = '25608a566fbb654ea959c1b1729e370d'; | ||
var MODEL = 'page'; | ||
var AUTH_TOKEN = '82202e99f9fb4ed1da5940f7fa191e72'; | ||
var builder; | ||
beforeEach(function () { | ||
builder = new builder_class_1.Builder(API_KEY, undefined, undefined, false, AUTH_TOKEN, 'v3'); | ||
var builderSubject = new observable_class_1.BehaviorSubject([]); | ||
builderSubject.next = jest.fn(function () { }); | ||
builder.observersByKey[MODEL] = builderSubject; | ||
builder['makeFetchApiCall'] = jest.fn(function (url) { | ||
return Promise.resolve({ | ||
json: function () { | ||
return Promise.resolve({}); | ||
}, | ||
}); | ||
}); | ||
}); | ||
test('hits content url with includeRefs=false when passed in params and noTraverse=true by default', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var expectedModel, includeRefs; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
expectedModel = 'page'; | ||
includeRefs = false; | ||
builder.apiEndpoint = 'content'; | ||
builder.getLocation = jest.fn(function () { return ({ | ||
search: "?builder.params=includeRefs%3D".concat(includeRefs), | ||
}); }); | ||
return [4 /*yield*/, builder.getAll(expectedModel, {})]; | ||
case 1: | ||
_a.sent(); | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=true&userAttributes=%7B%22device%22%3A%22desktop%22%7D&includeRefs=").concat(includeRefs, "&limit=30&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }); | ||
test('hits content url with includeRefs=true and noTraverse=true by default', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var expectedModel; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
expectedModel = 'page'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder.getAll(expectedModel, {})]; | ||
case 1: | ||
_a.sent(); | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=true&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&limit=30&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }); | ||
test('hits content url with includeRefs=false when passed in options and noTraverse=true by default', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
var expectedModel; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
expectedModel = 'page'; | ||
builder.apiEndpoint = 'content'; | ||
return [4 /*yield*/, builder.getAll(expectedModel, { | ||
includeRefs: false, | ||
})]; | ||
case 1: | ||
_a.sent(); | ||
expect(builder['makeFetchApiCall']).toBeCalledTimes(1); | ||
expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=true&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=false&limit=30&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }); | ||
}); | ||
//# sourceMappingURL=builder.class.test.js.map |
@@ -1,1 +0,1 @@ | ||
export declare const SDK_VERSION = "5.0.0"; | ||
export declare const SDK_VERSION = "6.0.0"; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.SDK_VERSION = void 0; | ||
exports.SDK_VERSION = '5.0.0'; | ||
exports.SDK_VERSION = '6.0.0'; | ||
//# sourceMappingURL=sdk-version.js.map |
{ | ||
"name": "@builder.io/sdk", | ||
"version": "5.0.0", | ||
"version": "6.0.0", | ||
"unpkg": "./dist/index.browser.js", | ||
@@ -5,0 +5,0 @@ "main": "./dist/index.cjs.js", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1782495
16942
11