@mondaydotcomorg/z2h-cli 0.34.0 → 0.34.2

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 (133) hide show
  1. package/CHANGELOG.md +2969 -0
  2. package/dist/backend/__tests__/ast.test.d.ts +2 -0
  3. package/dist/backend/__tests__/ast.test.d.ts.map +1 -0
  4. package/dist/backend/__tests__/parse.test.d.ts +2 -0
  5. package/dist/backend/__tests__/parse.test.d.ts.map +1 -0
  6. package/dist/backend/ast.d.ts +41 -0
  7. package/dist/backend/ast.d.ts.map +1 -0
  8. package/dist/backend/ast.js +152 -0
  9. package/dist/backend/handler-declaration.d.ts +17 -0
  10. package/dist/backend/handler-declaration.d.ts.map +1 -0
  11. package/dist/backend/handler-declaration.js +83 -0
  12. package/dist/backend/messages.d.ts +10 -0
  13. package/dist/backend/messages.d.ts.map +1 -0
  14. package/dist/backend/messages.js +14 -0
  15. package/dist/backend/parse.d.ts +11 -0
  16. package/dist/backend/parse.d.ts.map +1 -0
  17. package/dist/backend/parse.js +66 -0
  18. package/dist/backend/rules/__tests__/snowflake-static-sql.test.d.ts +2 -0
  19. package/dist/backend/rules/__tests__/snowflake-static-sql.test.d.ts.map +1 -0
  20. package/dist/backend/rules/index.d.ts +5 -0
  21. package/dist/backend/rules/index.d.ts.map +1 -0
  22. package/dist/backend/rules/index.js +8 -0
  23. package/dist/backend/rules/snowflake-static-sql.d.ts +15 -0
  24. package/dist/backend/rules/snowflake-static-sql.d.ts.map +1 -0
  25. package/dist/backend/rules/snowflake-static-sql.js +75 -0
  26. package/dist/backend/rules/types.d.ts +29 -0
  27. package/dist/backend/rules/types.d.ts.map +1 -0
  28. package/dist/backend/rules/types.js +1 -0
  29. package/dist/commands/__tests__/delete.test.d.ts +2 -0
  30. package/dist/commands/__tests__/delete.test.d.ts.map +1 -0
  31. package/dist/commands/backend.d.ts +0 -1
  32. package/dist/commands/backend.d.ts.map +1 -1
  33. package/dist/commands/backend.js +6 -6
  34. package/dist/commands/deploy.d.ts.map +1 -1
  35. package/dist/commands/deploy.js +16 -13
  36. package/dist/constants.d.ts +2 -13
  37. package/dist/constants.d.ts.map +1 -1
  38. package/dist/constants.js +60 -45
  39. package/dist/esm/backend/__tests__/ast.test.d.ts +2 -0
  40. package/dist/esm/backend/__tests__/ast.test.d.ts.map +1 -0
  41. package/dist/esm/backend/__tests__/parse.test.d.ts +2 -0
  42. package/dist/esm/backend/__tests__/parse.test.d.ts.map +1 -0
  43. package/dist/esm/backend/ast.d.ts +41 -0
  44. package/dist/esm/backend/ast.d.ts.map +1 -0
  45. package/dist/esm/backend/ast.mjs +146 -0
  46. package/dist/esm/backend/handler-declaration.d.ts +17 -0
  47. package/dist/esm/backend/handler-declaration.d.ts.map +1 -0
  48. package/dist/esm/backend/handler-declaration.mjs +78 -0
  49. package/dist/esm/backend/messages.d.ts +10 -0
  50. package/dist/esm/backend/messages.d.ts.map +1 -0
  51. package/dist/esm/backend/messages.mjs +12 -0
  52. package/dist/esm/backend/parse.d.ts +11 -0
  53. package/dist/esm/backend/parse.d.ts.map +1 -0
  54. package/dist/esm/backend/parse.mjs +64 -0
  55. package/dist/esm/backend/rules/__tests__/snowflake-static-sql.test.d.ts +2 -0
  56. package/dist/esm/backend/rules/__tests__/snowflake-static-sql.test.d.ts.map +1 -0
  57. package/dist/esm/backend/rules/index.d.ts +5 -0
  58. package/dist/esm/backend/rules/index.d.ts.map +1 -0
  59. package/dist/esm/backend/rules/index.mjs +6 -0
  60. package/dist/esm/backend/rules/snowflake-static-sql.d.ts +15 -0
  61. package/dist/esm/backend/rules/snowflake-static-sql.d.ts.map +1 -0
  62. package/dist/esm/backend/rules/snowflake-static-sql.mjs +73 -0
  63. package/dist/esm/backend/rules/types.d.ts +29 -0
  64. package/dist/esm/backend/rules/types.d.ts.map +1 -0
  65. package/dist/esm/backend/rules/types.mjs +1 -0
  66. package/dist/esm/commands/__tests__/delete.test.d.ts +2 -0
  67. package/dist/esm/commands/__tests__/delete.test.d.ts.map +1 -0
  68. package/dist/esm/commands/backend.d.ts +0 -1
  69. package/dist/esm/commands/backend.d.ts.map +1 -1
  70. package/dist/esm/commands/backend.mjs +5 -5
  71. package/dist/esm/commands/deploy.d.ts.map +1 -1
  72. package/dist/esm/commands/deploy.mjs +9 -6
  73. package/dist/esm/constants.d.ts +2 -13
  74. package/dist/esm/constants.d.ts.map +1 -1
  75. package/dist/esm/constants.mjs +5 -35
  76. package/dist/esm/util/__tests__/usage-upload.test.d.ts +2 -0
  77. package/dist/esm/util/__tests__/usage-upload.test.d.ts.map +1 -0
  78. package/dist/esm/util/app-name.mjs +1 -1
  79. package/dist/esm/util/auth/__tests__/index.test.d.ts +2 -0
  80. package/dist/esm/util/auth/__tests__/index.test.d.ts.map +1 -0
  81. package/dist/esm/util/auth/broker-credential-provider.d.ts +6 -1
  82. package/dist/esm/util/auth/broker-credential-provider.d.ts.map +1 -1
  83. package/dist/esm/util/auth/broker-credential-provider.mjs +2 -2
  84. package/dist/esm/util/auth/index.d.ts +3 -0
  85. package/dist/esm/util/auth/index.d.ts.map +1 -0
  86. package/dist/esm/util/auth/index.mjs +2 -0
  87. package/dist/esm/util/broker/app.d.ts +0 -1
  88. package/dist/esm/util/broker/app.d.ts.map +1 -1
  89. package/dist/esm/util/broker/app.mjs +3 -4
  90. package/dist/esm/util/git/repo.mjs +1 -1
  91. package/dist/esm/util/s3/client.mjs +1 -1
  92. package/dist/esm/util/s3/upload.mjs +1 -1
  93. package/dist/esm/util/usage-json.d.ts +2 -2
  94. package/dist/esm/util/usage-json.d.ts.map +1 -1
  95. package/dist/esm/util/usage-json.mjs +5 -2
  96. package/dist/esm/util/usage-upload.d.ts +3 -0
  97. package/dist/esm/util/usage-upload.d.ts.map +1 -0
  98. package/dist/esm/util/usage-upload.mjs +29 -0
  99. package/dist/util/__tests__/usage-upload.test.d.ts +2 -0
  100. package/dist/util/__tests__/usage-upload.test.d.ts.map +1 -0
  101. package/dist/util/app-name.js +6 -6
  102. package/dist/util/auth/__tests__/index.test.d.ts +2 -0
  103. package/dist/util/auth/__tests__/index.test.d.ts.map +1 -0
  104. package/dist/util/auth/broker-credential-provider.d.ts +6 -1
  105. package/dist/util/auth/broker-credential-provider.d.ts.map +1 -1
  106. package/dist/util/auth/broker-credential-provider.js +2 -2
  107. package/dist/util/auth/index.d.ts +3 -0
  108. package/dist/util/auth/index.d.ts.map +1 -0
  109. package/dist/util/auth/index.js +11 -0
  110. package/dist/util/broker/app.d.ts +0 -1
  111. package/dist/util/broker/app.d.ts.map +1 -1
  112. package/dist/util/broker/app.js +3 -4
  113. package/dist/util/git/repo.js +2 -2
  114. package/dist/util/s3/client.js +2 -2
  115. package/dist/util/s3/upload.js +2 -2
  116. package/dist/util/usage-json.d.ts +2 -2
  117. package/dist/util/usage-json.d.ts.map +1 -1
  118. package/dist/util/usage-json.js +5 -2
  119. package/dist/util/usage-upload.d.ts +3 -0
  120. package/dist/util/usage-upload.d.ts.map +1 -0
  121. package/dist/util/usage-upload.js +31 -0
  122. package/package.json +3 -3
  123. package/src/commands/__tests__/backend-deploy.test.ts +2 -4
  124. package/src/commands/__tests__/deploy.test.ts +43 -11
  125. package/src/commands/backend.ts +4 -5
  126. package/src/commands/deploy.ts +9 -5
  127. package/src/constants.ts +25 -47
  128. package/src/util/__tests__/usage-upload.test.ts +58 -0
  129. package/src/util/auth/__tests__/broker-credential-provider.test.ts +4 -4
  130. package/src/util/auth/broker-credential-provider.ts +4 -4
  131. package/src/util/broker/app.ts +2 -15
  132. package/src/util/usage-json.ts +11 -4
  133. package/src/util/usage-upload.ts +38 -0
@@ -0,0 +1,10 @@
1
+ export declare const messages: {
2
+ mustDefine: (file: string) => string;
3
+ notAFunction: (file: string) => string;
4
+ mustNotImport: (file: string) => string;
5
+ mustNotExportHandler: (file: string) => string;
6
+ mustNotExport: (file: string) => string;
7
+ moduleOnlySyntax: (file: string, detail: string) => string;
8
+ syntaxError: (file: string, line: number, column: number, detail: string) => string;
9
+ };
10
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/backend/messages.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;uBACA,MAAM;yBACJ,MAAM;0BACL,MAAM;iCAEC,MAAM;0BAEb,MAAM;6BAEH,MAAM,UAAU,MAAM;wBAE3B,MAAM,QAAQ,MAAM,UAAU,MAAM,UAAU,MAAM;CAEzE,CAAC"}
@@ -0,0 +1,12 @@
1
+ const EXAMPLE = 'async function handler(ctx) { ... }';
2
+ const messages = {
3
+ mustDefine: (file) => `${file} must define a handler — e.g. ${EXAMPLE}`,
4
+ notAFunction: (file) => `${file} declares handler but it is not a function — e.g. ${EXAMPLE}`,
5
+ mustNotImport: (file) => `${file} must not import other files or packages — handlers are self-contained; reach the outside world through ctx capabilities`,
6
+ mustNotExportHandler: (file) => `${file} must not export handler — the isolate has no module system; declare it as a plain global, e.g. ${EXAMPLE}`,
7
+ mustNotExport: (file) => `${file} must not use export — the isolate has no module system; declare handler as a plain global, e.g. ${EXAMPLE}`,
8
+ moduleOnlySyntax: (file, detail) => `${file} uses module-only syntax (${detail}) — handlers run as plain scripts, so top-level await and import.meta are not available`,
9
+ syntaxError: (file, line, column, detail) => `${file}:${line}:${column}: not valid JavaScript — ${detail}`,
10
+ };
11
+
12
+ export { messages };
@@ -0,0 +1,11 @@
1
+ import { type Program } from 'acorn';
2
+ /**
3
+ * The runner compiles handlers with `isolate.compileScript`, i.e. the classic
4
+ * *script* grammar — so that is the grammar we validate against. `import`/`export`
5
+ * declarations and top-level `await`/`import.meta` are only legal under the
6
+ * *module* grammar, so a handler using any of them fails the script parse; we
7
+ * re-parse it as a module purely to name which of those four things it was,
8
+ * instead of surfacing V8's bare "Unexpected token 'export'".
9
+ */
10
+ export declare function parseOrThrow(file: string, code: string): Program;
11
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/backend/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8D,KAAK,OAAO,EAAkB,MAAM,OAAO,CAAC;AAkDjH;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuBhE"}
@@ -0,0 +1,64 @@
1
+ import { parse } from 'acorn';
2
+ import { z } from 'zod';
3
+ import { trackEvent } from '../util/tracker.mjs';
4
+ import { exportsHandler } from './handler-declaration.mjs';
5
+ import { messages } from './messages.mjs';
6
+
7
+ const acornLocSchema = z.object({ line: z.number(), column: z.number() });
8
+ function isAcornSyntaxError(err) {
9
+ return err instanceof SyntaxError && acornLocSchema.safeParse(err.loc).success;
10
+ }
11
+ function tryParse(code, sourceType) {
12
+ try {
13
+ return { ok: true, program: parse(code, { ecmaVersion: 'latest', sourceType, locations: true }) };
14
+ }
15
+ catch (err) {
16
+ if (isAcornSyntaxError(err)) {
17
+ return { ok: false, error: err };
18
+ }
19
+ throw err;
20
+ }
21
+ }
22
+ /** Acorn appends ` (line:col)` to its messages; we report the position ourselves. */
23
+ const stripPosition = (message) => message.replace(/ \(\d+:\d+\)$/, '');
24
+ const isImportLike = (node) => node.type === 'ImportDeclaration' ||
25
+ node.type === 'ExportAllDeclaration' ||
26
+ (node.type === 'ExportNamedDeclaration' && node.source != null);
27
+ const isExport = (node) => node.type === 'ExportNamedDeclaration' || node.type === 'ExportDefaultDeclaration';
28
+ /** Reports the failure, then returns the error for the caller to throw. */
29
+ function parseError(message) {
30
+ void trackEvent('z2h_cli_handler_parse_error', { error: message });
31
+ return new Error(message);
32
+ }
33
+ /**
34
+ * The runner compiles handlers with `isolate.compileScript`, i.e. the classic
35
+ * *script* grammar — so that is the grammar we validate against. `import`/`export`
36
+ * declarations and top-level `await`/`import.meta` are only legal under the
37
+ * *module* grammar, so a handler using any of them fails the script parse; we
38
+ * re-parse it as a module purely to name which of those four things it was,
39
+ * instead of surfacing V8's bare "Unexpected token 'export'".
40
+ */
41
+ function parseOrThrow(file, code) {
42
+ const asScript = tryParse(code, 'script');
43
+ if (asScript.ok) {
44
+ return asScript.program;
45
+ }
46
+ const asModule = tryParse(code, 'module');
47
+ if (asModule.ok) {
48
+ const { body } = asModule.program;
49
+ if (body.some(exportsHandler)) {
50
+ throw parseError(messages.mustNotExportHandler(file));
51
+ }
52
+ if (body.some(isImportLike)) {
53
+ throw parseError(messages.mustNotImport(file));
54
+ }
55
+ if (body.some(isExport)) {
56
+ throw parseError(messages.mustNotExport(file));
57
+ }
58
+ throw parseError(messages.moduleOnlySyntax(file, stripPosition(asScript.error.message)));
59
+ }
60
+ const { line, column } = asScript.error.loc;
61
+ throw parseError(messages.syntaxError(file, line, column, stripPosition(asScript.error.message)));
62
+ }
63
+
64
+ export { parseOrThrow };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=snowflake-static-sql.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snowflake-static-sql.test.d.ts","sourceRoot":"","sources":["../../../../../src/backend/rules/__tests__/snowflake-static-sql.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { HandlerRule } from './types';
2
+ export type { HandlerRule, RuleContext } from './types';
3
+ /** Every rule the validator runs, in order. Add new capability rules here. */
4
+ export declare const HANDLER_RULES: readonly HandlerRule[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/backend/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAExD,8EAA8E;AAC9E,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAAmC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { SnowflakeStaticSqlRule } from './snowflake-static-sql.mjs';
2
+
3
+ /** Every rule the validator runs, in order. Add new capability rules here. */
4
+ const HANDLER_RULES = [new SnowflakeStaticSqlRule()];
5
+
6
+ export { HANDLER_RULES };
@@ -0,0 +1,15 @@
1
+ import type { HandlerRule, RuleContext } from './types';
2
+ /**
3
+ * `ctx.api.v1.snowflake.query(sql, params?, options?)` — the SQL text must live
4
+ * in the handler. The frontend chooses *which* handler to call and supplies
5
+ * `params` / `options`; it never ships SQL. Binding placeholders (`:name`) are
6
+ * how client values reach the query.
7
+ *
8
+ * The call is matched through `const` aliases of the channel
9
+ * (`const sf = ctx.api.v1.snowflake; sf.query(…)`), see `PathResolver`.
10
+ */
11
+ export declare class SnowflakeStaticSqlRule implements HandlerRule {
12
+ readonly name = "snowflake/static-sql";
13
+ check({ file, program, bindings, paths }: RuleContext): string[];
14
+ }
15
+ //# sourceMappingURL=snowflake-static-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snowflake-static-sql.d.ts","sourceRoot":"","sources":["../../../../src/backend/rules/snowflake-static-sql.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAgDxD;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,YAAW,WAAW;IACxD,QAAQ,CAAC,IAAI,0BAA0B;IAEvC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE;CAcjE"}
@@ -0,0 +1,73 @@
1
+ import { simple } from 'acorn-walk';
2
+ import { lineOf } from '../ast.mjs';
3
+
4
+ const SNOWFLAKE_QUERY = 'ctx.api.v1.snowflake.query';
5
+ const message = (file, line) => `${file}${line ? `:${line}` : ''}: ${SNOWFLAKE_QUERY} must receive SQL written in the handler — a string literal, ` +
6
+ `or a variable bound to one. Client-supplied values go through params (\`:name\` bindings) and options, never into the SQL text.`;
7
+ /**
8
+ * True when every possible value of `node` is text authored in this file:
9
+ * string literals, templates whose holes are themselves static, `+`
10
+ * concatenation, either branch of a conditional, and identifiers that resolve
11
+ * (within the file) to such values. Anything reaching outside the file —
12
+ * `ctx.input`, calls, member reads, destructuring — is not static.
13
+ */
14
+ function isStaticSql(node, bindings, resolving) {
15
+ if (!node) {
16
+ return false;
17
+ }
18
+ const staticChild = (child) => isStaticSql(child, bindings, resolving);
19
+ switch (node.type) {
20
+ case 'Literal':
21
+ return typeof node.value === 'string';
22
+ case 'TemplateLiteral':
23
+ return node.expressions.every(staticChild);
24
+ case 'BinaryExpression':
25
+ return node.operator === '+' && staticChild(node.left) && staticChild(node.right);
26
+ case 'ConditionalExpression':
27
+ return staticChild(node.consequent) && staticChild(node.alternate);
28
+ case 'LogicalExpression':
29
+ return staticChild(node.left) && staticChild(node.right);
30
+ case 'Identifier': {
31
+ const { name } = node;
32
+ if (bindings.unpinnable.has(name) || resolving.has(name)) {
33
+ return false;
34
+ }
35
+ const decls = bindings.declarations.get(name);
36
+ if (!decls || decls.length === 0) {
37
+ return false;
38
+ }
39
+ const next = new Set(resolving).add(name);
40
+ return decls.every(d => d.path?.length === 0 && isStaticSql(d.init, bindings, next));
41
+ }
42
+ default:
43
+ return false;
44
+ }
45
+ }
46
+ /**
47
+ * `ctx.api.v1.snowflake.query(sql, params?, options?)` — the SQL text must live
48
+ * in the handler. The frontend chooses *which* handler to call and supplies
49
+ * `params` / `options`; it never ships SQL. Binding placeholders (`:name`) are
50
+ * how client values reach the query.
51
+ *
52
+ * The call is matched through `const` aliases of the channel
53
+ * (`const sf = ctx.api.v1.snowflake; sf.query(…)`), see `PathResolver`.
54
+ */
55
+ class SnowflakeStaticSqlRule {
56
+ name = 'snowflake/static-sql';
57
+ check({ file, program, bindings, paths }) {
58
+ const violations = [];
59
+ simple(program, {
60
+ CallExpression(node) {
61
+ if (paths.pathOf(node.callee) !== SNOWFLAKE_QUERY) {
62
+ return;
63
+ }
64
+ if (!isStaticSql(node.arguments[0], bindings, new Set())) {
65
+ violations.push(message(file, lineOf(node)));
66
+ }
67
+ },
68
+ });
69
+ return violations;
70
+ }
71
+ }
72
+
73
+ export { SnowflakeStaticSqlRule };
@@ -0,0 +1,29 @@
1
+ import type { Program } from 'acorn';
2
+ import type { Bindings, PathResolver } from '../ast';
3
+ export interface RuleContext {
4
+ /** Handler file name, used to prefix messages. */
5
+ file: string;
6
+ /** Parsed with `locations: true`, so rules can point at a line. */
7
+ program: Program;
8
+ /** Every variable binding in the file — see `collectBindings`. */
9
+ bindings: Bindings;
10
+ /** Resolves member chains through `const` aliases — see `createPathResolver`. */
11
+ paths: PathResolver;
12
+ }
13
+ /**
14
+ * A capability-specific check that runs once the handler is structurally valid
15
+ * (parses as a script, defines `handler`, imports nothing).
16
+ *
17
+ * Rules return human-readable violations rather than throwing so the validator
18
+ * can report every problem in one pass — agent-generated handlers are fixed in
19
+ * a loop, and one round-trip per violation is slow.
20
+ *
21
+ * Implement as a class (see `SnowflakeStaticSqlRule`) and add an instance to
22
+ * `HANDLER_RULES` in `./index.ts` — keeps every rule the same shape to read.
23
+ */
24
+ export interface HandlerRule {
25
+ /** Stable identifier, e.g. `snowflake/static-sql`. */
26
+ name: string;
27
+ check(ctx: RuleContext): string[];
28
+ }
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/backend/rules/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,QAAQ,EAAE,QAAQ,CAAC;IACnB,iFAAiF;IACjF,KAAK,EAAE,YAAY,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,CAAC;CACnC"}
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=delete.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.test.d.ts","sourceRoot":"","sources":["../../../../src/commands/__tests__/delete.test.ts"],"names":[],"mappings":""}
@@ -1,7 +1,6 @@
1
1
  export interface ReadDetectAndUploadResult {
2
2
  integrations: string[];
3
3
  handlerNames: string[];
4
- apiUsages: Record<string, unknown>;
5
4
  }
6
5
  /**
7
6
  * Integration sync note: the returned set is re-derived from the CURRENT backend
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/commands/backend.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AA+BD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CASrC;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1F;AAsBD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,EAC5C,MAAM,GAAE,MAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAqBf"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/commands/backend.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA+BD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CASrC;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1F;AAsBD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,EAC5C,MAAM,GAAE,MAAsB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAqBf"}
@@ -8,7 +8,7 @@ import { whoAmI } from '../util/machine-identity.mjs';
8
8
  import { readHandlers } from '../backend/handlers.mjs';
9
9
  import { detectIntegrations } from '../backend/detect-integrations.mjs';
10
10
  import { getS3Client } from '../util/s3/client.mjs';
11
- import { BUCKET_WRITE_NAME } from '../constants.mjs';
11
+ import { BUCKET_WRITE_NAME } from '@mondaydotcomorg/z2h-shared-utils';
12
12
  import { runSandbox } from '../backend/client.mjs';
13
13
  import { formatSandboxRun } from '../backend/format-sandbox-run.mjs';
14
14
  import { validateHandlerSource } from '../backend/validate.mjs';
@@ -24,14 +24,14 @@ function currentAppName() {
24
24
  }
25
25
  async function readDetectAndUpload(appDir, prefix, appName, version, deployedBy, logLabel) {
26
26
  if (!hasHandlers(appDir)) {
27
- return { integrations: [], handlerNames: [], apiUsages: {} };
27
+ return { integrations: [], handlerNames: [] };
28
28
  }
29
29
  info(`reading backend handlers ${logLabel}`);
30
- const { handlers, apiDomains, apiUsages } = await readHandlers(appDir);
30
+ const { handlers, apiDomains } = await readHandlers(appDir);
31
31
  const integrations = detectIntegrations(apiDomains);
32
32
  const handlerNames = Object.keys(handlers);
33
33
  if (Object.keys(handlers).length === 0) {
34
- return { integrations, handlerNames, apiUsages };
34
+ return { integrations, handlerNames };
35
35
  }
36
36
  const s3 = getS3Client();
37
37
  const meta = JSON.stringify({ version, deployedBy, handlers: Object.keys(handlers) });
@@ -40,7 +40,7 @@ async function readDetectAndUpload(appDir, prefix, appName, version, deployedBy,
40
40
  ...Object.entries(handlers).map(([name, code]) => put(`${prefix}/${name}.js`, code, 'application/javascript')),
41
41
  put(`${prefix}/meta.json`, meta, 'application/json'),
42
42
  ]);
43
- return { integrations, handlerNames, apiUsages };
43
+ return { integrations, handlerNames };
44
44
  }
45
45
  /**
46
46
  * Integration sync note: the returned set is re-derived from the CURRENT backend
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,UAAU,EAA2C,MAAM,4BAA4B,CAAC;AAatG,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAWD,wBAAsB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3E"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,UAAU,EAA2C,MAAM,4BAA4B,CAAC;AAatG,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAWD,wBAAsB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3E"}
@@ -4,12 +4,13 @@ import { info, output, getOutputMode, warn } from '../util/logger.mjs';
4
4
  import { resolveConsumerPaths } from '../shadow/paths.mjs';
5
5
  import { fetchAppTags, fetchTagCatalog, setAppTags } from '../util/tags.mjs';
6
6
  import { uploadDir } from '../util/s3/upload.mjs';
7
- import { BUCKET_WRITE_NAME, S3_PREVIEWS_FOLDER, BUCKET_READ_DNS_URL, brokerBaseUrl, routingHeaders } from '../constants.mjs';
7
+ import { brokerBaseUrl, routingHeaders } from '../constants.mjs';
8
8
  import { fetchDeployVersion, brokerCredentialProvider } from '../util/auth/broker-credential-provider.mjs';
9
9
  import { readZthAuth } from '../util/auth/auth-store.mjs';
10
10
  import { validateAppName, cleanAppName, mfAppName, buildPreviewSlug } from '../util/app-name.mjs';
11
11
  import { getRemoteUrl, initRepo, guardCleanTree, pullAndResolve, pushToRemote } from '../util/git/repo.mjs';
12
12
  import { updateOrCreateUsageJson } from '../util/usage-json.mjs';
13
+ import { putAppUsage } from '../util/usage-upload.mjs';
13
14
  import { resolveGitEnv } from '../util/git/git-env.mjs';
14
15
  import { validateRemoteOptions, resolveRemoteUrl } from '../util/git/remote-options.mjs';
15
16
  import { setupS3Client } from '../util/s3/client.mjs';
@@ -21,6 +22,7 @@ import { tagDeployError, DeployError, grantReasonForStatus } from '../util/error
21
22
  import { deployBackend } from './backend.mjs';
22
23
  import { buildCommand } from './build.mjs';
23
24
  import { promptForTags } from './tag.mjs';
25
+ import { BUCKET_WRITE_NAME, S3_PREVIEWS_FOLDER, BUCKET_READ_DNS_URL } from '@mondaydotcomorg/z2h-shared-utils';
24
26
 
25
27
  // Should be run from the consumer app directory — uses process.cwd() to locate it.
26
28
  async function deployCommand(opts = {}) {
@@ -82,7 +84,7 @@ async function uploadAndRegister(opts) {
82
84
  const { paths, keyPrefix, appName, token, nextVersion, entry, gitRemote, isPreview, description, masterAppName } = opts;
83
85
  // Runs before the frontend upload so a `deployBackend` failure can't leave a
84
86
  // preview's unversioned `MF` dir overwritten with no rollback.
85
- const { integrations, handlerNames, apiUsages } = await deployBackend({
87
+ const { integrations, handlerNames } = await deployBackend({
86
88
  appDir: process.cwd(),
87
89
  appName,
88
90
  mfKeyPrefix: keyPrefix,
@@ -101,7 +103,6 @@ async function uploadAndRegister(opts) {
101
103
  gitRemote,
102
104
  integrations,
103
105
  handlerNames,
104
- apiUsages,
105
106
  description,
106
107
  masterAppName,
107
108
  });
@@ -135,7 +136,7 @@ async function deployPreview({ paths, consumerName, appName, token, opts }) {
135
136
  const url = `${BUCKET_READ_DNS_URL}/${keyPrefix}`;
136
137
  // No catch-all: every stage below tags its own DeployError reason at the throw site,
137
138
  // and anything unclassified reports as `unknown` via reasonOf() in runCommand.
138
- const nextVersion = (await fetchDeployVersion(previewAppName)) + 1;
139
+ const nextVersion = (await fetchDeployVersion(previewAppName)).version + 1;
139
140
  info('building');
140
141
  const entry = await buildAndStamp({
141
142
  paths,
@@ -200,9 +201,10 @@ async function deployLive({ paths, consumerName, appName, token, opts }) {
200
201
  await initRepo(process.cwd(), remote);
201
202
  gitRemote = remote;
202
203
  }
203
- const version = await fetchDeployVersion(appName);
204
+ const { version, id: appId } = await fetchDeployVersion(appName);
204
205
  const nextVersion = version + 1;
205
206
  const gitEnv = await resolveGitEnv(appName, gitRemote);
207
+ let usage = {};
206
208
  // Sync git first so a divergence (GitConflictError) stops us.
207
209
  // The skill commits the working tree (with an LLM-authored message) before
208
210
  // invoking deploy, so the tree should be clean here.
@@ -211,7 +213,7 @@ async function deployLive({ paths, consumerName, appName, token, opts }) {
211
213
  await guardCleanTree(process.cwd());
212
214
  info('syncing with git remote');
213
215
  await pullAndResolve(process.cwd(), gitEnv);
214
- await updateOrCreateUsageJson(process.cwd(), appName, whoAmI());
216
+ usage = await updateOrCreateUsageJson(process.cwd(), appName, whoAmI());
215
217
  }
216
218
  catch (err) {
217
219
  throw tagDeployError('git_error', err);
@@ -268,6 +270,7 @@ async function deployLive({ paths, consumerName, appName, token, opts }) {
268
270
  info('releasing deploy lock');
269
271
  await releaseLockBestEffort(appName, token);
270
272
  }
273
+ await putAppUsage(appName, appId, usage, nextVersion);
271
274
  // Tags are a post-deploy concern: the S3 upload has already succeeded, so a
272
275
  // tag failure never fails the deploy (handled inside).
273
276
  await handleDeployTags(appName);
@@ -8,19 +8,7 @@ export declare const SHADOW_DEV_DEPS: Record<string, string>;
8
8
  export declare const MIN_PORT = 13000;
9
9
  export declare const MAX_PORT = 19999;
10
10
  export declare const GITIGNORE_ENTRIES: string[];
11
- export declare const BUCKET_WRITE_NAME = "prod-use1-bigbrain-zth-mf-assets";
12
- export declare const REGION = "us-east-1";
13
- export declare const BUCKET_WRITE_URL = "https://prod-use1-bigbrain-zth-mf-assets.s3.us-east-1.amazonaws.com";
14
- export declare const BUCKET_READ_DNS_NAME = "bigbrain-zth-mf-assets";
15
- export declare const BUCKET_READ_DNS_URL = "https://bigbrain-zth-mf-assets.bigbrain.me";
16
- export declare const S3_PREVIEWS_FOLDER = "previews";
17
- export declare const MANIFEST_KEY = "mf-assets";
18
- export declare const MANIFEST_READ_URL = "https://bigbrain-zth-mf-assets.bigbrain.me/mf-assets";
19
- export declare const S3_SKILLS_BUCKET_NAME = "prod-use1-bigbrain-zth-skills";
20
- export declare const DATAVIZ_SKILLS_PREFIX = "dataviz/";
21
- export declare const APP_NAME_PATTERN: RegExp;
22
- export declare const PREVIEW_APP_NAME_PREFIX = "zth-preview-";
23
- export { ALWAYS_ON_CHANNELS, DECLARED_INTEGRATIONS, type DeclaredIntegration } from '@mondaydotcomorg/z2h-shared-utils';
11
+ export { ALWAYS_ON_CHANNELS, APP_USAGE_BUCKET_NAME, appUsageFolder, APP_NAME_PATTERN, BUCKET_READ_DNS_NAME, BUCKET_READ_DNS_URL, BUCKET_WRITE_NAME, BUCKET_WRITE_URL, DATAVIZ_SKILLS_PREFIX, DECLARED_INTEGRATIONS, MANIFEST_KEY, MANIFEST_READ_URL, PREVIEW_APP_NAME_PREFIX, REGION, S3_PREVIEWS_FOLDER, S3_SKILLS_BUCKET_NAME, type DeclaredIntegration, } from '@mondaydotcomorg/z2h-shared-utils';
24
12
  export declare const DEFAULT_BROKER_BASE_URL = "https://bigbrain-zth.bigbrain.me";
25
13
  /**
26
14
  * Resolves the broker origin (no trailing slash). Honors
@@ -28,6 +16,7 @@ export declare const DEFAULT_BROKER_BASE_URL = "https://bigbrain-zth.bigbrain.me
28
16
  * STS credential provider and the npm-broker registry URL.
29
17
  */
30
18
  export declare function brokerBaseUrl(): string;
19
+ export declare function isProdBroker(): boolean;
31
20
  export declare function routingHeaders(): Record<string, string>;
32
21
  export declare const NPM_BROKER_PATH = "/z2h-cli/npm";
33
22
  export declare const BROKER_NPM_SCOPE = "@mondaydotcomorg";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,eAAe,SAAS,CAAC;AAGtC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEjD,CAAC;AAKF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAElD,CAAC;AAMF,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAG9B,eAAO,MAAM,iBAAiB,UAAY,CAAC;AAQ3C,eAAO,MAAM,iBAAiB,qCAAqC,CAAC;AACpE,eAAO,MAAM,MAAM,cAAc,CAAC;AAClC,eAAO,MAAM,gBAAgB,wEAA4D,CAAC;AAE1F,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAC7D,eAAO,MAAM,mBAAmB,+CAAgD,CAAC;AAKjF,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAK7C,eAAO,MAAM,YAAY,cAAc,CAAC;AACxC,eAAO,MAAM,iBAAiB,yDAA2C,CAAC;AAM1E,eAAO,MAAM,qBAAqB,kCAAkC,CAAC;AAIrE,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAMhD,eAAO,MAAM,gBAAgB,QAA2B,CAAC;AAEzD,eAAO,MAAM,uBAAuB,iBAAiB,CAAC;AAMtD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAKxH,eAAO,MAAM,uBAAuB,qCAAqC,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAID,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGvD;AAKD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAG9C,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAGnD,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AAMrE,eAAO,MAAM,iBAAiB,EAAG,eAAwB,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,eAAe,SAAS,CAAC;AAGtC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEjD,CAAC;AAKF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAElD,CAAC;AAMF,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAC9B,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAG9B,eAAO,MAAM,iBAAiB,UAAY,CAAC;AAI3C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,mCAAmC,CAAC;AAK3C,eAAO,MAAM,uBAAuB,qCAAqC,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAID,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGvD;AAKD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAG9C,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAGnD,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AAMrE,eAAO,MAAM,iBAAiB,EAAG,eAAwB,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
@@ -1,4 +1,4 @@
1
- export { ALWAYS_ON_CHANNELS, DECLARED_INTEGRATIONS } from '@mondaydotcomorg/z2h-shared-utils';
1
+ export { ALWAYS_ON_CHANNELS, APP_NAME_PATTERN, APP_USAGE_BUCKET_NAME, BUCKET_READ_DNS_NAME, BUCKET_READ_DNS_URL, BUCKET_WRITE_NAME, BUCKET_WRITE_URL, DATAVIZ_SKILLS_PREFIX, DECLARED_INTEGRATIONS, MANIFEST_KEY, MANIFEST_READ_URL, PREVIEW_APP_NAME_PREFIX, REGION, S3_PREVIEWS_FOLDER, S3_SKILLS_BUCKET_NAME, appUsageFolder } from '@mondaydotcomorg/z2h-shared-utils';
2
2
 
3
3
  /**
4
4
  * Cross-file constants. Narrowly-used literals (templates, prefixes used in
@@ -24,39 +24,6 @@ const MIN_PORT = 13000;
24
24
  const MAX_PORT = 19999;
25
25
  // ─────────── Gitignore entries auto-appended to the consumer's file ────
26
26
  const GITIGNORE_ENTRIES = ['.zth/'];
27
- // ─────────── Z2H deploy bucket / contract ─────────
28
- // Source of truth for the bucket layout. The CLI uses these when configuring
29
- // the S3 client + uploading; bigbrain-zth's STS broker imports them via
30
- // `@mondaydotcomorg/z2h-cli/constants` to scope the per-deploy session
31
- // policy to the same bucket + manifest key.
32
- const BUCKET_WRITE_NAME = 'prod-use1-bigbrain-zth-mf-assets';
33
- const REGION = 'us-east-1';
34
- const BUCKET_WRITE_URL = `https://${BUCKET_WRITE_NAME}.s3.${REGION}.amazonaws.com`;
35
- const BUCKET_READ_DNS_NAME = 'bigbrain-zth-mf-assets';
36
- const BUCKET_READ_DNS_URL = `https://${BUCKET_READ_DNS_NAME}.bigbrain.me`;
37
- // Root prefix for ephemeral preview uploads: `previews/<previewAppName>/MF/...`,
38
- // where previewAppName is the preview's own `mf-zth-preview-<id>-<app>` name.
39
- // Shared by the CLI (upload path) and bigbrain-zth (STS policy + manifest overlay).
40
- const S3_PREVIEWS_FOLDER = 'previews';
41
- // No `.json` extension — TridentSkeleton's `mfUrl` API appends `/mf-assets`
42
- // to the bucket base when fetching, so the manifest must live at this exact
43
- // key. See microfrontends/mf-bigbrain-zth/.../ZeroToHeroHost.tsx.
44
- const MANIFEST_KEY = 'mf-assets';
45
- const MANIFEST_READ_URL = `${BUCKET_READ_DNS_URL}/${MANIFEST_KEY}`;
46
- // ─────────── Skills bucket (read-only) ─────────
47
- // bigbrain-zth mints read-only STS creds scoped to this bucket (mintDatavizSkillsCredentials);
48
- // bigbrain-zth-agent syncs from it into its vendor/ at pod startup (syncDatavizVendor).
49
- // Both import from here so the two sides can't drift.
50
- const S3_SKILLS_BUCKET_NAME = 'prod-use1-bigbrain-zth-skills';
51
- // Prefix the dataviz design-system skills are published under
52
- // (by data-cookbook's own CI on merge to master).
53
- const DATAVIZ_SKILLS_PREFIX = 'dataviz/';
54
- // ─────────── App-name slug — backend & CLI both honor this ─────
55
- // Lowercase kebab-case, must start with a letter, 2-50 chars total. The
56
- // backend STS broker rejects anything else with 400; the CLI can validate
57
- // upfront for friendlier errors.
58
- const APP_NAME_PATTERN = /^[a-z][a-z0-9-]{1,49}$/;
59
- const PREVIEW_APP_NAME_PREFIX = 'zth-preview-';
60
27
  // ─────────── Broker origin + npm registry (shared §3 contract) ─────
61
28
  // The bigbrain-zth broker fronts both the STS credential route and the npm
62
29
  // proxy. `Z2H_BROKER_BASE_URL` overrides the origin for tests/staging.
@@ -69,6 +36,9 @@ const DEFAULT_BROKER_BASE_URL = 'https://bigbrain-zth.bigbrain.me';
69
36
  function brokerBaseUrl() {
70
37
  return process.env.Z2H_BROKER_BASE_URL || DEFAULT_BROKER_BASE_URL;
71
38
  }
39
+ function isProdBroker() {
40
+ return brokerBaseUrl() === DEFAULT_BROKER_BASE_URL;
41
+ }
72
42
  // Returns Baggage header for monday-mirror routing when Z2H_ROUTING_KEY is set.
73
43
  // No-op in production (returns {}) — only activates when the env var is set.
74
44
  function routingHeaders() {
@@ -98,4 +68,4 @@ function brokerNpmRegistryUrl() {
98
68
  return `${brokerBaseUrl()}${NPM_BROKER_PATH}`;
99
69
  }
100
70
 
101
- export { APP_NAME_PATTERN, BROKER_NPM_SCOPE, BUCKET_READ_DNS_NAME, BUCKET_READ_DNS_URL, BUCKET_WRITE_NAME, BUCKET_WRITE_URL, DATAVIZ_SKILLS_PREFIX, DEFAULT_BROKER_BASE_URL, GITIGNORE_ENTRIES, MANIFEST_KEY, MANIFEST_READ_URL, MAX_PORT, MIN_PORT, NPM_BROKER_PATH, PREVIEW_APP_NAME_PREFIX, PUBLIC_NPM_REGISTRY_URL, REGION, S3_PREVIEWS_FOLDER, S3_SKILLS_BUCKET_NAME, SHADOW_DEV_DEPS, SHADOW_DIR_NAME, SHADOW_SCRIPTS, Z2H_NPM_TOKEN_ENV, brokerBaseUrl, brokerNpmRegistryUrl, routingHeaders };
71
+ export { BROKER_NPM_SCOPE, DEFAULT_BROKER_BASE_URL, GITIGNORE_ENTRIES, MAX_PORT, MIN_PORT, NPM_BROKER_PATH, PUBLIC_NPM_REGISTRY_URL, SHADOW_DEV_DEPS, SHADOW_DIR_NAME, SHADOW_SCRIPTS, Z2H_NPM_TOKEN_ENV, brokerBaseUrl, brokerNpmRegistryUrl, isProdBroker, routingHeaders };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=usage-upload.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-upload.test.d.ts","sourceRoot":"","sources":["../../../../src/util/__tests__/usage-upload.test.ts"],"names":[],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  import { readFileSync } from 'node:fs';
2
- import { APP_NAME_PATTERN, PREVIEW_APP_NAME_PREFIX } from '../constants.mjs';
2
+ import { APP_NAME_PATTERN, PREVIEW_APP_NAME_PREFIX } from '@mondaydotcomorg/z2h-shared-utils';
3
3
 
4
4
  /**
5
5
  * Strip any npm scope (`@scope/`) from a package name.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../../src/util/auth/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -1,12 +1,16 @@
1
1
  import type { AwsCredentialIdentityProvider } from '@aws-sdk/types';
2
2
  export declare const STS_BROKER_PATH = "/z2h-cli/sts/credentials";
3
3
  export declare const DEPLOY_VERSION_PATH = "/z2h-cli/apps/version";
4
+ interface VersionResponse {
5
+ version?: number;
6
+ id?: number | null;
7
+ }
4
8
  /**
5
9
  * Reserve the version this deploy will write to. Split out of the STS
6
10
  * credentials call so version derivation lives on its own endpoint — the CLI
7
11
  * asks for the version first, then requests credentials scoped to it.
8
12
  */
9
- export declare function fetchDeployVersion(appName: string): Promise<number>;
13
+ export declare function fetchDeployVersion(appName: string): Promise<Required<VersionResponse>>;
10
14
  /**
11
15
  * AWS SDK credential provider that fetches short-lived credentials from the
12
16
  * bigbrain-zth STS broker, scoped to `appName` — or, when `previewId` is
@@ -19,4 +23,5 @@ export declare function brokerCredentialProvider({ appName, previewId, }: {
19
23
  appName: string;
20
24
  previewId?: string;
21
25
  }): AwsCredentialIdentityProvider;
26
+ export {};
22
27
  //# sourceMappingURL=broker-credential-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"broker-credential-provider.d.ts","sourceRoot":"","sources":["../../../../src/util/auth/broker-credential-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAE3F,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AA0D3D;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMzE;AAwDD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,6BAA6B,CAIhC"}
1
+ {"version":3,"file":"broker-credential-provider.d.ts","sourceRoot":"","sources":["../../../../src/util/auth/broker-credential-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAE3F,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAC1D,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAa3D,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AA2CD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAK5F;AAwDD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,6BAA6B,CAIhC"}
@@ -49,8 +49,8 @@ async function assertBrokerOk(res, errorLabel) {
49
49
  async function fetchDeployVersion(appName) {
50
50
  const res = await postToBroker(DEPLOY_VERSION_PATH, { appName });
51
51
  await assertBrokerOk(res, 'deploy');
52
- const body = (await res.json());
53
- return body.version ?? 0;
52
+ const { version = 0, id = null } = (await res.json());
53
+ return { version, id };
54
54
  }
55
55
  async function requestSts(path, body, errorLabel) {
56
56
  const res = await postToBroker(path, body);
@@ -0,0 +1,3 @@
1
+ export { ensureZ2hToken, type EnsureZ2hTokenOptions } from '../npm/ensure-token';
2
+ export { readZthAuth, tryReadAuthTokenSync, Z2hAuthMissingError, type ZthAuth } from './auth-store';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/util/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ensureZ2hToken } from '../npm/ensure-token.mjs';
2
+ export { Z2hAuthMissingError, readZthAuth, tryReadAuthTokenSync } from './auth-store.mjs';
@@ -30,7 +30,6 @@ export interface RegisterOrUpdateOptions {
30
30
  gitRemote: string;
31
31
  integrations?: string[];
32
32
  handlerNames?: string[];
33
- apiUsages?: Record<string, unknown>;
34
33
  description?: string;
35
34
  /**
36
35
  * The base app a preview is for, sent only on first registration — the link
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../src/util/broker/app.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtC,uGAAuG;IACvG,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAsBvE;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhF;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA8DD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../src/util/broker/app.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtC,uGAAuG;IACvG,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAsBvE;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhF;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkDD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF"}