@ingestron/authoring 0.0.0-stage → 1.1.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.
Files changed (148) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/README.md +17 -2
  4. package/dist/annotations.d.ts +24 -0
  5. package/dist/annotations.d.ts.map +1 -0
  6. package/dist/annotations.js +132 -0
  7. package/dist/annotations.js.map +1 -0
  8. package/dist/completion.d.ts +8 -0
  9. package/dist/completion.d.ts.map +1 -0
  10. package/dist/completion.js +183 -0
  11. package/dist/completion.js.map +1 -0
  12. package/dist/context.d.ts +36 -0
  13. package/dist/context.d.ts.map +1 -0
  14. package/dist/context.js +98 -0
  15. package/dist/context.js.map +1 -0
  16. package/dist/contract-uses.d.ts +8 -0
  17. package/dist/contract-uses.d.ts.map +1 -0
  18. package/dist/contract-uses.js +40 -0
  19. package/dist/contract-uses.js.map +1 -0
  20. package/dist/diagnostics.d.ts +20 -0
  21. package/dist/diagnostics.d.ts.map +1 -0
  22. package/dist/diagnostics.js +143 -0
  23. package/dist/diagnostics.js.map +1 -0
  24. package/dist/docs-entries.d.ts +5 -0
  25. package/dist/docs-entries.d.ts.map +1 -0
  26. package/dist/docs-entries.js +109 -0
  27. package/dist/docs-entries.js.map +1 -0
  28. package/dist/docs.d.ts +7 -0
  29. package/dist/docs.d.ts.map +1 -0
  30. package/dist/docs.js +23 -0
  31. package/dist/docs.js.map +1 -0
  32. package/dist/explain.d.ts +14 -0
  33. package/dist/explain.d.ts.map +1 -0
  34. package/dist/explain.js +55 -0
  35. package/dist/explain.js.map +1 -0
  36. package/dist/fields.d.ts +19 -0
  37. package/dist/fields.d.ts.map +1 -0
  38. package/dist/fields.js +151 -0
  39. package/dist/fields.js.map +1 -0
  40. package/dist/fix-all.d.ts +5 -0
  41. package/dist/fix-all.d.ts.map +1 -0
  42. package/dist/fix-all.js +23 -0
  43. package/dist/fix-all.js.map +1 -0
  44. package/dist/fixed.d.ts +6 -0
  45. package/dist/fixed.d.ts.map +1 -0
  46. package/dist/fixed.js +43 -0
  47. package/dist/fixed.js.map +1 -0
  48. package/dist/fixes.d.ts +33 -0
  49. package/dist/fixes.d.ts.map +1 -0
  50. package/dist/fixes.js +99 -0
  51. package/dist/fixes.js.map +1 -0
  52. package/dist/flow.d.ts +16 -0
  53. package/dist/flow.d.ts.map +1 -0
  54. package/dist/flow.js +62 -0
  55. package/dist/flow.js.map +1 -0
  56. package/dist/hover.d.ts +7 -0
  57. package/dist/hover.d.ts.map +1 -0
  58. package/dist/hover.js +172 -0
  59. package/dist/hover.js.map +1 -0
  60. package/dist/index.d.ts +19 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +22 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/inline.d.ts +7 -0
  65. package/dist/inline.d.ts.map +1 -0
  66. package/dist/inline.js +57 -0
  67. package/dist/inline.js.map +1 -0
  68. package/dist/inputs.d.ts +5 -0
  69. package/dist/inputs.d.ts.map +1 -0
  70. package/dist/inputs.js +72 -0
  71. package/dist/inputs.js.map +1 -0
  72. package/dist/method-suggestions.d.ts +5 -0
  73. package/dist/method-suggestions.d.ts.map +1 -0
  74. package/dist/method-suggestions.js +24 -0
  75. package/dist/method-suggestions.js.map +1 -0
  76. package/dist/methods.d.ts +26 -0
  77. package/dist/methods.d.ts.map +1 -0
  78. package/dist/methods.js +67 -0
  79. package/dist/methods.js.map +1 -0
  80. package/dist/moves.d.ts +5 -0
  81. package/dist/moves.d.ts.map +1 -0
  82. package/dist/moves.js +82 -0
  83. package/dist/moves.js.map +1 -0
  84. package/dist/navigation.d.ts +24 -0
  85. package/dist/navigation.d.ts.map +1 -0
  86. package/dist/navigation.js +176 -0
  87. package/dist/navigation.js.map +1 -0
  88. package/dist/platform-request.d.ts +6 -0
  89. package/dist/platform-request.d.ts.map +1 -0
  90. package/dist/platform-request.js +13 -0
  91. package/dist/platform-request.js.map +1 -0
  92. package/dist/preview.d.ts +20 -0
  93. package/dist/preview.d.ts.map +1 -0
  94. package/dist/preview.js +51 -0
  95. package/dist/preview.js.map +1 -0
  96. package/dist/problems-at.d.ts +17 -0
  97. package/dist/problems-at.d.ts.map +1 -0
  98. package/dist/problems-at.js +32 -0
  99. package/dist/problems-at.js.map +1 -0
  100. package/dist/project.d.ts +27 -0
  101. package/dist/project.d.ts.map +1 -0
  102. package/dist/project.js +96 -0
  103. package/dist/project.js.map +1 -0
  104. package/dist/reference.d.ts +50 -0
  105. package/dist/reference.d.ts.map +1 -0
  106. package/dist/reference.js +152 -0
  107. package/dist/reference.js.map +1 -0
  108. package/dist/references.d.ts +8 -0
  109. package/dist/references.d.ts.map +1 -0
  110. package/dist/references.js +68 -0
  111. package/dist/references.js.map +1 -0
  112. package/dist/rename.d.ts +22 -0
  113. package/dist/rename.d.ts.map +1 -0
  114. package/dist/rename.js +64 -0
  115. package/dist/rename.js.map +1 -0
  116. package/dist/schema.d.ts +23 -0
  117. package/dist/schema.d.ts.map +1 -0
  118. package/dist/schema.js +46 -0
  119. package/dist/schema.js.map +1 -0
  120. package/dist/skeletons.d.ts +7 -0
  121. package/dist/skeletons.d.ts.map +1 -0
  122. package/dist/skeletons.js +107 -0
  123. package/dist/skeletons.js.map +1 -0
  124. package/dist/smart.d.ts +24 -0
  125. package/dist/smart.d.ts.map +1 -0
  126. package/dist/smart.js +113 -0
  127. package/dist/smart.js.map +1 -0
  128. package/dist/suggestion.d.ts +23 -0
  129. package/dist/suggestion.d.ts.map +1 -0
  130. package/dist/suggestion.js +2 -0
  131. package/dist/suggestion.js.map +1 -0
  132. package/dist/symbols.d.ts +12 -0
  133. package/dist/symbols.d.ts.map +1 -0
  134. package/dist/symbols.js +21 -0
  135. package/dist/symbols.js.map +1 -0
  136. package/dist/target.d.ts +4 -0
  137. package/dist/target.d.ts.map +1 -0
  138. package/dist/target.js +7 -0
  139. package/dist/target.js.map +1 -0
  140. package/dist/value-help.d.ts +7 -0
  141. package/dist/value-help.d.ts.map +1 -0
  142. package/dist/value-help.js +206 -0
  143. package/dist/value-help.js.map +1 -0
  144. package/dist/yaml.d.ts +33 -0
  145. package/dist/yaml.d.ts.map +1 -0
  146. package/dist/yaml.js +179 -0
  147. package/dist/yaml.js.map +1 -0
  148. package/package.json +58 -3
package/dist/moves.js ADDED
@@ -0,0 +1,82 @@
1
+ import { packs } from "@ingestron/cli";
2
+ import { parse } from "yaml";
3
+ import { placeAt } from "./context.js";
4
+ import { settingsAt } from "./fields.js";
5
+ import { positioned } from "./fixes.js";
6
+ import { openProject, resolved } from "./project.js";
7
+ import { spotAt } from "./yaml.js";
8
+ const pointerOf = (segments) => segments.map((segment) => `/${segment.replaceAll("~", "~0").replaceAll("/", "~1")}`).join("");
9
+ /** The move for the setting whose key is at `offset`, when it is written outside where it belongs. */
10
+ export function moveSetting(project, file, text, offset, environment) {
11
+ const found = misplaced(project, file, text, offset, environment);
12
+ const target = found && fileOfKind(project, found.belongs);
13
+ if (!found || !target)
14
+ return [];
15
+ const { key, method, action, from } = found;
16
+ const to = found.belongs === "Platform" ? ["settings", method, key] : [action, "settings", method, key];
17
+ const taken = valueAt(parse(project.files.read(target) ?? ""), to) !== undefined;
18
+ const fix = {
19
+ title: `Move ${key} to ${target}${taken ? ", replacing the value there" : ""}${scope(project, method, action, environment)}`,
20
+ edits: [
21
+ { file, pointer: pointerOf(from), remove: true },
22
+ { file: target, pointer: pointerOf(to), set: valueAt(parse(text), from) },
23
+ ],
24
+ };
25
+ const edits = positioned(project, fix);
26
+ // Both halves, or nothing: a value written as ${…} cannot be replaced in place.
27
+ return edits.length === 2 ? [{ title: fix.title, edits }] : [];
28
+ }
29
+ /**
30
+ * Which tables a setting moved out of one table reaches: every table whose
31
+ * step uses the method, so the person sees the move widen before choosing it.
32
+ */
33
+ function scope(project, method, action, environment) {
34
+ const model = resolved(project, environment).model ??
35
+ resolved(openProject(project.folder, new Map()), environment).model;
36
+ const step = action;
37
+ const names = (model?.tables ?? [])
38
+ .filter((table) => table[step]?.method === method)
39
+ .map((table) => table.name);
40
+ if (names.length === 0)
41
+ return "";
42
+ const shown = names.length > 5 ? [...names.slice(0, 5), `${names.length - 5} more`] : names;
43
+ return `; it applies to every ${method} table: ${shown.join(", ")}`;
44
+ }
45
+ function misplaced(project, file, text, offset, environment) {
46
+ const spot = spotAt(text, offset);
47
+ if (!spot)
48
+ return undefined;
49
+ const place = placeAt(file, text, offset);
50
+ const settings = settingsAt(project, place, spot.segments, environment);
51
+ const key = settings?.rest[0];
52
+ const method = settings && methodNamed(settings.method);
53
+ if (!settings || !key || !method)
54
+ return undefined;
55
+ const belongs = placementOf(method, key);
56
+ if (!belongs || belongs === place.kind)
57
+ return undefined;
58
+ const from = spot.segments.slice(0, spot.segments.length - settings.rest.length + 1);
59
+ return { key, method: settings.method, action: method.action, belongs, from };
60
+ }
61
+ /** The kind of file a setting belongs in, when its method says. */
62
+ function placementOf(method, key) {
63
+ if (method.placement?.platform?.includes(key))
64
+ return "Platform";
65
+ return method.placement?.standard?.includes(key) ? "Standard" : undefined;
66
+ }
67
+ function methodNamed(id) {
68
+ return packs.find((pack) => pack.methods[id])?.methods[id];
69
+ }
70
+ /** The project's file with a document of this kind. */
71
+ function fileOfKind(project, kind) {
72
+ const pattern = new RegExp(`^kind:\\s*${kind}\\s*$`, "m");
73
+ return project.files
74
+ .list()
75
+ .find((path) => /\.ya?ml$/.test(path) && pattern.test(project.files.read(path) ?? ""));
76
+ }
77
+ function valueAt(value, segments) {
78
+ return segments.reduce((node, segment) => node !== null && typeof node === "object"
79
+ ? node[segment]
80
+ : undefined, value);
81
+ }
82
+ //# sourceMappingURL=moves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moves.js","sourceRoot":"","sources":["../src/moves.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Project } from "./project.js";
2
+ /** A range of text in a project file (offsets). */
3
+ export interface Place {
4
+ file: string;
5
+ range: [number, number];
6
+ }
7
+ interface Occurrence extends Place {
8
+ /** What the place names, such as `doc:Connection:shop`, `table:orders` or `value:host`. */
9
+ symbol: string;
10
+ definition: boolean;
11
+ }
12
+ /** Where the id or reference at the offset is defined. */
13
+ export declare function definitionAt(project: Project, file: string, offset: number): Place | undefined;
14
+ /**
15
+ * Every place that defines or uses what is at the offset. A transform's id
16
+ * names both the transform and its table, so both are followed.
17
+ */
18
+ export declare function referencesAt(project: Project, file: string, offset: number): Place[];
19
+ /** The definitions and uses at the offset in `file`. */
20
+ export declare function occurrencesAt(project: Project, file: string, offset: number): Occurrence[];
21
+ /** Every definition and reference in the project's own files, computed once per project snapshot. */
22
+ export declare function occurrences(project: Project): Occurrence[];
23
+ export {};
24
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,mDAAmD;AACnD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzB;AAED,UAAU,UAAW,SAAQ,KAAK;IAChC,2FAA2F;IAC3F,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAUD,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAQ9F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAcpF;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAI1F;AAID,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,EAAE,CAI1D"}
@@ -0,0 +1,176 @@
1
+ // Go to definition and references. One index of the project lists every
2
+ // place an id is defined or used; these and rename all read from it, so they agree.
3
+ import { kinds } from "@ingestron/definitions";
4
+ import { dirname, join, normalize } from "node:path";
5
+ import { allSpots } from "./yaml.js";
6
+ const links = Object.values(kinds).flatMap((kind) => Object.entries(kind.links ?? {}).map(([pointer, target]) => ({
7
+ kind: kind.kind,
8
+ pattern: pointer.split("/").slice(1),
9
+ target,
10
+ })));
11
+ /** Where the id or reference at the offset is defined. */
12
+ export function definitionAt(project, file, offset) {
13
+ const here = occurrencesAt(project, file, offset);
14
+ const path = here.find((item) => item.symbol.startsWith("file:"))?.symbol.slice("file:".length);
15
+ if (path)
16
+ return project.files.read(path) === undefined ? undefined : { file: path, range: [0, 0] };
17
+ const symbols = new Set(here.map((item) => item.symbol));
18
+ const found = occurrences(project).find((item) => symbols.has(item.symbol) && item.definition);
19
+ return found && { file: found.file, range: found.range };
20
+ }
21
+ /**
22
+ * Every place that defines or uses what is at the offset. A transform's id
23
+ * names both the transform and its table, so both are followed.
24
+ */
25
+ export function referencesAt(project, file, offset) {
26
+ const symbols = new Set(occurrencesAt(project, file, offset)
27
+ .map((item) => item.symbol)
28
+ .filter((symbol) => !symbol.startsWith("file:")));
29
+ const seen = new Set();
30
+ return occurrences(project)
31
+ .filter((item) => symbols.has(item.symbol))
32
+ .filter((item) => {
33
+ const key = `${item.file}:${item.range[0]}`;
34
+ return !seen.has(key) && seen.add(key) !== undefined;
35
+ })
36
+ .map(({ file: path, range }) => ({ file: path, range }));
37
+ }
38
+ /** The definitions and uses at the offset in `file`. */
39
+ export function occurrencesAt(project, file, offset) {
40
+ return occurrences(project).filter((item) => item.file === file && offset >= item.range[0] && offset <= item.range[1]);
41
+ }
42
+ const cache = new WeakMap();
43
+ /** Every definition and reference in the project's own files, computed once per project snapshot. */
44
+ export function occurrences(project) {
45
+ let found = cache.get(project);
46
+ if (!found)
47
+ cache.set(project, (found = scan(project)));
48
+ return found;
49
+ }
50
+ function scan(project) {
51
+ const paths = project.files
52
+ .list()
53
+ .filter((path) => !path.startsWith("build/") && !path.includes("/build/"));
54
+ const code = transformCode(project, paths);
55
+ return paths.flatMap((path) => {
56
+ const text = project.files.read(path) ?? "";
57
+ const inText = /\.(ya?ml|sql|py)$/.test(path) ? textOccurrences(path, text, code) : [];
58
+ return /\.ya?ml$/.test(path) ? [...yamlOccurrences(path, text), ...inText] : inText;
59
+ });
60
+ }
61
+ /** The files transforms include as their code with `${file:…}`: only there is `tables["x"]` an input. */
62
+ function transformCode(project, paths) {
63
+ return new Set(paths
64
+ .filter((path) => /\.ya?ml$/.test(path))
65
+ .flatMap((path) => {
66
+ const text = project.files.read(path) ?? "";
67
+ if (!/^kind:\s*Transform\s*$/m.test(text))
68
+ return [];
69
+ return [...text.matchAll(/\$\{file:([^}#]+)/g)].map((match) => included(path, match[1]));
70
+ }));
71
+ }
72
+ /** A `${file:…}` path, relative to the including file, as a project path. */
73
+ function included(file, path) {
74
+ return normalize(join(dirname(file), path))
75
+ .split("\\")
76
+ .join("/");
77
+ }
78
+ function yamlOccurrences(file, text) {
79
+ let spots;
80
+ try {
81
+ spots = allSpots(text);
82
+ }
83
+ catch {
84
+ return [];
85
+ }
86
+ const kind = spots.find((item) => item.pointer === "/kind" && item.part === "value")?.text;
87
+ return spots.flatMap((item) => symbolsOf(file, kind, item).map(([symbol, definition]) => ({
88
+ file,
89
+ range: unquoted(text, item.range),
90
+ symbol,
91
+ definition,
92
+ })));
93
+ }
94
+ /** What each key or value names; the first rule that answers wins. */
95
+ const rules = [
96
+ (_file, kind, { pointer, part, text }) => part === "value" && pointer === "/id" && kind
97
+ ? [
98
+ [`doc:${kind}:${text}`, true],
99
+ ...(kind === "Transform" ? [[`table:${text}`, true]] : []),
100
+ ]
101
+ : undefined,
102
+ (_file, kind, { segments, part, text }) => kind === "Flow" && part === "key" && segments.length === 2 && segments[0] === "tables"
103
+ ? [[`table:${text}`, true]]
104
+ : undefined,
105
+ (_file, kind, { segments, part, text }) => kind === "Transform" && part === "value" && segments.length === 2 && segments[0] === "inputs"
106
+ ? [[`table:${text}`, false]]
107
+ : undefined,
108
+ (file, _kind, { segments, part, text }) => file === "project.yaml" && part === "key" && segments.length === 2 && segments[0] === "values"
109
+ ? [[`value:${text}`, true]]
110
+ : undefined,
111
+ // An environment's override of a value is the same value: rename must change it too.
112
+ (file, _kind, { segments, part, text }) => file === "project.yaml" &&
113
+ part === "key" &&
114
+ segments.length === 4 &&
115
+ segments[0] === "environments" &&
116
+ segments[2] === "values"
117
+ ? [[`value:${text}`, false]]
118
+ : undefined,
119
+ (_file, kind, { segments, part, text }) => {
120
+ if (part !== "value")
121
+ return undefined;
122
+ const link = links.find((item) => item.kind === kind && matches(item.pattern, segments));
123
+ return link && [[`doc:${link.target}:${text}`, false]];
124
+ },
125
+ ];
126
+ function symbolsOf(file, kind, item) {
127
+ for (const rule of rules) {
128
+ const found = rule(file, kind, item);
129
+ if (found)
130
+ return found;
131
+ }
132
+ return [];
133
+ }
134
+ function matches(pattern, segments) {
135
+ return (pattern.length === segments.length &&
136
+ pattern.every((part, index) => part === "*" || part === segments[index]));
137
+ }
138
+ /**
139
+ * References written inside text: `${values.x}`, `${file:…}` and
140
+ * `{{ tables.x }}`, and in Python `tables["x"]`, the DataFrame of input `x`.
141
+ */
142
+ function textOccurrences(file, text, code) {
143
+ const found = [];
144
+ const add = (expression, symbol, skip) => {
145
+ for (const match of text.matchAll(expression)) {
146
+ if (skip?.(text, match.index))
147
+ continue;
148
+ const name = match[1];
149
+ const start = match.index + match[0].indexOf(name);
150
+ found.push({
151
+ file,
152
+ range: [start, start + name.length],
153
+ symbol: symbol(name),
154
+ definition: false,
155
+ });
156
+ }
157
+ };
158
+ add(/\$\{values\.([A-Za-z_]\w*)/g, (name) => `value:${name}`);
159
+ add(/\{\{\s*tables\.([A-Za-z_]\w*)\s*\}\}/g, (name) => `table:${name}`);
160
+ if (code.has(file))
161
+ add(/\btables\[\s*["']([A-Za-z_]\w*)["']\s*\]/g, (name) => `table:${name}`, inComment);
162
+ add(/\$\{file:([^}#]+)/g, (path) => `file:${included(file, path)}`);
163
+ return found;
164
+ }
165
+ /** True when the offset is after a `#` on its line: a Python comment. */
166
+ function inComment(text, offset) {
167
+ return text.slice(text.lastIndexOf("\n", offset) + 1, offset).includes("#");
168
+ }
169
+ /** A quoted scalar's range without its quotes, so a rename keeps them. */
170
+ function unquoted(text, [start, end]) {
171
+ const quote = text[start];
172
+ return (quote === '"' || quote === "'") && text[end - 1] === quote
173
+ ? [start + 1, end - 1]
174
+ : [start, end];
175
+ }
176
+ //# sourceMappingURL=navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,oFAAoF;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAa,MAAM,WAAW,CAAC;AAchD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAClD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,EAAE,IAAI,CAAC,IAAI;IACf,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,MAAM;CACP,CAAC,CAAC,CACJ,CAAC;AAEF,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,IAAY,EAAE,MAAc;IACzE,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChG,IAAI,IAAI;QACN,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC5F,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/F,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,IAAY,EAAE,MAAc;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;SAC1B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CACnD,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,WAAW,CAAC,OAAO,CAAC;SACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC1C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IACvD,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,IAAY,EAAE,MAAc;IAC1E,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACnF,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAG,IAAI,OAAO,EAAyB,CAAC;AAEnD,qGAAqG;AACrG,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,IAAI,CAAC,OAAgB;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;SACxB,IAAI,EAAE;SACN,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yGAAyG;AACzG,SAAS,aAAa,CAAC,OAAgB,EAAE,KAAe;IACtD,OAAO,IAAI,GAAG,CACZ,KAAK;SACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACvC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,CACL,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAY;IAC1C,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;SACxC,KAAK,CAAC,IAAI,CAAC;SACX,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,IAAY;IACjD,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC;IAC3F,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5B,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;QACjC,MAAM;QACN,UAAU;KACX,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAID,sEAAsE;AACtE,MAAM,KAAK,GAAW;IACpB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CACvC,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,IAAI,IAAI;QAC3C,CAAC,CAAC;YACE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC;YAC7B,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,CAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF;QACH,CAAC,CAAC,SAAS;IACf,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CACxC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ;QACpF,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC,SAAS;IACf,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CACxC,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ;QAC3F,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,SAAS;IACf,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CACxC,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ;QAC5F,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC,SAAS;IACf,qFAAqF;IACrF,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CACxC,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,KAAK;QACd,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,QAAQ,CAAC,CAAC,CAAC,KAAK,cAAc;QAC9B,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ;QACtB,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,SAAS;IACf,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACxC,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzF,OAAO,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;CACF,CAAC;AAEF,SAAS,SAAS,CAAC,IAAY,EAAE,IAAwB,EAAE,IAAU;IACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,OAAiB,EAAE,QAAkB;IACpD,OAAO,CACL,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAClC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,IAAY,EAAE,IAAiB;IACpE,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,CACV,UAAkB,EAClB,MAAgC,EAChC,IAAgD,EAChD,EAAE;QACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI;gBACJ,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;gBACnC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC;gBACpB,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IACF,GAAG,CAAC,6BAA6B,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,uCAAuC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAChB,GAAG,CAAC,2CAA2C,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IACzF,GAAG,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,SAAS,SAAS,CAAC,IAAY,EAAE,MAAc;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,0EAA0E;AAC1E,SAAS,QAAQ,CAAC,IAAY,EAAE,CAAC,KAAK,EAAE,GAAG,CAAmB;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK;QAChE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Project } from "./project.js";
2
+ /** The request as Markdown for the environment, as `ingestron request` prints it. */
3
+ export declare function platformRequest(project: Project, environment: string | undefined): string;
4
+ /** What differs between two environments, as `ingestron compare` prints it. */
5
+ export declare function compareEnvironments(project: Project, a: string, b: string): string;
6
+ //# sourceMappingURL=platform-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-request.d.ts","sourceRoot":"","sources":["../src/platform-request.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEzF;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAElF"}
@@ -0,0 +1,13 @@
1
+ // The platform request and the environment comparison for the editor's
2
+ // commands: the CLI's `ingestron request` and `ingestron compare` text, from
3
+ // the project's files with open editors read first.
4
+ import { compareEnvironments as compare, platformRequest as request } from "@ingestron/cli";
5
+ /** The request as Markdown for the environment, as `ingestron request` prints it. */
6
+ export function platformRequest(project, environment) {
7
+ return request(project.files, environment);
8
+ }
9
+ /** What differs between two environments, as `ingestron compare` prints it. */
10
+ export function compareEnvironments(project, a, b) {
11
+ return compare(project.files, a, b);
12
+ }
13
+ //# sourceMappingURL=platform-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-request.js","sourceRoot":"","sources":["../src/platform-request.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,oDAAoD;AACpD,OAAO,EAAE,mBAAmB,IAAI,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG5F,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,WAA+B;IAC/E,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,CAAS,EAAE,CAAS;IACxE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type Project } from "./project.js";
2
+ /** One generated file, at its path in the project (under build/). */
3
+ export interface Generated {
4
+ path: string;
5
+ text: string;
6
+ }
7
+ type Files = Generated[] | {
8
+ problems: string;
9
+ };
10
+ /** Every file `apply` would write for the environment, or the problems that stop it; once per project snapshot. */
11
+ export declare function generatedFiles(project: Project, environment: string | undefined): Files;
12
+ /**
13
+ * The generated files for one table: its SQL or Python file, the copy that
14
+ * lands it, and the Lakeflow Connect pipeline that ingests it as `physical`.
15
+ */
16
+ export declare function generatedForTable(files: Generated[], table: string, physical?: string): Generated[];
17
+ /** The flow table the cursor is in, or the transform's table. */
18
+ export declare function tableAtCursor(text: string, offset: number): string | undefined;
19
+ export {};
20
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAKA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAGtD,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,KAAK,KAAK,GAAG,SAAS,EAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAGhD,mHAAmH;AACnH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAOvF;AAcD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,SAAQ,GACf,SAAS,EAAE,CAOb;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY9E"}
@@ -0,0 +1,51 @@
1
+ // The generated files, in memory, exactly as the CLI would write them, and
2
+ // the ones that belong to the table at the cursor.
3
+ import { kindOf } from "./context.js";
4
+ import { formatDiagnostics } from "@ingestron/config";
5
+ import { generatedOutputs } from "@ingestron/cli";
6
+ import { resolved } from "./project.js";
7
+ import { keyPath } from "./yaml.js";
8
+ const built = new WeakMap();
9
+ /** Every file `apply` would write for the environment, or the problems that stop it; once per project snapshot. */
10
+ export function generatedFiles(project, environment) {
11
+ let byEnvironment = built.get(project);
12
+ if (!byEnvironment)
13
+ built.set(project, (byEnvironment = new Map()));
14
+ const key = environment ?? "";
15
+ let files = byEnvironment.get(key);
16
+ if (!files)
17
+ byEnvironment.set(key, (files = build(project, environment)));
18
+ return files;
19
+ }
20
+ function build(project, environment) {
21
+ const name = environment ?? "default";
22
+ const { model, diagnostics } = resolved(project, environment);
23
+ if (!model)
24
+ return {
25
+ problems: `${name}: the definitions have problems\n${formatDiagnostics(diagnostics)}`,
26
+ };
27
+ return generatedOutputs(model, name).flatMap(({ label, files }) => Object.entries(files).map(([path, text]) => ({ path: `build/${label}/${path}`, text })));
28
+ }
29
+ /**
30
+ * The generated files for one table: its SQL or Python file, the copy that
31
+ * lands it, and the Lakeflow Connect pipeline that ingests it as `physical`.
32
+ */
33
+ export function generatedForTable(files, table, physical = table) {
34
+ return files.filter((file) => file.text.includes(`(table ${table})`) ||
35
+ file.text.includes(`"copy_${table}"`) ||
36
+ new RegExp(`^\\s*destination_table: ${physical}$`, "m").test(file.text));
37
+ }
38
+ /** The flow table the cursor is in, or the transform's table. */
39
+ export function tableAtCursor(text, offset) {
40
+ const kind = kindOf(text);
41
+ if (kind === "Transform")
42
+ return /^id:\s*(\S+)/m.exec(text)?.[1];
43
+ if (kind !== "Flow")
44
+ return undefined;
45
+ const lineEnd = text.indexOf("\n", offset);
46
+ const path = keyPath(text, lineEnd === -1 ? text.length : lineEnd);
47
+ const line = text.slice(text.lastIndexOf("\n", offset - 1) + 1, lineEnd === -1 ? undefined : lineEnd);
48
+ const own = /^ {2}([\w-]+):/.exec(line)?.[1];
49
+ return path[0] === "tables" ? (path[1] ?? own) : undefined;
50
+ }
51
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,mDAAmD;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAgB,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,KAAK,GAAG,IAAI,OAAO,EAA+B,CAAC;AAEzD,mHAAmH;AACnH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,WAA+B;IAC9E,IAAI,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,aAAa;QAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,WAAW,IAAI,EAAE,CAAC;IAC9B,IAAI,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,KAAK,CAAC,OAAgB,EAAE,WAA+B;IAC9D,MAAM,IAAI,GAAG,WAAW,IAAI,SAAS,CAAC;IACtC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK;QACR,OAAO;YACL,QAAQ,EAAE,GAAG,IAAI,oCAAoC,iBAAiB,CAAC,WAAW,CAAC,EAAE;SACtF,CAAC;IACJ,OAAO,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAChE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACxF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAkB,EAClB,KAAa,EACb,QAAQ,GAAG,KAAK;IAEhB,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,GAAG,CAAC;QACrC,IAAI,MAAM,CAAC,2BAA2B,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACrB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EACtC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CACrC,CAAC;IACF,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Project } from "./project.js";
2
+ /** A problem on the cursor's line, explained. */
3
+ export interface ProblemEntry {
4
+ code: string;
5
+ severity: "error" | "warning";
6
+ message: string;
7
+ /** The problem's own hint, such as the fields that are allowed. */
8
+ hint?: string;
9
+ meaning?: string;
10
+ fix?: string;
11
+ /** The quick fixes the editor offers for it. */
12
+ fixes: string[];
13
+ docs?: string;
14
+ }
15
+ /** The problems on the cursor's line, with their meaning, fix and quick fixes. */
16
+ export declare function problemsAt(project: Project, file: string, text: string, offset: number, environment: string | undefined): ProblemEntry[];
17
+ //# sourceMappingURL=problems-at.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"problems-at.d.ts","sourceRoot":"","sources":["../src/problems-at.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,YAAY,EAAE,CAuBhB"}
@@ -0,0 +1,32 @@
1
+ // The problems on the cursor's line, explained for the Reference panel: the
2
+ // problem's own hint, its code's meaning and fix, and the quick fixes offered.
3
+ import { codeHelp, loadingCodeHelp } from "@ingestron/definitions";
4
+ import { problems } from "./diagnostics.js";
5
+ import { codeDocs } from "./docs.js";
6
+ import { quickFixes } from "./fixes.js";
7
+ import { positionAt } from "./yaml.js";
8
+ /** The problems on the cursor's line, with their meaning, fix and quick fixes. */
9
+ export function problemsAt(project, file, text, offset, environment) {
10
+ const { line } = positionAt(text, offset);
11
+ const at = { start: { line, character: 0 }, end: { line, character: 0 } };
12
+ const fixes = quickFixes(project, environment, file, at);
13
+ return problems(project, environment)
14
+ .filter((problem) => problem.file === file && problem.range.start.line === line)
15
+ .map((problem) => {
16
+ const help = codeHelp[problem.code] ??
17
+ loadingCodeHelp[problem.code];
18
+ const docs = codeDocs(problem.code);
19
+ return {
20
+ code: problem.code,
21
+ severity: problem.severity,
22
+ message: problem.message.split("\n")[0],
23
+ ...(problem.message.includes("\n") && {
24
+ hint: problem.message.slice(problem.message.indexOf("\n") + 1),
25
+ }),
26
+ fixes: fixes.filter((fix) => fix.problem?.code === problem.code).map((fix) => fix.title),
27
+ ...(help && { meaning: help.meaning, fix: help.fix }),
28
+ ...(docs && { docs }),
29
+ };
30
+ });
31
+ }
32
+ //# sourceMappingURL=problems-at.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"problems-at.js","sourceRoot":"","sources":["../src/problems-at.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+EAA+E;AAC/E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAgBvC,kFAAkF;AAClF,MAAM,UAAU,UAAU,CACxB,OAAgB,EAChB,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,WAA+B;IAE/B,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1E,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;SAClC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;SAC/E,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,MAAM,IAAI,GACR,QAAQ,CAAC,OAAO,CAAC,IAA6B,CAAC;YAC/C,eAAe,CAAC,OAAO,CAAC,IAAoC,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE;YACxC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI;gBACpC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC/D,CAAC;YACF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;YACxF,GAAG,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type DefinitionDocument, type FileSource } from "@ingestron/config";
2
+ import { resolveDefinitions } from "@ingestron/definitions";
3
+ /** A project folder, its files and the environments it declares. */
4
+ export interface Project {
5
+ folder: string;
6
+ files: FileSource;
7
+ /** Declared environments, in order; empty when project.yaml declares none. */
8
+ environments: string[];
9
+ }
10
+ /** The nearest folder at or above the file's folder that has project.yaml. */
11
+ export declare function projectFolderOf(path: string): string | undefined;
12
+ /**
13
+ * The project in `folder`, with `open` (absolute path → text) read before the disk.
14
+ * Open a fresh project after any edit or disk change to refresh cached editor features.
15
+ */
16
+ export declare function openProject(folder: string, open: ReadonlyMap<string, string>): Project;
17
+ /** A path relative to the project, with forward slashes, or undefined outside it. */
18
+ export declare function inProject(folder: string, path: string): string | undefined;
19
+ /** The project resolved for an environment with the CLI's packs, once per project snapshot. */
20
+ export declare function resolved(project: Project, environment: string | undefined): ReturnType<typeof resolveDefinitions>;
21
+ /**
22
+ * The documents the project's imports load for an environment, with
23
+ * `${values.…}` and the rest resolved; once per project snapshot. Undefined
24
+ * when the project does not load.
25
+ */
26
+ export declare function loadedDocuments(project: Project, environment: string | undefined): readonly DefinitionDocument[] | undefined;
27
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAS,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,oEAAoE;AACpE,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,CAAC;IAClB,8EAA8E;IAC9E,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQhE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAGtF;AAED,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI1E;AA+BD,+FAA+F;AAC/F,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAUvC;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,SAAS,kBAAkB,EAAE,GAAG,SAAS,CAc3C"}
@@ -0,0 +1,96 @@
1
+ // An Ingestron project as the editor sees it: the folder with project.yaml,
2
+ // its files with open editors read before the disk, and its environments.
3
+ import { existsSync } from "node:fs";
4
+ import { dirname, join, relative, sep } from "node:path";
5
+ import { nodeFiles, resolveProject, } from "@ingestron/config";
6
+ import { packs } from "@ingestron/cli";
7
+ import { kinds, resolveDefinitions } from "@ingestron/definitions";
8
+ import { parse } from "yaml";
9
+ /** The nearest folder at or above the file's folder that has project.yaml. */
10
+ export function projectFolderOf(path) {
11
+ let folder = dirname(path);
12
+ for (;;) {
13
+ if (existsSync(join(folder, "project.yaml")))
14
+ return folder;
15
+ const parent = dirname(folder);
16
+ if (parent === folder)
17
+ return undefined;
18
+ folder = parent;
19
+ }
20
+ }
21
+ /**
22
+ * The project in `folder`, with `open` (absolute path → text) read before the disk.
23
+ * Open a fresh project after any edit or disk change to refresh cached editor features.
24
+ */
25
+ export function openProject(folder, open) {
26
+ const files = overlay(folder, open);
27
+ return { folder, files, environments: environmentsOf(files) };
28
+ }
29
+ /** A path relative to the project, with forward slashes, or undefined outside it. */
30
+ export function inProject(folder, path) {
31
+ const inside = relative(folder, path);
32
+ if (inside.startsWith("..") || inside === "")
33
+ return undefined;
34
+ return inside.split(sep).join("/");
35
+ }
36
+ function overlay(folder, open) {
37
+ const disk = nodeFiles(folder);
38
+ const edited = new Map();
39
+ for (const [path, text] of open) {
40
+ const inside = inProject(folder, path);
41
+ if (inside)
42
+ edited.set(inside, text);
43
+ }
44
+ return {
45
+ list: () => [...new Set([...disk.list(), ...edited.keys()])].sort(),
46
+ read: (path) => edited.get(path) ?? disk.read(path),
47
+ size: (path) => {
48
+ const text = edited.get(path);
49
+ return text === undefined ? disk.size?.(path) : Buffer.byteLength(text);
50
+ },
51
+ };
52
+ }
53
+ function environmentsOf(files) {
54
+ try {
55
+ const data = parse(files.read("project.yaml") ?? "");
56
+ return Object.keys(data?.environments ?? {});
57
+ }
58
+ catch {
59
+ // The problem is reported with its location by the diagnostics.
60
+ return [];
61
+ }
62
+ }
63
+ const resolutions = new WeakMap();
64
+ /** The project resolved for an environment with the CLI's packs, once per project snapshot. */
65
+ export function resolved(project, environment) {
66
+ let byEnvironment = resolutions.get(project);
67
+ if (!byEnvironment)
68
+ resolutions.set(project, (byEnvironment = new Map()));
69
+ const key = environment ?? "";
70
+ let result = byEnvironment.get(key);
71
+ if (!result) {
72
+ result = resolveDefinitions(project.files, { packs, ...(environment && { environment }) });
73
+ byEnvironment.set(key, result);
74
+ }
75
+ return result;
76
+ }
77
+ const loadings = new WeakMap();
78
+ /**
79
+ * The documents the project's imports load for an environment, with
80
+ * `${values.…}` and the rest resolved; once per project snapshot. Undefined
81
+ * when the project does not load.
82
+ */
83
+ export function loadedDocuments(project, environment) {
84
+ let byEnvironment = loadings.get(project);
85
+ if (!byEnvironment)
86
+ loadings.set(project, (byEnvironment = new Map()));
87
+ const key = environment ?? "";
88
+ if (!byEnvironment.has(key))
89
+ byEnvironment.set(key, resolveProject(project.files, {
90
+ kinds: Object.values(kinds),
91
+ ...(environment && { environment }),
92
+ envvars: {},
93
+ }).project?.documents);
94
+ return byEnvironment.get(key);
95
+ }
96
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}