feat: manually mirror opencoze's code from bytedance

Change-Id: I09a73aadda978ad9511264a756b2ce51f5761adf
This commit is contained in:
fanlv
2025-07-20 17:36:12 +08:00
commit 890153324f
14811 changed files with 1923430 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2025 coze-dev Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { useLocation } from 'react-router-dom';
import { renderHook } from '@testing-library/react-hooks';
import { useSpaceApp } from '../use-space-app';
vi.mock('react-router-dom', () => ({
useLocation: vi.fn(),
}));
describe('useSpaceApp', () => {
it('should return subpathName as spaceApp when url pattern matches', () => {
const mockLocationArr = [
['/space/123/app1', 'app1'],
['/space/123/app2/123', 'app2'],
];
mockLocationArr.forEach(([pathname, spaceApp]) => {
vi.mocked(useLocation).mockReturnValueOnce({ pathname } as any);
const { result } = renderHook(() => useSpaceApp());
expect(result.current).toEqual(spaceApp);
});
});
it('should return undefined when url pattern not matches', () => {
vi.mocked(useLocation).mockReturnValueOnce({ pathname: '/space' } as any);
const { result } = renderHook(() => useSpaceApp());
expect(result.current).toEqual(undefined);
});
});

View File

@@ -0,0 +1,36 @@
/*
* Copyright 2025 coze-dev Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { useLocation } from 'react-router-dom';
/**
* 从URL上获取工作空间子模块
* @param pathname
* @returns 工作子模块字符串,如果不匹配则返回 undefined
*/
const getSpaceApp = (pathname: string): string | undefined => {
// 以 /space/ 开头,后面跟 spaceId再跟子模块只允许字母、数字、-、_
const match = pathname.match(/^\/space\/[^/]+\/([A-Za-z0-9_-]+)/);
return match ? match[1] : undefined;
};
export const useSpaceApp = () => {
const { pathname } = useLocation();
const spaceApp = getSpaceApp(pathname);
return spaceApp;
};