@teambit/tracker 1.0.1174 → 1.0.1176

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.
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_chai","data","require","_fsExtra","_interopRequireDefault","_path","_legacy","_harmonyTesting","_workspaceTesting","_workspace","_tracker","e","__esModule","default","describe","timeout","workspaces","compWithIgnoredJson","enableTrackAllFiles","workspacePath","configPath","path","join","content","fs","readFileSync","workspaceKey","includes","Error","writeFileSync","replace","setup","files","opts","workspaceData","mockWorkspace","push","trackAllFiles","Object","entries","forEach","filePath","outputFileSync","harmony","loadManyAspects","WorkspaceAspect","TrackerAspect","tracker","get","id","expectToReject","fn","messagePart","err","expect","message","to","have","string","after","Promise","all","map","destroyWorkspace","addedFiles","before","results","addForCLI","componentPaths","override","addedComponents","file","relativePath","it","include","not","main","compWithTsconfig","addWithTsconfigAsMain","compWithGeneratedFile","AUTO_GENERATED_MSG","filesOf"],"sources":["add-components.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { AUTO_GENERATED_MSG } from '@teambit/legacy.constants';\nimport { loadManyAspects } from '@teambit/harmony.testing.load-aspect';\nimport type { WorkspaceData } from '@teambit/workspace.testing.mock-workspace';\nimport { mockWorkspace, destroyWorkspace } from '@teambit/workspace.testing.mock-workspace';\nimport { WorkspaceAspect } from '@teambit/workspace';\nimport { TrackerAspect } from './tracker.aspect';\nimport type { TrackerMain } from './tracker.main.runtime';\n\n/**\n * which files `bit add` ends up tracking. one harmony load stands in for a process per command, so\n * the rules that pick the files are covered here rather than as e2e.\n */\ndescribe('the files bit add tracks', function () {\n this.timeout(0);\n\n const workspaces: WorkspaceData[] = [];\n\n /** a component whose own ignore file hides the .json next to its source */\n const compWithIgnoredJson = {\n 'comp1/index.js': 'module.exports = () => \"comp1\";\\n',\n 'comp1/.bitignore': '*.json\\n',\n 'comp1/hello.json': '{ \"hello\": \"world\" }\\n',\n };\n\n /** the workspace aspect holds the flag, and workspace.jsonc carries comments that JSON.parse rejects */\n function enableTrackAllFiles(workspacePath: string) {\n const configPath = path.join(workspacePath, 'workspace.jsonc');\n const content = fs.readFileSync(configPath, 'utf8');\n const workspaceKey = '\"teambit.workspace/workspace\": {';\n if (!content.includes(workspaceKey)) throw new Error(`\"${workspaceKey}\" is no longer in the mock workspace.jsonc`);\n fs.writeFileSync(configPath, content.replace(workspaceKey, `${workspaceKey}\\n \"trackAllFiles\": true,`));\n }\n\n async function setup(files: Record<string, string>, opts: { trackAllFiles?: boolean } = {}) {\n const workspaceData = mockWorkspace();\n workspaces.push(workspaceData);\n const { workspacePath } = workspaceData;\n if (opts.trackAllFiles) enableTrackAllFiles(workspacePath);\n Object.entries(files).forEach(([filePath, content]) =>\n fs.outputFileSync(path.join(workspacePath, filePath), content)\n );\n const harmony = await loadManyAspects([WorkspaceAspect, TrackerAspect], workspacePath);\n // addForCLI resolves componentPaths and main against the cwd, so the tests pass absolute paths\n return { workspacePath, tracker: harmony.get<TrackerMain>(TrackerAspect.id) };\n }\n\n /** chai has no async throw assertion that also matches a message */\n async function expectToReject(fn: () => Promise<unknown>, messagePart: string) {\n try {\n await fn();\n } catch (err: any) {\n expect(err.message).to.have.string(messagePart);\n return;\n }\n throw new Error(`expected to reject with \"${messagePart}\", but it resolved`);\n }\n\n after(async () => {\n await Promise.all(workspaces.map((workspaceData) => destroyWorkspace(workspaceData)));\n });\n\n describe('the ignore file of the component being added', () => {\n let addedFiles: string[];\n before(async () => {\n const { workspacePath, tracker } = await setup(compWithIgnoredJson);\n const results = await tracker.addForCLI({\n componentPaths: [path.join(workspacePath, 'comp1')],\n id: 'comp1',\n override: false,\n });\n addedFiles = results.addedComponents[0].files.map((file) => file.relativePath);\n });\n it('should apply it at add time, as the rescan does', () => {\n expect(addedFiles).to.include('index.js');\n expect(addedFiles).to.not.include('hello.json');\n });\n it('should keep the ignore file itself, it is a source of the component', () => {\n expect(addedFiles).to.include('.bitignore');\n });\n it('should refuse a main file it excludes, rather than track what the next rescan drops', async () => {\n const { workspacePath, tracker } = await setup(compWithIgnoredJson);\n await expectToReject(\n () =>\n tracker.addForCLI({\n componentPaths: [path.join(workspacePath, 'comp1')],\n id: 'comp1',\n main: path.join(workspacePath, 'comp1/hello.json'),\n override: false,\n }),\n 'was excluded from file list'\n );\n });\n });\n\n describe('a config file bit treats as generated, at the component root', () => {\n const compWithTsconfig = {\n 'comp1/index.js': 'module.exports = () => \"comp1\";\\n',\n 'comp1/tsconfig.json': '{}\\n',\n };\n const addWithTsconfigAsMain = async (trackAllFiles: boolean) => {\n const { workspacePath, tracker } = await setup(compWithTsconfig, { trackAllFiles });\n return tracker.addForCLI({\n componentPaths: [path.join(workspacePath, 'comp1')],\n id: 'comp1',\n main: path.join(workspacePath, 'comp1/tsconfig.json'),\n override: false,\n });\n };\n it('should refuse it as a main file, rather than track what the next rescan drops', async () => {\n // it used to fail further down with \"main file tsconfig.json was removed from <id>\", which\n // sends the user to \"bit remove\" for a component they are adding\n await expectToReject(() => addWithTsconfigAsMain(false), 'was excluded from file list');\n });\n it('should accept it with trackAllFiles on, where the rescan keeps it', async () => {\n const results = await addWithTsconfigAsMain(true);\n expect(results.addedComponents[0].files.map((file) => file.relativePath)).to.include('tsconfig.json');\n });\n });\n\n describe('a file bit generated, which carries its banner', () => {\n const compWithGeneratedFile = {\n 'comp1/index.js': 'module.exports = () => \"comp1\";\\n',\n 'comp1/package.json': `${AUTO_GENERATED_MSG}{ \"name\": \"comp1\" }\\n`,\n };\n const filesOf = async (trackAllFiles: boolean) => {\n const { workspacePath, tracker } = await setup(compWithGeneratedFile, { trackAllFiles });\n const results = await tracker.addForCLI({\n componentPaths: [path.join(workspacePath, 'comp1')],\n id: 'comp1',\n override: false,\n });\n return results.addedComponents[0].files.map((file) => file.relativePath);\n };\n it('should drop it by default, it is not source', async () => {\n expect(await filesOf(false)).to.not.include('package.json');\n });\n it('should keep it with trackAllFiles on, which is what the rescan does', async () => {\n // the rescan never looks at the banner, so dropping it here would leave the two disagreeing:\n // the file is missing from the add, then turns up as a new file on the next status\n expect(await filesOf(true)).to.include('package.json');\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -38,7 +38,7 @@ function determineMainFile(addedComponent, existingComponentMap) {
38
38
  const componentIdStr = addedComponent.componentId.toString();
39
39
  const files = addedComponent.files;
40
40
  const rootDir = existingComponentMap && existingComponentMap.rootDir;
41
- const strategies = [getExistingIfNotChanged, getUserSpecifiedMainFile, onlyOneFileEnteredUseIt, searchForFileNameIndex, searchForSameFileNameAsImmediateDir, searchForAngularEntryPoint];
41
+ const strategies = [getExistingIfNotChanged, getUserSpecifiedMainFile, workspaceRootDefault, onlyOneFileEnteredUseIt, searchForFileNameIndex, searchForSameFileNameAsImmediateDir, searchForAngularEntryPoint];
42
42
  for (const strategy of strategies) {
43
43
  const foundMainFile = strategy();
44
44
  if (foundMainFile) {
@@ -68,6 +68,15 @@ function determineMainFile(addedComponent, existingComponentMap) {
68
68
  }
69
69
  return null;
70
70
  }
71
+ /**
72
+ * the workspace-root component has no entry point of its own. workspace.jsonc, the file that makes
73
+ * the directory a workspace, stands in for it. it comes before the index search on purpose: an
74
+ * index file somewhere in the root's file-set is not the entry point of the workspace.
75
+ */
76
+ function workspaceRootDefault() {
77
+ if ((0, _legacy2().pathNormalizeToLinux)(addedComponent.trackDir) !== _legacy3().WORKSPACE_ROOT_DIR) return null;
78
+ return files.find(file => file.relativePath === _legacy().WORKSPACE_JSONC)?.relativePath;
79
+ }
71
80
  /**
72
81
  * user didn't enter mainFile and the component has only one file, use that file as the main file
73
82
  */
@@ -1 +1 @@
1
- {"version":3,"names":["path","data","_interopRequireWildcard","require","_legacy","_legacy2","_legacy3","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","determineMainFile","addedComponent","existingComponentMap","mainFile","componentIdStr","componentId","toString","files","rootDir","strategies","getExistingIfNotChanged","getUserSpecifiedMainFile","onlyOneFileEnteredUseIt","searchForFileNameIndex","searchForSameFileNameAsImmediateDir","searchForAngularEntryPoint","strategy","foundMainFile","mainFileString","DEFAULT_INDEX_NAME","DEFAULT_INDEX_EXTS","join","MissingMainFile","map","file","normalize","relativePath","_searchMainFile","pathNormalizeToLinux","length","ext","mainFileNameToSearch","searchResult","immediateDir","entryPoint","ANGULAR_BIT_ENTRY_POINT_FILE","baseMainFile","mainFileFromFiles","find","mainFileUsingRootDir","pathJoinLinux","potentialMainFiles","filter","basename","sortByNumOfDirs","a","b","split","DEFAULT_SEPARATOR","sort"],"sources":["determine-main-file.ts"],"sourcesContent":["import * as path from 'path';\n\nimport {\n ANGULAR_BIT_ENTRY_POINT_FILE,\n DEFAULT_INDEX_EXTS,\n DEFAULT_INDEX_NAME,\n DEFAULT_SEPARATOR,\n} from '@teambit/legacy.constants';\nimport type { PathLinux } from '@teambit/legacy.utils';\nimport { pathJoinLinux, pathNormalizeToLinux } from '@teambit/legacy.utils';\nimport type { ComponentMap } from '@teambit/legacy.bit-map';\nimport { MissingMainFile } from '@teambit/legacy.bit-map';\nimport type { AddedComponent } from './add-components';\n\nexport default function determineMainFile(\n addedComponent: AddedComponent,\n existingComponentMap: ComponentMap | null | undefined\n): PathLinux {\n const mainFile = addedComponent.mainFile;\n const componentIdStr = addedComponent.componentId.toString();\n const files = addedComponent.files;\n const rootDir = existingComponentMap && existingComponentMap.rootDir;\n const strategies: Function[] = [\n getExistingIfNotChanged,\n getUserSpecifiedMainFile,\n onlyOneFileEnteredUseIt,\n searchForFileNameIndex,\n searchForSameFileNameAsImmediateDir,\n searchForAngularEntryPoint,\n ];\n\n for (const strategy of strategies) {\n const foundMainFile = strategy();\n if (foundMainFile) {\n return foundMainFile;\n }\n }\n const mainFileString = `${DEFAULT_INDEX_NAME}.[${DEFAULT_INDEX_EXTS.join(', ')}]`;\n throw new MissingMainFile(\n componentIdStr,\n mainFileString,\n files.map((file) => path.normalize(file.relativePath))\n );\n\n /**\n * user didn't enter mainFile but the component already exists with mainFile\n */\n function getExistingIfNotChanged(): PathLinux | null | undefined {\n if (!mainFile && existingComponentMap) {\n return existingComponentMap.mainFile;\n }\n return null;\n }\n /**\n * user entered mainFile => search the mainFile in the files array, throw error if not found\n */\n function getUserSpecifiedMainFile(): PathLinux | null | undefined {\n if (mainFile) {\n const foundMainFile = _searchMainFile(pathNormalizeToLinux(mainFile));\n if (foundMainFile) return foundMainFile;\n throw new MissingMainFile(\n componentIdStr,\n mainFile,\n files.map((file) => path.normalize(file.relativePath))\n );\n }\n return null;\n }\n /**\n * user didn't enter mainFile and the component has only one file, use that file as the main file\n */\n function onlyOneFileEnteredUseIt(): PathLinux | null | undefined {\n if (files.length === 1) {\n return files[0].relativePath;\n }\n return null;\n }\n /**\n * user didn't enter mainFile and the component has multiple files, search for file name \"index\",\n * e.g. `index.js`, `index.css`, etc.\n */\n function searchForFileNameIndex(): PathLinux | null | undefined {\n for (const ext of DEFAULT_INDEX_EXTS) {\n const mainFileNameToSearch = `${DEFAULT_INDEX_NAME}.${ext}`;\n const searchResult = _searchMainFile(mainFileNameToSearch);\n if (searchResult) {\n return searchResult;\n }\n }\n return null;\n }\n /**\n * user didn't enter mainFile and the component has multiple files, search for file with the same\n * name as the directory (see #1714)\n */\n function searchForSameFileNameAsImmediateDir(): PathLinux | null | undefined {\n if (addedComponent.immediateDir) {\n for (const ext of DEFAULT_INDEX_EXTS) {\n const mainFileNameToSearch = `${addedComponent.immediateDir}.${ext}`;\n const searchResult = _searchMainFile(mainFileNameToSearch);\n if (searchResult) {\n return searchResult;\n }\n }\n }\n return null;\n }\n /**\n * The component is an angular component and uses the angular entry point\n */\n function searchForAngularEntryPoint(): PathLinux | null | undefined {\n for (const entryPoint of ANGULAR_BIT_ENTRY_POINT_FILE) {\n const searchResult = _searchMainFile(entryPoint);\n if (searchResult) {\n return searchResult;\n }\n }\n return null;\n }\n\n function _searchMainFile(baseMainFile: PathLinux): PathLinux | null | undefined {\n // search for an exact relative-path\n let mainFileFromFiles = files.find((file) => file.relativePath === baseMainFile);\n if (mainFileFromFiles) return baseMainFile;\n if (rootDir) {\n const mainFileUsingRootDir = files.find((file) => pathJoinLinux(rootDir, file.relativePath) === baseMainFile);\n if (mainFileUsingRootDir) return mainFileUsingRootDir.relativePath;\n }\n // search for a file-name\n const potentialMainFiles = files.filter((file) => path.basename(file.relativePath) === baseMainFile);\n if (!potentialMainFiles.length) return null;\n // when there are several files that met the criteria, choose the closer to the root\n const sortByNumOfDirs = (a, b) =>\n a.relativePath.split(DEFAULT_SEPARATOR).length - b.relativePath.split(DEFAULT_SEPARATOR).length;\n potentialMainFiles.sort(sortByNumOfDirs);\n mainFileFromFiles = potentialMainFiles[0];\n return mainFileFromFiles.relativePath;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["path","data","_interopRequireWildcard","require","_legacy","_legacy2","_legacy3","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","determineMainFile","addedComponent","existingComponentMap","mainFile","componentIdStr","componentId","toString","files","rootDir","strategies","getExistingIfNotChanged","getUserSpecifiedMainFile","workspaceRootDefault","onlyOneFileEnteredUseIt","searchForFileNameIndex","searchForSameFileNameAsImmediateDir","searchForAngularEntryPoint","strategy","foundMainFile","mainFileString","DEFAULT_INDEX_NAME","DEFAULT_INDEX_EXTS","join","MissingMainFile","map","file","normalize","relativePath","_searchMainFile","pathNormalizeToLinux","trackDir","WORKSPACE_ROOT_DIR","find","WORKSPACE_JSONC","length","ext","mainFileNameToSearch","searchResult","immediateDir","entryPoint","ANGULAR_BIT_ENTRY_POINT_FILE","baseMainFile","mainFileFromFiles","mainFileUsingRootDir","pathJoinLinux","potentialMainFiles","filter","basename","sortByNumOfDirs","a","b","split","DEFAULT_SEPARATOR","sort"],"sources":["determine-main-file.ts"],"sourcesContent":["import * as path from 'path';\n\nimport {\n ANGULAR_BIT_ENTRY_POINT_FILE,\n DEFAULT_INDEX_EXTS,\n DEFAULT_INDEX_NAME,\n DEFAULT_SEPARATOR,\n WORKSPACE_JSONC,\n} from '@teambit/legacy.constants';\nimport type { PathLinux } from '@teambit/legacy.utils';\nimport { pathJoinLinux, pathNormalizeToLinux } from '@teambit/legacy.utils';\nimport type { ComponentMap } from '@teambit/legacy.bit-map';\nimport { MissingMainFile, WORKSPACE_ROOT_DIR } from '@teambit/legacy.bit-map';\nimport type { AddedComponent } from './add-components';\n\nexport default function determineMainFile(\n addedComponent: AddedComponent,\n existingComponentMap: ComponentMap | null | undefined\n): PathLinux {\n const mainFile = addedComponent.mainFile;\n const componentIdStr = addedComponent.componentId.toString();\n const files = addedComponent.files;\n const rootDir = existingComponentMap && existingComponentMap.rootDir;\n const strategies: Function[] = [\n getExistingIfNotChanged,\n getUserSpecifiedMainFile,\n workspaceRootDefault,\n onlyOneFileEnteredUseIt,\n searchForFileNameIndex,\n searchForSameFileNameAsImmediateDir,\n searchForAngularEntryPoint,\n ];\n\n for (const strategy of strategies) {\n const foundMainFile = strategy();\n if (foundMainFile) {\n return foundMainFile;\n }\n }\n const mainFileString = `${DEFAULT_INDEX_NAME}.[${DEFAULT_INDEX_EXTS.join(', ')}]`;\n throw new MissingMainFile(\n componentIdStr,\n mainFileString,\n files.map((file) => path.normalize(file.relativePath))\n );\n\n /**\n * user didn't enter mainFile but the component already exists with mainFile\n */\n function getExistingIfNotChanged(): PathLinux | null | undefined {\n if (!mainFile && existingComponentMap) {\n return existingComponentMap.mainFile;\n }\n return null;\n }\n /**\n * user entered mainFile => search the mainFile in the files array, throw error if not found\n */\n function getUserSpecifiedMainFile(): PathLinux | null | undefined {\n if (mainFile) {\n const foundMainFile = _searchMainFile(pathNormalizeToLinux(mainFile));\n if (foundMainFile) return foundMainFile;\n throw new MissingMainFile(\n componentIdStr,\n mainFile,\n files.map((file) => path.normalize(file.relativePath))\n );\n }\n return null;\n }\n /**\n * the workspace-root component has no entry point of its own. workspace.jsonc, the file that makes\n * the directory a workspace, stands in for it. it comes before the index search on purpose: an\n * index file somewhere in the root's file-set is not the entry point of the workspace.\n */\n function workspaceRootDefault(): PathLinux | null | undefined {\n if (pathNormalizeToLinux(addedComponent.trackDir) !== WORKSPACE_ROOT_DIR) return null;\n return files.find((file) => file.relativePath === WORKSPACE_JSONC)?.relativePath;\n }\n /**\n * user didn't enter mainFile and the component has only one file, use that file as the main file\n */\n function onlyOneFileEnteredUseIt(): PathLinux | null | undefined {\n if (files.length === 1) {\n return files[0].relativePath;\n }\n return null;\n }\n /**\n * user didn't enter mainFile and the component has multiple files, search for file name \"index\",\n * e.g. `index.js`, `index.css`, etc.\n */\n function searchForFileNameIndex(): PathLinux | null | undefined {\n for (const ext of DEFAULT_INDEX_EXTS) {\n const mainFileNameToSearch = `${DEFAULT_INDEX_NAME}.${ext}`;\n const searchResult = _searchMainFile(mainFileNameToSearch);\n if (searchResult) {\n return searchResult;\n }\n }\n return null;\n }\n /**\n * user didn't enter mainFile and the component has multiple files, search for file with the same\n * name as the directory (see #1714)\n */\n function searchForSameFileNameAsImmediateDir(): PathLinux | null | undefined {\n if (addedComponent.immediateDir) {\n for (const ext of DEFAULT_INDEX_EXTS) {\n const mainFileNameToSearch = `${addedComponent.immediateDir}.${ext}`;\n const searchResult = _searchMainFile(mainFileNameToSearch);\n if (searchResult) {\n return searchResult;\n }\n }\n }\n return null;\n }\n /**\n * The component is an angular component and uses the angular entry point\n */\n function searchForAngularEntryPoint(): PathLinux | null | undefined {\n for (const entryPoint of ANGULAR_BIT_ENTRY_POINT_FILE) {\n const searchResult = _searchMainFile(entryPoint);\n if (searchResult) {\n return searchResult;\n }\n }\n return null;\n }\n\n function _searchMainFile(baseMainFile: PathLinux): PathLinux | null | undefined {\n // search for an exact relative-path\n let mainFileFromFiles = files.find((file) => file.relativePath === baseMainFile);\n if (mainFileFromFiles) return baseMainFile;\n if (rootDir) {\n const mainFileUsingRootDir = files.find((file) => pathJoinLinux(rootDir, file.relativePath) === baseMainFile);\n if (mainFileUsingRootDir) return mainFileUsingRootDir.relativePath;\n }\n // search for a file-name\n const potentialMainFiles = files.filter((file) => path.basename(file.relativePath) === baseMainFile);\n if (!potentialMainFiles.length) return null;\n // when there are several files that met the criteria, choose the closer to the root\n const sortByNumOfDirs = (a, b) =>\n a.relativePath.split(DEFAULT_SEPARATOR).length - b.relativePath.split(DEFAULT_SEPARATOR).length;\n potentialMainFiles.sort(sortByNumOfDirs);\n mainFileFromFiles = potentialMainFiles[0];\n return mainFileFromFiles.relativePath;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+
3
+ function path() {
4
+ const data = _interopRequireWildcard(require("path"));
5
+ path = function () {
6
+ return data;
7
+ };
8
+ return data;
9
+ }
10
+ function _chai() {
11
+ const data = require("chai");
12
+ _chai = function () {
13
+ return data;
14
+ };
15
+ return data;
16
+ }
17
+ function _componentId() {
18
+ const data = require("@teambit/component-id");
19
+ _componentId = function () {
20
+ return data;
21
+ };
22
+ return data;
23
+ }
24
+ function _legacy() {
25
+ const data = require("@teambit/legacy.constants");
26
+ _legacy = function () {
27
+ return data;
28
+ };
29
+ return data;
30
+ }
31
+ function _legacy2() {
32
+ const data = require("@teambit/legacy.bit-map");
33
+ _legacy2 = function () {
34
+ return data;
35
+ };
36
+ return data;
37
+ }
38
+ function _determineMainFile() {
39
+ const data = _interopRequireDefault(require("./determine-main-file"));
40
+ _determineMainFile = function () {
41
+ return data;
42
+ };
43
+ return data;
44
+ }
45
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
46
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
47
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
48
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
49
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
50
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
51
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
52
+ const createAddedComponent = (overrides = {}) => _objectSpread({
53
+ componentId: _componentId().ComponentID.fromObject({
54
+ name: 'bar/foo'
55
+ }, 'my-scope'),
56
+ files: [],
57
+ mainFile: undefined,
58
+ trackDir: 'bar',
59
+ idFromPath: undefined
60
+ }, overrides);
61
+
62
+ /**
63
+ * the thrown error carries the component-id, the expected main-file pattern and the file list,
64
+ * all assembled separately from the exception type - so assert on them rather than on the class
65
+ * alone, otherwise a regression in any of those details still passes.
66
+ */
67
+ const expectToThrowMissingMainFile = (addedComponent, expectedMainFile, expectedFiles) => {
68
+ let error;
69
+ try {
70
+ (0, _determineMainFile().default)(addedComponent, null);
71
+ } catch (err) {
72
+ error = err;
73
+ }
74
+ (0, _chai().expect)(error).to.be.an.instanceOf(_legacy2().MissingMainFile);
75
+ (0, _chai().expect)(error?.componentId).to.equal('my-scope/bar/foo');
76
+ (0, _chai().expect)(error?.mainFile).to.equal(expectedMainFile);
77
+ (0, _chai().expect)(error?.files).to.deep.equal(expectedFiles.map(file => path().normalize(file)));
78
+ (0, _chai().expect)(error?.message).to.have.string('does not contain a main file');
79
+ (0, _chai().expect)(error?.message).to.have.string('my-scope/bar/foo');
80
+ };
81
+
82
+ // the pattern reported when no strategy matched, e.g. "index.[js, ts, ...]"
83
+ const indexMainFilePattern = `${_legacy().DEFAULT_INDEX_NAME}.[${_legacy().DEFAULT_INDEX_EXTS.join(', ')}]`;
84
+ const toFiles = paths => paths.map(relativePath => ({
85
+ relativePath,
86
+ test: false,
87
+ name: relativePath.split('/').pop()
88
+ }));
89
+ const addedComponentAt = (trackDir, files, mainFile) => ({
90
+ componentId: _componentId().ComponentID.fromObject({
91
+ name: 'comp'
92
+ }, 'my-scope'),
93
+ files: toFiles(files),
94
+ mainFile,
95
+ trackDir,
96
+ idFromPath: null,
97
+ immediateDir: trackDir.split('/').pop()
98
+ });
99
+ describe('determineMainFile', () => {
100
+ describe('user did not specify a main file', () => {
101
+ it('should throw MissingMainFile with the component details when no file matches any strategy', () => {
102
+ const addedComponent = createAddedComponent({
103
+ files: [{
104
+ relativePath: 'bar/foo1.js'
105
+ }, {
106
+ relativePath: 'bar/foo2.js'
107
+ }]
108
+ });
109
+ expectToThrowMissingMainFile(addedComponent, indexMainFilePattern, ['bar/foo1.js', 'bar/foo2.js']);
110
+ });
111
+ it('should use the only file when the component has a single file', () => {
112
+ const addedComponent = createAddedComponent({
113
+ files: [{
114
+ relativePath: 'bar/foo1.js'
115
+ }]
116
+ });
117
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponent, null)).to.equal('bar/foo1.js');
118
+ });
119
+ it('should identify the closest index file as the main file when multiple index files exist', () => {
120
+ const addedComponent = createAddedComponent({
121
+ files: [{
122
+ relativePath: 'bar/exceptions/some-exception.js'
123
+ }, {
124
+ relativePath: 'bar/exceptions/index.js'
125
+ }, {
126
+ relativePath: 'bar/index.js'
127
+ }, {
128
+ relativePath: 'bar/foo.js'
129
+ }]
130
+ });
131
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponent, null)).to.equal('bar/index.js');
132
+ });
133
+ it('should resolve a file with the same name as the immediate directory when no index file exists', () => {
134
+ const addedComponent = createAddedComponent({
135
+ files: [{
136
+ relativePath: 'bar/bar.js'
137
+ }, {
138
+ relativePath: 'bar/foo.js'
139
+ }],
140
+ immediateDir: 'bar'
141
+ });
142
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponent, null)).to.equal('bar/bar.js');
143
+ });
144
+ it('should prefer an index file over a file with the same name as the immediate directory', () => {
145
+ const addedComponent = createAddedComponent({
146
+ files: [{
147
+ relativePath: 'bar/bar.js'
148
+ }, {
149
+ relativePath: 'bar/index.js'
150
+ }],
151
+ immediateDir: 'bar'
152
+ });
153
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponent, null)).to.equal('bar/index.js');
154
+ });
155
+ it('should resolve the angular entry point file', () => {
156
+ const addedComponent = createAddedComponent({
157
+ files: [{
158
+ relativePath: 'bar/public-api.ts'
159
+ }, {
160
+ relativePath: 'bar/foo.ts'
161
+ }]
162
+ });
163
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponent, null)).to.equal('bar/public-api.ts');
164
+ });
165
+ it('should keep the main file of the existing component-map', () => {
166
+ const addedComponent = createAddedComponent({
167
+ files: [{
168
+ relativePath: 'bar/foo1.js'
169
+ }, {
170
+ relativePath: 'bar/foo2.js'
171
+ }]
172
+ });
173
+ // only mainFile and rootDir are read by the strategy, so a partial map is enough here
174
+ const existingComponentMap = {
175
+ mainFile: 'foo2.js',
176
+ rootDir: 'bar'
177
+ };
178
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponent, existingComponentMap)).to.equal('foo2.js');
179
+ });
180
+ });
181
+ describe('user specified a main file', () => {
182
+ it('should use the specified main file when it exists in the files', () => {
183
+ const addedComponent = createAddedComponent({
184
+ files: [{
185
+ relativePath: 'bar/foo1.js'
186
+ }, {
187
+ relativePath: 'bar/foo2.js'
188
+ }],
189
+ mainFile: 'bar/foo2.js'
190
+ });
191
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponent, null)).to.equal('bar/foo2.js');
192
+ });
193
+ it('should throw MissingMainFile with the component details when the specified main file is not in the files', () => {
194
+ const addedComponent = createAddedComponent({
195
+ files: [{
196
+ relativePath: 'bar/foo1.js'
197
+ }, {
198
+ relativePath: 'bar/foo2.js'
199
+ }],
200
+ mainFile: 'non-exist.js'
201
+ });
202
+ // the user's value is reported as-is here, not the index pattern
203
+ expectToThrowMissingMainFile(addedComponent, 'non-exist.js', ['bar/foo1.js', 'bar/foo2.js']);
204
+ });
205
+ });
206
+ describe('the workspace root', () => {
207
+ // an index file at the root and a deeper one: neither is the entry point of a workspace
208
+ const rootFiles = ['.bitmap', 'README.md', 'index.ts', 'scripts/index.js', 'workspace.jsonc'];
209
+ it('should default to workspace.jsonc, over the index files', () => {
210
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponentAt('.', rootFiles), null)).to.equal('workspace.jsonc');
211
+ });
212
+ it('should take the main file the user gave over the default', () => {
213
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponentAt('.', rootFiles, 'README.md'), null)).to.equal('README.md');
214
+ });
215
+ it('should keep the main file of the existing entry when re-tracked without one', () => {
216
+ const existing = {
217
+ rootDir: '.',
218
+ mainFile: 'README.md'
219
+ };
220
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponentAt('.', rootFiles), existing)).to.equal('README.md');
221
+ });
222
+ });
223
+ describe('a regular directory', () => {
224
+ it('should resolve the index file, a workspace.jsonc inside it is a file like any other', () => {
225
+ const files = ['packages/comp1/index.ts', 'packages/comp1/workspace.jsonc'];
226
+ (0, _chai().expect)((0, _determineMainFile().default)(addedComponentAt('packages/comp1', files), null)).to.equal('packages/comp1/index.ts');
227
+ });
228
+ });
229
+ });
230
+
231
+ //# sourceMappingURL=determine-main-file.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["path","data","_interopRequireWildcard","require","_chai","_componentId","_legacy","_legacy2","_determineMainFile","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","createAddedComponent","overrides","componentId","ComponentID","fromObject","name","files","mainFile","undefined","trackDir","idFromPath","expectToThrowMissingMainFile","addedComponent","expectedMainFile","expectedFiles","error","determineMainFile","err","expect","to","be","an","instanceOf","MissingMainFile","equal","deep","map","file","normalize","message","have","string","indexMainFilePattern","DEFAULT_INDEX_NAME","DEFAULT_INDEX_EXTS","join","toFiles","paths","relativePath","test","split","pop","addedComponentAt","immediateDir","describe","it","existingComponentMap","rootDir","rootFiles","existing"],"sources":["determine-main-file.spec.ts"],"sourcesContent":["import * as path from 'path';\nimport { expect } from 'chai';\nimport { ComponentID } from '@teambit/component-id';\nimport { DEFAULT_INDEX_EXTS, DEFAULT_INDEX_NAME } from '@teambit/legacy.constants';\nimport type { ComponentMap, ComponentMapFile } from '@teambit/legacy.bit-map';\nimport { MissingMainFile } from '@teambit/legacy.bit-map';\nimport determineMainFile from './determine-main-file';\nimport type { AddedComponent } from './add-components';\n\nconst createAddedComponent = (overrides: Partial<AddedComponent> = {}): AddedComponent => ({\n componentId: ComponentID.fromObject({ name: 'bar/foo' }, 'my-scope'),\n files: [],\n mainFile: undefined,\n trackDir: 'bar',\n idFromPath: undefined,\n ...overrides,\n});\n\n/**\n * the thrown error carries the component-id, the expected main-file pattern and the file list,\n * all assembled separately from the exception type - so assert on them rather than on the class\n * alone, otherwise a regression in any of those details still passes.\n */\nconst expectToThrowMissingMainFile = (\n addedComponent: AddedComponent,\n expectedMainFile: string,\n expectedFiles: string[]\n) => {\n let error: MissingMainFile | undefined;\n try {\n determineMainFile(addedComponent, null);\n } catch (err: any) {\n error = err;\n }\n expect(error).to.be.an.instanceOf(MissingMainFile);\n expect(error?.componentId).to.equal('my-scope/bar/foo');\n expect(error?.mainFile).to.equal(expectedMainFile);\n expect(error?.files).to.deep.equal(expectedFiles.map((file) => path.normalize(file)));\n expect(error?.message).to.have.string('does not contain a main file');\n expect(error?.message).to.have.string('my-scope/bar/foo');\n};\n\n// the pattern reported when no strategy matched, e.g. \"index.[js, ts, ...]\"\nconst indexMainFilePattern = `${DEFAULT_INDEX_NAME}.[${DEFAULT_INDEX_EXTS.join(', ')}]`;\n\nconst toFiles = (paths: string[]): ComponentMapFile[] =>\n paths.map((relativePath) => ({ relativePath, test: false, name: relativePath.split('/').pop() as string }));\n\nconst addedComponentAt = (trackDir: string, files: string[], mainFile?: string): AddedComponent => ({\n componentId: ComponentID.fromObject({ name: 'comp' }, 'my-scope'),\n files: toFiles(files),\n mainFile,\n trackDir,\n idFromPath: null,\n immediateDir: trackDir.split('/').pop(),\n});\n\ndescribe('determineMainFile', () => {\n describe('user did not specify a main file', () => {\n it('should throw MissingMainFile with the component details when no file matches any strategy', () => {\n const addedComponent = createAddedComponent({\n files: [{ relativePath: 'bar/foo1.js' }, { relativePath: 'bar/foo2.js' }],\n });\n expectToThrowMissingMainFile(addedComponent, indexMainFilePattern, ['bar/foo1.js', 'bar/foo2.js']);\n });\n it('should use the only file when the component has a single file', () => {\n const addedComponent = createAddedComponent({\n files: [{ relativePath: 'bar/foo1.js' }],\n });\n expect(determineMainFile(addedComponent, null)).to.equal('bar/foo1.js');\n });\n it('should identify the closest index file as the main file when multiple index files exist', () => {\n const addedComponent = createAddedComponent({\n files: [\n { relativePath: 'bar/exceptions/some-exception.js' },\n { relativePath: 'bar/exceptions/index.js' },\n { relativePath: 'bar/index.js' },\n { relativePath: 'bar/foo.js' },\n ],\n });\n expect(determineMainFile(addedComponent, null)).to.equal('bar/index.js');\n });\n it('should resolve a file with the same name as the immediate directory when no index file exists', () => {\n const addedComponent = createAddedComponent({\n files: [{ relativePath: 'bar/bar.js' }, { relativePath: 'bar/foo.js' }],\n immediateDir: 'bar',\n });\n expect(determineMainFile(addedComponent, null)).to.equal('bar/bar.js');\n });\n it('should prefer an index file over a file with the same name as the immediate directory', () => {\n const addedComponent = createAddedComponent({\n files: [{ relativePath: 'bar/bar.js' }, { relativePath: 'bar/index.js' }],\n immediateDir: 'bar',\n });\n expect(determineMainFile(addedComponent, null)).to.equal('bar/index.js');\n });\n it('should resolve the angular entry point file', () => {\n const addedComponent = createAddedComponent({\n files: [{ relativePath: 'bar/public-api.ts' }, { relativePath: 'bar/foo.ts' }],\n });\n expect(determineMainFile(addedComponent, null)).to.equal('bar/public-api.ts');\n });\n it('should keep the main file of the existing component-map', () => {\n const addedComponent = createAddedComponent({\n files: [{ relativePath: 'bar/foo1.js' }, { relativePath: 'bar/foo2.js' }],\n });\n // only mainFile and rootDir are read by the strategy, so a partial map is enough here\n const existingComponentMap = { mainFile: 'foo2.js', rootDir: 'bar' } as ComponentMap;\n expect(determineMainFile(addedComponent, existingComponentMap)).to.equal('foo2.js');\n });\n });\n describe('user specified a main file', () => {\n it('should use the specified main file when it exists in the files', () => {\n const addedComponent = createAddedComponent({\n files: [{ relativePath: 'bar/foo1.js' }, { relativePath: 'bar/foo2.js' }],\n mainFile: 'bar/foo2.js',\n });\n expect(determineMainFile(addedComponent, null)).to.equal('bar/foo2.js');\n });\n it('should throw MissingMainFile with the component details when the specified main file is not in the files', () => {\n const addedComponent = createAddedComponent({\n files: [{ relativePath: 'bar/foo1.js' }, { relativePath: 'bar/foo2.js' }],\n mainFile: 'non-exist.js',\n });\n // the user's value is reported as-is here, not the index pattern\n expectToThrowMissingMainFile(addedComponent, 'non-exist.js', ['bar/foo1.js', 'bar/foo2.js']);\n });\n });\n describe('the workspace root', () => {\n // an index file at the root and a deeper one: neither is the entry point of a workspace\n const rootFiles = ['.bitmap', 'README.md', 'index.ts', 'scripts/index.js', 'workspace.jsonc'];\n it('should default to workspace.jsonc, over the index files', () => {\n expect(determineMainFile(addedComponentAt('.', rootFiles), null)).to.equal('workspace.jsonc');\n });\n it('should take the main file the user gave over the default', () => {\n expect(determineMainFile(addedComponentAt('.', rootFiles, 'README.md'), null)).to.equal('README.md');\n });\n it('should keep the main file of the existing entry when re-tracked without one', () => {\n const existing = { rootDir: '.', mainFile: 'README.md' } as ComponentMap;\n expect(determineMainFile(addedComponentAt('.', rootFiles), existing)).to.equal('README.md');\n });\n });\n describe('a regular directory', () => {\n it('should resolve the index file, a workspace.jsonc inside it is a file like any other', () => {\n const files = ['packages/comp1/index.ts', 'packages/comp1/workspace.jsonc'];\n expect(determineMainFile(addedComponentAt('packages/comp1', files), null)).to.equal('packages/comp1/index.ts');\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export {};