@infuro/cms-core 1.0.16 → 1.0.19
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 +739 -724
- package/dist/admin.cjs +1 -1
- package/dist/admin.cjs.map +1 -1
- package/dist/admin.js +1 -1
- package/dist/admin.js.map +1 -1
- package/dist/api.cjs +132 -57
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.cts +1 -1
- package/dist/api.d.ts +1 -1
- package/dist/api.js +132 -57
- package/dist/api.js.map +1 -1
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/cli.cjs +21 -6
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +21 -6
- package/dist/cli.js.map +1 -1
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.js.map +1 -1
- package/dist/{index-h42MoUNq.d.cts → index-D2C1O9b4.d.cts} +8 -1
- package/dist/{index-C85X7cc7.d.ts → index-GMn7-9PX.d.ts} +8 -1
- package/dist/index.cjs +139 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +139 -57
- package/dist/index.js.map +1 -1
- package/dist/migrations/1772178563554-InitialSchema.ts +304 -304
- package/dist/migrations/1772178563555-ChatAndKnowledgeBase.ts +55 -55
- package/dist/migrations/1772178563556-KnowledgeBaseVector.ts +16 -16
- package/dist/migrations/1774300000000-RbacSeedGroupsAndPermissionUnique.ts +24 -24
- package/dist/migrations/1774300000001-SeedAdministratorUsersPermission.ts +35 -35
- package/dist/migrations/1774400000000-CustomerAdminAccessContactUser.ts +37 -37
- package/dist/migrations/1774400000001-StorefrontCartWishlist.ts +100 -100
- package/dist/migrations/1774400000002-WishlistGuestId.ts +29 -29
- package/dist/migrations/1774500000000-ProductCollectionHsn.ts +15 -15
- package/dist/migrations/1774600000000-OrderKindParentOrderNumber.ts +36 -36
- package/dist/migrations/1774700000000-CollectionVariants.ts +13 -0
- package/dist/migrations/1774800000000-OtpChallengesUserPhone.ts +41 -41
- package/dist/migrations/1774900000000-MessageTemplates.ts +39 -39
- package/dist/migrations/1775000000000-ProductUomTypeOrderItemSnapshots.ts +29 -29
- package/dist/migrations/1775200000000-MediaDriveFolders.ts +38 -38
- package/dist/migrations/README.md +3 -3
- package/dist/theme.cjs.map +1 -1
- package/dist/theme.js.map +1 -1
- package/package.json +13 -6
- package/src/admin/admin.css +72 -72
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
-
|
|
3
|
-
export class OrderKindParentOrderNumber1774600000000 implements MigrationInterface {
|
|
4
|
-
name = 'OrderKindParentOrderNumber1774600000000';
|
|
5
|
-
|
|
6
|
-
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
-
await queryRunner.query(
|
|
8
|
-
`ALTER TABLE "orders" ADD COLUMN IF NOT EXISTS "orderKind" character varying NOT NULL DEFAULT 'sale'`
|
|
9
|
-
);
|
|
10
|
-
await queryRunner.query(
|
|
11
|
-
`ALTER TABLE "orders" ADD COLUMN IF NOT EXISTS "parentOrderId" integer`
|
|
12
|
-
);
|
|
13
|
-
await queryRunner.query(`
|
|
14
|
-
DO $$ BEGIN
|
|
15
|
-
ALTER TABLE "orders" ADD CONSTRAINT "FK_orders_parentOrderId"
|
|
16
|
-
FOREIGN KEY ("parentOrderId") REFERENCES "orders"("id") ON DELETE SET NULL ON UPDATE NO ACTION;
|
|
17
|
-
EXCEPTION
|
|
18
|
-
WHEN duplicate_object THEN null;
|
|
19
|
-
END $$;
|
|
20
|
-
`);
|
|
21
|
-
await queryRunner.query(
|
|
22
|
-
`CREATE INDEX IF NOT EXISTS "IDX_orders_parentOrderId" ON "orders" ("parentOrderId")`
|
|
23
|
-
);
|
|
24
|
-
await queryRunner.query(
|
|
25
|
-
`CREATE INDEX IF NOT EXISTS "IDX_orders_orderKind" ON "orders" ("orderKind")`
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
30
|
-
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_orders_orderKind"`);
|
|
31
|
-
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_orders_parentOrderId"`);
|
|
32
|
-
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT IF EXISTS "FK_orders_parentOrderId"`);
|
|
33
|
-
await queryRunner.query(`ALTER TABLE "orders" DROP COLUMN IF EXISTS "parentOrderId"`);
|
|
34
|
-
await queryRunner.query(`ALTER TABLE "orders" DROP COLUMN IF EXISTS "orderKind"`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class OrderKindParentOrderNumber1774600000000 implements MigrationInterface {
|
|
4
|
+
name = 'OrderKindParentOrderNumber1774600000000';
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(
|
|
8
|
+
`ALTER TABLE "orders" ADD COLUMN IF NOT EXISTS "orderKind" character varying NOT NULL DEFAULT 'sale'`
|
|
9
|
+
);
|
|
10
|
+
await queryRunner.query(
|
|
11
|
+
`ALTER TABLE "orders" ADD COLUMN IF NOT EXISTS "parentOrderId" integer`
|
|
12
|
+
);
|
|
13
|
+
await queryRunner.query(`
|
|
14
|
+
DO $$ BEGIN
|
|
15
|
+
ALTER TABLE "orders" ADD CONSTRAINT "FK_orders_parentOrderId"
|
|
16
|
+
FOREIGN KEY ("parentOrderId") REFERENCES "orders"("id") ON DELETE SET NULL ON UPDATE NO ACTION;
|
|
17
|
+
EXCEPTION
|
|
18
|
+
WHEN duplicate_object THEN null;
|
|
19
|
+
END $$;
|
|
20
|
+
`);
|
|
21
|
+
await queryRunner.query(
|
|
22
|
+
`CREATE INDEX IF NOT EXISTS "IDX_orders_parentOrderId" ON "orders" ("parentOrderId")`
|
|
23
|
+
);
|
|
24
|
+
await queryRunner.query(
|
|
25
|
+
`CREATE INDEX IF NOT EXISTS "IDX_orders_orderKind" ON "orders" ("orderKind")`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
30
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_orders_orderKind"`);
|
|
31
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_orders_parentOrderId"`);
|
|
32
|
+
await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT IF EXISTS "FK_orders_parentOrderId"`);
|
|
33
|
+
await queryRunner.query(`ALTER TABLE "orders" DROP COLUMN IF EXISTS "parentOrderId"`);
|
|
34
|
+
await queryRunner.query(`ALTER TABLE "orders" DROP COLUMN IF EXISTS "orderKind"`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class CollectionVariants1774700000000 implements MigrationInterface {
|
|
4
|
+
name = 'CollectionVariants1774700000000';
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`ALTER TABLE "collections" ADD COLUMN IF NOT EXISTS "variants" jsonb`);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
11
|
+
await queryRunner.query(`ALTER TABLE "collections" DROP COLUMN IF EXISTS "variants"`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
-
|
|
3
|
-
export class OtpChallengesUserPhone1774800000000 implements MigrationInterface {
|
|
4
|
-
name = 'OtpChallengesUserPhone1774800000000';
|
|
5
|
-
|
|
6
|
-
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
-
await queryRunner.query(`
|
|
8
|
-
CREATE TABLE IF NOT EXISTS "otp_challenges" (
|
|
9
|
-
"id" SERIAL NOT NULL,
|
|
10
|
-
"purpose" character varying NOT NULL,
|
|
11
|
-
"channel" character varying NOT NULL,
|
|
12
|
-
"identifier" character varying NOT NULL,
|
|
13
|
-
"codeHash" character varying NOT NULL,
|
|
14
|
-
"expiresAt" TIMESTAMP NOT NULL,
|
|
15
|
-
"attempts" integer NOT NULL DEFAULT 0,
|
|
16
|
-
"consumedAt" TIMESTAMP,
|
|
17
|
-
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
18
|
-
CONSTRAINT "PK_otp_challenges" PRIMARY KEY ("id")
|
|
19
|
-
)
|
|
20
|
-
`);
|
|
21
|
-
await queryRunner.query(
|
|
22
|
-
`CREATE INDEX IF NOT EXISTS "IDX_otp_challenges_purpose_identifier" ON "otp_challenges" ("purpose", "identifier")`,
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
await queryRunner.query(`ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "phone" character varying`);
|
|
26
|
-
await queryRunner.query(`ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "phoneVerifiedAt" TIMESTAMP`);
|
|
27
|
-
await queryRunner.query(`ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "emailVerifiedAt" TIMESTAMP`);
|
|
28
|
-
await queryRunner.query(
|
|
29
|
-
`CREATE UNIQUE INDEX IF NOT EXISTS "UQ_users_phone" ON "users" ("phone") WHERE "phone" IS NOT NULL`,
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
34
|
-
await queryRunner.query(`DROP INDEX IF EXISTS "UQ_users_phone"`);
|
|
35
|
-
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN IF EXISTS "emailVerifiedAt"`);
|
|
36
|
-
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN IF EXISTS "phoneVerifiedAt"`);
|
|
37
|
-
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN IF EXISTS "phone"`);
|
|
38
|
-
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_otp_challenges_purpose_identifier"`);
|
|
39
|
-
await queryRunner.query(`DROP TABLE IF EXISTS "otp_challenges"`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class OtpChallengesUserPhone1774800000000 implements MigrationInterface {
|
|
4
|
+
name = 'OtpChallengesUserPhone1774800000000';
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`
|
|
8
|
+
CREATE TABLE IF NOT EXISTS "otp_challenges" (
|
|
9
|
+
"id" SERIAL NOT NULL,
|
|
10
|
+
"purpose" character varying NOT NULL,
|
|
11
|
+
"channel" character varying NOT NULL,
|
|
12
|
+
"identifier" character varying NOT NULL,
|
|
13
|
+
"codeHash" character varying NOT NULL,
|
|
14
|
+
"expiresAt" TIMESTAMP NOT NULL,
|
|
15
|
+
"attempts" integer NOT NULL DEFAULT 0,
|
|
16
|
+
"consumedAt" TIMESTAMP,
|
|
17
|
+
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
18
|
+
CONSTRAINT "PK_otp_challenges" PRIMARY KEY ("id")
|
|
19
|
+
)
|
|
20
|
+
`);
|
|
21
|
+
await queryRunner.query(
|
|
22
|
+
`CREATE INDEX IF NOT EXISTS "IDX_otp_challenges_purpose_identifier" ON "otp_challenges" ("purpose", "identifier")`,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
await queryRunner.query(`ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "phone" character varying`);
|
|
26
|
+
await queryRunner.query(`ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "phoneVerifiedAt" TIMESTAMP`);
|
|
27
|
+
await queryRunner.query(`ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "emailVerifiedAt" TIMESTAMP`);
|
|
28
|
+
await queryRunner.query(
|
|
29
|
+
`CREATE UNIQUE INDEX IF NOT EXISTS "UQ_users_phone" ON "users" ("phone") WHERE "phone" IS NOT NULL`,
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
34
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "UQ_users_phone"`);
|
|
35
|
+
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN IF EXISTS "emailVerifiedAt"`);
|
|
36
|
+
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN IF EXISTS "phoneVerifiedAt"`);
|
|
37
|
+
await queryRunner.query(`ALTER TABLE "users" DROP COLUMN IF EXISTS "phone"`);
|
|
38
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_otp_challenges_purpose_identifier"`);
|
|
39
|
+
await queryRunner.query(`DROP TABLE IF EXISTS "otp_challenges"`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
-
|
|
3
|
-
export class MessageTemplates1774900000000 implements MigrationInterface {
|
|
4
|
-
name = 'MessageTemplates1774900000000';
|
|
5
|
-
|
|
6
|
-
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
-
await queryRunner.query(`
|
|
8
|
-
CREATE TABLE IF NOT EXISTS "message_templates" (
|
|
9
|
-
"id" SERIAL NOT NULL,
|
|
10
|
-
"channel" character varying NOT NULL,
|
|
11
|
-
"template_key" character varying NOT NULL,
|
|
12
|
-
"name" character varying,
|
|
13
|
-
"subject" character varying,
|
|
14
|
-
"body" text NOT NULL DEFAULT '',
|
|
15
|
-
"external_template_ref" character varying,
|
|
16
|
-
"providerMeta" jsonb,
|
|
17
|
-
"enabled" boolean NOT NULL DEFAULT true,
|
|
18
|
-
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
19
|
-
"updatedAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
20
|
-
"deletedAt" TIMESTAMP,
|
|
21
|
-
"deleted" boolean NOT NULL DEFAULT false,
|
|
22
|
-
"createdBy" integer,
|
|
23
|
-
"updatedBy" integer,
|
|
24
|
-
"deletedBy" integer,
|
|
25
|
-
CONSTRAINT "PK_message_templates" PRIMARY KEY ("id")
|
|
26
|
-
)
|
|
27
|
-
`);
|
|
28
|
-
await queryRunner.query(`
|
|
29
|
-
CREATE UNIQUE INDEX IF NOT EXISTS "UQ_message_templates_channel_key_active"
|
|
30
|
-
ON "message_templates" ("channel", "template_key")
|
|
31
|
-
WHERE "deleted" = false
|
|
32
|
-
`);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
36
|
-
await queryRunner.query(`DROP INDEX IF EXISTS "UQ_message_templates_channel_key_active"`);
|
|
37
|
-
await queryRunner.query(`DROP TABLE IF EXISTS "message_templates"`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class MessageTemplates1774900000000 implements MigrationInterface {
|
|
4
|
+
name = 'MessageTemplates1774900000000';
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`
|
|
8
|
+
CREATE TABLE IF NOT EXISTS "message_templates" (
|
|
9
|
+
"id" SERIAL NOT NULL,
|
|
10
|
+
"channel" character varying NOT NULL,
|
|
11
|
+
"template_key" character varying NOT NULL,
|
|
12
|
+
"name" character varying,
|
|
13
|
+
"subject" character varying,
|
|
14
|
+
"body" text NOT NULL DEFAULT '',
|
|
15
|
+
"external_template_ref" character varying,
|
|
16
|
+
"providerMeta" jsonb,
|
|
17
|
+
"enabled" boolean NOT NULL DEFAULT true,
|
|
18
|
+
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
19
|
+
"updatedAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
20
|
+
"deletedAt" TIMESTAMP,
|
|
21
|
+
"deleted" boolean NOT NULL DEFAULT false,
|
|
22
|
+
"createdBy" integer,
|
|
23
|
+
"updatedBy" integer,
|
|
24
|
+
"deletedBy" integer,
|
|
25
|
+
CONSTRAINT "PK_message_templates" PRIMARY KEY ("id")
|
|
26
|
+
)
|
|
27
|
+
`);
|
|
28
|
+
await queryRunner.query(`
|
|
29
|
+
CREATE UNIQUE INDEX IF NOT EXISTS "UQ_message_templates_channel_key_active"
|
|
30
|
+
ON "message_templates" ("channel", "template_key")
|
|
31
|
+
WHERE "deleted" = false
|
|
32
|
+
`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
36
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "UQ_message_templates_channel_key_active"`);
|
|
37
|
+
await queryRunner.query(`DROP TABLE IF EXISTS "message_templates"`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
-
|
|
3
|
-
export class ProductUomTypeOrderItemSnapshots1775000000000 implements MigrationInterface {
|
|
4
|
-
name = 'ProductUomTypeOrderItemSnapshots1775000000000';
|
|
5
|
-
|
|
6
|
-
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
-
await queryRunner.query(`ALTER TABLE "products" ADD COLUMN IF NOT EXISTS "uom" character varying`);
|
|
8
|
-
await queryRunner.query(
|
|
9
|
-
`ALTER TABLE "products" ADD COLUMN IF NOT EXISTS "type" character varying NOT NULL DEFAULT 'product'`
|
|
10
|
-
);
|
|
11
|
-
await queryRunner.query(`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "hsn" character varying`);
|
|
12
|
-
await queryRunner.query(`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "uom" character varying`);
|
|
13
|
-
await queryRunner.query(`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "productType" character varying`);
|
|
14
|
-
await queryRunner.query(
|
|
15
|
-
`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "taxRate" numeric(5,2)`
|
|
16
|
-
);
|
|
17
|
-
await queryRunner.query(`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "taxCode" character varying`);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
21
|
-
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "taxCode"`);
|
|
22
|
-
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "taxRate"`);
|
|
23
|
-
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "productType"`);
|
|
24
|
-
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "uom"`);
|
|
25
|
-
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "hsn"`);
|
|
26
|
-
await queryRunner.query(`ALTER TABLE "products" DROP COLUMN IF EXISTS "type"`);
|
|
27
|
-
await queryRunner.query(`ALTER TABLE "products" DROP COLUMN IF EXISTS "uom"`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class ProductUomTypeOrderItemSnapshots1775000000000 implements MigrationInterface {
|
|
4
|
+
name = 'ProductUomTypeOrderItemSnapshots1775000000000';
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`ALTER TABLE "products" ADD COLUMN IF NOT EXISTS "uom" character varying`);
|
|
8
|
+
await queryRunner.query(
|
|
9
|
+
`ALTER TABLE "products" ADD COLUMN IF NOT EXISTS "type" character varying NOT NULL DEFAULT 'product'`
|
|
10
|
+
);
|
|
11
|
+
await queryRunner.query(`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "hsn" character varying`);
|
|
12
|
+
await queryRunner.query(`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "uom" character varying`);
|
|
13
|
+
await queryRunner.query(`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "productType" character varying`);
|
|
14
|
+
await queryRunner.query(
|
|
15
|
+
`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "taxRate" numeric(5,2)`
|
|
16
|
+
);
|
|
17
|
+
await queryRunner.query(`ALTER TABLE "order_items" ADD COLUMN IF NOT EXISTS "taxCode" character varying`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
21
|
+
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "taxCode"`);
|
|
22
|
+
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "taxRate"`);
|
|
23
|
+
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "productType"`);
|
|
24
|
+
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "uom"`);
|
|
25
|
+
await queryRunner.query(`ALTER TABLE "order_items" DROP COLUMN IF EXISTS "hsn"`);
|
|
26
|
+
await queryRunner.query(`ALTER TABLE "products" DROP COLUMN IF EXISTS "type"`);
|
|
27
|
+
await queryRunner.query(`ALTER TABLE "products" DROP COLUMN IF EXISTS "uom"`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
-
|
|
3
|
-
export class MediaDriveFolders1775200000000 implements MigrationInterface {
|
|
4
|
-
name = 'MediaDriveFolders1775200000000';
|
|
5
|
-
|
|
6
|
-
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
-
await queryRunner.query(`ALTER TABLE "media" DROP COLUMN IF EXISTS "folderPath"`);
|
|
8
|
-
await queryRunner.query(
|
|
9
|
-
`ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "kind" character varying(16) NOT NULL DEFAULT 'file'`
|
|
10
|
-
);
|
|
11
|
-
await queryRunner.query(`ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "parentId" integer`);
|
|
12
|
-
await queryRunner.query(`ALTER TABLE "media" ALTER COLUMN "url" DROP NOT NULL`);
|
|
13
|
-
await queryRunner.query(`ALTER TABLE "media" ALTER COLUMN "mimeType" DROP NOT NULL`);
|
|
14
|
-
await queryRunner.query(
|
|
15
|
-
`UPDATE "media" SET "kind" = 'file' WHERE "kind" IS NULL OR "kind" = ''`
|
|
16
|
-
);
|
|
17
|
-
await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_media_parentId" ON "media" ("parentId")`);
|
|
18
|
-
await queryRunner.query(`
|
|
19
|
-
DO $$ BEGIN
|
|
20
|
-
ALTER TABLE "media" ADD CONSTRAINT "FK_media_parent" FOREIGN KEY ("parentId") REFERENCES "media"("id") ON DELETE CASCADE;
|
|
21
|
-
EXCEPTION
|
|
22
|
-
WHEN duplicate_object THEN null;
|
|
23
|
-
END $$;
|
|
24
|
-
`);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
28
|
-
await queryRunner.query(`ALTER TABLE "media" DROP CONSTRAINT IF EXISTS "FK_media_parent"`);
|
|
29
|
-
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_media_parentId"`);
|
|
30
|
-
await queryRunner.query(`ALTER TABLE "media" DROP COLUMN IF EXISTS "parentId"`);
|
|
31
|
-
await queryRunner.query(`ALTER TABLE "media" DROP COLUMN IF EXISTS "kind"`);
|
|
32
|
-
await queryRunner.query(
|
|
33
|
-
`ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "folderPath" character varying(512) NOT NULL DEFAULT ''`
|
|
34
|
-
);
|
|
35
|
-
await queryRunner.query(`ALTER TABLE "media" ALTER COLUMN "url" SET NOT NULL`);
|
|
36
|
-
await queryRunner.query(`ALTER TABLE "media" ALTER COLUMN "mimeType" SET NOT NULL`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
1
|
+
import type { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
export class MediaDriveFolders1775200000000 implements MigrationInterface {
|
|
4
|
+
name = 'MediaDriveFolders1775200000000';
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`ALTER TABLE "media" DROP COLUMN IF EXISTS "folderPath"`);
|
|
8
|
+
await queryRunner.query(
|
|
9
|
+
`ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "kind" character varying(16) NOT NULL DEFAULT 'file'`
|
|
10
|
+
);
|
|
11
|
+
await queryRunner.query(`ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "parentId" integer`);
|
|
12
|
+
await queryRunner.query(`ALTER TABLE "media" ALTER COLUMN "url" DROP NOT NULL`);
|
|
13
|
+
await queryRunner.query(`ALTER TABLE "media" ALTER COLUMN "mimeType" DROP NOT NULL`);
|
|
14
|
+
await queryRunner.query(
|
|
15
|
+
`UPDATE "media" SET "kind" = 'file' WHERE "kind" IS NULL OR "kind" = ''`
|
|
16
|
+
);
|
|
17
|
+
await queryRunner.query(`CREATE INDEX IF NOT EXISTS "IDX_media_parentId" ON "media" ("parentId")`);
|
|
18
|
+
await queryRunner.query(`
|
|
19
|
+
DO $$ BEGIN
|
|
20
|
+
ALTER TABLE "media" ADD CONSTRAINT "FK_media_parent" FOREIGN KEY ("parentId") REFERENCES "media"("id") ON DELETE CASCADE;
|
|
21
|
+
EXCEPTION
|
|
22
|
+
WHEN duplicate_object THEN null;
|
|
23
|
+
END $$;
|
|
24
|
+
`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
28
|
+
await queryRunner.query(`ALTER TABLE "media" DROP CONSTRAINT IF EXISTS "FK_media_parent"`);
|
|
29
|
+
await queryRunner.query(`DROP INDEX IF EXISTS "IDX_media_parentId"`);
|
|
30
|
+
await queryRunner.query(`ALTER TABLE "media" DROP COLUMN IF EXISTS "parentId"`);
|
|
31
|
+
await queryRunner.query(`ALTER TABLE "media" DROP COLUMN IF EXISTS "kind"`);
|
|
32
|
+
await queryRunner.query(
|
|
33
|
+
`ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "folderPath" character varying(512) NOT NULL DEFAULT ''`
|
|
34
|
+
);
|
|
35
|
+
await queryRunner.query(`ALTER TABLE "media" ALTER COLUMN "url" SET NOT NULL`);
|
|
36
|
+
await queryRunner.query(`ALTER TABLE "media" ALTER COLUMN "mimeType" SET NOT NULL`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# Core migrations
|
|
2
|
-
|
|
3
|
-
TypeORM migrations for @infuro/cms-core schema. Shipped in `dist/migrations/` and run automatically with app migrations when you run `npm run migration:run`.
|
|
1
|
+
# Core migrations
|
|
2
|
+
|
|
3
|
+
TypeORM migrations for @infuro/cms-core schema. Shipped in `dist/migrations/` and run automatically with app migrations when you run `npm run migration:run`.
|
package/dist/theme.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/index.ts","../src/theme/registry.ts","../src/theme/renderer.ts"],"sourcesContent":["export type {\n PropType,\n PropDefinition,\n ComponentMeta,\n ThemeComponent,\n ThemeConfig,\n LayoutConfig,\n NavItem,\n NavbarConfig,\n FooterConfig,\n} from './types';\n\nexport { createTheme, buildResolver, getCatalog } from './registry';\nexport type { CatalogGroup } from './registry';\n\nexport { PageRenderer } from './renderer';\n","import type { ThemeConfig, ThemeComponent, ComponentMeta } from './types';\n\nexport function createTheme(config: ThemeConfig): ThemeConfig {\n const names = config.components.map((c) => c.meta.name);\n const duplicates = names.filter((n, i) => names.indexOf(n) !== i);\n if (duplicates.length) {\n throw new Error(`Duplicate component names in theme \"${config.name}\": ${duplicates.join(', ')}`);\n }\n return Object.freeze(config) as ThemeConfig;\n}\n\nexport function buildResolver(theme: ThemeConfig): Record<string, React.ComponentType<any>> {\n const resolver: Record<string, React.ComponentType<any>> = {};\n for (const { meta, component } of theme.components) {\n resolver[meta.name] = component;\n }\n return resolver;\n}\n\nexport interface CatalogGroup {\n category: string;\n components: ComponentMeta[];\n}\n\nexport function getCatalog(theme: ThemeConfig): CatalogGroup[] {\n const groups = new Map<string, ComponentMeta[]>();\n for (const { meta } of theme.components) {\n const list = groups.get(meta.category) || [];\n list.push(meta);\n groups.set(meta.category, list);\n }\n return Array.from(groups.entries()).map(([category, components]) => ({\n category,\n components,\n }));\n}\n","import React from 'react';\nimport type { ThemeConfig, NavbarConfig, FooterConfig } from './types';\nimport { buildResolver } from './registry';\n\ninterface CraftNode {\n type: string | { resolvedName: string };\n props: Record<string, any>;\n nodes?: string[];\n linkedNodes?: Record<string, string>;\n}\n\ntype CraftJson = Record<string, CraftNode>;\n\ninterface PageRendererProps {\n content: CraftJson;\n theme: ThemeConfig;\n navbarConfig?: NavbarConfig;\n footerConfig?: FooterConfig;\n}\n\nexport function PageRenderer({ content, theme, navbarConfig, footerConfig }: PageRendererProps) {\n const resolver = buildResolver(theme);\n const NavbarComponent = theme.layout?.navbar?.component;\n const FooterComponent = theme.layout?.footer?.component;\n\n return React.createElement(\n React.Fragment,\n null,\n NavbarComponent && navbarConfig\n ? React.createElement(NavbarComponent, navbarConfig)\n : null,\n React.createElement('main', null, renderNode(content, 'ROOT', resolver)),\n FooterComponent && footerConfig\n ? React.createElement(FooterComponent, footerConfig)\n : null,\n );\n}\n\nfunction getChildIds(node: CraftNode): string[] {\n const fromNodes = node.nodes ?? [];\n const fromLinked = Object.values(node.linkedNodes ?? {});\n return [...fromNodes, ...fromLinked];\n}\n\nfunction renderNode(\n json: CraftJson,\n nodeId: string,\n resolver: Record<string, React.ComponentType<any>>,\n): React.ReactNode {\n const node = json[nodeId];\n if (!node) return null;\n\n const resolvedName =\n typeof node.type === 'string' ? node.type : (node.type?.resolvedName ?? '');\n const Component = resolver[resolvedName];\n const childIds = getChildIds(node);\n const children = childIds.map((childId) => renderNode(json, childId, resolver));\n\n if (Component) {\n return React.createElement(Component, { key: nodeId, ...node.props }, children);\n }\n\n const tag = node.props?.is ?? 'div';\n const props = node.props ?? {};\n const safeProps: Record<string, unknown> = { key: nodeId };\n if (props.className != null) safeProps.className = props.className;\n if (props.style != null) safeProps.style = props.style;\n if (props.id != null) safeProps.id = props.id;\n return React.createElement(tag, safeProps, children);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,YAAY,QAAkC;AAC5D,QAAM,QAAQ,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI;AACtD,QAAM,aAAa,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,QAAQ,CAAC,MAAM,CAAC;AAChE,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,MAAM,uCAAuC,OAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,EACjG;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEO,SAAS,cAAc,OAA8D;AAC1F,QAAM,WAAqD,CAAC;AAC5D,aAAW,EAAE,MAAM,UAAU,KAAK,MAAM,YAAY;AAClD,aAAS,KAAK,IAAI,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAOO,SAAS,WAAW,OAAoC;AAC7D,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,EAAE,KAAK,KAAK,MAAM,YAAY;AACvC,UAAM,OAAO,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;AAC3C,SAAK,KAAK,IAAI;AACd,WAAO,IAAI,KAAK,UAAU,IAAI;AAAA,EAChC;AACA,SAAO,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,UAAU,OAAO;AAAA,IACnE;AAAA,IACA;AAAA,EACF,EAAE;AACJ;;;ACnCA,mBAAkB;AAoBX,SAAS,aAAa,EAAE,SAAS,OAAO,cAAc,aAAa,GAAsB;AAC9F,QAAM,WAAW,cAAc,KAAK;AACpC,QAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAC9C,QAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAE9C,SAAO,aAAAA,QAAM;AAAA,IACX,aAAAA,QAAM;AAAA,IACN;AAAA,IACA,mBAAmB,eACf,aAAAA,QAAM,cAAc,iBAAiB,YAAY,IACjD;AAAA,IACJ,aAAAA,QAAM,cAAc,QAAQ,MAAM,WAAW,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACvE,mBAAmB,eACf,aAAAA,QAAM,cAAc,iBAAiB,YAAY,IACjD;AAAA,EACN;AACF;AAEA,SAAS,YAAY,MAA2B;AAC9C,QAAM,YAAY,KAAK,SAAS,CAAC;AACjC,QAAM,aAAa,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC;AACvD,SAAO,CAAC,GAAG,WAAW,GAAG,UAAU;AACrC;AAEA,SAAS,WACP,MACA,QACA,UACiB;AACjB,QAAM,OAAO,KAAK,MAAM;AACxB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,eACJ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAQ,KAAK,MAAM,gBAAgB;AAC1E,QAAM,YAAY,SAAS,YAAY;AACvC,QAAM,WAAW,YAAY,IAAI;AACjC,QAAM,WAAW,SAAS,IAAI,CAAC,YAAY,WAAW,MAAM,SAAS,QAAQ,CAAC;AAE9E,MAAI,WAAW;AACb,WAAO,aAAAA,QAAM,cAAc,WAAW,EAAE,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,QAAQ;AAAA,EAChF;AAEA,QAAM,MAAM,KAAK,OAAO,MAAM;AAC9B,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAM,YAAqC,EAAE,KAAK,OAAO;AACzD,MAAI,MAAM,aAAa,KAAM,WAAU,YAAY,MAAM;AACzD,MAAI,MAAM,SAAS,KAAM,WAAU,QAAQ,MAAM;AACjD,MAAI,MAAM,MAAM,KAAM,WAAU,KAAK,MAAM;AAC3C,SAAO,aAAAA,QAAM,cAAc,KAAK,WAAW,QAAQ;AACrD;","names":["React"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/index.ts","../src/theme/registry.ts","../src/theme/renderer.ts"],"sourcesContent":["export type {\r\n PropType,\r\n PropDefinition,\r\n ComponentMeta,\r\n ThemeComponent,\r\n ThemeConfig,\r\n LayoutConfig,\r\n NavItem,\r\n NavbarConfig,\r\n FooterConfig,\r\n} from './types';\r\n\r\nexport { createTheme, buildResolver, getCatalog } from './registry';\r\nexport type { CatalogGroup } from './registry';\r\n\r\nexport { PageRenderer } from './renderer';\r\n","import type { ThemeConfig, ThemeComponent, ComponentMeta } from './types';\r\n\r\nexport function createTheme(config: ThemeConfig): ThemeConfig {\r\n const names = config.components.map((c) => c.meta.name);\r\n const duplicates = names.filter((n, i) => names.indexOf(n) !== i);\r\n if (duplicates.length) {\r\n throw new Error(`Duplicate component names in theme \"${config.name}\": ${duplicates.join(', ')}`);\r\n }\r\n return Object.freeze(config) as ThemeConfig;\r\n}\r\n\r\nexport function buildResolver(theme: ThemeConfig): Record<string, React.ComponentType<any>> {\r\n const resolver: Record<string, React.ComponentType<any>> = {};\r\n for (const { meta, component } of theme.components) {\r\n resolver[meta.name] = component;\r\n }\r\n return resolver;\r\n}\r\n\r\nexport interface CatalogGroup {\r\n category: string;\r\n components: ComponentMeta[];\r\n}\r\n\r\nexport function getCatalog(theme: ThemeConfig): CatalogGroup[] {\r\n const groups = new Map<string, ComponentMeta[]>();\r\n for (const { meta } of theme.components) {\r\n const list = groups.get(meta.category) || [];\r\n list.push(meta);\r\n groups.set(meta.category, list);\r\n }\r\n return Array.from(groups.entries()).map(([category, components]) => ({\r\n category,\r\n components,\r\n }));\r\n}\r\n","import React from 'react';\r\nimport type { ThemeConfig, NavbarConfig, FooterConfig } from './types';\r\nimport { buildResolver } from './registry';\r\n\r\ninterface CraftNode {\r\n type: string | { resolvedName: string };\r\n props: Record<string, any>;\r\n nodes?: string[];\r\n linkedNodes?: Record<string, string>;\r\n}\r\n\r\ntype CraftJson = Record<string, CraftNode>;\r\n\r\ninterface PageRendererProps {\r\n content: CraftJson;\r\n theme: ThemeConfig;\r\n navbarConfig?: NavbarConfig;\r\n footerConfig?: FooterConfig;\r\n}\r\n\r\nexport function PageRenderer({ content, theme, navbarConfig, footerConfig }: PageRendererProps) {\r\n const resolver = buildResolver(theme);\r\n const NavbarComponent = theme.layout?.navbar?.component;\r\n const FooterComponent = theme.layout?.footer?.component;\r\n\r\n return React.createElement(\r\n React.Fragment,\r\n null,\r\n NavbarComponent && navbarConfig\r\n ? React.createElement(NavbarComponent, navbarConfig)\r\n : null,\r\n React.createElement('main', null, renderNode(content, 'ROOT', resolver)),\r\n FooterComponent && footerConfig\r\n ? React.createElement(FooterComponent, footerConfig)\r\n : null,\r\n );\r\n}\r\n\r\nfunction getChildIds(node: CraftNode): string[] {\r\n const fromNodes = node.nodes ?? [];\r\n const fromLinked = Object.values(node.linkedNodes ?? {});\r\n return [...fromNodes, ...fromLinked];\r\n}\r\n\r\nfunction renderNode(\r\n json: CraftJson,\r\n nodeId: string,\r\n resolver: Record<string, React.ComponentType<any>>,\r\n): React.ReactNode {\r\n const node = json[nodeId];\r\n if (!node) return null;\r\n\r\n const resolvedName =\r\n typeof node.type === 'string' ? node.type : (node.type?.resolvedName ?? '');\r\n const Component = resolver[resolvedName];\r\n const childIds = getChildIds(node);\r\n const children = childIds.map((childId) => renderNode(json, childId, resolver));\r\n\r\n if (Component) {\r\n return React.createElement(Component, { key: nodeId, ...node.props }, children);\r\n }\r\n\r\n const tag = node.props?.is ?? 'div';\r\n const props = node.props ?? {};\r\n const safeProps: Record<string, unknown> = { key: nodeId };\r\n if (props.className != null) safeProps.className = props.className;\r\n if (props.style != null) safeProps.style = props.style;\r\n if (props.id != null) safeProps.id = props.id;\r\n return React.createElement(tag, safeProps, children);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,YAAY,QAAkC;AAC5D,QAAM,QAAQ,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI;AACtD,QAAM,aAAa,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,QAAQ,CAAC,MAAM,CAAC;AAChE,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,MAAM,uCAAuC,OAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,EACjG;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEO,SAAS,cAAc,OAA8D;AAC1F,QAAM,WAAqD,CAAC;AAC5D,aAAW,EAAE,MAAM,UAAU,KAAK,MAAM,YAAY;AAClD,aAAS,KAAK,IAAI,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAOO,SAAS,WAAW,OAAoC;AAC7D,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,EAAE,KAAK,KAAK,MAAM,YAAY;AACvC,UAAM,OAAO,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;AAC3C,SAAK,KAAK,IAAI;AACd,WAAO,IAAI,KAAK,UAAU,IAAI;AAAA,EAChC;AACA,SAAO,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,UAAU,OAAO;AAAA,IACnE;AAAA,IACA;AAAA,EACF,EAAE;AACJ;;;ACnCA,mBAAkB;AAoBX,SAAS,aAAa,EAAE,SAAS,OAAO,cAAc,aAAa,GAAsB;AAC9F,QAAM,WAAW,cAAc,KAAK;AACpC,QAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAC9C,QAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAE9C,SAAO,aAAAA,QAAM;AAAA,IACX,aAAAA,QAAM;AAAA,IACN;AAAA,IACA,mBAAmB,eACf,aAAAA,QAAM,cAAc,iBAAiB,YAAY,IACjD;AAAA,IACJ,aAAAA,QAAM,cAAc,QAAQ,MAAM,WAAW,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACvE,mBAAmB,eACf,aAAAA,QAAM,cAAc,iBAAiB,YAAY,IACjD;AAAA,EACN;AACF;AAEA,SAAS,YAAY,MAA2B;AAC9C,QAAM,YAAY,KAAK,SAAS,CAAC;AACjC,QAAM,aAAa,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC;AACvD,SAAO,CAAC,GAAG,WAAW,GAAG,UAAU;AACrC;AAEA,SAAS,WACP,MACA,QACA,UACiB;AACjB,QAAM,OAAO,KAAK,MAAM;AACxB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,eACJ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAQ,KAAK,MAAM,gBAAgB;AAC1E,QAAM,YAAY,SAAS,YAAY;AACvC,QAAM,WAAW,YAAY,IAAI;AACjC,QAAM,WAAW,SAAS,IAAI,CAAC,YAAY,WAAW,MAAM,SAAS,QAAQ,CAAC;AAE9E,MAAI,WAAW;AACb,WAAO,aAAAA,QAAM,cAAc,WAAW,EAAE,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,QAAQ;AAAA,EAChF;AAEA,QAAM,MAAM,KAAK,OAAO,MAAM;AAC9B,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAM,YAAqC,EAAE,KAAK,OAAO;AACzD,MAAI,MAAM,aAAa,KAAM,WAAU,YAAY,MAAM;AACzD,MAAI,MAAM,SAAS,KAAM,WAAU,QAAQ,MAAM;AACjD,MAAI,MAAM,MAAM,KAAM,WAAU,KAAK,MAAM;AAC3C,SAAO,aAAAA,QAAM,cAAc,KAAK,WAAW,QAAQ;AACrD;","names":["React"]}
|
package/dist/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/registry.ts","../src/theme/renderer.ts"],"sourcesContent":["import type { ThemeConfig, ThemeComponent, ComponentMeta } from './types';\n\nexport function createTheme(config: ThemeConfig): ThemeConfig {\n const names = config.components.map((c) => c.meta.name);\n const duplicates = names.filter((n, i) => names.indexOf(n) !== i);\n if (duplicates.length) {\n throw new Error(`Duplicate component names in theme \"${config.name}\": ${duplicates.join(', ')}`);\n }\n return Object.freeze(config) as ThemeConfig;\n}\n\nexport function buildResolver(theme: ThemeConfig): Record<string, React.ComponentType<any>> {\n const resolver: Record<string, React.ComponentType<any>> = {};\n for (const { meta, component } of theme.components) {\n resolver[meta.name] = component;\n }\n return resolver;\n}\n\nexport interface CatalogGroup {\n category: string;\n components: ComponentMeta[];\n}\n\nexport function getCatalog(theme: ThemeConfig): CatalogGroup[] {\n const groups = new Map<string, ComponentMeta[]>();\n for (const { meta } of theme.components) {\n const list = groups.get(meta.category) || [];\n list.push(meta);\n groups.set(meta.category, list);\n }\n return Array.from(groups.entries()).map(([category, components]) => ({\n category,\n components,\n }));\n}\n","import React from 'react';\nimport type { ThemeConfig, NavbarConfig, FooterConfig } from './types';\nimport { buildResolver } from './registry';\n\ninterface CraftNode {\n type: string | { resolvedName: string };\n props: Record<string, any>;\n nodes?: string[];\n linkedNodes?: Record<string, string>;\n}\n\ntype CraftJson = Record<string, CraftNode>;\n\ninterface PageRendererProps {\n content: CraftJson;\n theme: ThemeConfig;\n navbarConfig?: NavbarConfig;\n footerConfig?: FooterConfig;\n}\n\nexport function PageRenderer({ content, theme, navbarConfig, footerConfig }: PageRendererProps) {\n const resolver = buildResolver(theme);\n const NavbarComponent = theme.layout?.navbar?.component;\n const FooterComponent = theme.layout?.footer?.component;\n\n return React.createElement(\n React.Fragment,\n null,\n NavbarComponent && navbarConfig\n ? React.createElement(NavbarComponent, navbarConfig)\n : null,\n React.createElement('main', null, renderNode(content, 'ROOT', resolver)),\n FooterComponent && footerConfig\n ? React.createElement(FooterComponent, footerConfig)\n : null,\n );\n}\n\nfunction getChildIds(node: CraftNode): string[] {\n const fromNodes = node.nodes ?? [];\n const fromLinked = Object.values(node.linkedNodes ?? {});\n return [...fromNodes, ...fromLinked];\n}\n\nfunction renderNode(\n json: CraftJson,\n nodeId: string,\n resolver: Record<string, React.ComponentType<any>>,\n): React.ReactNode {\n const node = json[nodeId];\n if (!node) return null;\n\n const resolvedName =\n typeof node.type === 'string' ? node.type : (node.type?.resolvedName ?? '');\n const Component = resolver[resolvedName];\n const childIds = getChildIds(node);\n const children = childIds.map((childId) => renderNode(json, childId, resolver));\n\n if (Component) {\n return React.createElement(Component, { key: nodeId, ...node.props }, children);\n }\n\n const tag = node.props?.is ?? 'div';\n const props = node.props ?? {};\n const safeProps: Record<string, unknown> = { key: nodeId };\n if (props.className != null) safeProps.className = props.className;\n if (props.style != null) safeProps.style = props.style;\n if (props.id != null) safeProps.id = props.id;\n return React.createElement(tag, safeProps, children);\n}\n"],"mappings":";AAEO,SAAS,YAAY,QAAkC;AAC5D,QAAM,QAAQ,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI;AACtD,QAAM,aAAa,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,QAAQ,CAAC,MAAM,CAAC;AAChE,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,MAAM,uCAAuC,OAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,EACjG;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEO,SAAS,cAAc,OAA8D;AAC1F,QAAM,WAAqD,CAAC;AAC5D,aAAW,EAAE,MAAM,UAAU,KAAK,MAAM,YAAY;AAClD,aAAS,KAAK,IAAI,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAOO,SAAS,WAAW,OAAoC;AAC7D,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,EAAE,KAAK,KAAK,MAAM,YAAY;AACvC,UAAM,OAAO,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;AAC3C,SAAK,KAAK,IAAI;AACd,WAAO,IAAI,KAAK,UAAU,IAAI;AAAA,EAChC;AACA,SAAO,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,UAAU,OAAO;AAAA,IACnE;AAAA,IACA;AAAA,EACF,EAAE;AACJ;;;ACnCA,OAAO,WAAW;AAoBX,SAAS,aAAa,EAAE,SAAS,OAAO,cAAc,aAAa,GAAsB;AAC9F,QAAM,WAAW,cAAc,KAAK;AACpC,QAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAC9C,QAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAE9C,SAAO,MAAM;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA,mBAAmB,eACf,MAAM,cAAc,iBAAiB,YAAY,IACjD;AAAA,IACJ,MAAM,cAAc,QAAQ,MAAM,WAAW,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACvE,mBAAmB,eACf,MAAM,cAAc,iBAAiB,YAAY,IACjD;AAAA,EACN;AACF;AAEA,SAAS,YAAY,MAA2B;AAC9C,QAAM,YAAY,KAAK,SAAS,CAAC;AACjC,QAAM,aAAa,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC;AACvD,SAAO,CAAC,GAAG,WAAW,GAAG,UAAU;AACrC;AAEA,SAAS,WACP,MACA,QACA,UACiB;AACjB,QAAM,OAAO,KAAK,MAAM;AACxB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,eACJ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAQ,KAAK,MAAM,gBAAgB;AAC1E,QAAM,YAAY,SAAS,YAAY;AACvC,QAAM,WAAW,YAAY,IAAI;AACjC,QAAM,WAAW,SAAS,IAAI,CAAC,YAAY,WAAW,MAAM,SAAS,QAAQ,CAAC;AAE9E,MAAI,WAAW;AACb,WAAO,MAAM,cAAc,WAAW,EAAE,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,QAAQ;AAAA,EAChF;AAEA,QAAM,MAAM,KAAK,OAAO,MAAM;AAC9B,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAM,YAAqC,EAAE,KAAK,OAAO;AACzD,MAAI,MAAM,aAAa,KAAM,WAAU,YAAY,MAAM;AACzD,MAAI,MAAM,SAAS,KAAM,WAAU,QAAQ,MAAM;AACjD,MAAI,MAAM,MAAM,KAAM,WAAU,KAAK,MAAM;AAC3C,SAAO,MAAM,cAAc,KAAK,WAAW,QAAQ;AACrD;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/registry.ts","../src/theme/renderer.ts"],"sourcesContent":["import type { ThemeConfig, ThemeComponent, ComponentMeta } from './types';\r\n\r\nexport function createTheme(config: ThemeConfig): ThemeConfig {\r\n const names = config.components.map((c) => c.meta.name);\r\n const duplicates = names.filter((n, i) => names.indexOf(n) !== i);\r\n if (duplicates.length) {\r\n throw new Error(`Duplicate component names in theme \"${config.name}\": ${duplicates.join(', ')}`);\r\n }\r\n return Object.freeze(config) as ThemeConfig;\r\n}\r\n\r\nexport function buildResolver(theme: ThemeConfig): Record<string, React.ComponentType<any>> {\r\n const resolver: Record<string, React.ComponentType<any>> = {};\r\n for (const { meta, component } of theme.components) {\r\n resolver[meta.name] = component;\r\n }\r\n return resolver;\r\n}\r\n\r\nexport interface CatalogGroup {\r\n category: string;\r\n components: ComponentMeta[];\r\n}\r\n\r\nexport function getCatalog(theme: ThemeConfig): CatalogGroup[] {\r\n const groups = new Map<string, ComponentMeta[]>();\r\n for (const { meta } of theme.components) {\r\n const list = groups.get(meta.category) || [];\r\n list.push(meta);\r\n groups.set(meta.category, list);\r\n }\r\n return Array.from(groups.entries()).map(([category, components]) => ({\r\n category,\r\n components,\r\n }));\r\n}\r\n","import React from 'react';\r\nimport type { ThemeConfig, NavbarConfig, FooterConfig } from './types';\r\nimport { buildResolver } from './registry';\r\n\r\ninterface CraftNode {\r\n type: string | { resolvedName: string };\r\n props: Record<string, any>;\r\n nodes?: string[];\r\n linkedNodes?: Record<string, string>;\r\n}\r\n\r\ntype CraftJson = Record<string, CraftNode>;\r\n\r\ninterface PageRendererProps {\r\n content: CraftJson;\r\n theme: ThemeConfig;\r\n navbarConfig?: NavbarConfig;\r\n footerConfig?: FooterConfig;\r\n}\r\n\r\nexport function PageRenderer({ content, theme, navbarConfig, footerConfig }: PageRendererProps) {\r\n const resolver = buildResolver(theme);\r\n const NavbarComponent = theme.layout?.navbar?.component;\r\n const FooterComponent = theme.layout?.footer?.component;\r\n\r\n return React.createElement(\r\n React.Fragment,\r\n null,\r\n NavbarComponent && navbarConfig\r\n ? React.createElement(NavbarComponent, navbarConfig)\r\n : null,\r\n React.createElement('main', null, renderNode(content, 'ROOT', resolver)),\r\n FooterComponent && footerConfig\r\n ? React.createElement(FooterComponent, footerConfig)\r\n : null,\r\n );\r\n}\r\n\r\nfunction getChildIds(node: CraftNode): string[] {\r\n const fromNodes = node.nodes ?? [];\r\n const fromLinked = Object.values(node.linkedNodes ?? {});\r\n return [...fromNodes, ...fromLinked];\r\n}\r\n\r\nfunction renderNode(\r\n json: CraftJson,\r\n nodeId: string,\r\n resolver: Record<string, React.ComponentType<any>>,\r\n): React.ReactNode {\r\n const node = json[nodeId];\r\n if (!node) return null;\r\n\r\n const resolvedName =\r\n typeof node.type === 'string' ? node.type : (node.type?.resolvedName ?? '');\r\n const Component = resolver[resolvedName];\r\n const childIds = getChildIds(node);\r\n const children = childIds.map((childId) => renderNode(json, childId, resolver));\r\n\r\n if (Component) {\r\n return React.createElement(Component, { key: nodeId, ...node.props }, children);\r\n }\r\n\r\n const tag = node.props?.is ?? 'div';\r\n const props = node.props ?? {};\r\n const safeProps: Record<string, unknown> = { key: nodeId };\r\n if (props.className != null) safeProps.className = props.className;\r\n if (props.style != null) safeProps.style = props.style;\r\n if (props.id != null) safeProps.id = props.id;\r\n return React.createElement(tag, safeProps, children);\r\n}\r\n"],"mappings":";AAEO,SAAS,YAAY,QAAkC;AAC5D,QAAM,QAAQ,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI;AACtD,QAAM,aAAa,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,QAAQ,CAAC,MAAM,CAAC;AAChE,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,MAAM,uCAAuC,OAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,EACjG;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEO,SAAS,cAAc,OAA8D;AAC1F,QAAM,WAAqD,CAAC;AAC5D,aAAW,EAAE,MAAM,UAAU,KAAK,MAAM,YAAY;AAClD,aAAS,KAAK,IAAI,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAOO,SAAS,WAAW,OAAoC;AAC7D,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,EAAE,KAAK,KAAK,MAAM,YAAY;AACvC,UAAM,OAAO,OAAO,IAAI,KAAK,QAAQ,KAAK,CAAC;AAC3C,SAAK,KAAK,IAAI;AACd,WAAO,IAAI,KAAK,UAAU,IAAI;AAAA,EAChC;AACA,SAAO,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,UAAU,OAAO;AAAA,IACnE;AAAA,IACA;AAAA,EACF,EAAE;AACJ;;;ACnCA,OAAO,WAAW;AAoBX,SAAS,aAAa,EAAE,SAAS,OAAO,cAAc,aAAa,GAAsB;AAC9F,QAAM,WAAW,cAAc,KAAK;AACpC,QAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAC9C,QAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAE9C,SAAO,MAAM;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA,mBAAmB,eACf,MAAM,cAAc,iBAAiB,YAAY,IACjD;AAAA,IACJ,MAAM,cAAc,QAAQ,MAAM,WAAW,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACvE,mBAAmB,eACf,MAAM,cAAc,iBAAiB,YAAY,IACjD;AAAA,EACN;AACF;AAEA,SAAS,YAAY,MAA2B;AAC9C,QAAM,YAAY,KAAK,SAAS,CAAC;AACjC,QAAM,aAAa,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC;AACvD,SAAO,CAAC,GAAG,WAAW,GAAG,UAAU;AACrC;AAEA,SAAS,WACP,MACA,QACA,UACiB;AACjB,QAAM,OAAO,KAAK,MAAM;AACxB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,eACJ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAQ,KAAK,MAAM,gBAAgB;AAC1E,QAAM,YAAY,SAAS,YAAY;AACvC,QAAM,WAAW,YAAY,IAAI;AACjC,QAAM,WAAW,SAAS,IAAI,CAAC,YAAY,WAAW,MAAM,SAAS,QAAQ,CAAC;AAE9E,MAAI,WAAW;AACb,WAAO,MAAM,cAAc,WAAW,EAAE,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,QAAQ;AAAA,EAChF;AAEA,QAAM,MAAM,KAAK,OAAO,MAAM;AAC9B,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAM,YAAqC,EAAE,KAAK,OAAO;AACzD,MAAI,MAAM,aAAa,KAAM,WAAU,YAAY,MAAM;AACzD,MAAI,MAAM,SAAS,KAAM,WAAU,QAAQ,MAAM;AACjD,MAAI,MAAM,MAAM,KAAM,WAAU,KAAK,MAAM;AAC3C,SAAO,MAAM,cAAc,KAAK,WAAW,QAAQ;AACrD;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@infuro/cms-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.19",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -49,10 +49,12 @@
|
|
|
49
49
|
"./admin.css": "./src/admin/admin.css"
|
|
50
50
|
},
|
|
51
51
|
"scripts": {
|
|
52
|
-
"build": "tsup && mkdir -p dist/migrations && cp -r src/migrations/. dist/migrations/",
|
|
53
|
-
"dev": "tsup --watch",
|
|
52
|
+
"build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 tsup && shx mkdir -p dist/migrations && shx cp -r src/migrations/. dist/migrations/",
|
|
53
|
+
"dev": "cross-env NODE_OPTIONS=--max-old-space-size=8192 tsup --watch",
|
|
54
54
|
"link": "npm run build && npm link",
|
|
55
|
-
"prepublishOnly": "npm run build"
|
|
55
|
+
"prepublishOnly": "npm run build",
|
|
56
|
+
"migration:run": "cross-env TYPEORM_CLI=1 tsx -r dotenv/config node_modules/typeorm/cli.js migration:run -d src/scripts/migration-datasource.cjs",
|
|
57
|
+
"migration:revert": "cross-env TYPEORM_CLI=1 tsx -r dotenv/config node_modules/typeorm/cli.js migration:revert -d src/scripts/migration-datasource.cjs"
|
|
56
58
|
},
|
|
57
59
|
"peerDependencies": {
|
|
58
60
|
"@craftjs/core": ">=0.2.0",
|
|
@@ -63,8 +65,12 @@
|
|
|
63
65
|
"typeorm": ">=0.3.20"
|
|
64
66
|
},
|
|
65
67
|
"devDependencies": {
|
|
66
|
-
"
|
|
68
|
+
"cross-env": "^7.0.3",
|
|
69
|
+
"dotenv": "^16.4.5",
|
|
70
|
+
"shx": "^0.3.4",
|
|
71
|
+
"tsx": "^4.19.2",
|
|
67
72
|
"@craftjs/core": "^0.2.12",
|
|
73
|
+
"@types/adm-zip": "^0.5.5",
|
|
68
74
|
"@types/node": "^22",
|
|
69
75
|
"@types/nodemailer": "^6.4.0",
|
|
70
76
|
"@types/papaparse": "^5.3.14",
|
|
@@ -78,7 +84,6 @@
|
|
|
78
84
|
"typescript": "^5.3.3"
|
|
79
85
|
},
|
|
80
86
|
"dependencies": {
|
|
81
|
-
"adm-zip": "^0.5.16",
|
|
82
87
|
"@aws-sdk/client-s3": "^3.858.0",
|
|
83
88
|
"@aws-sdk/client-ses": "^3.858.0",
|
|
84
89
|
"@radix-ui/react-avatar": "^1.1.10",
|
|
@@ -93,6 +98,7 @@
|
|
|
93
98
|
"@radix-ui/react-slot": "^1.1.2",
|
|
94
99
|
"@radix-ui/react-switch": "^1.1.3",
|
|
95
100
|
"@radix-ui/react-tooltip": "^1.1.8",
|
|
101
|
+
"adm-zip": "^0.5.16",
|
|
96
102
|
"bcryptjs": "^3.0.3",
|
|
97
103
|
"bullmq": "^5.34.0",
|
|
98
104
|
"chart.js": "^4.5.0",
|
|
@@ -108,6 +114,7 @@
|
|
|
108
114
|
"next-themes": "^0.2.1",
|
|
109
115
|
"nodemailer": "^8.0.2",
|
|
110
116
|
"papaparse": "^5.4.1",
|
|
117
|
+
"pg": "^8.20.0",
|
|
111
118
|
"razorpay": "^2.9.6",
|
|
112
119
|
"react-chartjs-2": "^5.3.0",
|
|
113
120
|
"reflect-metadata": "^0.2.2",
|