{"version":3,"file":"helper.test.mjs","names":[],"sources":["../../../src/tests/helper.test.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport os from 'os';\nimport path from 'path';\n\nimport { extractFunctionEntries, flatDep, getDepsFromBundle, isESM, stripEntryResolveExtensions } from '../helper';\n\nimport type { Configuration, DependencyMap, IFile } from '../types';\n\njest.mock('fs-extra');\n\nafterAll(() => {\n  jest.resetAllMocks();\n});\n\ndescribe('extractFunctionEntries', () => {\n  const cwd = process.cwd();\n\n  describe('aws', () => {\n    it('should return entries for handlers which reference files in the working directory', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'file2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'aws', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'file2.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should return entries for handlers which reference directories that contain index files', () => {\n      jest.mocked(fs.existsSync).mockImplementation((fPath) => {\n        return typeof fPath !== 'string' || fPath.endsWith('/index.ts');\n      });\n\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'dir1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'dir2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'aws', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'dir1/index.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'dir2/index.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should return entries for handlers which reference files in folders in the working directory', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'folder/file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'folder/file2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'aws', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'folder/file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'folder/file2.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should return entries for handlers which reference files using a relative path in the working directory', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: './file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: './file2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'aws', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'file2.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should allow resolve extensions custom Swc setting', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: './file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: './file2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'aws', functionDefinitions, ['.custom.ts']);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'file1.custom.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'file2.custom.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should not return entries for handlers which have skipSwc set to true', async () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'file2.handler',\n          skipSwc: true,\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'aws', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n      ]);\n    });\n\n    it('should return entries for handlers on a Windows platform', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      jest.spyOn(path, 'relative').mockReturnValueOnce('src\\\\file1.ts');\n      jest.spyOn(os, 'platform').mockReturnValueOnce('win32');\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'file1.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'aws', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'src/file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n      ]);\n    });\n\n    it('should use swcEntrypoint in priority', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: '/opt/extension/my_custom_handler',\n          swcEntrypoint: 'file1.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'aws', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n      ]);\n    });\n\n    it('should throw an error if the handlers reference a file which does not exist', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(false);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'file2.handler',\n        },\n      };\n\n      expect(() => extractFunctionEntries(cwd, 'aws', functionDefinitions)).toThrow();\n    });\n  });\n\n  describe('azure', () => {\n    it('should return entries for handlers which reference files in the working directory', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'file2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'azure', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'file2.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should return entries for handlers which reference directories that contain index files', () => {\n      jest.mocked(fs.existsSync).mockImplementation((fPath) => {\n        return typeof fPath !== 'string' || fPath.endsWith('/index.ts');\n      });\n\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'dir1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'dir2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'azure', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'dir1/index.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'dir2/index.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should return entries for handlers which reference files in folders in the working directory', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'folder/file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'folder/file2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'azure', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'folder/file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'folder/file2.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should return entries for handlers which reference files using a relative path in the working directory', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: './file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: './file2.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'azure', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n        {\n          entry: 'file2.ts',\n          func: functionDefinitions.function2,\n          functionAlias: 'function2',\n        },\n      ]);\n    });\n\n    it('should return entries for handlers on a Windows platform', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(true);\n      jest.spyOn(path, 'relative').mockReturnValueOnce('src\\\\file1.ts');\n      jest.spyOn(os, 'platform').mockReturnValueOnce('win32');\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'file1.handler',\n        },\n      };\n\n      const fileNames = extractFunctionEntries(cwd, 'azure', functionDefinitions);\n\n      expect(fileNames).toStrictEqual([\n        {\n          entry: 'src/file1.ts',\n          func: functionDefinitions.function1,\n          functionAlias: 'function1',\n        },\n      ]);\n    });\n\n    it('should throw an error if the handlers reference a file which does not exist', () => {\n      jest.mocked(fs.existsSync).mockReturnValue(false);\n      const functionDefinitions = {\n        function1: {\n          events: [],\n          handler: 'file1.handler',\n        },\n        function2: {\n          events: [],\n          handler: 'file2.handler',\n        },\n      };\n\n      expect(() => extractFunctionEntries(cwd, 'azure', functionDefinitions)).toThrow();\n    });\n  });\n});\n\ndescribe('getDepsFromBundle', () => {\n  const inputPath = './';\n\n  describe('require statements', () => {\n    it('should extract deps from a string', () => {\n      jest.mocked(fs).readFileSync.mockReturnValue(`\n        require(\"@scope/package1\");\n        require(\"package2\");\n        function req3() {\n          return require('package3');\n        }\n      `);\n      expect(getDepsFromBundle(inputPath, false)).toStrictEqual(['@scope/package1', 'package2', 'package3']);\n    });\n\n    it('should extract the base dep from a string', () => {\n      jest\n        .mocked(fs)\n        .readFileSync.mockReturnValue(\n          'require(\"@scope/package1/subpath\");require(\"package2/subpath\");require(\"@scope/package3/subpath/subpath\");require(\"package4/subpath/subpath\")'\n        );\n      expect(getDepsFromBundle(inputPath, false)).toStrictEqual([\n        '@scope/package1',\n        'package2',\n        '@scope/package3',\n        'package4',\n      ]);\n    });\n\n    it('should remove duplicate package requires', () => {\n      jest\n        .mocked(fs)\n        .readFileSync.mockReturnValue('require(\"package1/subpath\");require(\"package1\");require(\"package1\")');\n      expect(getDepsFromBundle(inputPath, false)).toStrictEqual(['package1']);\n    });\n  });\n\n  describe('import statements', () => {\n    it('should extract deps from a string', () => {\n      jest.mocked(fs).readFileSync.mockReturnValue(\n        `\n        import * as n from \"package1\";\n        import \"package2\";\n        import {hello as r} from \"package3\";\n\n        function dynamicImport() {\n          return import('package4');\n        }\n        `\n      );\n      expect(getDepsFromBundle(inputPath, true)).toStrictEqual(['package1', 'package2', 'package3', 'package4']);\n    });\n\n    it('should extract deps from a minified string', () => {\n      jest\n        .mocked(fs)\n        .readFileSync.mockReturnValue('import*as n from\"package1\";import\"package2\";import{hello as r}from\"package3\";');\n      expect(getDepsFromBundle(inputPath, true)).toStrictEqual(['package1', 'package2', 'package3']);\n    });\n  });\n});\n\ndescribe('isESM', () => {\n  it('should return true when outputFileExtension is set to .mjs', () => {\n    const config = {\n      outputFileExtension: '.mjs',\n    } as Partial<Configuration> as Configuration;\n\n    expect(isESM(config)).toBe(true);\n  });\n\n  it('should return true when outputFileExtension is .mjs and format is not set', () => {\n    const config = {\n      outputFileExtension: '.mjs',\n    } as Partial<Configuration> as Configuration;\n\n    expect(isESM(config)).toBe(true);\n  });\n\n  it('should return false when outputFileExtension is .js', () => {\n    const config = {\n      outputFileExtension: '.js',\n    } as Partial<Configuration> as Configuration;\n\n    expect(isESM(config)).toBe(false);\n  });\n});\n\ndescribe('flatDeps', () => {\n  describe('basic', () => {\n    it('should pull all the dependencies from samchungy-a and samchungy-b', () => {\n      const depMap: DependencyMap = {\n        'samchungy-a': {\n          dependencies: {\n            'samchungy-dep-a': {\n              isRootDep: true,\n              version: '1.0.0',\n            },\n          },\n          version: '2.0.0',\n        },\n        'samchungy-b': {\n          dependencies: {\n            'samchungy-dep-a': {\n              version: '2.0.0',\n            },\n          },\n          version: '2.0.0',\n        },\n        'samchungy-dep-a': {\n          version: '1.0.0',\n        },\n      };\n\n      const expectedResult: string[] = ['samchungy-a', 'samchungy-dep-a', 'samchungy-b'];\n\n      const result = flatDep(depMap, ['samchungy-a', 'samchungy-b']);\n\n      expect(result).toStrictEqual(expectedResult);\n    });\n\n    it('should pull only the dependencies of samchungy-b', () => {\n      const depMap: DependencyMap = {\n        'samchungy-a': {\n          dependencies: {\n            'samchungy-dep-a': {\n              isRootDep: true,\n              version: '1.0.0',\n            },\n          },\n          version: '2.0.0',\n        },\n        'samchungy-b': {\n          dependencies: {\n            'samchungy-dep-a': {\n              version: '2.0.0',\n            },\n          },\n          version: '2.0.0',\n        },\n        'samchungy-dep-a': {\n          version: '1.0.0',\n        },\n      };\n\n      const expectedResult: string[] = ['samchungy-b'];\n\n      const result = flatDep(depMap, ['samchungy-b']);\n\n      expect(result).toStrictEqual(expectedResult);\n    });\n  });\n\n  describe('deduped', () => {\n    it('should pull all the dependencies from samchungy-a and samchungy-b', () => {\n      const depMap: DependencyMap = {\n        'samchungy-a': {\n          version: '3.0.0',\n          dependencies: {\n            'samchungy-dep-b': { version: '3.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-b': {\n          version: '5.0.0',\n          dependencies: {\n            'samchungy-dep-b': { version: '3.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-dep-b': {\n          version: '3.0.0',\n          dependencies: {\n            'samchungy-dep-c': { version: '^1.0.0', isRootDep: true },\n            'samchungy-dep-d': { version: '^1.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-dep-c': {\n          version: '1.0.0',\n          dependencies: {\n            'samchungy-dep-e': { version: '^1.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-dep-d': {\n          version: '1.0.0',\n          dependencies: {\n            'samchungy-dep-e': { version: '^1.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-dep-e': { version: '1.0.0' },\n      };\n\n      const expectedResult: string[] = [\n        'samchungy-a',\n        'samchungy-dep-b',\n        'samchungy-dep-c',\n        'samchungy-dep-e',\n        'samchungy-dep-d',\n        'samchungy-b',\n      ];\n\n      const result = flatDep(depMap, ['samchungy-a', 'samchungy-b']);\n\n      expect(result).toStrictEqual(expectedResult);\n    });\n\n    it('should pull only the dependencies from samchungy-a', () => {\n      const depMap: DependencyMap = {\n        'samchungy-a': {\n          version: '3.0.0',\n          dependencies: {\n            'samchungy-dep-b': { version: '3.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-b': {\n          version: '5.0.0',\n          dependencies: {\n            'samchungy-dep-b': { version: '3.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-dep-b': {\n          version: '3.0.0',\n          dependencies: {\n            'samchungy-dep-c': { version: '^1.0.0', isRootDep: true },\n            'samchungy-dep-d': { version: '^1.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-dep-c': {\n          version: '1.0.0',\n          dependencies: {\n            'samchungy-dep-e': { version: '^1.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-dep-d': {\n          version: '1.0.0',\n          dependencies: {\n            'samchungy-dep-e': { version: '^1.0.0', isRootDep: true },\n          },\n        },\n        'samchungy-dep-e': { version: '1.0.0' },\n      };\n\n      const expectedResult: string[] = [\n        'samchungy-a',\n        'samchungy-dep-b',\n        'samchungy-dep-c',\n        'samchungy-dep-e',\n        'samchungy-dep-d',\n        'samchungy-b',\n      ];\n\n      const result = flatDep(depMap, ['samchungy-a', 'samchungy-b']);\n\n      expect(result).toStrictEqual(expectedResult);\n    });\n  });\n});\n\ndescribe('stripEntryResolveExtensions', () => {\n  it('should remove custom extension prefixes', () => {\n    const result = stripEntryResolveExtensions({ localPath: 'test.custom.js' } as IFile, ['.custom.js']);\n    expect(result.localPath).toEqual('test.js');\n  });\n\n  it('should ignore prefixes not inside the resolve extensions list', () => {\n    const result = stripEntryResolveExtensions({ localPath: 'test.other.js' } as IFile, ['.custom.js']);\n    expect(result.localPath).toEqual('test.other.js');\n  });\n});\n"],"mappings":"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"}