@mcpmake/core 0.2.3 → 0.2.5

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.
Files changed (105) hide show
  1. package/dist/analyzer/dom-parser.d.ts +7 -0
  2. package/dist/analyzer/dom-parser.d.ts.map +1 -1
  3. package/dist/analyzer/dom-parser.js +31 -5
  4. package/dist/analyzer/dom-parser.js.map +1 -1
  5. package/dist/analyzer/goal-crawler.d.ts.map +1 -1
  6. package/dist/analyzer/goal-crawler.js +3 -2
  7. package/dist/analyzer/goal-crawler.js.map +1 -1
  8. package/dist/analyzer/semantic-analyzer.d.ts.map +1 -1
  9. package/dist/analyzer/semantic-analyzer.js +3 -2
  10. package/dist/analyzer/semantic-analyzer.js.map +1 -1
  11. package/dist/analyzer/site-crawler.d.ts.map +1 -1
  12. package/dist/analyzer/site-crawler.js +40 -8
  13. package/dist/analyzer/site-crawler.js.map +1 -1
  14. package/dist/emitter/index.d.ts.map +1 -1
  15. package/dist/emitter/index.js +113 -6
  16. package/dist/emitter/index.js.map +1 -1
  17. package/dist/emitter/project-scaffolder.d.ts +13 -0
  18. package/dist/emitter/project-scaffolder.d.ts.map +1 -1
  19. package/dist/emitter/project-scaffolder.js +29 -0
  20. package/dist/emitter/project-scaffolder.js.map +1 -1
  21. package/dist/emitter/python-template-loader.d.ts.map +1 -1
  22. package/dist/emitter/python-template-loader.js +10 -0
  23. package/dist/emitter/python-template-loader.js.map +1 -1
  24. package/dist/emitter/python-templates/server.py.hbs +78 -8
  25. package/dist/emitter/site-templates/browser-manager.ts.hbs +81 -32
  26. package/dist/emitter/site-templates/server-main-http.ts.hbs +25 -7
  27. package/dist/emitter/site-templates/tool-handler-form.ts.hbs +10 -8
  28. package/dist/emitter/template-loader.d.ts.map +1 -1
  29. package/dist/emitter/template-loader.js +9 -0
  30. package/dist/emitter/template-loader.js.map +1 -1
  31. package/dist/emitter/templates/auth-provider.ts.hbs +81 -20
  32. package/dist/emitter/templates/config.ts.hbs +7 -0
  33. package/dist/emitter/templates/env.example.hbs +6 -0
  34. package/dist/emitter/templates/http-executor.ts.hbs +150 -7
  35. package/dist/emitter/templates/server-main-http.ts.hbs +60 -4
  36. package/dist/emitter/templates/tool-handler.ts.hbs +37 -2
  37. package/dist/emitter/templates/tool-test.ts.hbs +9 -1
  38. package/dist/emitter/worker-templates/config.ts.hbs +7 -0
  39. package/dist/emitter/worker-templates/tool-handler.ts.hbs +37 -2
  40. package/dist/emitter/worker-templates/worker.ts.hbs +33 -2
  41. package/dist/generator/spec-generator.d.ts.map +1 -1
  42. package/dist/generator/spec-generator.js +44 -5
  43. package/dist/generator/spec-generator.js.map +1 -1
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/parser/operation-extractor.d.ts.map +1 -1
  49. package/dist/parser/operation-extractor.js +12 -1
  50. package/dist/parser/operation-extractor.js.map +1 -1
  51. package/dist/parser/overlay-loader.d.ts.map +1 -1
  52. package/dist/parser/overlay-loader.js +11 -2
  53. package/dist/parser/overlay-loader.js.map +1 -1
  54. package/dist/parser/schema-converter.d.ts +13 -2
  55. package/dist/parser/schema-converter.d.ts.map +1 -1
  56. package/dist/parser/schema-converter.js +30 -19
  57. package/dist/parser/schema-converter.js.map +1 -1
  58. package/dist/pricing.d.ts +5 -1
  59. package/dist/pricing.d.ts.map +1 -1
  60. package/dist/pricing.js +7 -3
  61. package/dist/pricing.js.map +1 -1
  62. package/dist/providers/index.d.ts.map +1 -1
  63. package/dist/providers/index.js +6 -21
  64. package/dist/providers/index.js.map +1 -1
  65. package/dist/recorder/browser-recorder.d.ts.map +1 -1
  66. package/dist/recorder/browser-recorder.js +39 -7
  67. package/dist/recorder/browser-recorder.js.map +1 -1
  68. package/dist/site-transformer/selector-healer.d.ts.map +1 -1
  69. package/dist/site-transformer/selector-healer.js +2 -1
  70. package/dist/site-transformer/selector-healer.js.map +1 -1
  71. package/dist/site-transformer/tool-generator.d.ts.map +1 -1
  72. package/dist/site-transformer/tool-generator.js +90 -22
  73. package/dist/site-transformer/tool-generator.js.map +1 -1
  74. package/dist/transformer/auth-detector.d.ts.map +1 -1
  75. package/dist/transformer/auth-detector.js +11 -4
  76. package/dist/transformer/auth-detector.js.map +1 -1
  77. package/dist/transformer/llm-namer.d.ts.map +1 -1
  78. package/dist/transformer/llm-namer.js +35 -10
  79. package/dist/transformer/llm-namer.js.map +1 -1
  80. package/dist/transformer/naming.d.ts.map +1 -1
  81. package/dist/transformer/naming.js +17 -9
  82. package/dist/transformer/naming.js.map +1 -1
  83. package/dist/transformer/resource-builder.d.ts.map +1 -1
  84. package/dist/transformer/resource-builder.js +13 -6
  85. package/dist/transformer/resource-builder.js.map +1 -1
  86. package/dist/transformer/stainless-translator.d.ts +6 -0
  87. package/dist/transformer/stainless-translator.d.ts.map +1 -1
  88. package/dist/transformer/stainless-translator.js +18 -1
  89. package/dist/transformer/stainless-translator.js.map +1 -1
  90. package/dist/transformer/tool-builder.d.ts.map +1 -1
  91. package/dist/transformer/tool-builder.js +111 -13
  92. package/dist/transformer/tool-builder.js.map +1 -1
  93. package/dist/types/index.d.ts +72 -0
  94. package/dist/types/index.d.ts.map +1 -1
  95. package/dist/types/site.d.ts +19 -1
  96. package/dist/types/site.d.ts.map +1 -1
  97. package/dist/utils/model-resolver.d.ts +21 -0
  98. package/dist/utils/model-resolver.d.ts.map +1 -0
  99. package/dist/utils/model-resolver.js +64 -0
  100. package/dist/utils/model-resolver.js.map +1 -0
  101. package/dist/utils/sanitize.d.ts +62 -0
  102. package/dist/utils/sanitize.d.ts.map +1 -1
  103. package/dist/utils/sanitize.js +141 -0
  104. package/dist/utils/sanitize.js.map +1 -1
  105. package/package.json +1 -1
@@ -20,6 +20,14 @@ export interface SelectorSet {
20
20
  humanLabel?: string;
21
21
  }
22
22
  export type FormFieldType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'select' | 'checkbox' | 'radio' | 'textarea' | 'hidden' | 'file' | 'date' | 'datetime-local' | 'color' | 'range' | 'other';
23
+ /** A single <option> from a <select>, preserving both the user-visible label
24
+ * and the wire value submitted to the server (they routinely differ). */
25
+ export interface SelectOption {
26
+ /** Visible option text shown to the user */
27
+ label: string;
28
+ /** Value attribute actually submitted / matched by Playwright's selectOption */
29
+ value: string;
30
+ }
23
31
  export interface FormFieldDescriptor {
24
32
  /** Form field name attribute */
25
33
  name: string;
@@ -33,10 +41,20 @@ export interface FormFieldDescriptor {
33
41
  placeholder?: string;
34
42
  /** Whether the field is required */
35
43
  required: boolean;
36
- /** Options for <select>, radio groups, and datalists */
44
+ /** Options for <select>, radio groups, and datalists (visible labels). */
37
45
  options?: string[];
46
+ /** Option label/value pairs for <select> fields (value drives Playwright). */
47
+ optionPairs?: SelectOption[];
38
48
  /** Default or current value */
39
49
  defaultValue?: string;
50
+ /**
51
+ * Stable, deduplicated MCP input key for this field. Derived from `name`
52
+ * but guaranteed to be a valid, unique JS identifier within the form so the
53
+ * generated schema property and the generated handler agree on one key. The
54
+ * handler still drives the DOM via `selector`, so the original `name` is not
55
+ * needed at fill time. Set by the site tool-generator.
56
+ */
57
+ inputKey?: string;
40
58
  }
41
59
  export interface FormDescriptor {
42
60
  /** Generated stable ID for this form */
@@ -1 +1 @@
1
- {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../../src/types/site.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../../src/types/site.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type Anthropic from '@anthropic-ai/sdk';
2
+ /**
3
+ * Model tiers used across the generator. Each maps to a preferred undated alias
4
+ * plus a name pattern used to auto-pick a replacement if that alias is ever
5
+ * retired.
6
+ */
7
+ export type ModelTier = 'balanced' | 'fast';
8
+ /**
9
+ * Resolve a usable model id for a tier against the live Models API, so a retired
10
+ * model id can never silently 404 the way a hardcoded snapshot does.
11
+ *
12
+ * Resolution order:
13
+ * 1. An explicit `override` (e.g. a `--model` CLI flag) wins, unchecked — the
14
+ * caller knows what they want, and a bad id surfaces as a clear API error
15
+ * rather than being second-guessed here.
16
+ * 2. The tier's preferred alias, **if** the Models API lists it.
17
+ * 3. Otherwise the newest served model whose id/name matches the tier.
18
+ * 4. If the Models API can't be reached, the preferred alias as a last resort.
19
+ */
20
+ export declare function resolveModel(client: Anthropic, tier: ModelTier, override?: string): Promise<string>;
21
+ //# sourceMappingURL=model-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/model-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAG/C;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAqB5C;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
@@ -0,0 +1,64 @@
1
+ import { logger } from './logger.js';
2
+ /**
3
+ * Preferred (undated) alias per tier. Undated aliases track the latest snapshot,
4
+ * but a whole family can still be retired — so the alias is only used when the
5
+ * live Models API confirms it exists (see {@link resolveModel}).
6
+ */
7
+ const PREFERRED = {
8
+ balanced: 'claude-sonnet-4-6',
9
+ fast: 'claude-haiku-4-5',
10
+ };
11
+ const TIER_PATTERN = {
12
+ balanced: /sonnet/i,
13
+ fast: /haiku/i,
14
+ };
15
+ // Resolved once per tier per process: the served-model list rarely changes
16
+ // mid-run, and we don't want a Models API round-trip before every call.
17
+ const cache = new Map();
18
+ /**
19
+ * Resolve a usable model id for a tier against the live Models API, so a retired
20
+ * model id can never silently 404 the way a hardcoded snapshot does.
21
+ *
22
+ * Resolution order:
23
+ * 1. An explicit `override` (e.g. a `--model` CLI flag) wins, unchecked — the
24
+ * caller knows what they want, and a bad id surfaces as a clear API error
25
+ * rather than being second-guessed here.
26
+ * 2. The tier's preferred alias, **if** the Models API lists it.
27
+ * 3. Otherwise the newest served model whose id/name matches the tier.
28
+ * 4. If the Models API can't be reached, the preferred alias as a last resort.
29
+ */
30
+ export async function resolveModel(client, tier, override) {
31
+ if (override)
32
+ return override;
33
+ const cached = cache.get(tier);
34
+ if (cached)
35
+ return cached;
36
+ const preferred = PREFERRED[tier];
37
+ let choice = preferred;
38
+ try {
39
+ const models = [];
40
+ for await (const m of client.models.list()) {
41
+ models.push({ id: m.id, display_name: m.display_name, created_at: m.created_at });
42
+ }
43
+ if (!models.some((m) => m.id === preferred)) {
44
+ const pattern = TIER_PATTERN[tier];
45
+ const newest = models
46
+ .filter((m) => pattern.test(m.id) || pattern.test(m.display_name))
47
+ // RFC 3339 timestamps sort correctly as strings (ISO 8601, newest last).
48
+ .sort((a, b) => b.created_at.localeCompare(a.created_at))[0];
49
+ if (newest) {
50
+ logger.warn(`Preferred model "${preferred}" unavailable; using "${newest.id}"`);
51
+ choice = newest.id;
52
+ }
53
+ else {
54
+ logger.warn(`Preferred model "${preferred}" unavailable and no ${tier} model found; trying it anyway`);
55
+ }
56
+ }
57
+ }
58
+ catch (err) {
59
+ logger.warn(`Could not list models (${err instanceof Error ? err.message : err}); using "${preferred}"`);
60
+ }
61
+ cache.set(tier, choice);
62
+ return choice;
63
+ }
64
+ //# sourceMappingURL=model-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/utils/model-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AASrC;;;;GAIG;AACH,MAAM,SAAS,GAA8B;IAC3C,QAAQ,EAAE,mBAAmB;IAC7B,IAAI,EAAE,kBAAkB;CACzB,CAAC;AAEF,MAAM,YAAY,GAA8B;IAC9C,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,QAAQ;CACf,CAAC;AAEF,2EAA2E;AAC3E,wEAAwE;AACxE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAiB,EACjB,IAAe,EACf,QAAiB;IAEjB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,SAAS,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,MAAM,GAA+D,EAAE,CAAC;QAC9E,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAClE,yEAAyE;iBACxE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,oBAAoB,SAAS,yBAAyB,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;gBAChF,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CACT,oBAAoB,SAAS,wBAAwB,IAAI,gCAAgC,CAC1F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CACT,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,aAAa,SAAS,GAAG,CAC5F,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -13,6 +13,68 @@ export declare function escapeTemplateLiteral(str: string): string;
13
13
  * Strips anything that isn't alphanumeric, underscore, or hyphen.
14
14
  */
15
15
  export declare function sanitizeIdentifier(str: string): string;
16
+ /**
17
+ * Sanitize an HTTP header name (e.g. an apiKey scheme `name`) for safe embedding
18
+ * in a string literal. Real header names are RFC 7230 tokens; in practice API
19
+ * key headers are `[A-Za-z0-9-]` (plus `_`). Stripping everything else removes
20
+ * quotes/backticks/newlines that could break out of the generated literal.
21
+ */
22
+ export declare function sanitizeHeaderName(str: string): string;
23
+ /**
24
+ * Sanitize an environment-variable name. It is emitted both as a quoted string
25
+ * and as a bare member access (`process.env.<NAME>` / `env.<NAME>`), so it must
26
+ * be a valid JS/POSIX identifier. Strips invalid chars and prefixes `_` when the
27
+ * result would start with a digit or be empty.
28
+ */
29
+ export declare function sanitizeEnvVarName(str: string): string;
30
+ /**
31
+ * Resolve OpenAPI server-variable placeholders (`{var}`) in a server URL from
32
+ * their declared defaults, then validate the result is a real http(s) URL.
33
+ *
34
+ * OpenAPI server URLs may carry variables — `https://{region}.api.test/{version}`
35
+ * — with a `variables` map giving each a `default`. Substituting them here keeps
36
+ * the URL semantically intact instead of stripping the braces (which would corrupt
37
+ * the path, e.g. `{version}` → empty). Variables without a known default are left
38
+ * as-is; the subsequent per-sink escaper neutralizes any residual unsafe chars.
39
+ */
40
+ export declare function resolveServerUrl(url: string, variables?: Record<string, {
41
+ default?: string;
42
+ } | undefined>): string;
43
+ /**
44
+ * Escape a base URL for safe embedding in a string literal across multiple
45
+ * target languages without mutating its semantics. Unlike a strip-based
46
+ * approach, this preserves every character that is legal in a URL (including
47
+ * `$`, `{`, `}`, `~`, etc. that appear in real paths such as `/v1/$metadata`)
48
+ * and only neutralizes the characters that could break out of, or inject into,
49
+ * the literal it is embedded in:
50
+ * - backslash, single/double quote, backtick → backslash-escaped
51
+ * - `${` (TS template-literal interpolation) → broken with a backslash
52
+ * - CR/LF (could inject extra dotenv/TOML lines) → backslash-escaped
53
+ * The same escaped form is safe in a TS single/double-quote string, a TS
54
+ * backtick literal, a Python double-quote string, a TOML basic string, and a
55
+ * single-line dotenv value. Validation/variable-resolution happens upstream in
56
+ * the emitter via {@link resolveServerUrl}.
57
+ */
58
+ export declare function sanitizeUrlLiteral(str: string): string;
59
+ /**
60
+ * Validate a request-body media type against the RFC media-type grammar
61
+ * (`type/subtype`, optional parameters). The OpenAPI `content` map key is
62
+ * attacker-influenced and is interpolated into a string literal, so a value
63
+ * that is not a well-formed media type is replaced with `application/json`
64
+ * (the universal safe default) rather than trusted. The returned value is
65
+ * still escaped at the literal sink by {@link escapeStringLiteral}.
66
+ */
67
+ export declare function sanitizeMediaType(str: string): string;
68
+ /**
69
+ * Escape a string for safe embedding in a double-quoted Python string literal.
70
+ * Escapes backslashes, double quotes, and newlines.
71
+ */
72
+ export declare function escapePyString(str: string): string;
73
+ /**
74
+ * Convert an arbitrary parameter name into a valid, non-keyword Python
75
+ * identifier for use as a function argument or local variable name.
76
+ */
77
+ export declare function sanitizePyIdentifier(str: string): string;
16
78
  /**
17
79
  * Validate that a URL path template contains only safe characters.
18
80
  * Allows: alphanumeric, /, {, }, -, _, .
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,GAC3D,MAAM,CAUR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAStD;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlD;AA0CD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKpD;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD"}
@@ -19,6 +19,147 @@ export function escapeTemplateLiteral(str) {
19
19
  export function sanitizeIdentifier(str) {
20
20
  return str.replace(/[^a-zA-Z0-9_\-]/g, '');
21
21
  }
22
+ /**
23
+ * Sanitize an HTTP header name (e.g. an apiKey scheme `name`) for safe embedding
24
+ * in a string literal. Real header names are RFC 7230 tokens; in practice API
25
+ * key headers are `[A-Za-z0-9-]` (plus `_`). Stripping everything else removes
26
+ * quotes/backticks/newlines that could break out of the generated literal.
27
+ */
28
+ export function sanitizeHeaderName(str) {
29
+ return str.replace(/[^A-Za-z0-9_\-]/g, '');
30
+ }
31
+ /**
32
+ * Sanitize an environment-variable name. It is emitted both as a quoted string
33
+ * and as a bare member access (`process.env.<NAME>` / `env.<NAME>`), so it must
34
+ * be a valid JS/POSIX identifier. Strips invalid chars and prefixes `_` when the
35
+ * result would start with a digit or be empty.
36
+ */
37
+ export function sanitizeEnvVarName(str) {
38
+ const cleaned = str.replace(/[^A-Za-z0-9_]/g, '');
39
+ return /^[A-Za-z_]/.test(cleaned) ? cleaned : `_${cleaned}`;
40
+ }
41
+ /**
42
+ * Resolve OpenAPI server-variable placeholders (`{var}`) in a server URL from
43
+ * their declared defaults, then validate the result is a real http(s) URL.
44
+ *
45
+ * OpenAPI server URLs may carry variables — `https://{region}.api.test/{version}`
46
+ * — with a `variables` map giving each a `default`. Substituting them here keeps
47
+ * the URL semantically intact instead of stripping the braces (which would corrupt
48
+ * the path, e.g. `{version}` → empty). Variables without a known default are left
49
+ * as-is; the subsequent per-sink escaper neutralizes any residual unsafe chars.
50
+ */
51
+ export function resolveServerUrl(url, variables) {
52
+ if (!url)
53
+ return url;
54
+ let resolved = url;
55
+ if (variables) {
56
+ resolved = resolved.replace(/\{([^{}]+)\}/g, (match, name) => {
57
+ const def = variables[name]?.default;
58
+ return typeof def === 'string' ? def : match;
59
+ });
60
+ }
61
+ return resolved;
62
+ }
63
+ /**
64
+ * Escape a base URL for safe embedding in a string literal across multiple
65
+ * target languages without mutating its semantics. Unlike a strip-based
66
+ * approach, this preserves every character that is legal in a URL (including
67
+ * `$`, `{`, `}`, `~`, etc. that appear in real paths such as `/v1/$metadata`)
68
+ * and only neutralizes the characters that could break out of, or inject into,
69
+ * the literal it is embedded in:
70
+ * - backslash, single/double quote, backtick → backslash-escaped
71
+ * - `${` (TS template-literal interpolation) → broken with a backslash
72
+ * - CR/LF (could inject extra dotenv/TOML lines) → backslash-escaped
73
+ * The same escaped form is safe in a TS single/double-quote string, a TS
74
+ * backtick literal, a Python double-quote string, a TOML basic string, and a
75
+ * single-line dotenv value. Validation/variable-resolution happens upstream in
76
+ * the emitter via {@link resolveServerUrl}.
77
+ */
78
+ export function sanitizeUrlLiteral(str) {
79
+ return str
80
+ .replace(/\\/g, '\\\\')
81
+ .replace(/`/g, '\\`')
82
+ .replace(/'/g, "\\'")
83
+ .replace(/"/g, '\\"')
84
+ .replace(/\$\{/g, '\\${')
85
+ .replace(/\r/g, '\\r')
86
+ .replace(/\n/g, '\\n');
87
+ }
88
+ /** RFC 6838 / RFC 7231 media-type token: `type/subtype` with optional params. */
89
+ const MEDIA_TYPE_RE = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*\/[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*(\s*;\s*[^\s;]+)*$/;
90
+ /**
91
+ * Validate a request-body media type against the RFC media-type grammar
92
+ * (`type/subtype`, optional parameters). The OpenAPI `content` map key is
93
+ * attacker-influenced and is interpolated into a string literal, so a value
94
+ * that is not a well-formed media type is replaced with `application/json`
95
+ * (the universal safe default) rather than trusted. The returned value is
96
+ * still escaped at the literal sink by {@link escapeStringLiteral}.
97
+ */
98
+ export function sanitizeMediaType(str) {
99
+ return MEDIA_TYPE_RE.test(str.trim()) ? str.trim() : 'application/json';
100
+ }
101
+ /**
102
+ * Escape a string for safe embedding in a double-quoted Python string literal.
103
+ * Escapes backslashes, double quotes, and newlines.
104
+ */
105
+ export function escapePyString(str) {
106
+ return str
107
+ .replace(/\\/g, '\\\\')
108
+ .replace(/"/g, '\\"')
109
+ .replace(/\n/g, '\\n')
110
+ .replace(/\r/g, '\\r');
111
+ }
112
+ const PY_KEYWORDS = new Set([
113
+ 'False',
114
+ 'None',
115
+ 'True',
116
+ 'and',
117
+ 'as',
118
+ 'assert',
119
+ 'async',
120
+ 'await',
121
+ 'break',
122
+ 'class',
123
+ 'continue',
124
+ 'def',
125
+ 'del',
126
+ 'elif',
127
+ 'else',
128
+ 'except',
129
+ 'finally',
130
+ 'for',
131
+ 'from',
132
+ 'global',
133
+ 'if',
134
+ 'import',
135
+ 'in',
136
+ 'is',
137
+ 'lambda',
138
+ 'nonlocal',
139
+ 'not',
140
+ 'or',
141
+ 'pass',
142
+ 'raise',
143
+ 'return',
144
+ 'try',
145
+ 'while',
146
+ 'with',
147
+ 'yield',
148
+ 'match',
149
+ 'case',
150
+ ]);
151
+ /**
152
+ * Convert an arbitrary parameter name into a valid, non-keyword Python
153
+ * identifier for use as a function argument or local variable name.
154
+ */
155
+ export function sanitizePyIdentifier(str) {
156
+ let id = str.replace(/[^A-Za-z0-9_]/g, '_');
157
+ if (!/^[A-Za-z_]/.test(id))
158
+ id = `_${id}`;
159
+ if (PY_KEYWORDS.has(id))
160
+ id = `${id}_`;
161
+ return id || '_param';
162
+ }
22
163
  /**
23
164
  * Validate that a URL path template contains only safe characters.
24
165
  * Allows: alphanumeric, /, {, }, -, _, .
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAClF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG;SACP,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;AAE1E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcpmake/core",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "Shared generation library for mcpmake — parse APIs (OpenAPI/HAR/Postman/websites) and emit MCP servers.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",