@objectstack/metadata 4.0.5 → 4.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.
- package/README.md +69 -2
- package/dist/index.cjs +374 -357
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +120 -85
- package/dist/index.d.ts +120 -85
- package/dist/index.js +379 -364
- package/dist/index.js.map +1 -1
- package/dist/migrations/{migrate-env-id-to-project-id.cjs → index.cjs} +83 -11
- package/dist/migrations/index.cjs.map +1 -0
- package/dist/migrations/index.d.cts +103 -0
- package/dist/migrations/index.d.ts +103 -0
- package/dist/migrations/index.js +127 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/node.cjs +374 -357
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.cts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +379 -364
- package/dist/node.js.map +1 -1
- package/package.json +10 -10
- package/dist/migrations/migrate-env-id-to-project-id.cjs.map +0 -1
- package/dist/migrations/migrate-env-id-to-project-id.d.cts +0 -37
- package/dist/migrations/migrate-env-id-to-project-id.d.ts +0 -37
- package/dist/migrations/migrate-env-id-to-project-id.js +0 -59
- package/dist/migrations/migrate-env-id-to-project-id.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectstack/metadata",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Metadata loading, saving, and persistence for ObjectStack",
|
|
6
6
|
"type": "module",
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"require": "./dist/node.cjs"
|
|
19
19
|
},
|
|
20
20
|
"./migrations": {
|
|
21
|
-
"types": "./dist/migrations/
|
|
22
|
-
"import": "./dist/migrations/
|
|
23
|
-
"require": "./dist/migrations/
|
|
21
|
+
"types": "./dist/migrations/index.d.ts",
|
|
22
|
+
"import": "./dist/migrations/index.js",
|
|
23
|
+
"require": "./dist/migrations/index.cjs"
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
@@ -39,16 +39,16 @@
|
|
|
39
39
|
"glob": "^13.0.6",
|
|
40
40
|
"js-yaml": "^4.1.1",
|
|
41
41
|
"zod": "^4.4.3",
|
|
42
|
-
"@objectstack/core": "4.0
|
|
43
|
-
"@objectstack/platform-objects": "4.0
|
|
44
|
-
"@objectstack/spec": "4.0
|
|
45
|
-
"@objectstack/types": "4.0
|
|
42
|
+
"@objectstack/core": "4.1.0",
|
|
43
|
+
"@objectstack/platform-objects": "4.1.0",
|
|
44
|
+
"@objectstack/spec": "4.1.0",
|
|
45
|
+
"@objectstack/types": "4.1.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/js-yaml": "^4.0.9",
|
|
49
|
-
"@types/node": "^25.
|
|
49
|
+
"@types/node": "^25.9.1",
|
|
50
50
|
"typescript": "^6.0.3",
|
|
51
|
-
"vitest": "^4.1.
|
|
51
|
+
"vitest": "^4.1.7"
|
|
52
52
|
},
|
|
53
53
|
"author": "ObjectStack",
|
|
54
54
|
"repository": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/migrations/migrate-env-id-to-project-id.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Migration: env_id → project_id\n *\n * Renames the `env_id` column to `project_id` across all metadata tables:\n * - sys_metadata\n * - sys_metadata_history\n * - sys_object\n * - sys_view\n * - sys_flow\n * - sys_agent\n * - sys_tool\n *\n * Safe to run multiple times (idempotent): checks for column existence before\n * attempting to rename. If `project_id` already exists, the step is skipped.\n *\n * Usage:\n * import { migrateEnvIdToProjectId } from '@objectstack/metadata/migrations';\n * await migrateEnvIdToProjectId(driver);\n */\n\nimport type { IDataDriver } from '@objectstack/spec/contracts';\n\nconst AFFECTED_TABLES = [\n 'sys_metadata',\n 'sys_metadata_history',\n 'sys_object',\n 'sys_view',\n 'sys_flow',\n 'sys_agent',\n 'sys_tool',\n] as const;\n\nexport interface MigrationResult {\n table: string;\n status: 'renamed' | 'already_done' | 'table_missing' | 'error';\n error?: string;\n}\n\n/**\n * Rename `env_id` → `project_id` on all metadata tables.\n *\n * @param driver An IDataDriver with access to the target database.\n * Must expose a raw query method: `driver.raw(sql, bindings?)`.\n * @returns Per-table migration results.\n */\nexport async function migrateEnvIdToProjectId(driver: IDataDriver): Promise<MigrationResult[]> {\n const driverAny = driver as any;\n\n if (typeof driverAny.raw !== 'function') {\n throw new Error(\n 'migrateEnvIdToProjectId: driver must expose a .raw(sql, bindings?) method. ' +\n 'SqlDriver (better-sqlite3/knex) and TursoDriver both support this.'\n );\n }\n\n const results: MigrationResult[] = [];\n\n for (const table of AFFECTED_TABLES) {\n try {\n // Detect dialect: SQLite uses PRAGMA, others use information_schema.\n const hasColumn = await _columnExists(driverAny, table, 'env_id');\n const alreadyMigrated = await _columnExists(driverAny, table, 'project_id');\n\n if (alreadyMigrated && !hasColumn) {\n results.push({ table, status: 'already_done' });\n continue;\n }\n\n if (!hasColumn) {\n // Neither column exists — table might not exist yet.\n results.push({ table, status: 'table_missing' });\n continue;\n }\n\n // Perform the rename. SQLite ≥ 3.25.0 supports ALTER TABLE RENAME COLUMN.\n await driverAny.raw(`ALTER TABLE \"${table}\" RENAME COLUMN env_id TO project_id`);\n\n results.push({ table, status: 'renamed' });\n } catch (err: any) {\n results.push({ table, status: 'error', error: err?.message ?? String(err) });\n }\n }\n\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nasync function _columnExists(driver: any, table: string, column: string): Promise<boolean> {\n try {\n // SQLite: PRAGMA table_info returns rows with `name` column.\n const rows: any[] = await driver.raw(`PRAGMA table_info(\"${table}\")`);\n if (Array.isArray(rows) && rows.length > 0) {\n // knex wraps PRAGMA result; handle both `rows` and `rows[0]` shapes.\n const list: any[] = Array.isArray(rows[0]) ? rows[0] : rows;\n return list.some((r: any) => r?.name === column);\n }\n\n // Fallback for non-SQLite: query information_schema.\n const result: any[] = await driver.raw(\n `SELECT column_name FROM information_schema.columns WHERE table_name = ? AND column_name = ?`,\n [table, column]\n );\n const list: any[] = Array.isArray(result[0]) ? result[0] : result;\n return list.length > 0;\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBA,IAAM,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAeA,eAAsB,wBAAwB,QAAiD;AAC3F,QAAM,YAAY;AAElB,MAAI,OAAO,UAAU,QAAQ,YAAY;AACrC,UAAM,IAAI;AAAA,MACN;AAAA,IAEJ;AAAA,EACJ;AAEA,QAAM,UAA6B,CAAC;AAEpC,aAAW,SAAS,iBAAiB;AACjC,QAAI;AAEA,YAAM,YAAY,MAAM,cAAc,WAAW,OAAO,QAAQ;AAChE,YAAM,kBAAkB,MAAM,cAAc,WAAW,OAAO,YAAY;AAE1E,UAAI,mBAAmB,CAAC,WAAW;AAC/B,gBAAQ,KAAK,EAAE,OAAO,QAAQ,eAAe,CAAC;AAC9C;AAAA,MACJ;AAEA,UAAI,CAAC,WAAW;AAEZ,gBAAQ,KAAK,EAAE,OAAO,QAAQ,gBAAgB,CAAC;AAC/C;AAAA,MACJ;AAGA,YAAM,UAAU,IAAI,gBAAgB,KAAK,sCAAsC;AAE/E,cAAQ,KAAK,EAAE,OAAO,QAAQ,UAAU,CAAC;AAAA,IAC7C,SAAS,KAAU;AACf,cAAQ,KAAK,EAAE,OAAO,QAAQ,SAAS,OAAO,KAAK,WAAW,OAAO,GAAG,EAAE,CAAC;AAAA,IAC/E;AAAA,EACJ;AAEA,SAAO;AACX;AAMA,eAAe,cAAc,QAAa,OAAe,QAAkC;AACvF,MAAI;AAEA,UAAM,OAAc,MAAM,OAAO,IAAI,sBAAsB,KAAK,IAAI;AACpE,QAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AAExC,YAAMA,QAAc,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI;AACvD,aAAOA,MAAK,KAAK,CAAC,MAAW,GAAG,SAAS,MAAM;AAAA,IACnD;AAGA,UAAM,SAAgB,MAAM,OAAO;AAAA,MAC/B;AAAA,MACA,CAAC,OAAO,MAAM;AAAA,IAClB;AACA,UAAM,OAAc,MAAM,QAAQ,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI;AAC3D,WAAO,KAAK,SAAS;AAAA,EACzB,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;","names":["list"]}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { IDataDriver } from '@objectstack/spec/contracts';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Migration: env_id → project_id
|
|
5
|
-
*
|
|
6
|
-
* Renames the `env_id` column to `project_id` across all metadata tables:
|
|
7
|
-
* - sys_metadata
|
|
8
|
-
* - sys_metadata_history
|
|
9
|
-
* - sys_object
|
|
10
|
-
* - sys_view
|
|
11
|
-
* - sys_flow
|
|
12
|
-
* - sys_agent
|
|
13
|
-
* - sys_tool
|
|
14
|
-
*
|
|
15
|
-
* Safe to run multiple times (idempotent): checks for column existence before
|
|
16
|
-
* attempting to rename. If `project_id` already exists, the step is skipped.
|
|
17
|
-
*
|
|
18
|
-
* Usage:
|
|
19
|
-
* import { migrateEnvIdToProjectId } from '@objectstack/metadata/migrations';
|
|
20
|
-
* await migrateEnvIdToProjectId(driver);
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
interface MigrationResult {
|
|
24
|
-
table: string;
|
|
25
|
-
status: 'renamed' | 'already_done' | 'table_missing' | 'error';
|
|
26
|
-
error?: string;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Rename `env_id` → `project_id` on all metadata tables.
|
|
30
|
-
*
|
|
31
|
-
* @param driver An IDataDriver with access to the target database.
|
|
32
|
-
* Must expose a raw query method: `driver.raw(sql, bindings?)`.
|
|
33
|
-
* @returns Per-table migration results.
|
|
34
|
-
*/
|
|
35
|
-
declare function migrateEnvIdToProjectId(driver: IDataDriver): Promise<MigrationResult[]>;
|
|
36
|
-
|
|
37
|
-
export { type MigrationResult, migrateEnvIdToProjectId };
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { IDataDriver } from '@objectstack/spec/contracts';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Migration: env_id → project_id
|
|
5
|
-
*
|
|
6
|
-
* Renames the `env_id` column to `project_id` across all metadata tables:
|
|
7
|
-
* - sys_metadata
|
|
8
|
-
* - sys_metadata_history
|
|
9
|
-
* - sys_object
|
|
10
|
-
* - sys_view
|
|
11
|
-
* - sys_flow
|
|
12
|
-
* - sys_agent
|
|
13
|
-
* - sys_tool
|
|
14
|
-
*
|
|
15
|
-
* Safe to run multiple times (idempotent): checks for column existence before
|
|
16
|
-
* attempting to rename. If `project_id` already exists, the step is skipped.
|
|
17
|
-
*
|
|
18
|
-
* Usage:
|
|
19
|
-
* import { migrateEnvIdToProjectId } from '@objectstack/metadata/migrations';
|
|
20
|
-
* await migrateEnvIdToProjectId(driver);
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
interface MigrationResult {
|
|
24
|
-
table: string;
|
|
25
|
-
status: 'renamed' | 'already_done' | 'table_missing' | 'error';
|
|
26
|
-
error?: string;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Rename `env_id` → `project_id` on all metadata tables.
|
|
30
|
-
*
|
|
31
|
-
* @param driver An IDataDriver with access to the target database.
|
|
32
|
-
* Must expose a raw query method: `driver.raw(sql, bindings?)`.
|
|
33
|
-
* @returns Per-table migration results.
|
|
34
|
-
*/
|
|
35
|
-
declare function migrateEnvIdToProjectId(driver: IDataDriver): Promise<MigrationResult[]>;
|
|
36
|
-
|
|
37
|
-
export { type MigrationResult, migrateEnvIdToProjectId };
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
// src/migrations/migrate-env-id-to-project-id.ts
|
|
2
|
-
var AFFECTED_TABLES = [
|
|
3
|
-
"sys_metadata",
|
|
4
|
-
"sys_metadata_history",
|
|
5
|
-
"sys_object",
|
|
6
|
-
"sys_view",
|
|
7
|
-
"sys_flow",
|
|
8
|
-
"sys_agent",
|
|
9
|
-
"sys_tool"
|
|
10
|
-
];
|
|
11
|
-
async function migrateEnvIdToProjectId(driver) {
|
|
12
|
-
const driverAny = driver;
|
|
13
|
-
if (typeof driverAny.raw !== "function") {
|
|
14
|
-
throw new Error(
|
|
15
|
-
"migrateEnvIdToProjectId: driver must expose a .raw(sql, bindings?) method. SqlDriver (better-sqlite3/knex) and TursoDriver both support this."
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
const results = [];
|
|
19
|
-
for (const table of AFFECTED_TABLES) {
|
|
20
|
-
try {
|
|
21
|
-
const hasColumn = await _columnExists(driverAny, table, "env_id");
|
|
22
|
-
const alreadyMigrated = await _columnExists(driverAny, table, "project_id");
|
|
23
|
-
if (alreadyMigrated && !hasColumn) {
|
|
24
|
-
results.push({ table, status: "already_done" });
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (!hasColumn) {
|
|
28
|
-
results.push({ table, status: "table_missing" });
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
await driverAny.raw(`ALTER TABLE "${table}" RENAME COLUMN env_id TO project_id`);
|
|
32
|
-
results.push({ table, status: "renamed" });
|
|
33
|
-
} catch (err) {
|
|
34
|
-
results.push({ table, status: "error", error: err?.message ?? String(err) });
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return results;
|
|
38
|
-
}
|
|
39
|
-
async function _columnExists(driver, table, column) {
|
|
40
|
-
try {
|
|
41
|
-
const rows = await driver.raw(`PRAGMA table_info("${table}")`);
|
|
42
|
-
if (Array.isArray(rows) && rows.length > 0) {
|
|
43
|
-
const list2 = Array.isArray(rows[0]) ? rows[0] : rows;
|
|
44
|
-
return list2.some((r) => r?.name === column);
|
|
45
|
-
}
|
|
46
|
-
const result = await driver.raw(
|
|
47
|
-
`SELECT column_name FROM information_schema.columns WHERE table_name = ? AND column_name = ?`,
|
|
48
|
-
[table, column]
|
|
49
|
-
);
|
|
50
|
-
const list = Array.isArray(result[0]) ? result[0] : result;
|
|
51
|
-
return list.length > 0;
|
|
52
|
-
} catch {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
export {
|
|
57
|
-
migrateEnvIdToProjectId
|
|
58
|
-
};
|
|
59
|
-
//# sourceMappingURL=migrate-env-id-to-project-id.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/migrations/migrate-env-id-to-project-id.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Migration: env_id → project_id\n *\n * Renames the `env_id` column to `project_id` across all metadata tables:\n * - sys_metadata\n * - sys_metadata_history\n * - sys_object\n * - sys_view\n * - sys_flow\n * - sys_agent\n * - sys_tool\n *\n * Safe to run multiple times (idempotent): checks for column existence before\n * attempting to rename. If `project_id` already exists, the step is skipped.\n *\n * Usage:\n * import { migrateEnvIdToProjectId } from '@objectstack/metadata/migrations';\n * await migrateEnvIdToProjectId(driver);\n */\n\nimport type { IDataDriver } from '@objectstack/spec/contracts';\n\nconst AFFECTED_TABLES = [\n 'sys_metadata',\n 'sys_metadata_history',\n 'sys_object',\n 'sys_view',\n 'sys_flow',\n 'sys_agent',\n 'sys_tool',\n] as const;\n\nexport interface MigrationResult {\n table: string;\n status: 'renamed' | 'already_done' | 'table_missing' | 'error';\n error?: string;\n}\n\n/**\n * Rename `env_id` → `project_id` on all metadata tables.\n *\n * @param driver An IDataDriver with access to the target database.\n * Must expose a raw query method: `driver.raw(sql, bindings?)`.\n * @returns Per-table migration results.\n */\nexport async function migrateEnvIdToProjectId(driver: IDataDriver): Promise<MigrationResult[]> {\n const driverAny = driver as any;\n\n if (typeof driverAny.raw !== 'function') {\n throw new Error(\n 'migrateEnvIdToProjectId: driver must expose a .raw(sql, bindings?) method. ' +\n 'SqlDriver (better-sqlite3/knex) and TursoDriver both support this.'\n );\n }\n\n const results: MigrationResult[] = [];\n\n for (const table of AFFECTED_TABLES) {\n try {\n // Detect dialect: SQLite uses PRAGMA, others use information_schema.\n const hasColumn = await _columnExists(driverAny, table, 'env_id');\n const alreadyMigrated = await _columnExists(driverAny, table, 'project_id');\n\n if (alreadyMigrated && !hasColumn) {\n results.push({ table, status: 'already_done' });\n continue;\n }\n\n if (!hasColumn) {\n // Neither column exists — table might not exist yet.\n results.push({ table, status: 'table_missing' });\n continue;\n }\n\n // Perform the rename. SQLite ≥ 3.25.0 supports ALTER TABLE RENAME COLUMN.\n await driverAny.raw(`ALTER TABLE \"${table}\" RENAME COLUMN env_id TO project_id`);\n\n results.push({ table, status: 'renamed' });\n } catch (err: any) {\n results.push({ table, status: 'error', error: err?.message ?? String(err) });\n }\n }\n\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nasync function _columnExists(driver: any, table: string, column: string): Promise<boolean> {\n try {\n // SQLite: PRAGMA table_info returns rows with `name` column.\n const rows: any[] = await driver.raw(`PRAGMA table_info(\"${table}\")`);\n if (Array.isArray(rows) && rows.length > 0) {\n // knex wraps PRAGMA result; handle both `rows` and `rows[0]` shapes.\n const list: any[] = Array.isArray(rows[0]) ? rows[0] : rows;\n return list.some((r: any) => r?.name === column);\n }\n\n // Fallback for non-SQLite: query information_schema.\n const result: any[] = await driver.raw(\n `SELECT column_name FROM information_schema.columns WHERE table_name = ? AND column_name = ?`,\n [table, column]\n );\n const list: any[] = Array.isArray(result[0]) ? result[0] : result;\n return list.length > 0;\n } catch {\n return false;\n }\n}\n"],"mappings":";AAwBA,IAAM,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAeA,eAAsB,wBAAwB,QAAiD;AAC3F,QAAM,YAAY;AAElB,MAAI,OAAO,UAAU,QAAQ,YAAY;AACrC,UAAM,IAAI;AAAA,MACN;AAAA,IAEJ;AAAA,EACJ;AAEA,QAAM,UAA6B,CAAC;AAEpC,aAAW,SAAS,iBAAiB;AACjC,QAAI;AAEA,YAAM,YAAY,MAAM,cAAc,WAAW,OAAO,QAAQ;AAChE,YAAM,kBAAkB,MAAM,cAAc,WAAW,OAAO,YAAY;AAE1E,UAAI,mBAAmB,CAAC,WAAW;AAC/B,gBAAQ,KAAK,EAAE,OAAO,QAAQ,eAAe,CAAC;AAC9C;AAAA,MACJ;AAEA,UAAI,CAAC,WAAW;AAEZ,gBAAQ,KAAK,EAAE,OAAO,QAAQ,gBAAgB,CAAC;AAC/C;AAAA,MACJ;AAGA,YAAM,UAAU,IAAI,gBAAgB,KAAK,sCAAsC;AAE/E,cAAQ,KAAK,EAAE,OAAO,QAAQ,UAAU,CAAC;AAAA,IAC7C,SAAS,KAAU;AACf,cAAQ,KAAK,EAAE,OAAO,QAAQ,SAAS,OAAO,KAAK,WAAW,OAAO,GAAG,EAAE,CAAC;AAAA,IAC/E;AAAA,EACJ;AAEA,SAAO;AACX;AAMA,eAAe,cAAc,QAAa,OAAe,QAAkC;AACvF,MAAI;AAEA,UAAM,OAAc,MAAM,OAAO,IAAI,sBAAsB,KAAK,IAAI;AACpE,QAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AAExC,YAAMA,QAAc,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI;AACvD,aAAOA,MAAK,KAAK,CAAC,MAAW,GAAG,SAAS,MAAM;AAAA,IACnD;AAGA,UAAM,SAAgB,MAAM,OAAO;AAAA,MAC/B;AAAA,MACA,CAAC,OAAO,MAAM;AAAA,IAClB;AACA,UAAM,OAAc,MAAM,QAAQ,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI;AAC3D,WAAO,KAAK,SAAS;AAAA,EACzB,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;","names":["list"]}
|