Skip to content

Commit 402a4b2

Browse files
author
Your Name
committed
merged latest changes from dev
2 parents fc472c8 + ac1d659 commit 402a4b2

76 files changed

Lines changed: 1976 additions & 1621 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/lint.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: Lint
2+
3+
on:
4+
pull_request:
5+
types: [opened, synchronize, reopened]
6+
7+
jobs:
8+
lint:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- uses: actions/checkout@v4
12+
- uses: pnpm/action-setup@v4
13+
with:
14+
version: 10.28.0
15+
- uses: actions/setup-node@v4
16+
with:
17+
node-version: '22.x'
18+
cache: 'pnpm'
19+
- run: pnpm install --no-frozen-lockfile
20+
- run: pnpm -r --sort --workspace-concurrency=1 run build
21+
- run: pnpm run lint

.talismanrc

Lines changed: 14 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,15 @@
11
fileignoreconfig:
2-
- filename: pnpm-lock.yaml
3-
checksum: 17968d9c5a68d526b2493deea339d611cc57f00dcdc6f3401954ed12d527e47e
4-
- filename: packages/contentstack-bulk-operations/src/messages/index.ts
5-
checksum: 097f7ed876622aed6edc3f12995a92e219f96c3d053ec078d45c762f7ebe085e
6-
- filename: packages/contentstack-apps-cli/src/messages/index.ts
7-
checksum: 5d7991adb5056a14359c5a43db995460a72234916138dbc5ec14f726faf0054b
8-
- filename: packages/contentstack-query-export/test/unit/common-helper.test.ts
9-
checksum: a0aa399a2ec15760fe25f7e952d64792b55d3c38d2281858a48e64f0f9081344
10-
- filename: packages/contentstack-import/test/unit/commands/cm/stacks/import.test.ts
11-
checksum: a52fbd82e4296734d5eb5b06cc9a10d7e2c1fe7b58d15a44d3246f0f2762d5a1
12-
- filename: packages/contentstack-export-to-csv/src/messages/index.ts
13-
checksum: 54cbfb3fb83d06ce46766897066ace927c190b2383154b45423e668f63fa4392
14-
- filename: packages/contentstack-import/test/unit/import/modules/assets.test.ts
15-
checksum: 64e3af1e307d0f001370870267fa4cedd2ae81d0f3c38c2e184e69a9a68b2b30
16-
- filename: packages/contentstack-bulk-operations/test/unit/base-bulk-command.test.ts
17-
checksum: 522b91a2d4bb6a73ebe5ab92c0111e74d567c4360470beefd6a7ca8d30a6e311
18-
- filename: packages/contentstack-import/test/unit/import/modules/base-class.test.ts
19-
checksum: 7616f13a4c908eead76c1625cb146320a8a23f31732acb2ea8472e2e0a8b2692
20-
- filename: packages/contentstack-import/test/unit/import/modules/content-types.test.ts
21-
checksum: cd47b1694cb1edffb11fed0f2024fac631b0279ebf55113510d9121c4b957ab1
22-
- filename: packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts
23-
checksum: 7216dd610334e6f4a0e2701712408a273a5a2bd4a5ec30b6d6aae043e2b53cc8
24-
- filename: packages/contentstack-bulk-operations/test/unit/utils/bulk-operation-log-handler.test.ts
25-
checksum: 8698f77bbb828df10ddc3a94726076a262fbf47d2468233c7e10e66cac42f97d
26-
- filename: packages/contentstack-import/test/unit/import/modules/entries.test.ts
27-
checksum: 02332fc203e92039b5fcab6e2e14d14ea5444a4cba2be853009b4c4994692637
28-
- filename: packages/contentstack-import/test/unit/import/modules/global-fields.test.ts
29-
checksum: 4bd86f40b28433470eea876acc9254042c3b24556acdfdb7b15375a948acc094
30-
- filename: packages/contentstack-export/test/unit/utils/common-helper.test.ts
31-
checksum: 928f173ca03855a516ac468dba84092fd5f66d2e41b0100bb548e0af364a4ef5
32-
- filename: packages/contentstack-bulk-operations/test/unit/utils/config-builder.test.ts
33-
checksum: e5891257999e9e940956ca77f5a7834be35d259edccd41c06f77736194ad7454
34-
- filename: packages/contentstack-export/test/unit/utils/export-config-handler.test.ts
35-
checksum: 0e7777f73da4f41f4e01e768dba1f3f62ab36778c4f9cd0b519fd1e3bb5c410f
36-
- filename: packages/contentstack-import/test/unit/import/modules/index.test.ts
37-
checksum: 6c2bc4bb09dc750532e84a2d6a8198e145bd142bc21ce0d97ae0c8da55dea723
38-
- filename: packages/contentstack-export/test/unit/utils/interactive.test.ts
39-
checksum: 0ea47db305f576c8c9da8cb34ae915f6b01992208ff1c4380cb7ffd93f538e5d
40-
- filename: packages/contentstack-bulk-operations/test/unit/utils/revert-retry-handler.test.ts
41-
checksum: c34a4bdea186f4ce48171d90b8ab0f1c94162e441acb23e3a0e00cb9f9f9255f
42-
- filename: packages/contentstack-clone/test/commands/stack-clone.test.ts
43-
checksum: 4547ba010cc3c9954de49e2b2bef45288dd070c4ad000b6ae3e9a8c9bb1ad296
44-
- filename: packages/contentstack-clone/test/lib/helpers/command-helpers.test.ts
45-
checksum: 32d385a677a76faa54cb3ddfe92fb1f1f53cfab878a78e2792c823a363956bd2
46-
- filename: packages/contentstack-export/test/unit/utils/marketplace-app-helper.test.ts
47-
checksum: 3734c4cf7145ef32ad424ccbc160ea8be9b38157762aa66ade51879ab369cee9
48-
- filename: packages/contentstack-import/test/unit/utils/marketplace-app-helper.test.ts
49-
checksum: 878be77164311c0ab86629fe18fd3d1be7ff187447e4e5ab65a241b3be0a8d24
50-
- filename: packages/contentstack-clone/test/lib/util/clone-handler.branch.test.ts
51-
checksum: db8c090aaada21d3952c5bc382228a0a11cebb63926512a5e2581bdaf5f4c2f6
52-
- filename: packages/contentstack-content-type/tests/utils/index.test.ts
53-
checksum: 8510fedf5eb6078c27d6a0d65d8bff4aa2d41b545246aed220d1a6a643188ad8
54-
- filename: packages/contentstack-import/test/unit/utils/common-helper.test.ts
55-
checksum: 12c8161a1cb313fa98b612d72e605f6e5190b9f9561d6e73c269c7d106e1a196
56-
- filename: packages/contentstack-import/test/unit/utils/interactive.test.ts
57-
checksum: dad20e229e02e847b5e939fdaf987b1a6c9ff4e1529b6d96a51130f7293285a9
58-
- filename: packages/contentstack-content-type/tests/core/contentstack/client.test.ts
59-
checksum: da15b04aa0a7ab0e48f70b847e68c05372943279e51c22f8539b01bb48033183
60-
- filename: packages/contentstack-import-setup/test/unit/common-helper.test.ts
61-
checksum: 7ac4645401fd3629347a8a182f8a320f177de545a96b8027422bd68040513068
62-
- filename: packages/contentstack-import-setup/test/unit/login-handler.test.ts
63-
checksum: fa7cb2aeb0873e5650beed42096ef4a8edd012a7217818ab0cab2ba6c4611934
64-
- filename: packages/contentstack-content-type/tests/core/command.test.ts
65-
checksum: 81da32fc47083a3421f5f1d9c04149ab313cb238d6416d3182f8b6d64dc8827d
66-
- filename: packages/contentstack-import/test/unit/utils/login-handler.test.ts
67-
checksum: 49dd751f846f50fe00d60e7f02b5bd237d36480048bf5e06a24f1cf9fe752a1b
68-
- filename: packages/contentstack-migrate-rte/test/utils/index.js
69-
checksum: f67235e607a446e5b2dd624046966a1ac5af7bce128aa080ec3c420c48b8bddc
70-
- filename: packages/contentstack-import/test/unit/import/modules/marketplace-apps.test.ts
71-
checksum: 42f4d0a15080a69423d4e82b11a6a1933c5f72930cdc4a55b86f27fdc980aeea
72-
- filename: packages/contentstack-migrate-rte/test/commands/json-migration.test.js
73-
checksum: 0d18641a32f7cf33d013a5a7c447c1067ba77022513b42304a727f873c741e99
74-
version: '1.0'
2+
3+
- filename: pnpm-lock.yaml
4+
checksum: c3bcd614567a430c43ef8c3aa5a4ea2e006486137ba8397d58f01de89b858a1e
5+
- filename: packages/contentstack-seed/tests/importer.test.ts
6+
checksum: cf452b6bc7d3cfcef493ee64e1f5a4e97ac841292ff8ba3515375fc4e8ed049c
7+
- filename: packages/contentstack-variants/test/unit/import/variant-entries.test.ts
8+
checksum: 6aca150cf9656d27acb1811f478d298668ec28f610b2d4820a6d5115612d52c0
9+
- filename: packages/contentstack-export/src/config/index.ts
10+
checksum: 6fa4bba2174bbf33f5611098f49a02bf2fc789f59634e99be58de7e370f5fcd3
11+
- filename: packages/contentstack-branches/test/unit/helpers/stub-auth.ts
12+
checksum: 8cafd5994d3ec13ba9af74c80b330bfd14721ea4e0359b456598964a6c2913ce
13+
- filename: packages/contentstack-seed/tests/contentstack.test.ts
14+
checksum: 04196568bf29f4693e968079867e87d96219b022bfee0f4697dce1b9bc161ac3
15+
version: '1.0'

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"clean:packages": "pnpm -r --filter './packages/*' run clean",
1414
"build": "pnpm -r --filter './packages/*' run build",
1515
"test": "pnpm -r --filter './packages/*' run test",
16+
"lint": "pnpm -r --filter './packages/*' run lint",
1617
"prepack": "pnpm -r --filter './packages/*' run prepack",
1718
"bootstrap": "pnpm install",
1819
"clean:modules": "rm -rf node_modules packages/**/node_modules",
@@ -27,4 +28,4 @@
2728
"workspaces": [
2829
"packages/*"
2930
]
30-
}
31+
}
Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,50 @@
11
import tseslint from 'typescript-eslint';
22
import globals from 'globals';
3+
import unicorn from 'eslint-plugin-unicorn';
4+
import n from 'eslint-plugin-n';
35

46
export default [
57
...tseslint.configs.recommended,
68
{
7-
ignores: [
8-
'lib/**/*',
9-
'test/**/*',
10-
'dist/**/*',
11-
],
9+
ignores: ['lib/**/*', 'test/**/*', 'types/**/*', 'node_modules/**/*', '*.js'],
1210
},
1311
{
1412
languageOptions: {
1513
parser: tseslint.parser,
1614
parserOptions: {
17-
project: './tsconfig.json',
15+
sourceType: 'module',
1816
},
19-
sourceType: 'module',
2017
globals: {
2118
...globals.node,
2219
},
2320
},
21+
// unicorn/node registered (not enabled) so pre-existing inline eslint-disable
22+
// directives that reference their rules resolve under ESLint 10 flat config.
2423
plugins: {
2524
'@typescript-eslint': tseslint.plugin,
25+
unicorn,
26+
node: n,
2627
},
2728
rules: {
28-
'@typescript-eslint/no-unused-vars': [
29-
'error',
30-
{
31-
args: 'none',
32-
},
33-
],
34-
'@typescript-eslint/prefer-namespace-keyword': 'error',
35-
quotes: 'off',
36-
semi: 'off',
29+
// Pre-existing lint debt surfaced once the ESLint-10 flat-config crash was
30+
// fixed. Kept visible as warnings (tracked for follow-up cleanup) rather
31+
// than blocking, since these rules were never enforced while lint crashed.
32+
'@typescript-eslint/no-unused-vars': ['warn', { args: 'none', ignoreRestSiblings: true }],
33+
'@typescript-eslint/no-explicit-any': 'warn',
34+
'@typescript-eslint/no-unused-expressions': ['warn', { allowShortCircuit: true, allowTernary: true }],
35+
'@typescript-eslint/no-require-imports': 'warn',
36+
'@typescript-eslint/ban-ts-comment': 'warn',
37+
'@typescript-eslint/no-wrapper-object-types': 'warn',
38+
'@typescript-eslint/no-unsafe-function-type': 'warn',
39+
'@typescript-eslint/no-empty-object-type': 'warn',
40+
'@typescript-eslint/no-this-alias': 'warn',
41+
'@typescript-eslint/no-use-before-define': 'off',
3742
'@typescript-eslint/no-redeclare': 'off',
38-
eqeqeq: ['error', 'smart'],
39-
'id-match': 'error',
43+
'prefer-const': 'warn',
44+
'prefer-rest-params': 'warn',
45+
'no-var': 'warn',
46+
eqeqeq: 'warn',
4047
'no-eval': 'error',
41-
'no-var': 'error',
42-
'@typescript-eslint/no-explicit-any': 'off',
43-
'@typescript-eslint/no-require-imports': 'off',
44-
'prefer-const': 'error',
4548
},
4649
},
47-
];
50+
];

packages/contentstack-apps-cli/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,8 @@
7777
},
7878
"scripts": {
7979
"build": "pnpm clean && tsc -b",
80-
"lint": "eslint . --ext .ts",
80+
"lint": "eslint \"src/**/*.ts\"",
8181
"postpack": "shx rm -f oclif.manifest.json",
82-
"posttest": "pnpm lint",
8382
"prepack": "pnpm build && oclif manifest && oclif readme",
8483
"test": "mocha --forbid-only \"test/**/*.test.ts\"",
8584
"version": "oclif readme && git add README.md",
Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,50 @@
1-
import oclif from 'eslint-config-oclif';
2-
import oclifTypescript from 'eslint-config-oclif-typescript';
1+
import tseslint from 'typescript-eslint';
2+
import globals from 'globals';
3+
import unicorn from 'eslint-plugin-unicorn';
4+
import n from 'eslint-plugin-n';
35

46
export default [
5-
oclif,
6-
oclifTypescript,
7+
...tseslint.configs.recommended,
78
{
8-
ignores: [
9-
'dist/**/*',
10-
],
9+
ignores: ['lib/**/*', 'test/**/*', 'types/**/*', 'node_modules/**/*', '*.js'],
1110
},
12-
];
11+
{
12+
languageOptions: {
13+
parser: tseslint.parser,
14+
parserOptions: {
15+
sourceType: 'module',
16+
},
17+
globals: {
18+
...globals.node,
19+
},
20+
},
21+
// unicorn/node registered (not enabled) so pre-existing inline eslint-disable
22+
// directives that reference their rules resolve under ESLint 10 flat config.
23+
plugins: {
24+
'@typescript-eslint': tseslint.plugin,
25+
unicorn,
26+
node: n,
27+
},
28+
rules: {
29+
// Pre-existing lint debt surfaced once the ESLint-10 flat-config crash was
30+
// fixed. Kept visible as warnings (tracked for follow-up cleanup) rather
31+
// than blocking, since these rules were never enforced while lint crashed.
32+
'@typescript-eslint/no-unused-vars': ['warn', { args: 'none', ignoreRestSiblings: true }],
33+
'@typescript-eslint/no-explicit-any': 'warn',
34+
'@typescript-eslint/no-unused-expressions': ['warn', { allowShortCircuit: true, allowTernary: true }],
35+
'@typescript-eslint/no-require-imports': 'warn',
36+
'@typescript-eslint/ban-ts-comment': 'warn',
37+
'@typescript-eslint/no-wrapper-object-types': 'warn',
38+
'@typescript-eslint/no-unsafe-function-type': 'warn',
39+
'@typescript-eslint/no-empty-object-type': 'warn',
40+
'@typescript-eslint/no-this-alias': 'warn',
41+
'@typescript-eslint/no-use-before-define': 'off',
42+
'@typescript-eslint/no-redeclare': 'off',
43+
'prefer-const': 'warn',
44+
'prefer-rest-params': 'warn',
45+
'no-var': 'warn',
46+
eqeqeq: 'warn',
47+
'no-eval': 'error',
48+
},
49+
},
50+
];

packages/contentstack-audit/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,8 @@
5959
},
6060
"scripts": {
6161
"build": "pnpm compile && oclif manifest && oclif readme",
62-
"lint": "eslint . --ext .ts",
62+
"lint": "eslint \"src/**/*.ts\"",
6363
"postpack": "shx rm -f oclif.manifest.json",
64-
"posttest": "npm run lint",
6564
"compile": "tsc -b tsconfig.json",
6665
"prepack": "pnpm compile && oclif manifest && oclif readme",
6766
"test": "mocha --forbid-only \"test/**/*.test.ts\"",

packages/contentstack-audit/src/audit-base-command.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,20 +340,37 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
340340
);
341341

342342
break;
343-
case 'field-rules':
343+
case 'field-rules': {
344344
log.info('Executing field-rules audit', this.auditContext);
345-
// NOTE: We are using the fixed content-type for validation of field rules
345+
// NOTE: We are using the fixed content-type/global-field for validation of field rules.
346346
const data = this.getCtAndGfSchema();
347347
constructorParam.ctSchema = data.ctSchema;
348348
constructorParam.gfSchema = data.gfSchema;
349-
missingFieldRules = await new FieldRule(cloneDeep(constructorParam)).run();
349+
350+
// Field rules live on both content types and global fields. FieldRule.run() picks its
351+
// schema from moduleName, so invoke it once per schema (overriding moduleName per
352+
// instance) and merge the results. Merged object is keyed by schema uid; a content type
353+
// and global field sharing a uid would collide, which is not expected in practice.
354+
const ctFieldRules = await new FieldRule(
355+
cloneDeep({ ...constructorParam, moduleName: 'content-types' }),
356+
).run();
357+
let gfFieldRules: Record<string, any> = {};
358+
if (data.gfSchema?.length) {
359+
gfFieldRules = await new FieldRule(
360+
cloneDeep({ ...constructorParam, moduleName: 'global-fields' }),
361+
).run();
362+
}
363+
missingFieldRules = { ...ctFieldRules, ...gfFieldRules };
364+
350365
await this.prepareReport(module, missingFieldRules);
351-
this.getAffectedData('field-rules', dataModuleWise['content-types'], missingFieldRules);
366+
const total = (data.ctSchema?.length || 0) + (data.gfSchema?.length || 0);
367+
this.getAffectedData('field-rules', { Total: total }, missingFieldRules);
352368
log.success(
353369
`Field-rules audit completed. Found ${Object.keys(missingFieldRules || {}).length} issues`,
354370
this.auditContext,
355371
);
356372
break;
373+
}
357374
case 'composable-studio':
358375
log.info('Executing composable-studio audit', this.auditContext);
359376
missingRefsInComposableStudio = await new ComposableStudio(cloneDeep(constructorParam)).run();

packages/contentstack-audit/test/unit/modules/field-rules.test.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,53 @@ describe('Field Rules', () => {
140140
});
141141
});
142142

143+
describe('global field rules', () => {
144+
const gfWithRuleSchema = () => [
145+
{
146+
uid: 'gf_with_rule',
147+
title: 'GF With Rule',
148+
schema: [{ uid: 'single_line', data_type: 'text', display_name: 'Single Line' }],
149+
field_rules: [
150+
{
151+
conditions: [{ operand_field: 'single_line', operator: 'equals', value: 'x' }],
152+
actions: [{ action: 'show', target_field: 'missing_field' }],
153+
},
154+
],
155+
},
156+
];
157+
158+
fancy
159+
.stdout({ print: process.env.PRINT === 'true' || false })
160+
.stub(FieldRule.prototype, 'prepareEntryMetaData', async () => {})
161+
.stub(FieldRule.prototype, 'prerequisiteData', async () => {})
162+
.it("scans a global field's own field_rules and flags missing target fields", async () => {
163+
const gfInstance = new FieldRule({
164+
...constructorParam,
165+
moduleName: 'global-fields',
166+
gfSchema: gfWithRuleSchema() as any,
167+
});
168+
const result = await gfInstance.run();
169+
expect(result).to.have.property('gf_with_rule');
170+
expect(JSON.stringify(result)).to.include('missing_field');
171+
});
172+
173+
fancy
174+
.stdout({ print: process.env.PRINT === 'true' || false })
175+
.stub(FieldRule.prototype, 'prepareEntryMetaData', async () => {})
176+
.stub(FieldRule.prototype, 'prerequisiteData', async () => {})
177+
.it('does not flag a global field whose field_rules reference existing fields', async () => {
178+
const okSchema = gfWithRuleSchema();
179+
okSchema[0].field_rules[0].actions[0].target_field = 'single_line';
180+
const gfInstance = new FieldRule({
181+
...constructorParam,
182+
moduleName: 'global-fields',
183+
gfSchema: okSchema as any,
184+
});
185+
const result = await gfInstance.run();
186+
expect(result).to.not.have.property('gf_with_rule');
187+
});
188+
});
189+
143190
describe('writeFixContent method', () => {
144191
fancy
145192
.stdout({ print: process.env.PRINT === 'true' || false })

0 commit comments

Comments
 (0)