cantian-mongodb 0.0.1 → 0.0.6
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/bin/migrate.d.ts +2 -0
- package/dist/bin/migrate.js +21 -0
- package/dist/bin/migrate.js.map +1 -0
- package/dist/migration.d.ts +18 -0
- package/dist/migration.js +66 -0
- package/dist/migration.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { glob } from 'node:fs';
|
|
3
|
+
import { migrate } from '../migration.js';
|
|
4
|
+
import { db } from '../mongoClient.js';
|
|
5
|
+
let [, , modelDir] = process.argv;
|
|
6
|
+
if (!modelDir) {
|
|
7
|
+
modelDir = 'dist/models';
|
|
8
|
+
}
|
|
9
|
+
const modelFiles = await new Promise((r) => glob(`${modelDir}/*.js`, (err, files) => {
|
|
10
|
+
if (err)
|
|
11
|
+
throw err;
|
|
12
|
+
r(files);
|
|
13
|
+
}));
|
|
14
|
+
for (const file of modelFiles) {
|
|
15
|
+
const model = (await import(`${process.cwd()}/${file}`)).default;
|
|
16
|
+
if (model) {
|
|
17
|
+
await migrate(db, model);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
process.exit();
|
|
21
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/bin/migrate.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAS,MAAM,mBAAmB,CAAC;AAE9C,IAAI,CAAC,EAAE,AAAD,EAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;AAElC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACd,QAAQ,GAAG,aAAa,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,GAAG,MAAM,IAAI,OAAO,CAAW,CAAC,CAAC,EAAE,EAAE,CACnD,IAAI,CAAC,GAAG,QAAQ,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;IACtC,IAAI,GAAG;QAAE,MAAM,GAAG,CAAC;IACnB,CAAC,CAAC,KAAK,CAAC,CAAC;AACX,CAAC,CAAC,CACH,CAAC;AACF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,OAAgB,CAAC;IAC1E,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,OAAO,CAAC,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CreateIndexesOptions, Db, IndexSpecification } from 'mongodb';
|
|
2
|
+
import { Model } from './mongoClient.js';
|
|
3
|
+
export type Indexes = {
|
|
4
|
+
key: any;
|
|
5
|
+
options?: CreateIndexesOptions;
|
|
6
|
+
vectorOptions?: Record<string, any>;
|
|
7
|
+
}[];
|
|
8
|
+
export declare function generateIndexName(key: IndexSpecification): string;
|
|
9
|
+
export declare const migrate: (db: Db, model: Model) => Promise<void>;
|
|
10
|
+
export type MigrateRemoteEvent = {
|
|
11
|
+
dbName: string;
|
|
12
|
+
collections: {
|
|
13
|
+
collectionName: string;
|
|
14
|
+
schema: Model['schema'];
|
|
15
|
+
indexes: Model['indexes'];
|
|
16
|
+
}[];
|
|
17
|
+
};
|
|
18
|
+
export declare const migrateRemoteHandler: (event: MigrateRemoteEvent) => Promise<void>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { mongoClient } from './mongoClient.js';
|
|
2
|
+
export function generateIndexName(key) {
|
|
3
|
+
return Object.entries(key)
|
|
4
|
+
.map(([k, v]) => `${k}_${v}`)
|
|
5
|
+
.join('_');
|
|
6
|
+
}
|
|
7
|
+
async function migrateSchema(db, collectionName, schema) {
|
|
8
|
+
const existingCollections = await db
|
|
9
|
+
.listCollections({
|
|
10
|
+
name: collectionName,
|
|
11
|
+
})
|
|
12
|
+
.toArray();
|
|
13
|
+
if (existingCollections.length) {
|
|
14
|
+
await db.command({
|
|
15
|
+
collMod: collectionName,
|
|
16
|
+
validator: { $jsonSchema: schema },
|
|
17
|
+
});
|
|
18
|
+
console.info(`Update collection '${collectionName}' successfully with schema: ${JSON.stringify(schema)}`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
await db.createCollection(collectionName, {
|
|
22
|
+
validator: { $jsonSchema: schema },
|
|
23
|
+
});
|
|
24
|
+
console.info(`Create collection '${collectionName}' successfully with schema: ${JSON.stringify(schema)}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export const migrate = async (db, model) => {
|
|
28
|
+
const collectionName = model.collection.collectionName;
|
|
29
|
+
await migrateSchema(db, collectionName, model.schema);
|
|
30
|
+
if (model.indexes?.length) {
|
|
31
|
+
for (const index of model.indexes) {
|
|
32
|
+
const indexOption = { ...index.options, name: generateIndexName(index.key) };
|
|
33
|
+
await model.collection.createIndex(index.key, indexOption);
|
|
34
|
+
console.info(`Create a general index for ${collectionName} successfully.`, indexOption);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const existingIndexes = await model.collection.listIndexes().toArray();
|
|
38
|
+
const existingIndexMap = {};
|
|
39
|
+
for (const existingIndex of existingIndexes) {
|
|
40
|
+
existingIndexMap[existingIndex.name] = existingIndex;
|
|
41
|
+
}
|
|
42
|
+
for (const existingIndex of existingIndexes) {
|
|
43
|
+
if (existingIndex.name === '_id_') {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const inUsed = model.indexes?.find((v) => {
|
|
47
|
+
return existingIndex.name === generateIndexName(v.key);
|
|
48
|
+
});
|
|
49
|
+
if (!inUsed) {
|
|
50
|
+
await model.collection.dropIndex(existingIndex.name);
|
|
51
|
+
console.info(`Removed an index from ${collectionName} successfully.`, existingIndex);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
export const migrateRemoteHandler = async (event) => {
|
|
56
|
+
const db = mongoClient.db(event.dbName, { ignoreUndefined: true });
|
|
57
|
+
for (const collectionConfig of event.collections) {
|
|
58
|
+
const collection = db.collection(collectionConfig.collectionName);
|
|
59
|
+
await migrate(db, {
|
|
60
|
+
schema: collectionConfig.schema,
|
|
61
|
+
indexes: collectionConfig.indexes,
|
|
62
|
+
collection,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cantian-mongodb",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
|
-
".": "./dist/index.js"
|
|
6
|
+
".": "./dist/index.js",
|
|
7
|
+
"./migration": "./dist/migration.js"
|
|
7
8
|
},
|
|
8
9
|
"files": [
|
|
9
10
|
"dist"
|
|
10
11
|
],
|
|
12
|
+
"bin": {
|
|
13
|
+
"cantian-mongodb-migrate": "./dist/bin/migrate.js"
|
|
14
|
+
},
|
|
11
15
|
"scripts": {
|
|
12
|
-
"prepublishOnly": "rm -rf dist && tsc"
|
|
16
|
+
"prepublishOnly": "rm -rf dist && tsc && chmod +x dist/bin/*.js"
|
|
13
17
|
},
|
|
14
18
|
"devDependencies": {
|
|
15
19
|
"json-schema-to-ts": "^3.1.1"
|