@ms-cloudpack/package-utilities 12.3.18 → 12.3.20

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.
@@ -1,9 +1,9 @@
1
1
  import type { ModuleType } from '@ms-cloudpack/common-types';
2
2
  /** Exported for testing only. */
3
- export declare function detectModuleTypeFromSource(source: string): ModuleType;
3
+ export declare function detectModuleTypeFromSource(source: string): ModuleType | undefined;
4
4
  /**
5
- * Determines if the given file is commonjs or esm.
5
+ * Determines the module type of the given file (undefined means we can't determine).
6
6
  * This will use the extension if it's clear, or if not, it will parse the file.
7
7
  */
8
- export declare function detectModuleType(filePath: string): Promise<ModuleType>;
8
+ export declare function detectModuleType(filePath: string): Promise<ModuleType | undefined>;
9
9
  //# sourceMappingURL=detectModuleType.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detectModuleType.d.ts","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAK7D,iCAAiC;AACjC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CA+GrE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAuB5E"}
1
+ {"version":3,"file":"detectModuleType.d.ts","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAK7D,iCAAiC;AACjC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CA+GjF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAmBxF"}
@@ -109,20 +109,17 @@ export function detectModuleTypeFromSource(source) {
109
109
  return undefined;
110
110
  }
111
111
  /**
112
- * Determines if the given file is commonjs or esm.
112
+ * Determines the module type of the given file (undefined means we can't determine).
113
113
  * This will use the extension if it's clear, or if not, it will parse the file.
114
114
  */
115
115
  export async function detectModuleType(filePath) {
116
- // Check for explicit commonjs or ESM extensions.
116
+ // Check for explicit cjs or esm extensions.
117
117
  const fileExt = path.extname(filePath);
118
118
  if (cjsExtensions.includes(fileExt)) {
119
119
  return 'cjs';
120
120
  }
121
- if (esmExtensions.includes(fileExt)) {
122
- return 'esm';
123
- }
124
- // For typescript files which aren't explicitly cjs, return esm immediately.
125
- if (typescriptExtensions.includes(fileExt)) {
121
+ // For esm extensions or any TS files which aren't explicitly cjs, return esm immediately.
122
+ if (esmExtensions.includes(fileExt) || typescriptExtensions.includes(fileExt)) {
126
123
  return 'esm';
127
124
  }
128
125
  let source;
@@ -1 +1 @@
1
- {"version":3,"file":"detectModuleType.js","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"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","sourcesContent":["import fsPromises from 'fs/promises';\nimport type {\n AssignmentExpression,\n CallExpression,\n Identifier,\n MemberExpression,\n Node,\n Program,\n UnaryExpression,\n} from 'acorn';\nimport { parse } from 'acorn';\nimport { simple as simpleWalk } from 'acorn-walk';\nimport path from 'path';\nimport { javascriptExtensions, typescriptExtensions } from '@ms-cloudpack/path-utilities';\nimport type { ModuleType } from '@ms-cloudpack/common-types';\n\nconst cjsExtensions = [...javascriptExtensions, ...typescriptExtensions].filter((ext) => ext.startsWith('.c'));\nconst esmExtensions = [...javascriptExtensions, ...typescriptExtensions].filter((ext) => ext.startsWith('.m'));\n\n/** Exported for testing only. */\nexport function detectModuleTypeFromSource(source: string): ModuleType {\n let ast: Program;\n\n try {\n ast = parse(source, {\n ecmaVersion: 'latest',\n sourceType: 'module', // Try to parse as a module first.\n });\n } catch {\n // If the parse fails, try again as a script.\n try {\n ast = parse(source, {\n ecmaVersion: 'latest',\n sourceType: 'script', // Parse as a script for CommonJS.\n });\n } catch {\n // If parsing fails again, the code is not valid JavaScript or too complex for a simple parse.\n return undefined;\n }\n }\n\n // Basic check for AMD-style modules.\n const firstNode = ast.body[0];\n if (\n firstNode &&\n firstNode.type === 'ExpressionStatement' &&\n firstNode.expression.type === 'CallExpression' &&\n firstNode.expression.callee.type === 'Identifier' &&\n firstNode.expression.callee.name === 'define'\n ) {\n return 'amd';\n }\n\n let isCJS = false;\n let isESM = false;\n\n const returnESM = (): never => {\n isESM = true;\n throw new Error('Found moduleType.');\n };\n\n const returnCJS = (): void => {\n isCJS = true;\n // Note, we do not throw for CJS and instead parse the full file. Sometimes ESM output can still have checks\n // for CommonJS, and short circuiting too soon might miss ESM syntax.\n };\n\n try {\n simpleWalk(ast, {\n // ESM checks\n ImportDeclaration: returnESM,\n ExportNamedDeclaration: returnESM,\n ExportAllDeclaration: returnESM,\n ExportDefaultDeclaration: returnESM,\n\n // CommonJS checks\n CallExpression(node: Node) {\n if (isCallExpression(node) && node.callee.type === 'Identifier' && node.callee.name === 'require') {\n returnCJS();\n }\n },\n Identifier(node: Node) {\n if (isIdentifier(node) && node.name === 'exports') {\n returnCJS();\n }\n },\n UnaryExpression(node: Node) {\n if (isUnaryExpression(node) && node.operator === 'typeof') {\n const argument = node.argument;\n\n // Handle expressions like `typeof exports`\n if (isIdentifier(argument) && argument.name === 'exports') {\n returnCJS();\n }\n }\n },\n AssignmentExpression(node: Node) {\n if (isAssignmentExpression(node)) {\n const left = node.left;\n // Handle expressions like `module.exports = ...`\n if (isMemberExpression(left)) {\n if (\n 'object' in left &&\n left.object.type === 'Identifier' &&\n left.object.name === 'module' &&\n isIdentifier(left.property) &&\n left.property.name === 'exports'\n ) {\n returnCJS();\n }\n // Handle expressions like `exports.someProperty = ...`\n else if ('object' in left && left.object.type === 'Identifier' && left.object.name === 'exports') {\n returnCJS();\n }\n }\n }\n },\n });\n } catch {\n /* no-op */\n }\n\n if (isESM) {\n // Note: While it's possible for a file to include both styles, we'll prefer ESM if we find it.\n return 'esm';\n } else if (isCJS) {\n return 'cjs';\n }\n\n // We didn't find either.\n return undefined;\n}\n\n/**\n * Determines if the given file is commonjs or esm.\n * This will use the extension if it's clear, or if not, it will parse the file.\n */\nexport async function detectModuleType(filePath: string): Promise<ModuleType> {\n // Check for explicit commonjs or ESM extensions.\n const fileExt = path.extname(filePath);\n if (cjsExtensions.includes(fileExt)) {\n return 'cjs';\n }\n if (esmExtensions.includes(fileExt)) {\n return 'esm';\n }\n\n // For typescript files which aren't explicitly cjs, return esm immediately.\n if (typescriptExtensions.includes(fileExt)) {\n return 'esm';\n }\n\n let source: string;\n try {\n source = (await fsPromises.readFile(filePath, 'utf8')).toString();\n } catch {\n return undefined;\n }\n\n return detectModuleTypeFromSource(source);\n}\n\n/**\n * Type guard for CallExpression.\n */\nfunction isCallExpression(node: Node): node is CallExpression {\n return node.type === 'CallExpression';\n}\n\n/**\n * Type guard for AssignmentExpression.\n */\nfunction isAssignmentExpression(node: Node): node is AssignmentExpression {\n return node.type === 'AssignmentExpression';\n}\n\n/**\n * Type guard for MemberExpression.\n */\nfunction isMemberExpression(node: Node): node is MemberExpression {\n return node.type === 'MemberExpression';\n}\n\n/**\n * Type guard for Identifier.\n */\nfunction isIdentifier(node: Node): node is Identifier {\n return node.type === 'Identifier';\n}\n\n/**\n * Type guard for UnaryExpression.\n */\nfunction isUnaryExpression(node: Node): node is UnaryExpression {\n return node.type === 'UnaryExpression';\n}\n"]}
1
+ {"version":3,"file":"detectModuleType.js","sourceRoot":"","sources":["../src/detectModuleType.ts"],"names":[],"mappings":"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","sourcesContent":["import fsPromises from 'fs/promises';\nimport type {\n AssignmentExpression,\n CallExpression,\n Identifier,\n MemberExpression,\n Node,\n Program,\n UnaryExpression,\n} from 'acorn';\nimport { parse } from 'acorn';\nimport { simple as simpleWalk } from 'acorn-walk';\nimport path from 'path';\nimport { javascriptExtensions, typescriptExtensions } from '@ms-cloudpack/path-utilities';\nimport type { ModuleType } from '@ms-cloudpack/common-types';\n\nconst cjsExtensions = [...javascriptExtensions, ...typescriptExtensions].filter((ext) => ext.startsWith('.c'));\nconst esmExtensions = [...javascriptExtensions, ...typescriptExtensions].filter((ext) => ext.startsWith('.m'));\n\n/** Exported for testing only. */\nexport function detectModuleTypeFromSource(source: string): ModuleType | undefined {\n let ast: Program;\n\n try {\n ast = parse(source, {\n ecmaVersion: 'latest',\n sourceType: 'module', // Try to parse as a module first.\n });\n } catch {\n // If the parse fails, try again as a script.\n try {\n ast = parse(source, {\n ecmaVersion: 'latest',\n sourceType: 'script', // Parse as a script for CommonJS.\n });\n } catch {\n // If parsing fails again, the code is not valid JavaScript or too complex for a simple parse.\n return undefined;\n }\n }\n\n // Basic check for AMD-style modules.\n const firstNode = ast.body[0];\n if (\n firstNode &&\n firstNode.type === 'ExpressionStatement' &&\n firstNode.expression.type === 'CallExpression' &&\n firstNode.expression.callee.type === 'Identifier' &&\n firstNode.expression.callee.name === 'define'\n ) {\n return 'amd';\n }\n\n let isCJS = false;\n let isESM = false;\n\n const returnESM = (): never => {\n isESM = true;\n throw new Error('Found moduleType.');\n };\n\n const returnCJS = (): void => {\n isCJS = true;\n // Note, we do not throw for CJS and instead parse the full file. Sometimes ESM output can still have checks\n // for CommonJS, and short circuiting too soon might miss ESM syntax.\n };\n\n try {\n simpleWalk(ast, {\n // ESM checks\n ImportDeclaration: returnESM,\n ExportNamedDeclaration: returnESM,\n ExportAllDeclaration: returnESM,\n ExportDefaultDeclaration: returnESM,\n\n // CommonJS checks\n CallExpression(node: Node) {\n if (isCallExpression(node) && node.callee.type === 'Identifier' && node.callee.name === 'require') {\n returnCJS();\n }\n },\n Identifier(node: Node) {\n if (isIdentifier(node) && node.name === 'exports') {\n returnCJS();\n }\n },\n UnaryExpression(node: Node) {\n if (isUnaryExpression(node) && node.operator === 'typeof') {\n const argument = node.argument;\n\n // Handle expressions like `typeof exports`\n if (isIdentifier(argument) && argument.name === 'exports') {\n returnCJS();\n }\n }\n },\n AssignmentExpression(node: Node) {\n if (isAssignmentExpression(node)) {\n const left = node.left;\n // Handle expressions like `module.exports = ...`\n if (isMemberExpression(left)) {\n if (\n 'object' in left &&\n left.object.type === 'Identifier' &&\n left.object.name === 'module' &&\n isIdentifier(left.property) &&\n left.property.name === 'exports'\n ) {\n returnCJS();\n }\n // Handle expressions like `exports.someProperty = ...`\n else if ('object' in left && left.object.type === 'Identifier' && left.object.name === 'exports') {\n returnCJS();\n }\n }\n }\n },\n });\n } catch {\n /* no-op */\n }\n\n if (isESM) {\n // Note: While it's possible for a file to include both styles, we'll prefer ESM if we find it.\n return 'esm';\n } else if (isCJS) {\n return 'cjs';\n }\n\n // We didn't find either.\n return undefined;\n}\n\n/**\n * Determines the module type of the given file (undefined means we can't determine).\n * This will use the extension if it's clear, or if not, it will parse the file.\n */\nexport async function detectModuleType(filePath: string): Promise<ModuleType | undefined> {\n // Check for explicit cjs or esm extensions.\n const fileExt = path.extname(filePath);\n if (cjsExtensions.includes(fileExt)) {\n return 'cjs';\n }\n // For esm extensions or any TS files which aren't explicitly cjs, return esm immediately.\n if (esmExtensions.includes(fileExt) || typescriptExtensions.includes(fileExt)) {\n return 'esm';\n }\n\n let source: string;\n try {\n source = (await fsPromises.readFile(filePath, 'utf8')).toString();\n } catch {\n return undefined;\n }\n\n return detectModuleTypeFromSource(source);\n}\n\n/**\n * Type guard for CallExpression.\n */\nfunction isCallExpression(node: Node): node is CallExpression {\n return node.type === 'CallExpression';\n}\n\n/**\n * Type guard for AssignmentExpression.\n */\nfunction isAssignmentExpression(node: Node): node is AssignmentExpression {\n return node.type === 'AssignmentExpression';\n}\n\n/**\n * Type guard for MemberExpression.\n */\nfunction isMemberExpression(node: Node): node is MemberExpression {\n return node.type === 'MemberExpression';\n}\n\n/**\n * Type guard for Identifier.\n */\nfunction isIdentifier(node: Node): node is Identifier {\n return node.type === 'Identifier';\n}\n\n/**\n * Type guard for UnaryExpression.\n */\nfunction isUnaryExpression(node: Node): node is UnaryExpression {\n return node.type === 'UnaryExpression';\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/package-utilities",
3
- "version": "12.3.18",
3
+ "version": "12.3.20",
4
4
  "description": "Utilities for resolving/parsing packages and their imports.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -14,10 +14,10 @@
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "@ms-cloudpack/common-types": "^0.26.2",
17
+ "@ms-cloudpack/common-types": "^0.26.4",
18
18
  "@ms-cloudpack/json-utilities": "^0.1.10",
19
19
  "@ms-cloudpack/path-string-parsing": "^1.2.7",
20
- "@ms-cloudpack/path-utilities": "^3.1.12",
20
+ "@ms-cloudpack/path-utilities": "^3.1.14",
21
21
  "@ms-cloudpack/task-reporter": "^0.17.2",
22
22
  "acorn": "^8.11.2",
23
23
  "acorn-walk": "^8.2.1",