mirror of
https://github.com/strapi/strapi.git
synced 2025-07-25 18:05:07 +00:00
Merge branch 'master' into releases/v4
This commit is contained in:
commit
a4d3ac34bd
@ -33,8 +33,8 @@
|
|||||||
Strapi is a free and open-source headless CMS delivering your content anywhere you need.
|
Strapi is a free and open-source headless CMS delivering your content anywhere you need.
|
||||||
|
|
||||||
- **Keep control over your data**. With Strapi, you know where your data is stored, and you keep full control at all times.
|
- **Keep control over your data**. With Strapi, you know where your data is stored, and you keep full control at all times.
|
||||||
- **Self-hosted**. You can host and scale Strapi projects the way you want. You can choose any hosting platform you want: AWS, Render, Netlify, Heroku, a VPS, or a dedicated server. You can scale as you grow, 100% independent.
|
- **Self-hosted**. You can host and scale Strapi projects the way you want. You can choose any hosting platform you want: AWS, Render, Heroku, a VPS, or a dedicated server. You can scale as you grow, 100% independent.
|
||||||
- **Database agnostic**. Strapi works with SQL databases. You can choose the database you prefer: PostgreSQL, MySQL, MariaDB, and SQLite.
|
- **Database agnostic**. You can choose the database you prefer. Strapi works with SQL & NoSQL databases: MongoDB, PostgreSQL, MySQL, MariaDB, and SQLite.
|
||||||
- **Customizable**. You can quickly build your logic by fully customizing APIs, routes, or plugins to fit your needs perfectly.
|
- **Customizable**. You can quickly build your logic by fully customizing APIs, routes, or plugins to fit your needs perfectly.
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const { escapeQuery, stringIncludes, stringEquals } = require('../string-formatting');
|
const {
|
||||||
|
escapeQuery,
|
||||||
|
stringIncludes,
|
||||||
|
stringEquals,
|
||||||
|
getCommonBeginning,
|
||||||
|
getCommonPath,
|
||||||
|
} = require('../string-formatting');
|
||||||
|
|
||||||
describe('string-formatting', () => {
|
describe('string-formatting', () => {
|
||||||
describe('Escape Query', () => {
|
describe('Escape Query', () => {
|
||||||
@ -64,4 +70,31 @@ describe('string-formatting', () => {
|
|||||||
expect(result).toBe(expectedResult);
|
expect(result).toBe(expectedResult);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('getCommonBeginning', () => {
|
||||||
|
const tests = [
|
||||||
|
[['abcd', 'abc', 'ab'], 'ab'],
|
||||||
|
[['abcd', 'abc'], 'abc'],
|
||||||
|
[['ab/cd', 'ab/c'], 'ab/c'],
|
||||||
|
[['abc', 'abc'], 'abc'],
|
||||||
|
];
|
||||||
|
test.each(tests)('%p has common beginning: %p', (a, expectedResult) => {
|
||||||
|
const result = getCommonBeginning(...a);
|
||||||
|
expect(result).toBe(expectedResult);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('getCommonPath', () => {
|
||||||
|
const tests = [
|
||||||
|
[['abc', 'ab'], ''],
|
||||||
|
[['http://ab.com/cd', 'http://ab.com/c'], 'http://ab.com'],
|
||||||
|
[['http://ab.com/admin', 'http://ab.com/api'], 'http://ab.com'],
|
||||||
|
[['http://ab.com/admin', 'http://ab.com/admin/'], 'http://ab.com/admin'],
|
||||||
|
[['http://ab.com/admin', 'http://ab.com/admin'], 'http://ab.com/admin'],
|
||||||
|
];
|
||||||
|
test.each(tests)('%p has common path: %p', (a, expectedResult) => {
|
||||||
|
const result = getCommonPath(...a);
|
||||||
|
expect(result).toBe(expectedResult);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
const { getCommonBeginning } = require('./string-formatting');
|
const { getCommonPath } = require('./string-formatting');
|
||||||
|
|
||||||
const getConfigUrls = (serverConfig, forAdminBuild = false) => {
|
const getConfigUrls = (serverConfig, forAdminBuild = false) => {
|
||||||
// Defines serverUrl value
|
// Defines serverUrl value
|
||||||
@ -46,7 +46,7 @@ const getConfigUrls = (serverConfig, forAdminBuild = false) => {
|
|||||||
new URL(adminUrl).origin === new URL(serverUrl).origin &&
|
new URL(adminUrl).origin === new URL(serverUrl).origin &&
|
||||||
!forAdminBuild
|
!forAdminBuild
|
||||||
) {
|
) {
|
||||||
adminPath = adminUrl.replace(getCommonBeginning(serverUrl, adminUrl), '');
|
adminPath = adminUrl.replace(getCommonPath(serverUrl, adminUrl), '');
|
||||||
adminPath = `/${_.trim(adminPath, '/')}`;
|
adminPath = `/${_.trim(adminPath, '/')}`;
|
||||||
} else if (adminUrl.startsWith('http')) {
|
} else if (adminUrl.startsWith('http')) {
|
||||||
adminPath = new URL(adminUrl).pathname;
|
adminPath = new URL(adminUrl).pathname;
|
||||||
|
@ -1,23 +1,22 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
const _ = require('lodash');
|
||||||
const slugify = require('@sindresorhus/slugify');
|
const slugify = require('@sindresorhus/slugify');
|
||||||
|
|
||||||
const nameToSlug = (name, options = { separator: '-' }) => slugify(name, options);
|
const nameToSlug = (name, options = { separator: '-' }) => slugify(name, options);
|
||||||
|
|
||||||
const nameToCollectionName = name => slugify(name, { separator: '_' });
|
const nameToCollectionName = name => slugify(name, { separator: '_' });
|
||||||
|
|
||||||
const getCommonBeginning = (str1 = '', str2 = '') => {
|
const getCommonBeginning = (...strings) =>
|
||||||
let common = '';
|
_.takeWhile(strings[0], (char, index) => strings.every(string => string[index] === char)).join(
|
||||||
let index = 0;
|
''
|
||||||
while (index < str1.length && index < str2.length) {
|
);
|
||||||
if (str1[index] === str2[index]) {
|
|
||||||
common += str1[index];
|
const getCommonPath = (...paths) => {
|
||||||
index += 1;
|
const [segments, ...otherSegments] = paths.map(it => _.split(it, '/'));
|
||||||
} else {
|
return _.join(
|
||||||
break;
|
_.takeWhile(segments, (str, index) => otherSegments.every(it => it[index] === str)),
|
||||||
}
|
'/'
|
||||||
}
|
);
|
||||||
return common;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const escapeQuery = (query, charsToEscape, escapeChar = '\\') => {
|
const escapeQuery = (query, charsToEscape, escapeChar = '\\') => {
|
||||||
@ -39,6 +38,7 @@ module.exports = {
|
|||||||
nameToSlug,
|
nameToSlug,
|
||||||
nameToCollectionName,
|
nameToCollectionName,
|
||||||
getCommonBeginning,
|
getCommonBeginning,
|
||||||
|
getCommonPath,
|
||||||
escapeQuery,
|
escapeQuery,
|
||||||
stringIncludes,
|
stringIncludes,
|
||||||
stringEquals,
|
stringEquals,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user