medusa-plugin-tax-lookup 0.1.0 → 0.2.1

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.
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /// <reference types="jest" />
7
+ const path_1 = __importDefault(require("path"));
8
+ const provider_1 = require("../../providers/tax-lookup/provider");
9
+ const fixturesDir = path_1.default.resolve(__dirname, '__fixtures__');
10
+ const mockLogger = {
11
+ info: jest.fn(),
12
+ warn: jest.fn(),
13
+ error: jest.fn(),
14
+ debug: jest.fn(),
15
+ activity: jest.fn(),
16
+ progress: jest.fn(),
17
+ log: jest.fn(),
18
+ panic: jest.fn(),
19
+ shouldLog: jest.fn(),
20
+ setLogLevel: jest.fn(),
21
+ unsetLogLevel: jest.fn(),
22
+ };
23
+ function createProvider(options) {
24
+ return new provider_1.TaxLookupProvider({ logger: mockLogger }, options);
25
+ }
26
+ function makeContext(postalCode) {
27
+ return {
28
+ address: {
29
+ postal_code: postalCode,
30
+ },
31
+ };
32
+ }
33
+ function makeItemLines(ids) {
34
+ return ids.map((id) => ({ line_item: { id } }));
35
+ }
36
+ function makeShippingLines(ids) {
37
+ return ids.map((id) => ({ shipping_line: { id } }));
38
+ }
39
+ describe("TaxLookupProvider", () => {
40
+ beforeEach(() => {
41
+ jest.clearAllMocks();
42
+ });
43
+ describe("constructor", () => {
44
+ it("throws when dataDirectory is not provided", () => {
45
+ expect(() => createProvider({})).toThrow("dataDirectory is required");
46
+ });
47
+ it("throws when dataDirectory does not exist", () => {
48
+ expect(() => createProvider({ dataDirectory: "/nonexistent/path" })).toThrow("dataDirectory does not exist");
49
+ });
50
+ it("loads CSV files from the fixtures directory", () => {
51
+ createProvider({ dataDirectory: fixturesDir });
52
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining("loaded"));
53
+ });
54
+ it("warns when a CSV is missing required columns", () => {
55
+ createProvider({ dataDirectory: fixturesDir });
56
+ expect(mockLogger.warn).toHaveBeenCalledWith(expect.stringContaining("bad-headers.csv"));
57
+ });
58
+ it("warns when directory has no CSV files", () => {
59
+ const fs = require('fs');
60
+ const os = require('os');
61
+ const tmpDir = fs.mkdtempSync(path_1.default.join(os.tmpdir(), 'tax-test-'));
62
+ createProvider({ dataDirectory: tmpDir });
63
+ expect(mockLogger.warn).toHaveBeenCalledWith(expect.stringContaining("no CSV files found"));
64
+ fs.rmSync(tmpDir, { recursive: true });
65
+ });
66
+ });
67
+ describe("CSV parsing", () => {
68
+ it("loads the CA tax rates CSV", () => {
69
+ createProvider({ dataDirectory: fixturesDir });
70
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining("TAXRATES_ZIP5_CA202604.csv"));
71
+ });
72
+ it("loads the LA tax rates CSV", () => {
73
+ createProvider({ dataDirectory: fixturesDir });
74
+ expect(mockLogger.info).toHaveBeenCalledWith(expect.stringContaining("TAXRATES_ZIP5_LA202604.csv"));
75
+ });
76
+ it("converts decimal rates to percentages", async () => {
77
+ const provider = createProvider({ dataDirectory: fixturesDir });
78
+ // minimal.csv: 10001 -> 0.08875 -> 8.875%
79
+ const result = await provider.getTaxLines(makeItemLines(["item_1"]), [], makeContext("10001"));
80
+ expect(result).toHaveLength(1);
81
+ expect(result[0]).toMatchObject({ rate: 8.875 });
82
+ });
83
+ it("ignores extra columns in CSV files", async () => {
84
+ const provider = createProvider({ dataDirectory: fixturesDir });
85
+ // CA CSV has State, ZipCode, TaxRegionName, EstimatedCombinedRate, etc.
86
+ // 90001 -> 0.105 -> 10.5%
87
+ const result = await provider.getTaxLines(makeItemLines(["item_1"]), [], makeContext("90001"));
88
+ expect(result).toHaveLength(1);
89
+ expect(result[0]).toMatchObject({ rate: 10.5 });
90
+ });
91
+ it("loads rates from multiple state CSVs", async () => {
92
+ const provider = createProvider({ dataDirectory: fixturesDir });
93
+ // CA zip
94
+ const caResult = await provider.getTaxLines(makeItemLines(["item_1"]), [], makeContext("90001"));
95
+ expect(caResult[0]).toMatchObject({ rate: 10.5 });
96
+ // LA zip
97
+ const laResult = await provider.getTaxLines(makeItemLines(["item_1"]), [], makeContext("70001"));
98
+ expect(laResult[0]).toMatchObject({ rate: 9.75 });
99
+ });
100
+ });
101
+ describe("getTaxLines", () => {
102
+ let provider;
103
+ beforeEach(() => {
104
+ provider = createProvider({ dataDirectory: fixturesDir });
105
+ });
106
+ it("returns empty array when no postal code", async () => {
107
+ const result = await provider.getTaxLines(makeItemLines(["item_1"]), makeShippingLines(["ship_1"]), makeContext(undefined));
108
+ expect(result).toEqual([]);
109
+ });
110
+ it("returns rate 0 for unknown zip codes", async () => {
111
+ const result = await provider.getTaxLines(makeItemLines(["item_1"]), [], makeContext("00000"));
112
+ expect(result).toHaveLength(1);
113
+ expect(result[0]).toMatchObject({ rate: 0 });
114
+ });
115
+ it("truncates postal code to 5 digits", async () => {
116
+ // 90001-1234 should match 90001
117
+ const result = await provider.getTaxLines(makeItemLines(["item_1"]), [], makeContext("90001-1234"));
118
+ expect(result).toHaveLength(1);
119
+ expect(result[0]).toMatchObject({ rate: 10.5 });
120
+ });
121
+ it("returns tax lines for items and shipping", async () => {
122
+ const result = await provider.getTaxLines(makeItemLines(["item_1", "item_2"]), makeShippingLines(["ship_1"]), makeContext("90002"));
123
+ expect(result).toHaveLength(3);
124
+ expect(result[0]).toMatchObject({
125
+ line_item_id: "item_1",
126
+ rate: 10.75,
127
+ name: "Sales Tax",
128
+ code: "TAX-90002",
129
+ provider_id: "tax-lookup",
130
+ });
131
+ expect(result[1]).toMatchObject({
132
+ line_item_id: "item_2",
133
+ rate: 10.75,
134
+ });
135
+ expect(result[2]).toMatchObject({
136
+ shipping_line_id: "ship_1",
137
+ rate: 10.75,
138
+ name: "Sales Tax",
139
+ code: "TAX-90002",
140
+ });
141
+ });
142
+ it("looks up a known CA rate", async () => {
143
+ // 90003 -> 0.0975 -> 9.75%
144
+ const result = await provider.getTaxLines(makeItemLines(["item_1"]), [], makeContext("90003"));
145
+ expect(result[0]).toMatchObject({ rate: 9.75, code: "TAX-90003" });
146
+ });
147
+ it("looks up a known LA rate", async () => {
148
+ // 70002 -> 0.0975 -> 9.75%
149
+ const result = await provider.getTaxLines(makeItemLines(["item_1"]), [], makeContext("70002"));
150
+ expect(result[0]).toMatchObject({ rate: 9.75, code: "TAX-70002" });
151
+ });
152
+ });
153
+ });
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIudW5pdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9fX3Rlc3RzX18vcHJvdmlkZXIudW5pdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOEJBQThCO0FBQzlCLGdEQUF1QjtBQUN2QixrRUFBeUY7QUFFekYsTUFBTSxXQUFXLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUE7QUFFM0QsTUFBTSxVQUFVLEdBQUc7SUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2hCLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2hCLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ25CLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDdEIsYUFBYSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7Q0FDakIsQ0FBQTtBQUVSLFNBQVMsY0FBYyxDQUFDLE9BQXlCO0lBQ2hELE9BQU8sSUFBSSw0QkFBaUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsVUFBbUI7SUFDdkMsT0FBTztRQUNOLE9BQU8sRUFBRTtZQUNSLFdBQVcsRUFBRSxVQUFVO1NBQ3ZCO0tBQ00sQ0FBQTtBQUNULENBQUM7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
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@medusajs/types").ModuleProviderExports;
2
+ export default _default;
3
+ export * from './provider';
@@ -1,8 +1,23 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
17
  const utils_1 = require("@medusajs/framework/utils");
4
18
  const provider_1 = require("./provider");
5
19
  exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.TAX, {
6
20
  services: [provider_1.TaxLookupProvider]
7
21
  });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3RheC1sb29rdXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBbUU7QUFDbkUseUNBQThDO0FBRTlDLGtCQUFlLElBQUEsc0JBQWMsRUFBQyxlQUFPLENBQUMsR0FBRyxFQUFFO0lBQzFDLFFBQVEsRUFBRSxDQUFDLDRCQUFpQixDQUFDO0NBQzdCLENBQUMsQ0FBQSJ9
22
+ __exportStar(require("./provider"), exports);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3RheC1sb29rdXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUFtRTtBQUNuRSx5Q0FBOEM7QUFFOUMsa0JBQWUsSUFBQSxzQkFBYyxFQUFDLGVBQU8sQ0FBQyxHQUFHLEVBQUU7SUFDMUMsUUFBUSxFQUFFLENBQUMsNEJBQWlCLENBQUM7Q0FDN0IsQ0FBQyxDQUFBO0FBRUYsNkNBQTBCIn0=
@@ -0,0 +1,15 @@
1
+ import { TaxTypes } from '@medusajs/framework/types';
2
+ import { Logger } from '@medusajs/framework/types';
3
+ export interface TaxLookupOptions {
4
+ dataDirectory: string;
5
+ }
6
+ export declare class TaxLookupProvider implements TaxTypes.ITaxProvider {
7
+ static identifier: string;
8
+ protected logger_: Logger;
9
+ protected taxRates_: Record<string, number>;
10
+ constructor({ logger }: {
11
+ logger: Logger;
12
+ }, options: TaxLookupOptions);
13
+ getIdentifier(): string;
14
+ getTaxLines(itemLines: TaxTypes.ItemTaxCalculationLine[], shippingLines: TaxTypes.ShippingTaxCalculationLine[], context: TaxTypes.TaxCalculationContext): Promise<(TaxTypes.ItemTaxLineDTO | TaxTypes.ShippingTaxLineDTO)[]>;
15
+ }
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Tax provider for Medusa that looks up tax rates by ZIP code from CSV files.
4
4
 
5
+ [Documentation](https://pevey.com/medusa-plugin-tax-lookup)
6
+
5
7
  If you are not familiar with Medusa, you can learn more on [the project web site](https://www.medusajs.com/).
6
8
 
7
9
  ## Features
@@ -73,3 +75,13 @@ If multiple CSV files contain the same ZIP code, the last file loaded wins.
73
75
  The column names the tax provider is configured to use are based on the format of csv files downloaded from Avalara: https://www.avalara.com/taxrates/en/download-tax-tables.html.
74
76
 
75
77
  However, you can use any spreadsheet you want. Just change the name of the rate column in your data source to `EstimatedCombinedRate` and the postal code column to `ZipCode`.
78
+
79
+ ## Building for Production
80
+
81
+ Make sure you copy your configured tax data directory to your .medusa/server build output. You can automate this by updating your build script in your project's package.json.
82
+
83
+ Example:
84
+
85
+ ```
86
+ "build": "medusa build && cp -R tax-data .medusa/server",
87
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medusa-plugin-tax-lookup",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Tax rate lookup provider for Medusa v2",
5
5
  "author": "Lacey Pevey",
6
6
  "license": "MIT",
@@ -14,11 +14,26 @@
14
14
  ],
15
15
  "exports": {
16
16
  "./package.json": "./package.json",
17
- "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
18
- "./modules/*": "./.medusa/server/src/modules/*/index.js",
19
- "./providers/*": "./.medusa/server/src/providers/*/index.js",
20
- "./*": "./.medusa/server/src/*.js",
21
- ".": "./.medusa/server/src/providers/tax-lookup/index.js"
17
+ "./.medusa/server/src/modules/*": {
18
+ "types": "./.medusa/server/src/modules/*/index.d.ts",
19
+ "default": "./.medusa/server/src/modules/*/index.js"
20
+ },
21
+ "./modules/*": {
22
+ "types": "./.medusa/server/src/modules/*/index.d.ts",
23
+ "default": "./.medusa/server/src/modules/*/index.js"
24
+ },
25
+ "./providers/*": {
26
+ "types": "./.medusa/server/src/providers/*/index.d.ts",
27
+ "default": "./.medusa/server/src/providers/*/index.js"
28
+ },
29
+ "./*": {
30
+ "types": "./.medusa/server/src/*.d.ts",
31
+ "default": "./.medusa/server/src/*.js"
32
+ },
33
+ ".": {
34
+ "types": "./.medusa/server/src/providers/tax-lookup/index.d.ts",
35
+ "default": "./.medusa/server/src/providers/tax-lookup/index.js"
36
+ }
22
37
  },
23
38
  "keywords": [
24
39
  "medusa-plugin-tax",
@@ -35,38 +50,33 @@
35
50
  "test:unit": "TEST_TYPE=unit NODE_OPTIONS=--experimental-vm-modules jest --silent --runInBand --detectOpenHandles --forceExit --passWithNoTests"
36
51
  },
37
52
  "devDependencies": {
38
- "@medusajs/admin-sdk": "2.13.6",
39
- "@medusajs/cli": "2.13.6",
40
- "@medusajs/framework": "2.13.6",
41
- "@medusajs/icons": "2.13.6",
42
- "@medusajs/medusa": "2.13.6",
43
- "@medusajs/test-utils": "2.13.6",
44
- "@medusajs/ui": "4.0.25",
45
- "@swc/core": "^1.7.28",
46
- "@swc/jest": "^0.2.39",
47
- "@types/jest": "^30.0.0",
48
- "@types/node": "^20.0.0",
49
- "@types/react": "^18.3.2",
50
- "@types/react-dom": "^18.2.25",
51
- "jest": "^29.7.0",
52
- "prop-types": "^15.8.1",
53
- "react": "^18.2.0",
54
- "react-dom": "^18.2.0",
55
- "ts-node": "^10.9.2",
56
- "typescript": "^5.6.2",
57
- "vite": "^5.2.11",
58
- "yalc": "^1.0.0-pre.53"
53
+ "@medusajs/admin-sdk": "2.16.0",
54
+ "@medusajs/cli": "2.16.0",
55
+ "@medusajs/framework": "2.16.0",
56
+ "@medusajs/icons": "2.16.0",
57
+ "@medusajs/ui": "4.1.16",
58
+ "@swc/core": "1.15.33",
59
+ "@swc/jest": "0.2.39",
60
+ "@types/jest": "30.0.0",
61
+ "@types/node": "20.0.0",
62
+ "@types/react": "18.3.2",
63
+ "@types/react-dom": "18.2.25",
64
+ "jest": "29.7.0",
65
+ "prop-types": "15.8.1",
66
+ "react": "18.3.1",
67
+ "react-dom": "18.3.1",
68
+ "ts-node": "10.9.2",
69
+ "typescript": "6.0.3",
70
+ "vite": "8.0.8",
71
+ "yalc": "1.0.0-pre.53"
59
72
  },
60
73
  "peerDependencies": {
61
- "@medusajs/admin-sdk": "2.13.6",
62
- "@medusajs/cli": "2.13.6",
63
- "@medusajs/framework": "2.13.6",
64
- "@medusajs/icons": "2.13.6",
65
- "@medusajs/medusa": "2.13.6",
66
- "@medusajs/test-utils": "2.13.6",
67
- "@medusajs/ui": "4.0.25"
74
+ "@medusajs/framework": "2.16.0",
75
+ "@medusajs/js-sdk": "2.16.0",
76
+ "@medusajs/medusa": "2.16.0"
68
77
  },
69
78
  "engines": {
70
79
  "node": ">=20"
71
- }
72
- }
80
+ },
81
+ "gitHead": "e09c71de0e01897fa9441b40b67315b5a7b6d5bf"
82
+ }