@fougere/adapter-duckdb 0.23.0-alpha.0 → 0.24.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type Entity } from '@fougere/schema';
2
2
  /** An entry of `sources:` as this reader sees it — what its own adapter declared, nothing added. */
3
3
  export interface SourceEntry {
4
- type?: string;
4
+ type: string;
5
5
  path?: string;
6
6
  url?: string;
7
7
  entities?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAI3E,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,0EAA0E;IAC1E,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,kEAAkE;IAClE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAED,2EAA2E;AAC3E,MAAM,WAAW,KAAK;IACpB,6DAA6D;IAC7D,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChH,uEAAuE;IACvE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAeD,kDAAkD;AAClD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAkE5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAI3E,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,0EAA0E;IAC1E,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,kEAAkE;IAClE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAED,2EAA2E;AAC3E,MAAM,WAAW,KAAK;IACpB,6DAA6D;IAC7D,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChH,uEAAuE;IACvE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAeD,kDAAkD;AAClD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAgE5E"}
package/dist/index.js CHANGED
@@ -32,7 +32,7 @@ export async function connectSources(options) {
32
32
  const name = lowerFirst(shape.name ?? '');
33
33
  const alias = home.get(name) ?? fallback;
34
34
  if (!alias)
35
- throw new Error(`${name} lives in no declared source — no source lists it, and none holds the rest.`);
35
+ throw new Error(`${name} is in no source: none lists it, and none takes the rest. Add it to one in sources:.`);
36
36
  wanted.add(alias);
37
37
  placed.set(shape, { alias, table: resolve(name) });
38
38
  }
@@ -42,17 +42,15 @@ export async function connectSources(options) {
42
42
  for (const alias of wanted) {
43
43
  const entry = options.sources[alias];
44
44
  if (!entry)
45
- throw new Error(`source '${alias}' is read but never declared.`);
46
- const type = entry.type ?? 'sqlite';
47
- const attachable = ATTACHABLE[type];
45
+ throw new Error(`source '${alias}' is read here but missing from sources:.`);
46
+ const attachable = ATTACHABLE[entry.type];
48
47
  if (!attachable) {
49
- throw new Error(`source '${alias}' is a ${type} source, which DuckDB cannot attach — there is no ` +
50
- `such extension. Read it by key through its own storage, or mirror it into one of ` +
51
- `${Object.keys(ATTACHABLE).join(', ')}.`);
48
+ throw new Error(`source '${alias}' is ${entry.type}, which DuckDB cannot read. It reads `
49
+ + `${Object.keys(ATTACHABLE).join(', ')}: copy the rows into one of those, or read them through their own repository.`);
52
50
  }
53
51
  const target = attachable.target(entry);
54
52
  if (!target) {
55
- throw new Error(`source '${alias}': nothing says where it is — DuckDB is told what to open.`);
53
+ throw new Error(`source '${alias}' has no path or url, so DuckDB cannot open it.`);
56
54
  }
57
55
  await db.run(`INSTALL ${attachable.extension}; LOAD ${attachable.extension};`);
58
56
  await db.run(`ATTACH '${target}' AS ${quote(attachedAs(alias))} (TYPE ${attachable.extension}, READ_ONLY);`);
@@ -83,13 +81,11 @@ function qualify(ref, placed) {
83
81
  return `${quote(attachedAs(found.alias))}.${quote(found.table)}`;
84
82
  const name = ref?.name;
85
83
  if (name) {
86
- throw new Error(`${name} is named in a query but not in \`reads\` — its source is not attached, so its ` +
87
- `table does not exist in this connection. Add it to \`reads\`, or stop naming it.`);
84
+ throw new Error(`${name} is used in a query but is not in \`reads\`. Add it to \`reads\` in frond.config.ts.`);
88
85
  }
89
86
  // A plain value interpolated into SQL is refused: this tag substitutes ENTITIES, and
90
87
  // accepting a value would be a string-built query with no binding in sight.
91
- throw new Error(`only an entity may be interpolated into a source query — pass a value through the ` +
92
- `query text you write, or filter the result.`);
88
+ throw new Error('Only an entity can go inside ${…} in a source query. Write values in the query text, or filter the result.');
93
89
  }
94
90
  const quote = (identifier) => `"${identifier.replace(/"/g, '""')}"`;
95
91
  /** The column set, checked ONCE against the shape. */
@@ -97,9 +93,9 @@ function refuseMismatch(shape, names, row, sql) {
97
93
  const missing = names.filter((name) => !(toSnakeCase(name) in row) && !(name in row));
98
94
  if (missing.length === 0)
99
95
  return;
100
- throw new Error(`${shape.name ?? 'the shape'} declares ${missing.map((m) => `\`${m}\``).join(', ')}, ` +
101
- `and the query answers ${Object.keys(row).map((c) => `\`${c}\``).join(', ')} — name the column with ` +
102
- `\`as\`, or drop the field.\n${sql.trim()}`);
96
+ throw new Error(`${shape.name ?? 'the shape'} expects ${missing.map((m) => `\`${m}\``).join(', ')}, `
97
+ + `and the query returns ${Object.keys(row).map((c) => `\`${c}\``).join(', ')}. Rename the column with \`as\`, `
98
+ + `or remove the field.\n${sql.trim()}`);
103
99
  }
104
100
  /** Keep what the shape declares, converted — a column it does not name never leaves. */
105
101
  function project(names, codecs, row) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fougere/adapter-duckdb",
3
- "version": "0.23.0-alpha.0",
3
+ "version": "0.24.0-alpha.0",
4
4
  "description": "Read across an app's sources — one SQL query over what DuckDB can attach.",
5
5
  "keywords": [
6
6
  "fougere",
@@ -29,8 +29,8 @@
29
29
  "src"
30
30
  ],
31
31
  "dependencies": {
32
- "@fougere/schema": "0.23.0-alpha.0",
33
- "@fougere/adapter-sql": "0.23.0-alpha.0"
32
+ "@fougere/schema": "0.24.0-alpha.0",
33
+ "@fougere/adapter-sql": "0.24.0-alpha.0"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "@duckdb/node-api": ">=1.4.0-0"
package/src/index.ts CHANGED
@@ -6,7 +6,7 @@ import { toTable, toTableName, toSnakeCase, codecsOf } from '@fougere/adapter-sq
6
6
 
7
7
  /** An entry of `sources:` as this reader sees it — what its own adapter declared, nothing added. */
8
8
  export interface SourceEntry {
9
- type?: string;
9
+ type: string;
10
10
  path?: string;
11
11
  url?: string;
12
12
  entities?: string[];
@@ -61,7 +61,7 @@ export async function connectSources(options: ConnectOptions): Promise<Reads> {
61
61
  for (const shape of options.reads) {
62
62
  const name = lowerFirst((shape as { name?: string }).name ?? '');
63
63
  const alias = home.get(name) ?? fallback;
64
- if (!alias) throw new Error(`${name} lives in no declared source — no source lists it, and none holds the rest.`);
64
+ if (!alias) throw new Error(`${name} is in no source: none lists it, and none takes the rest. Add it to one in sources:.`);
65
65
  wanted.add(alias);
66
66
  placed.set(shape, { alias, table: resolve(name) });
67
67
  }
@@ -72,20 +72,18 @@ export async function connectSources(options: ConnectOptions): Promise<Reads> {
72
72
 
73
73
  for (const alias of wanted) {
74
74
  const entry = options.sources[alias];
75
- if (!entry) throw new Error(`source '${alias}' is read but never declared.`);
75
+ if (!entry) throw new Error(`source '${alias}' is read here but missing from sources:.`);
76
76
 
77
- const type = entry.type ?? 'sqlite';
78
- const attachable = ATTACHABLE[type];
77
+ const attachable = ATTACHABLE[entry.type];
79
78
  if (!attachable) {
80
79
  throw new Error(
81
- `source '${alias}' is a ${type} source, which DuckDB cannot attach — there is no ` +
82
- `such extension. Read it by key through its own storage, or mirror it into one of ` +
83
- `${Object.keys(ATTACHABLE).join(', ')}.`,
80
+ `source '${alias}' is ${entry.type}, which DuckDB cannot read. It reads `
81
+ + `${Object.keys(ATTACHABLE).join(', ')}: copy the rows into one of those, or read them through their own repository.`,
84
82
  );
85
83
  }
86
84
  const target = attachable.target(entry);
87
85
  if (!target) {
88
- throw new Error(`source '${alias}': nothing says where it is — DuckDB is told what to open.`);
86
+ throw new Error(`source '${alias}' has no path or url, so DuckDB cannot open it.`);
89
87
  }
90
88
  await db.run(`INSTALL ${attachable.extension}; LOAD ${attachable.extension};`);
91
89
  await db.run(`ATTACH '${target}' AS ${quote(attachedAs(alias))} (TYPE ${attachable.extension}, READ_ONLY);`);
@@ -119,15 +117,13 @@ function qualify(ref: unknown, placed: Map<Entity, { alias: string; table: strin
119
117
  const name = (ref as { name?: string } | undefined)?.name;
120
118
  if (name) {
121
119
  throw new Error(
122
- `${name} is named in a query but not in \`reads\` — its source is not attached, so its ` +
123
- `table does not exist in this connection. Add it to \`reads\`, or stop naming it.`,
120
+ `${name} is used in a query but is not in \`reads\`. Add it to \`reads\` in frond.config.ts.`,
124
121
  );
125
122
  }
126
123
  // A plain value interpolated into SQL is refused: this tag substitutes ENTITIES, and
127
124
  // accepting a value would be a string-built query with no binding in sight.
128
125
  throw new Error(
129
- `only an entity may be interpolated into a source query — pass a value through the ` +
130
- `query text you write, or filter the result.`,
126
+ 'Only an entity can go inside ${…} in a source query. Write values in the query text, or filter the result.',
131
127
  );
132
128
  }
133
129
 
@@ -138,9 +134,9 @@ function refuseMismatch(shape: Entity, names: string[], row: Record<string, unkn
138
134
  const missing = names.filter((name) => !(toSnakeCase(name) in row) && !(name in row));
139
135
  if (missing.length === 0) return;
140
136
  throw new Error(
141
- `${(shape as { name?: string }).name ?? 'the shape'} declares ${missing.map((m) => `\`${m}\``).join(', ')}, ` +
142
- `and the query answers ${Object.keys(row).map((c) => `\`${c}\``).join(', ')} — name the column with ` +
143
- `\`as\`, or drop the field.\n${sql.trim()}`,
137
+ `${(shape as { name?: string }).name ?? 'the shape'} expects ${missing.map((m) => `\`${m}\``).join(', ')}, `
138
+ + `and the query returns ${Object.keys(row).map((c) => `\`${c}\``).join(', ')}. Rename the column with \`as\`, `
139
+ + `or remove the field.\n${sql.trim()}`,
144
140
  );
145
141
  }
146
142