@vercel/python-analysis 0.7.0 → 0.8.0

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.
package/dist/index.cjs CHANGED
@@ -66,8 +66,10 @@ __export(src_exports, {
66
66
  containsAppOrHandler: () => containsAppOrHandler,
67
67
  createMinimalManifest: () => createMinimalManifest,
68
68
  discoverPythonPackage: () => discoverPythonPackage,
69
+ getStringConstant: () => getStringConstant,
69
70
  isPrivatePackageSource: () => isPrivatePackageSource,
70
71
  normalizePackageName: () => normalizePackageName,
72
+ parseDjangoSettingsModule: () => parseDjangoSettingsModule,
71
73
  parseUvLock: () => parseUvLock,
72
74
  scanDistributions: () => scanDistributions,
73
75
  selectPython: () => selectPython,
@@ -123,6 +125,18 @@ async function containsAppOrHandler(source) {
123
125
  const mod = await importWasmModule();
124
126
  return mod.containsAppOrHandler(source);
125
127
  }
128
+ async function getStringConstant(source, name) {
129
+ const mod = await importWasmModule();
130
+ return mod.getStringConstant(source, name) ?? null;
131
+ }
132
+ var DJANGO_SETTINGS_MODULE_PATTERN_RE = /DJANGO_SETTINGS_MODULE/;
133
+ async function parseDjangoSettingsModule(content) {
134
+ if (!DJANGO_SETTINGS_MODULE_PATTERN_RE.test(content)) {
135
+ return null;
136
+ }
137
+ const mod = await importWasmModule();
138
+ return mod.parseDjangoSettingsModule(content) ?? null;
139
+ }
126
140
 
127
141
  // src/manifest/dist-metadata.ts
128
142
  var import_promises2 = require("fs/promises");
@@ -2476,8 +2490,10 @@ var HashDigestSchema = hashDigestSchema;
2476
2490
  containsAppOrHandler,
2477
2491
  createMinimalManifest,
2478
2492
  discoverPythonPackage,
2493
+ getStringConstant,
2479
2494
  isPrivatePackageSource,
2480
2495
  normalizePackageName,
2496
+ parseDjangoSettingsModule,
2481
2497
  parseUvLock,
2482
2498
  scanDistributions,
2483
2499
  selectPython,
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @module @vercel/python-analysis
8
8
  */
9
- export { containsAppOrHandler } from './semantic/entrypoints';
9
+ export { containsAppOrHandler, getStringConstant, parseDjangoSettingsModule, } from './semantic/entrypoints';
10
10
  export type { Distribution, DistributionIndex, PackagePath, DirectUrlInfo, } from './manifest/dist-metadata';
11
11
  export { scanDistributions } from './manifest/dist-metadata';
12
12
  export type { PythonConfig, PythonConfigs, PythonLockFile, PythonManifest, PythonManifestOrigin, PythonPackage, PythonVersionConfig, } from './manifest/package';
package/dist/index.js CHANGED
@@ -46,6 +46,18 @@ async function containsAppOrHandler(source) {
46
46
  const mod = await importWasmModule();
47
47
  return mod.containsAppOrHandler(source);
48
48
  }
49
+ async function getStringConstant(source, name) {
50
+ const mod = await importWasmModule();
51
+ return mod.getStringConstant(source, name) ?? null;
52
+ }
53
+ var DJANGO_SETTINGS_MODULE_PATTERN_RE = /DJANGO_SETTINGS_MODULE/;
54
+ async function parseDjangoSettingsModule(content) {
55
+ if (!DJANGO_SETTINGS_MODULE_PATTERN_RE.test(content)) {
56
+ return null;
57
+ }
58
+ const mod = await importWasmModule();
59
+ return mod.parseDjangoSettingsModule(content) ?? null;
60
+ }
49
61
 
50
62
  // src/manifest/dist-metadata.ts
51
63
  import { readdir, readFile as readFile2 } from "fs/promises";
@@ -2401,8 +2413,10 @@ export {
2401
2413
  containsAppOrHandler,
2402
2414
  createMinimalManifest,
2403
2415
  discoverPythonPackage,
2416
+ getStringConstant,
2404
2417
  isPrivatePackageSource,
2405
2418
  normalizePackageName,
2419
+ parseDjangoSettingsModule,
2406
2420
  parseUvLock,
2407
2421
  scanDistributions,
2408
2422
  selectPython,
@@ -27,3 +27,23 @@
27
27
  * ```
28
28
  */
29
29
  export declare function containsAppOrHandler(source: string): Promise<boolean>;
30
+ /**
31
+ * Extract the string value of a top-level constant with the given name.
32
+ * Only considers simple assignments (NAME = "string") and annotated assignments
33
+ * (NAME: str = "string") at module level. Returns the first matching string
34
+ * value, or null if not found or the value is not a string literal.
35
+ *
36
+ * @param source - Python source code
37
+ * @param name - Constant name (e.g. "VERSION", "APP_NAME")
38
+ * @returns The string value or null
39
+ */
40
+ export declare function getStringConstant(source: string, name: string): Promise<string | null>;
41
+ /**
42
+ * Parse manage.py content for DJANGO_SETTINGS_MODULE (e.g. from
43
+ * os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')).
44
+ * Uses the WASM Python parser to extract the value from the AST.
45
+ *
46
+ * @param content - Raw content of manage.py
47
+ * @returns The settings module string (e.g. 'app.settings') or null if not found
48
+ */
49
+ export declare function parseDjangoSettingsModule(content: string): Promise<string | null>;
@@ -69,6 +69,8 @@ export interface ImportObject {
69
69
  }
70
70
  export interface Root {
71
71
  containsAppOrHandler(source: string): boolean,
72
+ getStringConstant(source: string, name: string): string | undefined,
73
+ parseDjangoSettingsModule(source: string): string | undefined,
72
74
  parseDistMetadata(content: Uint8Array): DistMetadata,
73
75
  parseRecord(content: string): Array<RecordEntry>,
74
76
  parseDirectUrl(content: string): DirectUrlInfo,
@@ -1036,6 +1036,7 @@ let gen = (function* _initGenerator () {
1036
1036
  let postReturn1;
1037
1037
  let postReturn2;
1038
1038
  let postReturn3;
1039
+ let postReturn4;
1039
1040
  function trampoline0(handle) {
1040
1041
  const handleEntry = rscTableRemove(handleTable1, handle);
1041
1042
  if (handleEntry.own) {
@@ -1125,10 +1126,11 @@ let gen = (function* _initGenerator () {
1125
1126
  '7': trampoline5,
1126
1127
  },
1127
1128
  }));
1128
- postReturn0 = exports1['cabi_post_parse-dist-metadata'];
1129
- postReturn1 = exports1['cabi_post_parse-record'];
1130
- postReturn2 = exports1['cabi_post_parse-direct-url'];
1131
- postReturn3 = exports1['cabi_post_normalize-package-name'];
1129
+ postReturn0 = exports1['cabi_post_get-string-constant'];
1130
+ postReturn1 = exports1['cabi_post_parse-dist-metadata'];
1131
+ postReturn2 = exports1['cabi_post_parse-record'];
1132
+ postReturn3 = exports1['cabi_post_parse-direct-url'];
1133
+ postReturn4 = exports1['cabi_post_normalize-package-name'];
1132
1134
  let exports1ContainsAppOrHandler;
1133
1135
 
1134
1136
  function containsAppOrHandler(arg0) {
@@ -1152,6 +1154,100 @@ let gen = (function* _initGenerator () {
1152
1154
  });
1153
1155
  return bool1 == 0 ? false : (bool1 == 1 ? true : throwInvalidBool());
1154
1156
  }
1157
+ let exports1GetStringConstant;
1158
+
1159
+ function getStringConstant(arg0, arg1) {
1160
+ var ptr0 = utf8Encode(arg0, realloc0, memory0);
1161
+ var len0 = utf8EncodedLen;
1162
+ var ptr1 = utf8Encode(arg1, realloc0, memory0);
1163
+ var len1 = utf8EncodedLen;
1164
+ _debugLog('[iface="get-string-constant", function="get-string-constant"][Instruction::CallWasm] enter', {
1165
+ funcName: 'get-string-constant',
1166
+ paramCount: 4,
1167
+ async: false,
1168
+ postReturn: true,
1169
+ });
1170
+ const _wasm_call_currentTaskID = startCurrentTask(0, false, 'exports1GetStringConstant');
1171
+ const ret = exports1GetStringConstant(ptr0, len0, ptr1, len1);
1172
+ endCurrentTask(0);
1173
+ let variant3;
1174
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
1175
+ case 0: {
1176
+ variant3 = undefined;
1177
+ break;
1178
+ }
1179
+ case 1: {
1180
+ var ptr2 = dataView(memory0).getUint32(ret + 4, true);
1181
+ var len2 = dataView(memory0).getUint32(ret + 8, true);
1182
+ var result2 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr2, len2));
1183
+ variant3 = result2;
1184
+ break;
1185
+ }
1186
+ default: {
1187
+ throw new TypeError('invalid variant discriminant for option');
1188
+ }
1189
+ }
1190
+ _debugLog('[iface="get-string-constant", function="get-string-constant"][Instruction::Return]', {
1191
+ funcName: 'get-string-constant',
1192
+ paramCount: 1,
1193
+ async: false,
1194
+ postReturn: true
1195
+ });
1196
+ const retCopy = variant3;
1197
+
1198
+ let cstate = getOrCreateAsyncState(0);
1199
+ cstate.mayLeave = false;
1200
+ postReturn0(ret);
1201
+ cstate.mayLeave = true;
1202
+ return retCopy;
1203
+
1204
+ }
1205
+ let exports1ParseDjangoSettingsModule;
1206
+
1207
+ function parseDjangoSettingsModule(arg0) {
1208
+ var ptr0 = utf8Encode(arg0, realloc0, memory0);
1209
+ var len0 = utf8EncodedLen;
1210
+ _debugLog('[iface="parse-django-settings-module", function="parse-django-settings-module"][Instruction::CallWasm] enter', {
1211
+ funcName: 'parse-django-settings-module',
1212
+ paramCount: 2,
1213
+ async: false,
1214
+ postReturn: true,
1215
+ });
1216
+ const _wasm_call_currentTaskID = startCurrentTask(0, false, 'exports1ParseDjangoSettingsModule');
1217
+ const ret = exports1ParseDjangoSettingsModule(ptr0, len0);
1218
+ endCurrentTask(0);
1219
+ let variant2;
1220
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
1221
+ case 0: {
1222
+ variant2 = undefined;
1223
+ break;
1224
+ }
1225
+ case 1: {
1226
+ var ptr1 = dataView(memory0).getUint32(ret + 4, true);
1227
+ var len1 = dataView(memory0).getUint32(ret + 8, true);
1228
+ var result1 = utf8Decoder.decode(new Uint8Array(memory0.buffer, ptr1, len1));
1229
+ variant2 = result1;
1230
+ break;
1231
+ }
1232
+ default: {
1233
+ throw new TypeError('invalid variant discriminant for option');
1234
+ }
1235
+ }
1236
+ _debugLog('[iface="parse-django-settings-module", function="parse-django-settings-module"][Instruction::Return]', {
1237
+ funcName: 'parse-django-settings-module',
1238
+ paramCount: 1,
1239
+ async: false,
1240
+ postReturn: true
1241
+ });
1242
+ const retCopy = variant2;
1243
+
1244
+ let cstate = getOrCreateAsyncState(0);
1245
+ cstate.mayLeave = false;
1246
+ postReturn0(ret);
1247
+ cstate.mayLeave = true;
1248
+ return retCopy;
1249
+
1250
+ }
1155
1251
  let exports1ParseDistMetadata;
1156
1252
 
1157
1253
  function parseDistMetadata(arg0) {
@@ -1482,7 +1578,7 @@ let gen = (function* _initGenerator () {
1482
1578
 
1483
1579
  let cstate = getOrCreateAsyncState(0);
1484
1580
  cstate.mayLeave = false;
1485
- postReturn0(ret);
1581
+ postReturn1(ret);
1486
1582
  cstate.mayLeave = true;
1487
1583
 
1488
1584
 
@@ -1585,7 +1681,7 @@ let gen = (function* _initGenerator () {
1585
1681
 
1586
1682
  let cstate = getOrCreateAsyncState(0);
1587
1683
  cstate.mayLeave = false;
1588
- postReturn1(ret);
1684
+ postReturn2(ret);
1589
1685
  cstate.mayLeave = true;
1590
1686
 
1591
1687
 
@@ -1745,7 +1841,7 @@ let gen = (function* _initGenerator () {
1745
1841
 
1746
1842
  let cstate = getOrCreateAsyncState(0);
1747
1843
  cstate.mayLeave = false;
1748
- postReturn2(ret);
1844
+ postReturn3(ret);
1749
1845
  cstate.mayLeave = true;
1750
1846
 
1751
1847
 
@@ -1783,18 +1879,20 @@ let gen = (function* _initGenerator () {
1783
1879
 
1784
1880
  let cstate = getOrCreateAsyncState(0);
1785
1881
  cstate.mayLeave = false;
1786
- postReturn3(ret);
1882
+ postReturn4(ret);
1787
1883
  cstate.mayLeave = true;
1788
1884
  return retCopy;
1789
1885
 
1790
1886
  }
1791
1887
  exports1ContainsAppOrHandler = exports1['contains-app-or-handler'];
1888
+ exports1GetStringConstant = exports1['get-string-constant'];
1889
+ exports1ParseDjangoSettingsModule = exports1['parse-django-settings-module'];
1792
1890
  exports1ParseDistMetadata = exports1['parse-dist-metadata'];
1793
1891
  exports1ParseRecord = exports1['parse-record'];
1794
1892
  exports1ParseDirectUrl = exports1['parse-direct-url'];
1795
1893
  exports1NormalizePackageName = exports1['normalize-package-name'];
1796
1894
 
1797
- return { containsAppOrHandler, normalizePackageName, parseDirectUrl, parseDistMetadata, parseRecord, };
1895
+ return { containsAppOrHandler, getStringConstant, normalizePackageName, parseDirectUrl, parseDistMetadata, parseDjangoSettingsModule, parseRecord, };
1798
1896
  })();
1799
1897
  let promise, resolve, reject;
1800
1898
  function runNext (value) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/python-analysis",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "main": "./dist/index.cjs",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",