@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
@@ -0,0 +1,50 @@
1
+ import { type ProblemEntry } from "./problems-at.js";
2
+ import { type FieldInfo } from "@ingestron/definitions";
3
+ import { type MethodInfo } from "./methods.js";
4
+ import type { Project } from "./project.js";
5
+ import { type Spot } from "./yaml.js";
6
+ export type { ProblemEntry };
7
+ /** What the panel shows; every text is plain, with `code` in backticks. */
8
+ export interface ReferenceEntry {
9
+ title: string;
10
+ subtitle: string;
11
+ text?: string;
12
+ values?: {
13
+ value: string;
14
+ text?: string;
15
+ current?: boolean;
16
+ }[];
17
+ /** Short facts; `code` ones are values as written, such as a default. */
18
+ facts?: {
19
+ label: string;
20
+ value: string;
21
+ code?: boolean;
22
+ }[];
23
+ /** For a document or method: its top-level fields or settings. */
24
+ fields?: {
25
+ name: string;
26
+ text?: string;
27
+ docs: string;
28
+ }[];
29
+ /** The heading for `fields`, such as "Settings"; default "Fields". */
30
+ fieldsHeading?: string;
31
+ /** For a method: each table that uses it, and what chose it. */
32
+ usedBy?: string[];
33
+ /** For a contract field: what each of the project's packs does with it. */
34
+ packs?: {
35
+ pack: string;
36
+ status: string;
37
+ text: string;
38
+ }[];
39
+ problems?: ProblemEntry[];
40
+ docs?: string;
41
+ }
42
+ /** The entry for `offset` in `text`, the open text of `file`; undefined outside definitions. */
43
+ export declare function referenceAt(project: Project, file: string, text: string, offset: number, environment: string | undefined): ReferenceEntry | undefined;
44
+ /** A method's entry: what it does, its facts and settings, and the tables that use it. */
45
+ export declare function methodEntry(info: MethodInfo): ReferenceEntry;
46
+ /** A field's entry: what it is, its values and facts; `spot` marks the value written. */
47
+ export declare function fieldEntry(field: FieldInfo, spot: Spot, subtitle: string): ReferenceEntry;
48
+ /** A document kind's entry, with its top-level fields. */
49
+ export declare function documentEntry(kind: string | undefined): ReferenceEntry | undefined;
50
+ //# sourceMappingURL=reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../src/reference.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAqC,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG3F,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAU,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAE9C,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC/D,yEAAyE;IACzE,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC3D,kEAAkE;IAClE,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzD,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,2EAA2E;IAC3E,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzD,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,gGAAgG;AAChG,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,cAAc,GAAG,SAAS,CAO5B;AAgED,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAe5D;AAkBD,yFAAyF;AACzF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CA0BzF;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAkBlF"}
@@ -0,0 +1,152 @@
1
+ // The reference entry for the place under the cursor, for a panel beside the
2
+ // editor: the problems on that line with their meaning and fixes, then the
3
+ // field or value there, or else the document kind and its fields.
4
+ import { problemsAt } from "./problems-at.js";
5
+ import { documentReference, referenceKinds } from "@ingestron/definitions";
6
+ import { placeAt } from "./context.js";
7
+ import { connectorOf, fieldAt, settingsAt } from "./fields.js";
8
+ import { methodAt, methodInfo } from "./methods.js";
9
+ import { shown } from "./hover.js";
10
+ import { contractUses } from "./contract-uses.js";
11
+ import { spotAt } from "./yaml.js";
12
+ /** The entry for `offset` in `text`, the open text of `file`; undefined outside definitions. */
13
+ export function referenceAt(project, file, text, offset, environment) {
14
+ if (!/\.ya?ml$/.test(file))
15
+ return undefined;
16
+ const entry = placeEntry(project, file, text, offset, environment);
17
+ const found = problemsAt(project, file, text, offset, environment);
18
+ if (!entry && found.length === 0)
19
+ return undefined;
20
+ const base = entry ?? { title: "Problems", subtitle: file };
21
+ return found.length > 0 ? { ...base, problems: found } : base;
22
+ }
23
+ /** The field or value at the place, or the document when there is no field or it is the header. */
24
+ function placeEntry(project, file, text, offset, environment) {
25
+ const place = placeAt(file, text, offset);
26
+ const spot = safeSpot(text, offset);
27
+ // On a new list item there is no field yet: the list it is in is the place.
28
+ if (!spot)
29
+ return place.path.length > 0
30
+ ? listEntry(project, place, environment)
31
+ : documentEntry(place.kind);
32
+ if (/^(apiVersion|kind)$/.test(spot.segments.join("/")))
33
+ return documentEntry(place.kind);
34
+ const named = methodAt(project, place, spot, environment);
35
+ const info = named && methodInfo(project, named, environment);
36
+ return info ? methodEntry(info) : spotEntry(project, place, spot, environment);
37
+ }
38
+ /** The field at the spot; for a list item without its own description, the list's. */
39
+ function spotEntry(project, place, spot, environment) {
40
+ const field = fieldAt(project, place, spot.segments, environment);
41
+ if (!field && /^\d+$/.test(spot.segments.at(-1) ?? ""))
42
+ return listEntry(project, { ...place, path: spot.segments.slice(0, -1) }, environment);
43
+ if (!field)
44
+ return documentEntry(place.kind);
45
+ const method = settingsAt(project, place, spot.segments, environment)?.method;
46
+ const connector = spot.segments[0] === "settings" ? connectorOf(place, project, environment) : undefined;
47
+ const subtitle = method
48
+ ? `Setting of ${method}`
49
+ : connector
50
+ ? `Setting of the ${connector.title} connector`
51
+ : `Field of ${place.kind}`;
52
+ const entry = fieldEntry(field, spot, subtitle);
53
+ return place.kind === "DataContract" ? withPacks(project, entry, field, environment) : entry;
54
+ }
55
+ function listEntry(project, place, environment) {
56
+ const field = fieldAt(project, place, place.path, environment);
57
+ const spot = {
58
+ part: "key",
59
+ segments: place.path,
60
+ pointer: "",
61
+ text: "",
62
+ range: [0, 0],
63
+ };
64
+ if (!field)
65
+ return documentEntry(place.kind);
66
+ const entry = fieldEntry(field, spot, `Field of ${place.kind}`);
67
+ return place.kind === "DataContract" ? withPacks(project, entry, field, environment) : entry;
68
+ }
69
+ /** A method's entry: what it does, its facts and settings, and the tables that use it. */
70
+ export function methodEntry(info) {
71
+ return {
72
+ title: info.id,
73
+ subtitle: `Method of the ${info.pack} pack (${info.action})`,
74
+ text: info.description,
75
+ facts: info.facts,
76
+ fields: info.settings.map((field) => ({
77
+ name: field.name,
78
+ docs: field.docs,
79
+ ...(field.description && { text: field.description }),
80
+ })),
81
+ fieldsHeading: "Settings",
82
+ docs: info.docs,
83
+ usedBy: info.usedBy,
84
+ };
85
+ }
86
+ function withPacks(project, entry, field, environment) {
87
+ const packs = contractUses(project, field.path.join("."), environment);
88
+ return packs.length > 0 ? { ...entry, packs } : entry;
89
+ }
90
+ const homes = {
91
+ platform: "the platform",
92
+ standard: "the standard",
93
+ definition: "a flow or transform",
94
+ };
95
+ /** A field's entry: what it is, its values and facts; `spot` marks the value written. */
96
+ export function fieldEntry(field, spot, subtitle) {
97
+ const written = spot.part === "value" ? spot.text : undefined;
98
+ const facts = [
99
+ field.required && { label: "Required", value: "yes" },
100
+ field.default !== undefined && { label: "Default", value: shown(field.default), code: true },
101
+ field.example !== undefined && {
102
+ label: "For example",
103
+ value: shown(field.example),
104
+ code: true,
105
+ },
106
+ field.placement && { label: "Usually in", value: homes[field.placement] },
107
+ ].filter((fact) => Boolean(fact));
108
+ return {
109
+ title: field.name,
110
+ subtitle,
111
+ docs: field.docs,
112
+ ...(field.description && { text: field.description }),
113
+ ...(field.values && {
114
+ values: field.values.map(({ value, description }) => ({
115
+ value: String(value),
116
+ ...(description && { text: description }),
117
+ ...(written === String(value) && { current: true }),
118
+ })),
119
+ }),
120
+ ...(facts.length > 0 && { facts }),
121
+ };
122
+ }
123
+ /** A document kind's entry, with its top-level fields. */
124
+ export function documentEntry(kind) {
125
+ if (!kind || !(kind in referenceKinds))
126
+ return undefined;
127
+ const name = kind;
128
+ const schema = referenceKinds[name].schema;
129
+ const fields = documentReference(name)
130
+ .filter((field) => field.path.length === 1)
131
+ .map((field) => ({
132
+ name: field.name,
133
+ docs: field.docs,
134
+ ...(field.description && { text: field.description }),
135
+ }));
136
+ return {
137
+ title: kind,
138
+ subtitle: "Document",
139
+ fields,
140
+ docs: `/docs/reference/documents#${kind.toLowerCase()}`,
141
+ ...(schema.description && { text: schema.description }),
142
+ };
143
+ }
144
+ function safeSpot(text, offset) {
145
+ try {
146
+ return spotAt(text, offset);
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ //# sourceMappingURL=reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference.js","sourceRoot":"","sources":["../src/reference.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Project } from "./project.js";
2
+ /** The text with every reference resolved, or undefined when one cannot be (or must not be shown). */
3
+ export declare function resolveText(project: Project, text: string, environment: string | undefined): string | undefined;
4
+ /** The `${…}` reference around `offset` in `text`, if any. */
5
+ export declare function referenceAround(text: string, offset: number): string | undefined;
6
+ /** "`${values.x}` is `…` in dev." for a reference that may be shown, else undefined. */
7
+ export declare function referenceValue(project: Project, reference: string, environment: string | undefined): string | undefined;
8
+ //# sourceMappingURL=references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAS5C,sGAAsG;AACtG,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,MAAM,GAAG,SAAS,CAcpB;AAgCD,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKhF;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,MAAM,GAAG,SAAS,CAKpB"}
@@ -0,0 +1,68 @@
1
+ // `${…}` references resolved from project.yaml alone, for hints while a
2
+ // document has a problem and the project does not load: values for the
3
+ // environment, the environment's name, and the project's id and name.
4
+ import { parseDocument } from "yaml";
5
+ /** The text with every reference resolved, or undefined when one cannot be (or must not be shown). */
6
+ export function resolveText(project, text, environment) {
7
+ const manifest = manifestOf(project);
8
+ if (!manifest)
9
+ return undefined;
10
+ const values = {
11
+ ...manifest.values,
12
+ ...(environment ? manifest.environments?.[environment]?.values : {}),
13
+ };
14
+ const lookup = (name) => {
15
+ if (name === "environment.name")
16
+ return environment;
17
+ if (name === "project.id")
18
+ return manifest.id;
19
+ if (name === "project.name")
20
+ return manifest.name;
21
+ return name.startsWith("values.") ? values[name.slice("values.".length)] : undefined;
22
+ };
23
+ return substitute(text, lookup, 3);
24
+ }
25
+ function substitute(text, lookup, depth) {
26
+ let unresolved = false;
27
+ const out = text.replace(/\$\{([^}]+)\}/g, (_, name) => {
28
+ const value = lookup(name.trim());
29
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
30
+ unresolved = true;
31
+ return "";
32
+ }
33
+ // A value may itself use references, such as ${environment.name}.
34
+ const inner = depth > 0 ? substitute(String(value), lookup, depth - 1) : undefined;
35
+ if (inner === undefined)
36
+ unresolved = true;
37
+ return inner ?? "";
38
+ });
39
+ return unresolved ? undefined : out;
40
+ }
41
+ function manifestOf(project) {
42
+ try {
43
+ // Tolerant: a YAML error elsewhere in the file leaves the values readable.
44
+ const data = parseDocument(project.files.read("project.yaml") ?? "").toJS();
45
+ return data && typeof data === "object" ? data : undefined;
46
+ }
47
+ catch {
48
+ return undefined;
49
+ }
50
+ }
51
+ /** The `${…}` reference around `offset` in `text`, if any. */
52
+ export function referenceAround(text, offset) {
53
+ const start = text.lastIndexOf("${", offset);
54
+ const end = text.indexOf("}", start);
55
+ if (start < 0 || end < offset - 1 || text.slice(start, end).includes("\n"))
56
+ return undefined;
57
+ return text.slice(start, end + 1);
58
+ }
59
+ /** "`${values.x}` is `…` in dev." for a reference that may be shown, else undefined. */
60
+ export function referenceValue(project, reference, environment) {
61
+ if (/^\$\{(secret|envvar|file):/.test(reference))
62
+ return undefined;
63
+ const value = resolveText(project, reference, environment);
64
+ if (value === undefined)
65
+ return undefined;
66
+ return `\`${reference}\` is \`${value}\`${environment ? ` in ${environment}` : ""}.`;
67
+ }
68
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,uEAAuE;AACvE,sEAAsE;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAUrC,sGAAsG;AACtG,MAAM,UAAU,WAAW,CACzB,OAAgB,EAChB,IAAY,EACZ,WAA+B;IAE/B,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,MAAM,GAAG;QACb,GAAG,QAAQ,CAAC,MAAM;QAClB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAW,EAAE;QACvC,IAAI,IAAI,KAAK,kBAAkB;YAAE,OAAO,WAAW,CAAC;QACpD,IAAI,IAAI,KAAK,YAAY;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QAC9C,IAAI,IAAI,KAAK,cAAc;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;QAClD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,CAAC,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,UAAU,CACjB,IAAY,EACZ,MAAiC,EACjC,KAAa;IAEb,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACzF,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,kEAAkE;QAClE,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,IAAI,KAAK,KAAK,SAAS;YAAE,UAAU,GAAG,IAAI,CAAC;QAC3C,OAAO,KAAK,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAED,SAAS,UAAU,CAAC,OAAgB;IAClC,IAAI,CAAC;QACH,2EAA2E;QAC3E,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAa,CAAC;QACvF,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAAc;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7F,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,cAAc,CAC5B,OAAgB,EAChB,SAAiB,EACjB,WAA+B;IAE/B,IAAI,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACnE,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AACvF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Project } from "./project.js";
2
+ /** The edits that rename the id at the offset everywhere, by file. */
3
+ export declare function renameAt(project: Project, file: string, offset: number, name: string): Record<string, {
4
+ range: [number, number];
5
+ text: string;
6
+ }[]> | undefined;
7
+ /**
8
+ * Why the id at the offset cannot be renamed to `name`, or undefined when it
9
+ * can: a blank name, or one that another table or document of the same kind
10
+ * already has, which would leave two definitions with one name.
11
+ */
12
+ export declare function renameProblem(project: Project, file: string, offset: number, name: string): string | undefined;
13
+ /**
14
+ * The edits that keep every `${file:…}` pointing at the same file when the
15
+ * file or folder `from` moves to `to` (project paths with "/"), by file as
16
+ * it is now. A file that moves keeps its own references right too.
17
+ */
18
+ export declare function fileMoveEdits(project: Project, from: string, to: string): Record<string, {
19
+ range: [number, number];
20
+ text: string;
21
+ }[]>;
22
+ //# sourceMappingURL=rename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../src/rename.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,sEAAsE;AACtE,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,GAAG,SAAS,CAMzE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAapB;AASD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAa7D"}
package/dist/rename.js ADDED
@@ -0,0 +1,64 @@
1
+ // Rename: the edits that change an id everywhere it is used, the names it
2
+ // refuses, and the `${file:…}` paths to change when a file or folder moves,
3
+ // from the same index as go to definition and references.
4
+ import { dirname, posix } from "node:path";
5
+ import { occurrences, occurrencesAt, referencesAt } from "./navigation.js";
6
+ /** The edits that rename the id at the offset everywhere, by file. */
7
+ export function renameAt(project, file, offset, name) {
8
+ const places = referencesAt(project, file, offset);
9
+ if (places.length === 0)
10
+ return undefined;
11
+ const edits = {};
12
+ for (const place of places)
13
+ (edits[place.file] ??= []).push({ range: place.range, text: name });
14
+ return edits;
15
+ }
16
+ /**
17
+ * Why the id at the offset cannot be renamed to `name`, or undefined when it
18
+ * can: a blank name, or one that another table or document of the same kind
19
+ * already has, which would leave two definitions with one name.
20
+ */
21
+ export function renameProblem(project, file, offset, name) {
22
+ if (name.trim() === "")
23
+ return "Give a name.";
24
+ const symbols = occurrencesAt(project, file, offset)
25
+ .map((item) => item.symbol)
26
+ .filter((symbol) => !symbol.startsWith("file:"));
27
+ for (const symbol of symbols) {
28
+ const kind = symbol.slice(0, symbol.lastIndexOf(":") + 1);
29
+ const taken = `${kind}${name}`;
30
+ if (taken === symbol)
31
+ continue;
32
+ if (occurrences(project).some((item) => item.definition && item.symbol === taken))
33
+ return `"${name}" is already ${describe(kind)}. Choose another name.`;
34
+ }
35
+ return undefined;
36
+ }
37
+ /** `table:` → "the name of a table", `doc:Connection:` → "the id of a Connection". */
38
+ function describe(kind) {
39
+ if (kind === "table:")
40
+ return "the name of a table";
41
+ if (kind === "value:")
42
+ return "the name of a value";
43
+ return `the id of a ${kind.split(":")[1]}`;
44
+ }
45
+ /**
46
+ * The edits that keep every `${file:…}` pointing at the same file when the
47
+ * file or folder `from` moves to `to` (project paths with "/"), by file as
48
+ * it is now. A file that moves keeps its own references right too.
49
+ */
50
+ export function fileMoveEdits(project, from, to) {
51
+ const moved = (path) => path === from ? to : path.startsWith(`${from}/`) ? `${to}${path.slice(from.length)}` : path;
52
+ const edits = {};
53
+ for (const item of occurrences(project)) {
54
+ if (!item.symbol.startsWith("file:"))
55
+ continue;
56
+ const target = item.symbol.slice("file:".length);
57
+ const written = (project.files.read(item.file) ?? "").slice(...item.range);
58
+ const text = posix.relative(dirname(moved(item.file)), moved(target));
59
+ if (text !== written && (moved(item.file) !== item.file || moved(target) !== target))
60
+ (edits[item.file] ??= []).push({ range: item.range, text });
61
+ }
62
+ return edits;
63
+ }
64
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../src/rename.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /** A JSON Schema, loosely typed: only the parts the editor reads. */
2
+ export interface Schema {
3
+ type?: string | string[];
4
+ description?: string;
5
+ enum?: unknown[];
6
+ examples?: unknown[];
7
+ const?: unknown;
8
+ default?: unknown;
9
+ properties?: Record<string, Schema>;
10
+ additionalProperties?: Schema | boolean;
11
+ items?: Schema;
12
+ $ref?: string;
13
+ $defs?: Record<string, Schema>;
14
+ definitions?: Record<string, Schema>;
15
+ allOf?: Schema[];
16
+ anyOf?: Schema[];
17
+ oneOf?: Schema[];
18
+ }
19
+ /** The schema for a project file: by name for project.yaml and template.yaml, else by its kind. */
20
+ export declare function schemaFor(file: string, kind: string | undefined): Schema | undefined;
21
+ /** The schemas that describe the value at `segments` (several when branches allow it). */
22
+ export declare function schemasAt(root: Schema, segments: string[]): Schema[];
23
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAMA,qEAAqE;AACrE,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMpF;AAED,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAKpE"}
package/dist/schema.js ADDED
@@ -0,0 +1,46 @@
1
+ // The JSON Schema of a document, and the part of it at a path, following
2
+ // $ref, items, additionalProperties and the branches of allOf/anyOf/oneOf.
3
+ import { manifestSchema } from "@ingestron/config";
4
+ import { templateSchema } from "@ingestron/cli";
5
+ import { kinds } from "@ingestron/definitions";
6
+ /** The schema for a project file: by name for project.yaml and template.yaml, else by its kind. */
7
+ export function schemaFor(file, kind) {
8
+ const name = file.split("/").pop();
9
+ if (name === "project.yaml")
10
+ return manifestSchema;
11
+ if (name === "template.yaml")
12
+ return templateSchema;
13
+ const found = Object.values(kinds).find((item) => item.kind === kind);
14
+ return found?.schema;
15
+ }
16
+ /** The schemas that describe the value at `segments` (several when branches allow it). */
17
+ export function schemasAt(root, segments) {
18
+ let current = expand(root, root);
19
+ for (const segment of segments)
20
+ current = current.flatMap((schema) => child(root, schema, segment));
21
+ return current;
22
+ }
23
+ function child(root, schema, segment) {
24
+ const found = schema.properties?.[segment] ?? schema.items;
25
+ const next = found ??
26
+ (typeof schema.additionalProperties === "object" ? schema.additionalProperties : undefined);
27
+ return next ? expand(root, next) : [];
28
+ }
29
+ /** The schema with its $ref resolved and its branches listed. */
30
+ function expand(root, schema) {
31
+ const resolved = schema.$ref
32
+ ? { ...lookup(root, schema.$ref), ...schema, $ref: undefined }
33
+ : schema;
34
+ const branches = [
35
+ ...(resolved.allOf ?? []),
36
+ ...(resolved.anyOf ?? []),
37
+ ...(resolved.oneOf ?? []),
38
+ ];
39
+ return [resolved, ...branches.flatMap((branch) => expand(root, branch))];
40
+ }
41
+ function lookup(root, reference) {
42
+ const [, group, name] = /^#\/(\$defs|definitions)\/(.+)$/.exec(reference) ?? [];
43
+ const defs = group === "definitions" ? root.definitions : root.$defs;
44
+ return (name && defs?.[name]) || {};
45
+ }
46
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Suggestion } from "./completion.js";
2
+ import type { Project } from "./project.js";
3
+ /** Skeletons for an empty file: its folder's kind, or every kind elsewhere. */
4
+ export declare function skeletons(project: Project, file: string, id?: string): Suggestion[];
5
+ /** A snippet as plain text: each tab stop's default, or its first choice. */
6
+ export declare function plainText(snippet: string): string;
7
+ //# sourceMappingURL=skeletons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeletons.d.ts","sourceRoot":"","sources":["../src/skeletons.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAgBnF;AAuGD,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUjD"}
@@ -0,0 +1,107 @@
1
+ // Skeletons for a new, empty file: one document of the kind its folder holds,
2
+ // with the id from the file name and the project's ids to choose from.
3
+ import { basename } from "node:path";
4
+ import { packs, projectId } from "@ingestron/cli";
5
+ import { occurrences } from "./navigation.js";
6
+ import { idsOf } from "./context.js";
7
+ import { objectOf, standardPacks, unusedContracts } from "./smart.js";
8
+ /** A tab stop with a choice of values, or with one default. */
9
+ const stop = (n, values, fallback) => values.length > 0 ? `\${${n}|${values.join(",")}|}` : `\${${n}:${fallback}}`;
10
+ /** Skeletons for an empty file: its folder's kind, or every kind elsewhere. */
11
+ export function skeletons(project, file, id) {
12
+ const base = file
13
+ .split("/")
14
+ .at(-1)
15
+ .replace(/\.ya?ml$/, "");
16
+ const source = idsOf(project, "Connection")[0] ?? "source";
17
+ const all = {
18
+ flows: () => [flowSkeleton(project, base)],
19
+ connections: () => connectionSkeletons(project, id ?? base),
20
+ contracts: () => [contractSkeleton(base, id ?? `${source}.${base}`)],
21
+ transforms: () => [transformSkeleton(project, base, source)],
22
+ };
23
+ const root = rootSkeletons[file];
24
+ if (root)
25
+ return [root(project)];
26
+ const folder = file.split("/").at(-2) ?? "";
27
+ return (folder in all ? [folder] : Object.keys(all)).flatMap((name) => all[name]());
28
+ }
29
+ /** The files at a project's root that hold one known document. */
30
+ const rootSkeletons = {
31
+ "project.yaml": (project) => ({
32
+ label: "Project manifest",
33
+ kind: "document",
34
+ snippet: `id: \${1:${projectId(basename(project.folder))}}\nenvironments:\n dev: {}\n prod: {}\n` +
35
+ `imports:\n - standard.yaml\n - connections/*.yaml\n - contracts/*.yaml\n - flows/*.yaml\n`,
36
+ documentation: "The project's id, environments and the files to load. Add `transforms/*.yaml` and `platform.yaml` when you have them.",
37
+ }),
38
+ "standard.yaml": (project) => skeleton("Standard", `${header("Standard", projectId(basename(project.folder)))}packs: [${stop(2, packs.map((pack) => `${pack.id}@${pack.version}`), "databricks@1")}]\n$0`, "How the organisation builds data products: the packs, and its naming, rules and settings."),
39
+ "platform.yaml": () => skeleton("Platform", `${header("Platform", "platform")}$0`, "Where the project's assets go."),
40
+ };
41
+ const header = (kind, id) => `apiVersion: ingestron.io/v1\nkind: ${kind}\nid: \${1:${id}}\n`;
42
+ function skeleton(kind, snippet, documentation) {
43
+ return { label: `${kind} document`, kind: "document", snippet, documentation };
44
+ }
45
+ function flowSkeleton(project, base) {
46
+ const connections = idsOf(project, "Connection");
47
+ const contract = unusedContracts(project)[0];
48
+ const table = contract ? objectOf(project, contract) : base;
49
+ const contractId = contract ?? `${connections[0] ?? "source"}.${table}`;
50
+ return skeleton("Flow", `${header("Flow", base)}source: ${stop(2, connections, "source")}\ntables:\n` +
51
+ ` \${3:${table}}: { object: $3, contract: \${4:${contractId}} }\n`, "Tables loaded from one connection.");
52
+ }
53
+ /** One per connector the standard's packs read, with that connector's settings to fill. */
54
+ function connectionSkeletons(project, id) {
55
+ const own = standardPacks(project);
56
+ const entries = own.flatMap((pack) => (pack.connectors ?? []).map((connector) => ({ pack, connector })));
57
+ return entries.map(({ pack, connector }) => {
58
+ const shared = entries.filter((entry) => entry.connector.id === connector.id).length > 1;
59
+ const reach = pack.methods[connector.method]?.connectivity ?? [
60
+ "public",
61
+ "workspace",
62
+ "private",
63
+ ];
64
+ const settings = connector.settings
65
+ .filter((setting) => !setting.optional)
66
+ .map(({ name, secret }, index) => secret ? ` ${name}: \\\${secret:\${${index + 3}:${name}}}` : ` ${name}: $${index + 3}`);
67
+ return {
68
+ label: `Connection: ${connector.title}${shared ? ` (${pack.id})` : ""}`,
69
+ kind: "document",
70
+ snippet: `${header("Connection", id)}connector: ${connector.id}\nconnectivity: \${2|${reach.join(",")}|}\n` +
71
+ `settings:\n${settings.join("\n")}\n`,
72
+ documentation: connector.settings
73
+ .map(({ name, description }) => `\`${name}\`: ${description}`)
74
+ .join("\n\n"),
75
+ };
76
+ });
77
+ }
78
+ function contractSkeleton(base, id) {
79
+ const types = "string,integer,number,boolean,date,timestamp";
80
+ return {
81
+ ...skeleton("DataContract", `apiVersion: v3.1.0\nkind: DataContract\nid: \${1:${id}}\nversion: 1.0.0\n` +
82
+ `status: draft\nschema:\n - name: \${2:${base}}\n logicalType: object\n properties:\n` +
83
+ ` - { name: \${3:id}, logicalType: \${4|${types}|}, required: true, primaryKey: true }\n`, "The columns a table has and the rules its rows follow."),
84
+ };
85
+ }
86
+ function transformSkeleton(project, base, source) {
87
+ const tables = occurrences(project)
88
+ .filter((item) => item.definition && item.symbol.startsWith("table:"))
89
+ .map((item) => item.symbol.slice("table:".length));
90
+ return skeleton("Transform", `${header("Transform", base)}inputs: [${stop(2, [...new Set(tables)], "table")}]\n` +
91
+ `code: \\\${file:${base}.sql}\ncontract: \${3:${source}.${base}}\n`, "A table built from other tables with SQL or Python.");
92
+ }
93
+ /** A snippet as plain text: each tab stop's default, or its first choice. */
94
+ export function plainText(snippet) {
95
+ const values = new Map();
96
+ const filled = snippet
97
+ .replace(/\$\{(\d+)\|([^,|]*)[^|]*\|\}/g, (_, n, first) => remember(values, n, first))
98
+ .replace(/\$\{(\d+):([^}]*)\}/g, (_, n, value) => remember(values, n, value));
99
+ return filled
100
+ .replace(/(?<!\\)\$(\d+)/g, (_, n) => values.get(n) ?? "")
101
+ .replace(/\\\$/g, "$");
102
+ }
103
+ function remember(values, n, value) {
104
+ values.set(n, value);
105
+ return value;
106
+ }
107
+ //# sourceMappingURL=skeletons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeletons.js","sourceRoot":"","sources":["../src/skeletons.ts"],"names":[],"mappings":"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"}